Browse Source

Merge remote-tracking branch 'upstream/branch-1.0.0' into branch-1.0.0

pull/2/head
gongzijian 6 years ago
parent
commit
b332c70f88
  1. 35
      .gitignore
  2. 2
      README.md
  3. BIN
      docs/zh_CN/Easyscheduler文档.pdf
  4. 63
      docs/zh_CN/README.md
  5. 1
      docs/zh_CN/SUMMARY.md
  6. 23
      docs/zh_CN/book.json
  7. BIN
      docs/zh_CN/images/mysql_edit.png
  8. 22
      docs/zh_CN/styles/website.css
  9. 210
      docs/zh_CN/前端部署文档.md
  10. 462
      docs/zh_CN/后端部署文档.md
  11. 2
      escheduler-alert/pom.xml
  12. 2
      escheduler-alert/src/main/java/cn/escheduler/alert/utils/Constants.java
  13. 7
      escheduler-alert/src/main/java/cn/escheduler/alert/utils/MailUtils.java
  14. 2
      escheduler-api/pom.xml
  15. 2
      escheduler-api/src/main/java/cn/escheduler/api/controller/ProcessDefinitionController.java
  16. 105
      escheduler-api/src/main/java/cn/escheduler/api/controller/QueueController.java
  17. 7
      escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java
  18. 2
      escheduler-api/src/main/java/cn/escheduler/api/quartz/ProcessScheduleJob.java
  19. 13
      escheduler-api/src/main/java/cn/escheduler/api/service/ProcessDefinitionService.java
  20. 200
      escheduler-api/src/main/java/cn/escheduler/api/service/QueueService.java
  21. 78
      escheduler-api/src/test/java/cn/escheduler/api/controller/QueueControllerTest.java
  22. 14
      escheduler-common/pom.xml
  23. 30
      escheduler-common/src/main/java/cn/escheduler/common/Constants.java
  24. 7
      escheduler-common/src/main/java/cn/escheduler/common/utils/CommonUtils.java
  25. 1
      escheduler-common/src/main/resources/common/common.properties
  26. 2
      escheduler-dao/pom.xml
  27. 3
      escheduler-dao/src/main/java/cn/escheduler/dao/ProcessDao.java
  28. 35
      escheduler-dao/src/main/java/cn/escheduler/dao/mapper/QueueMapper.java
  29. 80
      escheduler-dao/src/main/java/cn/escheduler/dao/mapper/QueueMapperProvider.java
  30. 29
      escheduler-dao/src/main/java/cn/escheduler/dao/model/Queue.java
  31. 2
      escheduler-rpc/pom.xml
  32. 2
      escheduler-server/pom.xml
  33. 4
      escheduler-server/src/main/java/cn/escheduler/server/worker/runner/FetchTaskThread.java
  34. 71
      escheduler-server/src/main/java/cn/escheduler/server/worker/task/PythonCommandExecutor.java
  35. 2
      escheduler-server/src/main/java/cn/escheduler/server/worker/task/python/PythonTask.java
  36. 2
      escheduler-server/src/main/java/cn/escheduler/server/zk/ZKMasterClient.java
  37. 2
      escheduler-server/src/main/resources/worker.properties
  38. 65
      escheduler-server/src/test/java/cn/escheduler/server/worker/EnvFileTest.java
  39. 3
      escheduler-server/src/test/java/cn/escheduler/server/zk/ZKWorkerClientTest.java
  40. 2
      escheduler-ui/.env
  41. 5
      escheduler-ui/dist/combo/1.0.0/3rd.css
  42. 10783
      escheduler-ui/dist/combo/1.0.0/3rd.js
  43. 8
      escheduler-ui/dist/combo/1.0.0/base.css
  44. 14
      escheduler-ui/dist/combo/1.0.0/es5.js
  45. 1
      escheduler-ui/dist/combo/1.0.0/local.js
  46. 1
      escheduler-ui/dist/css/common.8ba9af7.css
  47. 14
      escheduler-ui/dist/css/home/index.0212fa5.css
  48. 14
      escheduler-ui/dist/css/login/index.6083d91.css
  49. BIN
      escheduler-ui/dist/font/fontawesome-webfont.674f50d.eot
  50. BIN
      escheduler-ui/dist/font/fontawesome-webfont.af7ae50.woff2
  51. BIN
      escheduler-ui/dist/font/fontawesome-webfont.b06871f.ttf
  52. BIN
      escheduler-ui/dist/font/fontawesome-webfont.fee66e7.woff
  53. BIN
      escheduler-ui/dist/font/iconfont.4f692dd.ttf
  54. BIN
      escheduler-ui/dist/font/iconfont.6f38b93.eot
  55. BIN
      escheduler-ui/dist/font/iconfont.be17177.woff
  56. BIN
      escheduler-ui/dist/images/close.png
  57. BIN
      escheduler-ui/dist/images/dag_bg.png
  58. BIN
      escheduler-ui/dist/images/down_error.png
  59. BIN
      escheduler-ui/dist/images/errorTip.png
  60. BIN
      escheduler-ui/dist/images/favicon.ico
  61. 2671
      escheduler-ui/dist/images/fontawesome-webfont.svg
  62. 266
      escheduler-ui/dist/images/iconfont.svg
  63. BIN
      escheduler-ui/dist/images/login-logo.png
  64. BIN
      escheduler-ui/dist/images/logo.png
  65. BIN
      escheduler-ui/dist/images/m_logo.png
  66. BIN
      escheduler-ui/dist/images/open.png
  67. BIN
      escheduler-ui/dist/images/toolbar_DEPENDENT.png
  68. BIN
      escheduler-ui/dist/images/toolbar_MR.png
  69. BIN
      escheduler-ui/dist/images/toolbar_PROCEDURE.png
  70. BIN
      escheduler-ui/dist/images/toolbar_PYTHON.png
  71. BIN
      escheduler-ui/dist/images/toolbar_SHELL.png
  72. BIN
      escheduler-ui/dist/images/toolbar_SPARK.png
  73. BIN
      escheduler-ui/dist/images/toolbar_SQL.png
  74. BIN
      escheduler-ui/dist/images/toolbar_SUB_PROCESS.png
  75. 7
      escheduler-ui/dist/index.html
  76. 2
      escheduler-ui/dist/js/0.8ca091c.js
  77. 1
      escheduler-ui/dist/js/0.8ca091c.js.map
  78. 2
      escheduler-ui/dist/js/1.bdb0cc7.js
  79. 1
      escheduler-ui/dist/js/1.bdb0cc7.js.map
  80. 2
      escheduler-ui/dist/js/10.73c0240.js
  81. 1
      escheduler-ui/dist/js/10.73c0240.js.map
  82. 2
      escheduler-ui/dist/js/11.078cbab.js
  83. 1
      escheduler-ui/dist/js/11.078cbab.js.map
  84. 2
      escheduler-ui/dist/js/12.864692a.js
  85. 1
      escheduler-ui/dist/js/12.864692a.js.map
  86. 2
      escheduler-ui/dist/js/13.7e1b794.js
  87. 1
      escheduler-ui/dist/js/13.7e1b794.js.map
  88. 2
      escheduler-ui/dist/js/14.22fa282.js
  89. 1
      escheduler-ui/dist/js/14.22fa282.js.map
  90. 2
      escheduler-ui/dist/js/15.eea1d19.js
  91. 1
      escheduler-ui/dist/js/15.eea1d19.js.map
  92. 2
      escheduler-ui/dist/js/16.fd660eb.js
  93. 1
      escheduler-ui/dist/js/16.fd660eb.js.map
  94. 2
      escheduler-ui/dist/js/17.4aef6ba.js
  95. 1
      escheduler-ui/dist/js/17.4aef6ba.js.map
  96. 2
      escheduler-ui/dist/js/18.b14d7b0.js
  97. 1
      escheduler-ui/dist/js/18.b14d7b0.js.map
  98. 2
      escheduler-ui/dist/js/19.35e5748.js
  99. 1
      escheduler-ui/dist/js/19.35e5748.js.map
  100. 2
      escheduler-ui/dist/js/2.d6885e7.js
  101. Some files were not shown because too many files have changed in this diff Show More

35
.gitignore vendored

@ -0,0 +1,35 @@
.git
.svn
.hg
.zip
.gz
.DS_Store
.idea
.idea/
.idea/*
.target
.target/
target/*
*/target
*/target/*
.settings
.nbproject
.classpath
.project
*.iml
*.ipr
*.iws
*.tgz
.*.swp
.vim
.tmp
node_modules
npm-debug.log
.vscode
logs/*
.www
t.*
yarn.lock
package-lock.json
config.gypi
test/coverage

2
README.md

@ -41,6 +41,8 @@ Easy Scheduler
- [**使用手册**](https://analysys.github.io/easyscheduler_docs_cn/系统使用手册.html?_blank "系统使用手册") - [**使用手册**](https://analysys.github.io/easyscheduler_docs_cn/系统使用手册.html?_blank "系统使用手册")
- <a href="http://52.82.13.76:8888" target="_blank">我要体验</a> 普通用户登录:demo/demo123
更多文档请参考 <a href="https://analysys.github.io/easyscheduler_docs_cn/" target="_blank">easyscheduler中文在线文档</a> 更多文档请参考 <a href="https://analysys.github.io/easyscheduler_docs_cn/" target="_blank">easyscheduler中文在线文档</a>
### 感谢 ### 感谢

BIN
docs/zh_CN/Easyscheduler文档.pdf

Binary file not shown.

63
docs/zh_CN/README.md

@ -0,0 +1,63 @@
Easy Scheduler
============
[![License](https://img.shields.io/badge/license-Apache%202-4EB1BA.svg)](https://www.apache.org/licenses/LICENSE-2.0.html)
> Easy Scheduler for Big Data
**设计特点:** 一个分布式易扩展的可视化DAG工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中`开箱即用`。
其主要目标如下:
- 以DAG图的方式将Task按照任务的依赖关系关联起来,可实时可视化监控任务的运行状态
- 支持丰富的任务类型:Shell、MR、Spark、SQL(mysql、postgresql、hive、sparksql),Python,Sub_Process、Procedure等
- 支持工作流定时调度、依赖调度、手动调度、手动暂停/停止/恢复,同时支持失败重试/告警、从指定节点恢复失败、Kill任务等操作
- 支持工作流优先级、任务优先级及任务的故障转移及任务超时告警/失败
- 支持工作流全局参数及节点自定义参数设置
- 支持资源文件的在线上传/下载,管理等,支持在线文件创建、编辑
- 支持任务日志在线查看及滚动、在线下载日志等
- 实现集群HA,通过Zookeeper实现Master集群和Worker集群去中心化
- 支持对`Master/Worker` cpu load,memory,cpu在线查看
- 支持工作流运行历史树形/甘特图展示、支持任务状态统计、流程状态统计
- 支持补数
- 支持多租户
- 支持国际化
- 还有更多等待伙伴们探索
### 与同类调度系统的对比
![调度系统对比](http://geek.analysys.cn/static/upload/47/2019-03-01/9609ca82-cf8b-4d91-8dc0-0e2805194747.jpeg)
### 系统部分截图
![](http://geek.analysys.cn/static/upload/221/2019-03-29/0a9dea80-fb02-4fa5-a812-633b67035ffc.jpeg)
![](http://geek.analysys.cn/static/upload/221/2019-04-01/83686def-a54f-4169-8cae-77b1f8300cc1.png)
![](http://geek.analysys.cn/static/upload/221/2019-03-29/83c937c7-1793-4d7a-aa28-b98460329fe0.jpeg)
### 文档
- <a href="https://analysys.github.io/easyscheduler_docs_cn/后端部署文档.html" target="_blank">后端部署文档</a>
- <a href="https://analysys.github.io/easyscheduler_docs_cn/前端部署文档.html" target="_blank">前端部署文档</a>
- [**使用手册**](https://analysys.github.io/easyscheduler_docs_cn/系统使用手册.html?_blank "系统使用手册")
- <a href="http://52.82.13.76:8888" target="_blank">我要体验</a> 普通用户登录:demo/demo123
更多文档请参考 <a href="https://analysys.github.io/easyscheduler_docs_cn/" target="_blank">easyscheduler中文在线文档</a>
### 感谢
- Easy Scheduler使用了很多优秀的开源项目,比如google的guava、guice、grpc,netty,ali的bonecp,quartz,以及apache的众多开源项目等等,
正是由于站在这些开源项目的肩膀上,才有Easy Scheduler的诞生的可能。对此我们对使用的所有开源软件表示非常的感谢!我们也希望自己不仅是开源的受益者,也能成为开源的
贡献者,于是我们决定把易调度贡献出来,并承诺长期维护。也希望对开源有同样热情和信念的伙伴加入进来,一起为开源献出一份力!
### 帮助
The fastest way to get response from our developers is to submit issues, or add our wechat : 510570367

1
docs/zh_CN/SUMMARY.md

@ -12,6 +12,7 @@
* [系统使用手册](系统使用手册.md#使用手册) * [系统使用手册](系统使用手册.md#使用手册)
* [系统架构设计](系统架构设计.md#系统架构设计) * [系统架构设计](系统架构设计.md#系统架构设计)
* 前端开发文档 * 前端开发文档
* [开发环境搭建](前端部署文档.md)
* [项目目录结构](前端开发文档.md#项目目录结构) * [项目目录结构](前端开发文档.md#项目目录结构)
* [系统功能模块](前端开发文档.md#系统功能模块) * [系统功能模块](前端开发文档.md#系统功能模块)
* [路由和状态管理](前端开发文档.md#路由和状态管理) * [路由和状态管理](前端开发文档.md#路由和状态管理)

23
docs/zh_CN/book.json

@ -0,0 +1,23 @@
{
"title": "调度系统-EasyScheduler",
"author": "YIGUAN",
"description": "调度系统",
"language": "zh-hans",
"gitbook": "3.2.3",
"styles": {
"website": "./styles/website.css"
},
"structure": {
"readme": "README.md"
},
"plugins":[
"expandable-chapters",
"insert-logo-link"
],
"pluginsConfig": {
"insert-logo-link": {
"src": "http://geek.analysys.cn/static/upload/236/2019-03-29/379450b4-7919-4707-877c-4d33300377d4.png",
"url": "https://github.com/analysys/EasyScheduler"
}
}
}

BIN
docs/zh_CN/images/mysql_edit.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 100 KiB

22
docs/zh_CN/styles/website.css

@ -0,0 +1,22 @@
.gitbook-link {
display: none !important;
}
.book.font-family-0 {
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif !important;
}
.body-inner .i18n {
position: absolute;
right: 140px;
top: 0;
height: 50px;
line-height: 50px;
padding: 0 10px;
color: #ccc;
font-size: 14px;
display: inline-block;
}
.body-inner .i18n:hover {
color: #999;
}

210
docs/zh_CN/前端部署文档.md

@ -1,12 +1,15 @@
# 前端部署文档 # 前端部署文档
- ##### 1. 开发环境搭建
## 前端项目环境构建及编译 - ##### 2. 自动化部署
#### Escheduler项目前端技术栈
##### `Vue + es6 + Ans-ui + d3 + jsplumb + lodash`
#### 开发环境 - ##### 3. 手动部署
##### `Node`
- ##### 4. Liunx下使用node启动并且守护进程
### 1.开发环境搭建
- #### node安装 - #### node安装
Node包下载 (注意版本 8.9.4) `https://nodejs.org/download/release/v8.9.4/` Node包下载 (注意版本 8.9.4) `https://nodejs.org/download/release/v8.9.4/`
@ -40,166 +43,30 @@ API_BASE = http://192.168.220.204:12345
- `npm run build` 项目打包 (打包后根目录会创建一个名为dist文件夹,用于发布线上Nginx) - `npm run build` 项目打包 (打包后根目录会创建一个名为dist文件夹,用于发布线上Nginx)
## 安装及配置
### (1-1) Nginx安装
安装 `wget http://nginx.org/download/nginx-1.10.1.tar.gz`
Nginx的配置及运行需要pcre、zlib等软件包的支持,因此应预先安装这些软件的开发包(devel),以便提供相应的库和头文件,确保Nginx的安装顺利完成。
```
[root@nginx ~]# service iptables stop
[root@nginx ~]# setenforce 0
[root@nginx ~]# mount /dev/cdrom /mnt/
[root@nginx ~]# vim /etc/yum.repos.d/yum.repo
[base]
name=RedHat Enterprise Linux Server
baseurl=file:///mnt/Packages
gpgcheck=0
[root@nginx ~]# yum -y install pcre-devel zilb-devel openssl-devel
```
### (1-2) 创建运行用户、组
Nginx服务程序默认以nobody身份运行,建议为其创建专门的用户账号,以便更准确地控制其访问权限,增加灵活性、降低安全风险。如:创建一个名为nginx的用户,不建立宿主目录,也禁止登录到shell环境。
```
[root@nginx ~]# useradd -M -s /sbin/nologin escheduler
```
### (1-3) 编译安装nginx
释放nginx源码包
```
[root@nginx ~]# tar xf nginx-1.6.2.tar.gz -C /usr/src/
```
编译前配置
```
[root@nginx ~]# cd /usr/src/nginx-1.6.2/
[root@nginx nginx-1.6.2]# ./configure --prefix=/usr/local/nginx --user=escheduler --group=escheduler --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module
```
注:配置前可以参考 ./configure --help给出说明
```
--prefix 设定Nginx的安装目录
--user和—group 指定Nginx运行用户和组
--with-http_stub_status_module 启用http_stub_status_module模块以支持状态统计
--with-http_ssl_module 启用SSL模块
```
> #### 错误
```
[root@centos nginx-1.6.2]# ./configure --prefix=/usr/local/nginx --user=escheduler --group=escheduler --with-http_stub_status_module --with-http_ssl_module --with-http_flv_module --with-http_gzip_static_module
checking for OS
+ Linux 2.6.32-431.el6.i686 i686
checking for C compiler ... not found
./configure: error: C compiler cc is not found
```
> #### 解决方法
```
yum -y install gcc gcc-c++
```
编译 安装
```
[root@nginx nginx-1.6.2]# make && make install
```
为了使Nginx服务器的运行更加方便,可以为主程序nginx创建链接文件,以便管理员直接执行nginx命令就可以调用Nginx的主程序。
```
[root@nginx nginx-1.6.2]# ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/
[root@nginx nginx-1.6.2]# ll /usr/local/bin/nginx
lrwxrwxrwx 1 root root 27 12-29 07:24 /usr/local/bin/nginx -> /usr/local/nginx/sbin/nginx
```
Nginx的运行控制 ### 2.自动化部署
与Apache的主程序httpd类似,Nginx的主程序也提供了"-t"选项用来对配置文件进行检查,以便找出不当或错误的配置。配置文件nginx.conf默认位于安装目录/usr/local/nginx/conf/目录中。若要检查位于其他位置的配置文件,可使用"-c"选项来指定路径。
```
root@nginx conf]# nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
```
启动、停止Nginx 在项目`escheduler-ui`根目录编辑安装文件`vi install(线上环境).sh`
直接运行nginx即可启动Nginx服务器,这种方式将使用默认的配置文件,若要改用其他配置文件,需添加"-c 配置文件路径"选项来指定路径。需要注意的是,若服务器中已安装有httpd等其他WEB服务软件,应采取措施(修改端口,停用或卸载)避免部突。
```
[root@nginx conf]# chown -R escheduler:escheduler /usr/local/nginx
/usr/local/nginx/conf/nginx.conf 更改前端访问端口和后端代理接口地址
[root@nginx conf]# netstat -anpt |grep :80
[root@nginx conf]# nginx
[root@nginx conf]# netstat -anpt |grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 6810/nginx: master
``` ```
# 配置前端访问端口
esc_proxy="8888"
通过检查 Nginx程序的监听状态,或者在浏览器中访问此WEB服务(默认页面将显示"Welcome to nginx!"),可以确认Nginx服务是否正常运行。 # 配置代理后端接口
``` esc_proxy_port="http://192.168.220.154:12345"
[root@nginx ~]# yum -y install elinks
[root@nginx ~]# elinks --dump http://localhost
Welcome to nginx!
``` ```
主程序Nginx支持标准的进程信号,通过kill或者killall命令传送 前端自动部署基于`yum`操作,部署之前请先安装更新`yum
```
HUP 重载配置 等同于-1
QUIT 退出进程 等同于-3
KILL 杀死进程
[root@nginx ~]# killall -s HUP nginx
[root@nginx ~]# killall -s QUIT nginx
[root@nginx ~]# netstat -anpt |grep :80
```
当Nginx进程运行时,PID号默认存放在logs/目录下的nginx.pid文件中,因此若改用kill命令,也可以根据nginx.pid文件中的PID号来进行控制。 在项目`escheduler-ui`根目录执行`./install(线上环境).sh`
为了使Nginx服务的启动、停止、重载等操作更加方便,可以编写Nginx服务脚本,并使用chkconfig和service工具来进行管理,也更加符合RHEL系统的管理习惯。
```
[root@nginx ~]# vim /etc/init.d/nginx
```
脚本一
```
#!/bin/bash
# chkconfig: 2345 99 20
# description: Nginx Server Control Script
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
case "$1" in
start)
$PROG
;;
stop)
kill -s QUIT $(cat $PIDF)
;;
restart)
$0 stop
$0 start
;;
reload)
kill -s HUP $(cat $PIDF)
;;
*)
echo "Usage: $0 (start|stop|restart|reload)"
exit 1
esac
exit 0
[root@nginx ~]# chmod +x /etc/init.d/nginx
[root@nginx ~]# chkconfig --add nginx
[root@nginx ~]# chkconfig nginx on
[root@nginx ~]# chkconfig --list nginx
nginx 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
```
报错的话: `/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf`
这样就可以通过nginx脚本来启动、停止、重启、重载Nginx服务器了。
### (2-1) root安装 ### 3.手动部署
安装epel源 `yum install epel-release -y` 安装epel源 `yum install epel-release -y`
@ -214,16 +81,13 @@ nginx 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
- 状态 `systemctl status nginx` - 状态 `systemctl status nginx`
#项目生产环境配置
> #### 创建静态页面存放目录 > #### 创建静态页面存放目录
``` ```
mkdir /data2_4T/escheduler_front/escheduler/server mkdir /data2_4T/escheduler_front/escheduler/server
``` ```
> #### 配置文件地址 > #### 配置文件地址
``` ```
/etc/nginx/conf.d/default.conf /etc/nginx/conf.d/escheduler.conf
``` ```
> #### 配置信息 > #### 配置信息
``` ```
@ -265,8 +129,7 @@ systemctl restart nginx
``` ```
#### 前端项目发布
## 前端项目发布
前端在开发环境(dev)中运行 `npm run build` 命令,生成打包文件(dist)包 前端在开发环境(dev)中运行 `npm run build` 命令,生成打包文件(dist)包
@ -275,6 +138,39 @@ systemctl restart nginx
访问地址 `http://localhost:8888/#/` 访问地址 `http://localhost:8888/#/`
### 4.Liunx下使用node启动并且守护进程
安装pm2 `npm install -g pm2`
在项目`escheduler-ui`根目录执行 `pm2 start npm -- run dev` 启动项目
#### 命令
- 启用 `pm2 start npm -- run dev`
- 停止 `pm2 stop npm`
- 删除 `pm2 delete npm`
- 状态 `pm2 list`
```
[root@localhost escheduler-ui]# pm2 start npm -- run dev
[PM2] Applying action restartProcessId on app [npm](ids: 0)
[PM2] [npm](0) ✓
[PM2] Process successfully started
┌──────────┬────┬─────────┬──────┬──────┬────────┬─────────┬────────┬─────┬──────────┬──────┬──────────┐
│ App name │ id │ version │ mode │ pid │ status │ restart │ uptime │ cpu │ mem │ user │ watching │
├──────────┼────┼─────────┼──────┼──────┼────────┼─────────┼────────┼─────┼──────────┼──────┼──────────┤
│ npm │ 0 │ N/A │ fork │ 6168 │ online │ 31 │ 0s │ 0% │ 5.6 MB │ root │ disabled │
└──────────┴────┴─────────┴──────┴──────┴────────┴─────────┴────────┴─────┴──────────┴──────┴──────────┘
Use `pm2 show <id|name>` to get more details about an app
```
## 问题 ## 问题
#### 1. 上传文件大小限制 #### 1. 上传文件大小限制
编辑配置文件 `vi /etc/nginx/nginx.conf` 编辑配置文件 `vi /etc/nginx/nginx.conf`

462
docs/zh_CN/后端部署文档.md

@ -3,10 +3,10 @@
## 基础软件安装 ## 基础软件安装
* [Mysql](https://blog.csdn.net/u011886447/article/details/79796802) (5.5+) : 必装 * [Mysql](http://geek.analysys.cn/topic/124) (5.5+) : 必装
* [JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html) (1.8+) : 必装 * [JDK](https://www.oracle.com/technetwork/java/javase/downloads/index.html) (1.8+) : 必装
* [ZooKeeper](https://www.jianshu.com/p/de90172ea680)(3.4.6) :必装 * [ZooKeeper](https://www.jianshu.com/p/de90172ea680)(3.4.6) :必装
* [Hadoop](https://blog.csdn.net/Evankaka/article/details/51612437)(2.7.3) :选装, 如果需要使用到资源上传功能,MapReduce任务提交则需要配置Hadoop(上传的资源文件目前保存在Hdfs上) * [Hadoop](https://blog.csdn.net/Evankaka/article/details/51612437)(2.6+) :选装, 如果需要使用到资源上传功能,MapReduce任务提交则需要配置Hadoop(上传的资源文件目前保存在Hdfs上)
* [Hive](https://staroon.pro/2017/12/09/HiveInstall/)(1.2.1) : 选装,hive任务提交需要安装 * [Hive](https://staroon.pro/2017/12/09/HiveInstall/)(1.2.1) : 选装,hive任务提交需要安装
* Spark(1.x,2.x) : 选装,Spark任务提交需要安装 * Spark(1.x,2.x) : 选装,Spark任务提交需要安装
* PostgreSQL(8.2.15+) : 选装,PostgreSQL PostgreSQL存储过程需要安装 * PostgreSQL(8.2.15+) : 选装,PostgreSQL PostgreSQL存储过程需要安装
@ -27,15 +27,6 @@
正常编译完后,会在当前目录生成 target/escheduler-{version}/ 正常编译完后,会在当前目录生成 target/escheduler-{version}/
```
bin
conf
lib
script
sql
install.sh
```
- 说明 - 说明
``` ```
@ -74,7 +65,7 @@ mysql -h {host} -u {user} -p{password} -D {db} < quartz.sql
## 创建部署用户 ## 创建部署用户
因为escheduler worker都是以 sudo -u {linux-user} 方式来执行作业,所以部署用户需要有 sudo 权限,而且是免密的。 - 在所有需要部署调度的机器上创建部署用户,因为worker服务是以 sudo -u {linux-user} 方式来执行作业,所以部署用户需要有 sudo 权限,而且是免密的。
```部署账号 ```部署账号
vi /etc/sudoers vi /etc/sudoers
@ -86,386 +77,81 @@ escheduler ALL=(ALL) NOPASSWD: NOPASSWD: ALL
#Default requiretty #Default requiretty
``` ```
## 配置文件说明 ## ssh免密配置
在部署机器和其他安装机器上配置ssh免密登录,如果要在部署机上安装调度,需要配置本机免密登录自己
```
说明:配置文件位于 target/escheduler-{version}/conf 下面
```
### escheduler-alert
配置邮件告警信息
* alert.properties
```
#以qq邮箱为例,如果是别的邮箱,请更改对应配置
#alert type is EMAIL/SMS
alert.type=EMAIL
# mail server configuration
mail.protocol=SMTP
mail.server.host=smtp.exmail.qq.com
mail.server.port=25
mail.sender=xxxxxxx@qq.com
mail.passwd=xxxxxxx
# xls file path, need manually create it before use if not exist
xls.file.path=/opt/xls
```
### escheduler-common
通用配置文件配置,队列选择及地址配置,通用文件目录配置
- common/common.properties
```
#task queue implementation, default "zookeeper"
escheduler.queue.impl=zookeeper
# user data directory path, self configuration, please make sure the directory exists and have read write permissions
data.basedir.path=/tmp/escheduler
# directory path for user data download. self configuration, please make sure the directory exists and have read write permissions
data.download.basedir.path=/tmp/escheduler/download
# process execute directory. self configuration, please make sure the directory exists and have read write permissions
process.exec.basepath=/tmp/escheduler/exec
# data base dir, resource file will store to this hadoop hdfs path, self configuration, please make sure the directory exists on hdfs and have read write permissions。"/escheduler" is recommended
data.store2hdfs.basepath=/escheduler
# whether hdfs starts
hdfs.startup.state=true
# system env path. self configuration, please make sure the directory and file exists and have read write execute permissions
escheduler.env.path=/opt/.escheduler_env.sh
escheduler.env.py=/opt/escheduler_env.py
#resource.view.suffixs
resource.view.suffixs=txt,log,sh,conf,cfg,py,java,sql,hql,xml
# is development state? default "false"
development.state=false
```
SHELL任务 环境变量配置
```
说明:配置文件位于 target/escheduler-{version}/conf/env 下面,这个会是Worker执行任务时加载的环境
```
.escheduler_env.sh
```
export HADOOP_HOME=/opt/soft/hadoop
export HADOOP_CONF_DIR=/opt/soft/hadoop/etc/hadoop
export SPARK_HOME1=/opt/soft/spark1
export SPARK_HOME2=/opt/soft/spark2
export PYTHON_HOME=/opt/soft/python
export JAVA_HOME=/opt/soft/java
export HIVE_HOME=/opt/soft/hive
export PATH=$HADOOP_HOME/bin:$SPARK_HOME1/bin:$SPARK_HOME2/bin:$PYTHON_HOME/bin:$JAVA_HOME/bin:$HIVE_HOME/bin:$PATH
```
Python任务 环境变量配置
```
说明:配置文件位于 target/escheduler-{version}/conf/env 下面
```
escheduler_env.py
```
import os
HADOOP_HOME="/opt/soft/hadoop"
SPARK_HOME1="/opt/soft/spark1"
SPARK_HOME2="/opt/soft/spark2"
PYTHON_HOME="/opt/soft/python"
JAVA_HOME="/opt/soft/java"
HIVE_HOME="/opt/soft/hive"
PATH=os.environ['PATH']
PATH="%s/bin:%s/bin:%s/bin:%s/bin:%s/bin:%s/bin:%s"%(HIVE_HOME,HADOOP_HOME,SPARK_HOME1,SPARK_HOME2,JAVA_HOME,PYTHON_HOME,PATH)
os.putenv('PATH','%s'%PATH)
```
hadoop 配置文件
- common/hadoop/hadoop.properties
```
# ha or single namenode,If namenode ha needs to copy core-site.xml and hdfs-site.xml to the conf directory
fs.defaultFS=hdfs://mycluster:8020
#resourcemanager ha note this need ips , this empty if single
yarn.resourcemanager.ha.rm.ids=192.168.xx.xx,192.168.xx.xx
# If it is a single resourcemanager, you only need to configure one host name. If it is resourcemanager HA, the default configuration is fine
yarn.application.status.address=http://ark1:8088/ws/v1/cluster/apps/%s
```
定时器配置文件
- quartz.properties
```
#============================================================================
# Configure Main Scheduler Properties
#============================================================================
org.quartz.scheduler.instanceName = EasyScheduler
org.quartz.scheduler.instanceId = AUTO
org.quartz.scheduler.makeSchedulerThreadDaemon = true
org.quartz.jobStore.useProperties = false
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.makeThreadsDaemons = true
org.quartz.threadPool.threadCount = 25
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_
org.quartz.jobStore.isClustered = true
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.clusterCheckinInterval = 5000
org.quartz.jobStore.dataSource = myDs
#============================================================================
# Configure Datasources
#============================================================================
org.quartz.dataSource.myDs.driver = com.mysql.jdbc.Driver
org.quartz.dataSource.myDs.URL = jdbc:mysql://192.168.xx.xx:3306/escheduler?characterEncoding=utf8&useSSL=false
org.quartz.dataSource.myDs.user = xx
org.quartz.dataSource.myDs.password = xx
org.quartz.dataSource.myDs.maxConnections = 10
org.quartz.dataSource.myDs.validationQuery = select 1
```
zookeeper 配置文件
- zookeeper.properties
```
#zookeeper cluster
zookeeper.quorum=192.168.xx.xx:2181,192.168.xx.xx:2181,192.168.xx.xx:2181
#escheduler root directory
zookeeper.escheduler.root=/escheduler
#zookeeper server dirctory
zookeeper.escheduler.dead.servers=/escheduler/dead-servers
zookeeper.escheduler.masters=/escheduler/masters
zookeeper.escheduler.workers=/escheduler/workers
#zookeeper lock dirctory
zookeeper.escheduler.lock.masters=/escheduler/lock/masters
zookeeper.escheduler.lock.workers=/escheduler/lock/workers
#escheduler failover directory
zookeeper.escheduler.lock.masters.failover=/escheduler/lock/failover/masters
zookeeper.escheduler.lock.workers.failover=/escheduler/lock/failover/workers
#escheduler failover directory
zookeeper.session.timeout=300
zookeeper.connection.timeout=300
zookeeper.retry.sleep=1000
zookeeper.retry.maxtime=5
```
- [将 **主机器** 和各个其它机器SSH打通](http://geek.analysys.cn/topic/113)
### escheduler-dao ## 部署
dao数据源配置 ### 1. 修改安装目录权限
- dao/data_source.properties - 安装目录如下:
``` ```
# base spring data source configuration bin
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource conf
spring.datasource.driver-class-name=com.mysql.jdbc.Driver install.sh
spring.datasource.url=jdbc:mysql://192.168.xx.xx:3306/escheduler?characterEncoding=UTF-8 lib
spring.datasource.username=xx script
spring.datasource.password=xx sql
# connection configuration
spring.datasource.initialSize=5
# min connection number
spring.datasource.minIdle=5
# max connection number
spring.datasource.maxActive=50
# max wait time for get a connection in milliseconds. if configuring maxWait, fair locks are enabled by default and concurrency efficiency decreases.
# If necessary, unfair locks can be used by configuring the useUnfairLock attribute to true.
spring.datasource.maxWait=60000
# milliseconds for check to close free connections
spring.datasource.timeBetweenEvictionRunsMillis=60000
# the Destroy thread detects the connection interval and closes the physical connection in milliseconds if the connection idle time is greater than or equal to minEvictableIdleTimeMillis.
spring.datasource.timeBetweenConnectErrorMillis=60000
# the longest time a connection remains idle without being evicted, in milliseconds
spring.datasource.minEvictableIdleTimeMillis=300000
#the SQL used to check whether the connection is valid requires a query statement. If validation Query is null, testOnBorrow, testOnReturn, and testWhileIdle will not work.
spring.datasource.validationQuery=SELECT 1
#check whether the connection is valid for timeout, in seconds
spring.datasource.validationQueryTimeout=3
# when applying for a connection, if it is detected that the connection is idle longer than time Between Eviction Runs Millis,
# validation Query is performed to check whether the connection is valid
spring.datasource.testWhileIdle=true
#execute validation to check if the connection is valid when applying for a connection
spring.datasource.testOnBorrow=true
#execute validation to check if the connection is valid when the connection is returned
spring.datasource.testOnReturn=false
spring.datasource.defaultAutoCommit=true
spring.datasource.keepAlive=true
# open PSCache, specify count PSCache for every connection
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
```
### escheduler-server
master配置文件
- master.properties
```
# master execute thread num
master.exec.threads=100
# master execute task number in parallel
master.exec.task.number=20
# master heartbeat interval
master.heartbeat.interval=10
# master commit task retry times
master.task.commit.retryTimes=5
# master commit task interval
master.task.commit.interval=100
# only less than cpu avg load, master server can work. default value : the number of cpu cores * 2
master.max.cpuload.avg=10
# only larger than reserved memory, master server can work. default value : physical memory * 1/10, unit is G.
master.reserved.memory=1
``` ```
- 修改权限(deployUser修改为对应部署用户)
`sudo chown -R deployUser:deployUser *`
### 2. 修改环境变量文件
worker配置文件 - 根据业务需求,修改conf/env/目录下的**escheduler_env.py**,**.escheduler_env.sh**两个文件中的环境变量
- worker.properties
```
# worker execute thread num
worker.exec.threads=100
# worker heartbeat interval
worker.heartbeat.interval=10
# submit the number of tasks at a time ### 3. 修改部署参数
worker.fetch.task.num = 10
- 修改 **install.sh**中的参数,替换成自身业务所需的值
# only less than cpu avg load, worker server can work. default value : the number of cpu cores * 2 - 如果使用hdfs相关功能,需要拷贝**hdfs-site.xml**和**core-site.xml**到conf目录下
worker.max.cpuload.avg=10
# only larger than reserved memory, worker server can work. default value : physical memory * 1/6, unit is G. ### 4. 一键部署
worker.reserved.memory=1
```
- 安装zookeeper工具
`pip install kazoo`
### escheduler-api - 切换到部署用户,一键部署
web配置文件 `sh install.sh`
- application.properties - jps查看服务是否启动
```aidl
MasterServer ----- master服务
WorkerServer ----- worker服务
LoggerServer ----- logger服务
ApiApplicationServer ----- api服务
AlertServer ----- alert服务
``` ```
# server port
server.port=12345
# session config
server.session.timeout=7200
server.context-path=/escheduler/
# file size limit for upload ## 日志查看
spring.http.multipart.max-file-size=1024MB 日志统一存放于指定文件夹内
spring.http.multipart.max-request-size=1024MB
# post content ```日志路径
server.max-http-post-size=5000000 logs/
├── escheduler-alert-server.log
├── escheduler-master-server.log
|—— escheduler-worker-server.log
|—— escheduler-api-server.log
|—— escheduler-logger-server.log
``` ```
## 启停服务
* 一键停止集群所有服务
## 伪分布式部署 ` sh ./script/stop_all.sh`
### 1,创建部署用户
如上 **创建部署用户** * 一键开启集群所有服务
### 2,根据实际需求来创建HDFS根路径 ` sh ./script/start_all.sh`
根据 **common/common.properties****hdfs.startup.state** 的配置来判断是否启动HDFS,如果启动,则需要创建HDFS根路径,并将 **owner** 修改为**部署用户**,否则忽略此步骤
### 3,项目编译
如上进行 **项目编译**
### 4,修改配置文件
根据 **配置文件说明** 修改配置文件和 **环境变量** 文件
### 5,创建目录并将环境变量文件复制到指定目录
- 创建 **common/common.properties** 下的data.basedir.path、data.download.basedir.path和process.exec.basepath路径
- 将**.escheduler_env.sh** 和 **escheduler_env.py** 两个环境变量文件复制到 **common/common.properties**配置的**escheduler.env.path****escheduler.env.py** 的目录下,并将 **owner** 修改为**部署用户**
### 6,启停服务
* 启停Master * 启停Master
@ -500,55 +186,3 @@ sh ./bin/escheduler-daemon.sh start alert-server
sh ./bin/escheduler-daemon.sh stop alert-server sh ./bin/escheduler-daemon.sh stop alert-server
``` ```
## 分布式部署
### 1,创建部署用户
- 在需要部署调度的机器上如上 **创建部署用户**
- [将 **主机器** 和各个其它机器SSH打通](https://blog.csdn.net/thinkmore1314/article/details/22489203)
### 2,根据实际需求来创建HDFS根路径
根据 **common/common.properties****hdfs.startup.state** 的配置来判断是否启动HDFS,如果启动,则需要创建HDFS根路径,并将 **owner** 修改为**部署用户**,否则忽略此步骤
### 3,项目编译
如上进行 **项目编译**
### 4,将环境变量文件复制到指定目录
将**.escheduler_env.sh** 和 **escheduler_env.py** 两个环境变量文件复制到 **common/common.properties**配置的**escheduler.env.path****escheduler.env.py** 的目录下,并将 **owner** 修改为**部署用户**
### 5,修改 install.sh
修改 install.sh 中变量的值,替换成自身业务所需的值
### 6,一键部署
- 安装 pip install kazoo
- 使用部署用户 sh install.sh 一键部署
- 注意:scp_hosts.sh 里 `tar -zxvf $workDir/../escheduler-1.0.0.tar.gz -C $installPath` 中的版本号(1.0.0)需要执行前手动替换成对应的版本号
## 服务监控
monitor_server.py 脚本是监听,master和worker服务挂掉重启的脚本
注意:在全部服务都启动之后启动
nohup python -u monitor_server.py > nohup.out 2>&1 &
## 日志查看
日志统一存放于指定文件夹内
```日志路径
logs/
├── escheduler-alert-server.log
├── escheduler-master-server.log
|—— escheduler-worker-server.log
|—— escheduler-api-server.log
|—— escheduler-logger-server.log
```

2
escheduler-alert/pom.xml

@ -4,7 +4,7 @@
<parent> <parent>
<groupId>cn.analysys</groupId> <groupId>cn.analysys</groupId>
<artifactId>escheduler</artifactId> <artifactId>escheduler</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.1-SNAPSHOT</version>
</parent> </parent>
<artifactId>escheduler-alert</artifactId> <artifactId>escheduler-alert</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

2
escheduler-alert/src/main/java/cn/escheduler/alert/utils/Constants.java

@ -57,6 +57,8 @@ public class Constants {
public static final String MAIL_TRANSPORT_PROTOCOL = "mail.transport.protocol"; public static final String MAIL_TRANSPORT_PROTOCOL = "mail.transport.protocol";
public static final String MAIL_SMTP_STARTTLS_ENABLE = "mail.smtp.starttls.enable";
public static final String TEXT_HTML_CHARSET_UTF_8 = "text/html;charset=utf-8"; public static final String TEXT_HTML_CHARSET_UTF_8 = "text/html;charset=utf-8";
public static final String STRING_TRUE = "true"; public static final String STRING_TRUE = "true";

7
escheduler-alert/src/main/java/cn/escheduler/alert/utils/MailUtils.java

@ -104,6 +104,10 @@ public class MailUtils {
Map<String,Object> retMap = new HashMap<>(); Map<String,Object> retMap = new HashMap<>();
retMap.put(Constants.STATUS, false); retMap.put(Constants.STATUS, false);
// if there is no receivers && no receiversCc, no need to process
if (CollectionUtils.isEmpty(receivers) && CollectionUtils.isEmpty(receiversCc)) {
return retMap;
}
receivers.removeIf((from) -> (StringUtils.isEmpty(from))); receivers.removeIf((from) -> (StringUtils.isEmpty(from)));
@ -117,6 +121,8 @@ public class MailUtils {
email.setSmtpPort(mailServerPort); email.setSmtpPort(mailServerPort);
//set charset //set charset
email.setCharset(Constants.UTF_8); email.setCharset(Constants.UTF_8);
// TLS verification
email.setTLS(true);
if (CollectionUtils.isNotEmpty(receivers)){ if (CollectionUtils.isNotEmpty(receivers)){
// receivers mail // receivers mail
for (String receiver : receivers) { for (String receiver : receivers) {
@ -267,6 +273,7 @@ public class MailUtils {
props.setProperty(Constants.MAIL_HOST, mailServerHost); props.setProperty(Constants.MAIL_HOST, mailServerHost);
props.setProperty(Constants.MAIL_SMTP_AUTH, Constants.STRING_TRUE); props.setProperty(Constants.MAIL_SMTP_AUTH, Constants.STRING_TRUE);
props.setProperty(Constants.MAIL_TRANSPORT_PROTOCOL, mailProtocol); props.setProperty(Constants.MAIL_TRANSPORT_PROTOCOL, mailProtocol);
props.setProperty(Constants.MAIL_SMTP_STARTTLS_ENABLE, Constants.STRING_TRUE);
Authenticator auth = new Authenticator() { Authenticator auth = new Authenticator() {
@Override @Override
protected PasswordAuthentication getPasswordAuthentication() { protected PasswordAuthentication getPasswordAuthentication() {

2
escheduler-api/pom.xml

@ -3,7 +3,7 @@
<parent> <parent>
<groupId>cn.analysys</groupId> <groupId>cn.analysys</groupId>
<artifactId>escheduler</artifactId> <artifactId>escheduler</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.1-SNAPSHOT</version>
</parent> </parent>
<artifactId>escheduler-api</artifactId> <artifactId>escheduler-api</artifactId>
<packaging>jar</packaging> <packaging>jar</packaging>

2
escheduler-api/src/main/java/cn/escheduler/api/controller/ProcessDefinitionController.java

@ -127,7 +127,7 @@ public class ProcessDefinitionController extends BaseController{
logger.info("login user {}, update process define, project name: {}, process define name: {}, " + logger.info("login user {}, update process define, project name: {}, process define name: {}, " +
"process_definition_json: {}, desc: {}, locations:{}, connects:{}", "process_definition_json: {}, desc: {}, locations:{}, connects:{}",
loginUser.getUserName(), projectName, name, processDefinitionJson,desc, locations, connects); loginUser.getUserName(), projectName, name, processDefinitionJson,desc, locations, connects);
Map<String, Object> result = processDefinitionService.updateProccessDefinition(loginUser, projectName, id, name, Map<String, Object> result = processDefinitionService.updateProcessDefinition(loginUser, projectName, id, name,
processDefinitionJson, desc, locations, connects); processDefinitionJson, desc, locations, connects);
return returnDataList(result); return returnDataList(result);
}catch (Exception e){ }catch (Exception e){

105
escheduler-api/src/main/java/cn/escheduler/api/controller/QueueController.java

@ -17,6 +17,7 @@
package cn.escheduler.api.controller; package cn.escheduler.api.controller;
import cn.escheduler.api.enums.Status;
import cn.escheduler.api.service.QueueService; import cn.escheduler.api.service.QueueService;
import cn.escheduler.api.utils.Constants; import cn.escheduler.api.utils.Constants;
import cn.escheduler.api.utils.Result; import cn.escheduler.api.utils.Result;
@ -29,7 +30,7 @@ import org.springframework.web.bind.annotation.*;
import java.util.Map; import java.util.Map;
import static cn.escheduler.api.enums.Status.QUERY_QUEUE_LIST_ERROR; import static cn.escheduler.api.enums.Status.*;
/** /**
@ -63,5 +64,107 @@ public class QueueController extends BaseController{
} }
} }
/**
* query queue list paging
* @param loginUser
* @return
*/
@GetMapping(value="/list-paging")
@ResponseStatus(HttpStatus.OK)
public Result queryQueueListPaging(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@RequestParam("pageNo") Integer pageNo,
@RequestParam(value = "searchVal", required = false) String searchVal,
@RequestParam("pageSize") Integer pageSize){
try{
logger.info("login user {}, query queue list,search value:{}", loginUser.getUserName(),searchVal);
Map<String, Object> result = checkPageParams(pageNo, pageSize);
if(result.get(Constants.STATUS) != Status.SUCCESS){
return returnDataListPaging(result);
}
result = queueService.queryList(loginUser,searchVal,pageNo,pageSize);
return returnDataListPaging(result);
}catch (Exception e){
logger.error(QUERY_QUEUE_LIST_ERROR.getMsg(),e);
return error(QUERY_QUEUE_LIST_ERROR.getCode(), QUERY_QUEUE_LIST_ERROR.getMsg());
}
}
/**
* create queue
*
* @param loginUser
* @param queue
* @param queueName
* @return
*/
@PostMapping(value = "/create")
@ResponseStatus(HttpStatus.CREATED)
public Result createQueue(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@RequestParam(value = "queue") String queue,
@RequestParam(value = "queueName") String queueName) {
logger.info("login user {}, create queue, queue: {}, queueName: {}",
loginUser.getUserName(), queue, queueName);
try {
Map<String, Object> result = queueService.createQueue(loginUser,queue,queueName);
return returnDataList(result);
}catch (Exception e){
logger.error(CREATE_QUEUE_ERROR.getMsg(),e);
return error(CREATE_QUEUE_ERROR.getCode(), CREATE_QUEUE_ERROR.getMsg());
}
}
/**
* update queue
*
* @param loginUser
* @param queue
* @param queueName
* @return
*/
@PostMapping(value = "/update")
@ResponseStatus(HttpStatus.CREATED)
public Result updateQueue(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@RequestParam(value = "id") int id,
@RequestParam(value = "queue") String queue,
@RequestParam(value = "queueName") String queueName) {
logger.info("login user {}, update queue, id: {}, queue: {}, queueName: {}",
loginUser.getUserName(), id,queue, queueName);
try {
Map<String, Object> result = queueService.updateQueue(loginUser,id,queue,queueName);
return returnDataList(result);
}catch (Exception e){
logger.error(UPDATE_QUEUE_ERROR.getMsg(),e);
return error(UPDATE_QUEUE_ERROR.getCode(), UPDATE_QUEUE_ERROR.getMsg());
}
}
/**
* verify queue and queue name
*
* @param loginUser
* @param queue
* @param queueName
* @return
*/
@PostMapping(value = "/verify-queue")
@ResponseStatus(HttpStatus.OK)
public Result verifyQueue(@RequestAttribute(value = Constants.SESSION_USER) User loginUser,
@RequestParam(value ="queue") String queue,
@RequestParam(value ="queueName") String queueName
) {
try{
logger.info("login user {}, verfiy queue: {} queue name: {}",
loginUser.getUserName(),queue,queueName);
return queueService.verifyQueue(queue,queueName);
}catch (Exception e){
logger.error(VERIFY_QUEUE_ERROR.getMsg(),e);
return error(Status.VERIFY_QUEUE_ERROR.getCode(), Status.VERIFY_QUEUE_ERROR.getMsg());
}
}
} }

7
escheduler-api/src/main/java/cn/escheduler/api/enums/Status.java

@ -149,6 +149,13 @@ public enum Status {
TENANT_CODE_HAS_ALREADY_EXISTS(10124,"tenant code has already exists"), TENANT_CODE_HAS_ALREADY_EXISTS(10124,"tenant code has already exists"),
IP_IS_EMPTY(10125,"ip is empty"), IP_IS_EMPTY(10125,"ip is empty"),
SCHEDULE_CRON_REALEASE_NEED_NOT_CHANGE(10126, "schedule release is already {0}"), SCHEDULE_CRON_REALEASE_NEED_NOT_CHANGE(10126, "schedule release is already {0}"),
CREATE_QUEUE_ERROR(10127, "create queue error"),
QUEUE_NOT_EXIST(10128, "queue {0} not exists"),
QUEUE_VALUE_EXIST(10129, "queue value {0} already exists"),
QUEUE_NAME_EXIST(10130, "queue name {0} already exists"),
UPDATE_QUEUE_ERROR(10131, "update queue error"),
NEED_NOT_UPDATE_QUEUE(10132, "no content changes, no updates are required"),
VERIFY_QUEUE_ERROR(10133,"verify queue error"),
UDF_FUNCTION_NOT_EXIST(20001, "UDF function not found"), UDF_FUNCTION_NOT_EXIST(20001, "UDF function not found"),

2
escheduler-api/src/main/java/cn/escheduler/api/quartz/ProcessScheduleJob.java

@ -125,7 +125,7 @@ public class ProcessScheduleJob implements Job {
} }
Command command = new Command(); Command command = new Command();
command.setCommandType(CommandType.START_PROCESS); command.setCommandType(CommandType.SCHEDULER);
command.setExecutorId(schedule.getUserId()); command.setExecutorId(schedule.getUserId());
command.setFailureStrategy(schedule.getFailureStrategy()); command.setFailureStrategy(schedule.getFailureStrategy());
command.setProcessDefinitionId(schedule.getProcessDefinitionId()); command.setProcessDefinitionId(schedule.getProcessDefinitionId());

13
escheduler-api/src/main/java/cn/escheduler/api/service/ProcessDefinitionService.java

@ -114,7 +114,7 @@ public class ProcessDefinitionService extends BaseDAGService {
ProcessData processData = JSONUtils.parseObject(processDefinitionJson, ProcessData.class); ProcessData processData = JSONUtils.parseObject(processDefinitionJson, ProcessData.class);
Map<String, Object> checkProcessJson = checkProcessNodeList(processData, processDefinitionJson); Map<String, Object> checkProcessJson = checkProcessNodeList(processData, processDefinitionJson);
if (checkProcessJson.get(Constants.STATUS) != Status.SUCCESS) { if (checkProcessJson.get(Constants.STATUS) != Status.SUCCESS) {
return result; return checkProcessJson;
} }
processDefine.setName(name); processDefine.setName(name);
@ -247,9 +247,9 @@ public class ProcessDefinitionService extends BaseDAGService {
* @param connects * @param connects
* @return * @return
*/ */
public Map<String, Object> updateProccessDefinition(User loginUser, String projectName, int id, String name, public Map<String, Object> updateProcessDefinition(User loginUser, String projectName, int id, String name,
String processDefinitionJson, String desc, String processDefinitionJson, String desc,
String locations, String connects) throws JsonProcessingException { String locations, String connects) {
Map<String, Object> result = new HashMap<>(5); Map<String, Object> result = new HashMap<>(5);
Project project = projectMapper.queryByName(projectName); Project project = projectMapper.queryByName(projectName);
@ -262,7 +262,7 @@ public class ProcessDefinitionService extends BaseDAGService {
ProcessData processData = JSONUtils.parseObject(processDefinitionJson, ProcessData.class); ProcessData processData = JSONUtils.parseObject(processDefinitionJson, ProcessData.class);
Map<String, Object> checkProcessJson = checkProcessNodeList(processData, processDefinitionJson); Map<String, Object> checkProcessJson = checkProcessNodeList(processData, processDefinitionJson);
if ((checkProcessJson.get(Constants.STATUS) != Status.SUCCESS)) { if ((checkProcessJson.get(Constants.STATUS) != Status.SUCCESS)) {
return result; return checkProcessJson;
} }
ProcessDefinition processDefinition = processDao.findProcessDefineById(id); ProcessDefinition processDefinition = processDao.findProcessDefineById(id);
if (processDefinition == null) { if (processDefinition == null) {
@ -284,7 +284,6 @@ public class ProcessDefinitionService extends BaseDAGService {
processDefine.setName(name); processDefine.setName(name);
processDefine.setReleaseState(ReleaseState.OFFLINE); processDefine.setReleaseState(ReleaseState.OFFLINE);
processDefine.setProjectId(project.getId()); processDefine.setProjectId(project.getId());
processDefine.setUserId(loginUser.getId());
processDefine.setProcessDefinitionJson(processDefinitionJson); processDefine.setProcessDefinitionJson(processDefinitionJson);
processDefine.setDesc(desc); processDefine.setDesc(desc);
processDefine.setLocations(locations); processDefine.setLocations(locations);
@ -718,7 +717,9 @@ public class ProcessDefinitionService extends BaseDAGService {
List<String> preTasks = JSONUtils.toList(taskNodeResponse.getPreTasks(),String.class); List<String> preTasks = JSONUtils.toList(taskNodeResponse.getPreTasks(),String.class);
if (CollectionUtils.isNotEmpty(preTasks)) { if (CollectionUtils.isNotEmpty(preTasks)) {
for (String preTask : preTasks) { for (String preTask : preTasks) {
graph.addEdge(preTask, taskNodeResponse.getName()); if (!graph.addEdge(preTask, taskNodeResponse.getName())) {
return true;
}
} }
} }
} }

200
escheduler-api/src/main/java/cn/escheduler/api/service/QueueService.java

@ -18,12 +18,18 @@ package cn.escheduler.api.service;
import cn.escheduler.api.enums.Status; import cn.escheduler.api.enums.Status;
import cn.escheduler.api.utils.Constants; import cn.escheduler.api.utils.Constants;
import cn.escheduler.api.utils.PageInfo;
import cn.escheduler.api.utils.Result;
import cn.escheduler.dao.mapper.QueueMapper; import cn.escheduler.dao.mapper.QueueMapper;
import cn.escheduler.dao.model.Queue; import cn.escheduler.dao.model.Queue;
import cn.escheduler.dao.model.User; import cn.escheduler.dao.model.User;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -32,8 +38,9 @@ import java.util.Map;
* queue service * queue service
*/ */
@Service @Service
public class QueueService extends BaseService{ public class QueueService extends BaseService {
private static final Logger logger = LoggerFactory.getLogger(TenantService.class);
@Autowired @Autowired
private QueueMapper queueMapper; private QueueMapper queueMapper;
@ -52,9 +59,198 @@ public class QueueService extends BaseService{
List<Queue> queueList = queueMapper.queryAllQueue(); List<Queue> queueList = queueMapper.queryAllQueue();
result.put(Constants.DATA_LIST, queueList); result.put(Constants.DATA_LIST, queueList);
putMsg(result,Status.SUCCESS); putMsg(result, Status.SUCCESS);
return result; return result;
} }
/**
* query queue list paging
*
* @param loginUser
* @param searchVal
* @param pageNo
* @param pageSize
* @return
*/
public Map<String, Object> queryList(User loginUser, String searchVal, Integer pageNo, Integer pageSize) {
Map<String, Object> result = new HashMap<>(5);
if (checkAdmin(loginUser, result)) {
return result;
}
Integer count = queueMapper.countQueuePaging(searchVal);
PageInfo<Queue> pageInfo = new PageInfo<>(pageNo, pageSize);
List<Queue> queueList = queueMapper.queryQueuePaging(searchVal, pageInfo.getStart(), pageSize);
pageInfo.setTotalCount(count);
pageInfo.setLists(queueList);
result.put(Constants.DATA_LIST, pageInfo);
putMsg(result, Status.SUCCESS);
return result;
}
/**
* create queue
*
* @param loginUser
* @param queue
* @param queueName
* @return
*/
public Map<String, Object> createQueue(User loginUser, String queue, String queueName) {
Map<String, Object> result = new HashMap<>(5);
if (checkAdmin(loginUser, result)) {
return result;
}
if(StringUtils.isEmpty(queue)){
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, queue);
return result;
}
if(StringUtils.isEmpty(queueName)){
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, queueName);
return result;
}
if (checkQueueNameExist(queueName)) {
putMsg(result, Status.QUEUE_NAME_EXIST, queueName);
return result;
}
if (checkQueueExist(queue)) {
putMsg(result, Status.QUEUE_VALUE_EXIST, queue);
return result;
}
Queue queueObj = new Queue();
Date now = new Date();
queueObj.setQueue(queue);
queueObj.setQueueName(queueName);
queueObj.setCreateTime(now);
queueObj.setUpdateTime(now);
queueMapper.insert(queueObj);
putMsg(result, Status.SUCCESS);
return result;
}
/**
* update queue
*
* @param loginUser
* @param id
* @param queue
* @param queueName
* @return
*/
public Map<String, Object> updateQueue(User loginUser, int id, String queue, String queueName) {
Map<String, Object> result = new HashMap<>(5);
if (checkAdmin(loginUser, result)) {
return result;
}
Queue queueObj = queueMapper.queryById(id);
if (queueObj == null) {
putMsg(result, Status.QUEUE_NOT_EXIST, id);
return result;
}
// whether queue value or queueName is changed
if (queue.equals(queueObj.getQueue()) && queueName.equals(queueObj.getQueueName())) {
putMsg(result, Status.NEED_NOT_UPDATE_QUEUE);
return result;
}
// check queue name is exist
if (!queueName.equals(queueObj.getQueueName())) {
if(checkQueueNameExist(queueName)){
putMsg(result, Status.QUEUE_NAME_EXIST, queueName);
return result;
}
}
// check queue value is exist
if (!queue.equals(queueObj.getQueue())) {
if(checkQueueExist(queue)){
putMsg(result, Status.QUEUE_VALUE_EXIST, queue);
return result;
}
}
// update queue
Date now = new Date();
queueObj.setQueue(queue);
queueObj.setQueueName(queueName);
queueObj.setUpdateTime(now);
queueMapper.update(queueObj);
putMsg(result, Status.SUCCESS);
return result;
}
/**
* verify queue and queueName
*
* @param queue
* @param queueName
* @return
*/
public Result verifyQueue(String queue, String queueName) {
Result result=new Result();
if (StringUtils.isEmpty(queue)) {
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, queue);
return result;
}
if (StringUtils.isEmpty(queueName)) {
putMsg(result, Status.REQUEST_PARAMS_NOT_VALID_ERROR, queueName);
return result;
}
if(checkQueueNameExist(queueName)){
logger.error("queue name {} has exist, can't create again.", queueName);
putMsg(result, Status.QUEUE_NAME_EXIST, queueName);
return result;
}
if(checkQueueExist(queue)){
logger.error("queue value {} has exist, can't create again.", queue);
putMsg(result, Status.QUEUE_VALUE_EXIST, queue);
return result;
}
putMsg(result, Status.SUCCESS);
return result;
}
/**
* check queue exist
*
* @param queue
* @return
*/
private boolean checkQueueExist(String queue) {
return queueMapper.queryByQueue(queue) == null ? false : true;
}
/**
* check queue name exist
*
* @param queueName
* @return
*/
private boolean checkQueueNameExist(String queueName) {
return queueMapper.queryByQueueName(queueName) == null ? false : true;
}
} }

78
escheduler-api/src/test/java/cn/escheduler/api/controller/QueueControllerTest.java

@ -32,9 +32,12 @@ import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.WebApplicationContext;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ -65,4 +68,79 @@ public class QueueControllerTest {
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue()); Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info(mvcResult.getResponse().getContentAsString()); logger.info(mvcResult.getResponse().getContentAsString());
} }
@Test
public void queryPagingList() throws Exception {
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
//paramsMap.add("processInstanceId","1380");
paramsMap.add("searchVal","");
paramsMap.add("pageNo","1");
paramsMap.add("pageSize","20");
MvcResult mvcResult = mockMvc.perform(get("/queue/list-paging")
.header("sessionId", "d4541e0d-0349-4f05-9c68-300176cd3c91")
.params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info(mvcResult.getResponse().getContentAsString());
}
@Test
public void createQueue() throws Exception {
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
paramsMap.add("queue","ait111134");
paramsMap.add("queueName","aitName1");
MvcResult mvcResult = mockMvc.perform(post("/queue/create")
.header("sessionId", "d4541e0d-0349-4f05-9c68-300176cd3c91")
.params(paramsMap))
.andExpect(status().isCreated())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
//Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info(mvcResult.getResponse().getContentAsString());
}
@Test
public void updateQueue() throws Exception {
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
paramsMap.add("id","2");
paramsMap.add("queue","ait12");
paramsMap.add("queueName","aitName");
MvcResult mvcResult = mockMvc.perform(post("/queue/update")
.header("sessionId", "d4541e0d-0349-4f05-9c68-300176cd3c91")
.params(paramsMap))
.andExpect(status().isCreated())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
//Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info(mvcResult.getResponse().getContentAsString());
}
@Test
public void verifyQueue() throws Exception {
MultiValueMap<String, String> paramsMap = new LinkedMultiValueMap<>();
paramsMap.add("queue","ait123");
paramsMap.add("queueName","aitName");
MvcResult mvcResult = mockMvc.perform(post("/queue/verify-queue")
.header("sessionId", "d4541e0d-0349-4f05-9c68-300176cd3c91")
.params(paramsMap))
.andExpect(status().isOk())
.andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8))
.andReturn();
Result result = JSONUtils.parseObject(mvcResult.getResponse().getContentAsString(), Result.class);
//Assert.assertEquals(Status.SUCCESS.getCode(),result.getCode().intValue());
logger.info(mvcResult.getResponse().getContentAsString());
}
} }

14
escheduler-common/pom.xml

@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>escheduler</artifactId> <artifactId>escheduler</artifactId>
<groupId>cn.analysys</groupId> <groupId>cn.analysys</groupId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.1-SNAPSHOT</version>
</parent> </parent>
<artifactId>escheduler-common</artifactId> <artifactId>escheduler-common</artifactId>
<name>escheduler-common</name> <name>escheduler-common</name>
@ -148,6 +148,10 @@
<groupId>javax.servlet.jsp</groupId> <groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId> <artifactId>jsp-api</artifactId>
</exclusion> </exclusion>
<exclusion>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>
@ -340,6 +344,14 @@
<artifactId>log4j-slf4j-impl</artifactId> <artifactId>log4j-slf4j-impl</artifactId>
<groupId>org.apache.logging.log4j</groupId> <groupId>org.apache.logging.log4j</groupId>
</exclusion> </exclusion>
<exclusion>
<artifactId>javax.servlet</artifactId>
<groupId>org.eclipse.jetty.orbit</groupId>
</exclusion>
<exclusion>
<artifactId>servlet-api-2.5</artifactId>
<groupId>org.mortbay.jetty</groupId>
</exclusion>
</exclusions> </exclusions>
</dependency> </dependency>

30
escheduler-common/src/main/java/cn/escheduler/common/Constants.java

@ -70,25 +70,6 @@ public final class Constants {
*/ */
public static final String YARN_APPLICATION_STATUS_ADDRESS = "yarn.application.status.address"; public static final String YARN_APPLICATION_STATUS_ADDRESS = "yarn.application.status.address";
/**
* spring.redis.maxIdle
*/
public static final String SPRING_REDIS_MAXIDLE = "spring.redis.maxIdle";
/**
* spring.redis.maxTotal
*/
public static final String SPRING_REDIS_MAXTOTAL = "spring.redis.maxTotal";
/**
* spring.redis.host
*/
public static final String SPRING_REDIS_HOST = "spring.redis.host";
/**
* spring.redis.port
*/
public static final String SPRING_REDIS_PORT = "spring.redis.port";
/** /**
* hdfs configuration * hdfs configuration
@ -117,9 +98,14 @@ public final class Constants {
public static final String ESCHEDULER_ENV_PATH = "escheduler.env.path"; public static final String ESCHEDULER_ENV_PATH = "escheduler.env.path";
/** /**
* escheduler.env.py * escheduler.env.sh
*/ */
public static final String ESCHEDULER_ENV_PY = "escheduler.env.py"; public static final String ESCHEDULER_ENV_SH = ".escheduler_env.sh";
/**
* python home
*/
public static final String PYTHON_HOME="PYTHON_HOME";
/** /**
* resource.view.suffixs * resource.view.suffixs
@ -255,8 +241,6 @@ public final class Constants {
public static final String SCHEDULER_QUEUE_IMPL = "escheduler.queue.impl"; public static final String SCHEDULER_QUEUE_IMPL = "escheduler.queue.impl";
public static final String SCHEDULER_QUEUE_REDIS_IMPL = "redis";
/** /**
* date format of yyyy-MM-dd HH:mm:ss * date format of yyyy-MM-dd HH:mm:ss

7
escheduler-common/src/main/java/cn/escheduler/common/utils/CommonUtils.java

@ -46,13 +46,6 @@ public class CommonUtils {
return envPath; return envPath;
} }
/**
* @return get the path of Python system environment variables
*/
public static String getPythonSystemEnvPath() {
return getString(ESCHEDULER_ENV_PY);
}
/** /**
* @return get queue implementation name * @return get queue implementation name
*/ */

1
escheduler-common/src/main/resources/common/common.properties

@ -18,7 +18,6 @@ hdfs.startup.state=true
# system env path. self configuration, please make sure the directory and file exists and have read write execute permissions # system env path. self configuration, please make sure the directory and file exists and have read write execute permissions
escheduler.env.path=/opt/.escheduler_env.sh escheduler.env.path=/opt/.escheduler_env.sh
escheduler.env.py=/opt/escheduler_env.py
#resource.view.suffixs #resource.view.suffixs
resource.view.suffixs=txt,log,sh,conf,cfg,py,java,sql,hql,xml resource.view.suffixs=txt,log,sh,conf,cfg,py,java,sql,hql,xml

2
escheduler-dao/pom.xml

@ -4,7 +4,7 @@
<parent> <parent>
<groupId>cn.analysys</groupId> <groupId>cn.analysys</groupId>
<artifactId>escheduler</artifactId> <artifactId>escheduler</artifactId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.1-SNAPSHOT</version>
</parent> </parent>
<artifactId>escheduler-dao</artifactId> <artifactId>escheduler-dao</artifactId>
<name>escheduler-dao</name> <name>escheduler-dao</name>

3
escheduler-dao/src/main/java/cn/escheduler/dao/ProcessDao.java

@ -606,6 +606,7 @@ public class ProcessDao extends AbstractBaseDao {
updateTaskInstance(taskInstance); updateTaskInstance(taskInstance);
} }
processInstance.setStartTime(new Date()); processInstance.setStartTime(new Date());
processInstance.setEndTime(null);
processInstance.setRunTimes(runTime +1); processInstance.setRunTimes(runTime +1);
initComplementDataParam(processDefinition, processInstance, cmdParam); initComplementDataParam(processDefinition, processInstance, cmdParam);
break; break;
@ -1272,7 +1273,7 @@ public class ProcessDao extends AbstractBaseDao {
return scheduleMapper.queryById(id); return scheduleMapper.queryById(id);
} }
public List<ProcessInstance> queryNeddFailoverProcessInstances(String host){ public List<ProcessInstance> queryNeedFailoverProcessInstances(String host){
return processInstanceMapper.queryByHostAndStatus(host, stateArray); return processInstanceMapper.queryByHostAndStatus(host, stateArray);
} }

35
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/QueueMapper.java

@ -20,6 +20,7 @@ import cn.escheduler.dao.model.Queue;
import org.apache.ibatis.annotations.*; import org.apache.ibatis.annotations.*;
import org.apache.ibatis.type.JdbcType; import org.apache.ibatis.type.JdbcType;
import java.sql.Timestamp;
import java.util.List; import java.util.List;
/** /**
@ -64,7 +65,9 @@ public interface QueueMapper {
*/ */
@Results(value = {@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER), @Results(value = {@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER),
@Result(property = "queueName", column = "queue_name", javaType = String.class, jdbcType = JdbcType.VARCHAR), @Result(property = "queueName", column = "queue_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
@Result(property = "queue", column = "queue", javaType = String.class, jdbcType = JdbcType.VARCHAR) @Result(property = "queue", column = "queue", javaType = String.class, jdbcType = JdbcType.VARCHAR),
@Result(property = "createTime", column = "create_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
@Result(property = "updateTime", column = "update_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE)
}) })
@SelectProvider(type = QueueMapperProvider.class, method = "queryById") @SelectProvider(type = QueueMapperProvider.class, method = "queryById")
Queue queryById(@Param("queueId") int queueId); Queue queryById(@Param("queueId") int queueId);
@ -76,13 +79,41 @@ public interface QueueMapper {
*/ */
@Results(value = {@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER), @Results(value = {@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER),
@Result(property = "queueName", column = "queue_name", javaType = String.class, jdbcType = JdbcType.VARCHAR), @Result(property = "queueName", column = "queue_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
@Result(property = "queue", column = "queue", javaType = String.class, jdbcType = JdbcType.VARCHAR) @Result(property = "queue", column = "queue", javaType = String.class, jdbcType = JdbcType.VARCHAR),
@Result(property = "createTime", column = "create_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
@Result(property = "updateTime", column = "update_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE)
}) })
@SelectProvider(type = QueueMapperProvider.class, method = "queryAllQueue") @SelectProvider(type = QueueMapperProvider.class, method = "queryAllQueue")
List<Queue> queryAllQueue(); List<Queue> queryAllQueue();
/**
* query all queue list
* @return
*/
@Results(value = {@Result(property = "id", column = "id", id = true, javaType = Integer.class, jdbcType = JdbcType.INTEGER),
@Result(property = "queueName", column = "queue_name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
@Result(property = "queue", column = "queue", javaType = String.class, jdbcType = JdbcType.VARCHAR),
@Result(property = "createTime", column = "create_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE),
@Result(property = "updateTime", column = "update_time", javaType = Timestamp.class, jdbcType = JdbcType.DATE)
})
@SelectProvider(type = QueueMapperProvider.class, method = "queryQueuePaging")
List<Queue> queryQueuePaging(@Param("searchVal") String searchVal,
@Param("offset") Integer offset,
@Param("pageSize") Integer pageSize);
/**
* count queue by search value
* @param searchVal
* @return
*/
@SelectProvider(type = QueueMapperProvider.class, method = "countQueuePaging")
Integer countQueuePaging(@Param("searchVal") String searchVal);
@SelectProvider(type = QueueMapperProvider.class, method = "queryByQueue")
Queue queryByQueue(@Param("queue") String queue);
@SelectProvider(type = QueueMapperProvider.class, method = "queryByQueueName")
Queue queryByQueueName(@Param("queueName") String queueName);
} }

80
escheduler-dao/src/main/java/cn/escheduler/dao/mapper/QueueMapperProvider.java

@ -16,6 +16,7 @@
*/ */
package cn.escheduler.dao.mapper; package cn.escheduler.dao.mapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.jdbc.SQL; import org.apache.ibatis.jdbc.SQL;
import java.util.Map; import java.util.Map;
@ -39,7 +40,8 @@ public class QueueMapperProvider {
INSERT_INTO(TABLE_NAME); INSERT_INTO(TABLE_NAME);
VALUES("`queue_name`", "#{queue.queueName}"); VALUES("`queue_name`", "#{queue.queueName}");
VALUES("`queue`", "#{queue.queue}"); VALUES("`queue`", "#{queue.queue}");
VALUES("`create_time`", "#{queue.createTime}");
VALUES("`update_time`", "#{queue.updateTime}");
} }
}.toString(); }.toString();
} }
@ -73,6 +75,7 @@ public class QueueMapperProvider {
SET("`queue_name`=#{queue.queueName}"); SET("`queue_name`=#{queue.queueName}");
SET("`queue`=#{queue.queue}"); SET("`queue`=#{queue.queue}");
SET("`update_time`=#{queue.updateTime}");
WHERE("`id`=#{queue.id}"); WHERE("`id`=#{queue.id}");
} }
@ -80,10 +83,6 @@ public class QueueMapperProvider {
} }
/** /**
* query queue by id * query queue by id
* *
@ -117,5 +116,76 @@ public class QueueMapperProvider {
}.toString(); }.toString();
} }
/**
* count queue by search value
* @param parameter
* @return
*/
public String countQueuePaging(Map<String, Object> parameter) {
return new SQL() {{
SELECT("count(0)");
FROM(TABLE_NAME);
Object searchVal = parameter.get("searchVal");
if(searchVal != null && StringUtils.isNotEmpty(searchVal.toString())){
WHERE( " queue_name like concat('%', #{searchVal}, '%') ");
}
}}.toString();
}
/**
* query tenant list paging
* @param parameter
* @return
*/
public String queryQueuePaging(Map<String, Object> parameter) {
return new SQL() {
{
SELECT("*");
FROM(TABLE_NAME);
Object searchVal = parameter.get("searchVal");
if(searchVal != null && StringUtils.isNotEmpty(searchVal.toString())){
WHERE( " queue_name like concat('%', #{searchVal}, '%') ");
}
ORDER_BY(" update_time desc limit #{offset},#{pageSize} ");
}
}.toString();
}
/**
* query by queue
*
* @param parameter
* @return
*/
public String queryByQueue(Map<String, Object> parameter) {
return new SQL() {
{
SELECT("*");
FROM(TABLE_NAME);
WHERE("`queue` = #{queue}");
}
}.toString();
}
/**
* query by queue name
*
* @param parameter
* @return
*/
public String queryByQueueName(Map<String, Object> parameter) {
return new SQL() {
{
SELECT("*");
FROM(TABLE_NAME);
WHERE("`queue_name` = #{queueName}");
}
}.toString();
}
} }

29
escheduler-dao/src/main/java/cn/escheduler/dao/model/Queue.java

@ -16,6 +16,8 @@
*/ */
package cn.escheduler.dao.model; package cn.escheduler.dao.model;
import java.util.Date;
/** /**
* queue * queue
*/ */
@ -34,6 +36,15 @@ public class Queue {
*/ */
private String queue; private String queue;
/**
* create time
*/
private Date createTime;
/**
* update time
*/
private Date updateTime;
public int getId() { public int getId() {
return id; return id;
} }
@ -58,12 +69,30 @@ public class Queue {
this.queue = queue; this.queue = queue;
} }
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Date getUpdateTime() {
return updateTime;
}
public void setUpdateTime(Date updateTime) {
this.updateTime = updateTime;
}
@Override @Override
public String toString() { public String toString() {
return "Queue{" + return "Queue{" +
"id=" + id + "id=" + id +
", queueName='" + queueName + '\'' + ", queueName='" + queueName + '\'' +
", queue='" + queue + '\'' + ", queue='" + queue + '\'' +
", createTime=" + createTime +
", updateTime=" + updateTime +
'}'; '}';
} }
} }

2
escheduler-rpc/pom.xml

@ -4,7 +4,7 @@
<parent> <parent>
<artifactId>escheduler</artifactId> <artifactId>escheduler</artifactId>
<groupId>cn.analysys</groupId> <groupId>cn.analysys</groupId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.1-SNAPSHOT</version>
</parent> </parent>
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>

2
escheduler-server/pom.xml

@ -3,7 +3,7 @@
<parent> <parent>
<artifactId>escheduler</artifactId> <artifactId>escheduler</artifactId>
<groupId>cn.analysys</groupId> <groupId>cn.analysys</groupId>
<version>1.0.0-SNAPSHOT</version> <version>1.0.1-SNAPSHOT</version>
</parent> </parent>
<artifactId>escheduler-server</artifactId> <artifactId>escheduler-server</artifactId>
<name>escheduler-server</name> <name>escheduler-server</name>

4
escheduler-server/src/main/java/cn/escheduler/server/worker/runner/FetchTaskThread.java

@ -170,9 +170,9 @@ public class FetchTaskThread implements Runnable{
// check and create Linux users // check and create Linux users
FileUtils.createWorkDirAndUserIfAbsent(execLocalPath, FileUtils.createWorkDirAndUserIfAbsent(execLocalPath,
processDefine.getUserName(), logger); processInstance.getTenantCode(), logger);
logger.info("task : {} ready to submit to task scheduler thread",taskId);
// submit task // submit task
workerExecService.submit(new TaskScheduleThread(taskInstance, processDao)); workerExecService.submit(new TaskScheduleThread(taskInstance, processDao));
} }

71
escheduler-server/src/main/java/cn/escheduler/server/worker/task/PythonCommandExecutor.java

@ -16,12 +16,13 @@
*/ */
package cn.escheduler.server.worker.task; package cn.escheduler.server.worker.task;
import cn.escheduler.common.Constants;
import cn.escheduler.common.utils.FileUtils; import cn.escheduler.common.utils.FileUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.File; import java.io.*;
import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Paths; import java.nio.file.Paths;
@ -34,6 +35,8 @@ import java.util.function.Consumer;
*/ */
public class PythonCommandExecutor extends AbstractCommandExecutor { public class PythonCommandExecutor extends AbstractCommandExecutor {
private static final Logger logger = LoggerFactory.getLogger(PythonCommandExecutor.class);
public static final String PYTHON = "python"; public static final String PYTHON = "python";
@ -63,27 +66,13 @@ public class PythonCommandExecutor extends AbstractCommandExecutor {
*/ */
@Override @Override
protected void createCommandFileIfNotExists(String execCommand, String commandFile) throws IOException { protected void createCommandFileIfNotExists(String execCommand, String commandFile) throws IOException {
logger.info("proxy user:{}, work dir:{}", tenantCode, taskDir); logger.info("tenant :{}, work dir:{}", tenantCode, taskDir);
if (!Files.exists(Paths.get(commandFile))) { if (!Files.exists(Paths.get(commandFile))) {
logger.info("generate command file:{}", commandFile); logger.info("generate command file:{}", commandFile);
StringBuilder sb = new StringBuilder(200); StringBuilder sb = new StringBuilder(200);
sb.append("#-*- encoding=utf8 -*-\n"); sb.append("#-*- encoding=utf8 -*-\n");
sb.append("import os,sys\n");
sb.append("BASEDIR = os.path.dirname(os.path.realpath(__file__))\n");
sb.append("os.chdir(BASEDIR)\n");
if (StringUtils.isNotEmpty(envFile)) {
String[] envArray = envFile.split("\\.");
if(envArray.length == 2){
String path = envArray[0];
logger.info("path:"+path);
int index = path.lastIndexOf("/");
sb.append(String.format("sys.path.append('%s')\n",path.substring(0,index)));
sb.append(String.format("import %s\n",path.substring(index+1)));
}
}
sb.append("\n\n"); sb.append("\n\n");
sb.append(String.format("import py_%s_node\n",taskAppId)); sb.append(String.format("import py_%s_node\n",taskAppId));
@ -96,8 +85,15 @@ public class PythonCommandExecutor extends AbstractCommandExecutor {
@Override @Override
protected String commandType() { protected String commandType() {
String envPath = System.getProperty("user.dir") + Constants.SINGLE_SLASH + "conf"+
Constants.SINGLE_SLASH +"env" + Constants.SINGLE_SLASH + Constants.ESCHEDULER_ENV_SH;
String pythonHome = getPythonHome(envPath);
if (StringUtils.isEmpty(pythonHome)){
return PYTHON; return PYTHON;
} }
return pythonHome;
}
@Override @Override
protected boolean checkShowLog(String line) { protected boolean checkShowLog(String line) {
@ -109,4 +105,45 @@ public class PythonCommandExecutor extends AbstractCommandExecutor {
return true; return true;
} }
/**
* get python home
* @param envPath
* @return
*/
private static String getPythonHome(String envPath){
BufferedReader br = null;
String line = null;
StringBuilder sb = new StringBuilder();
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(envPath)));
while ((line = br.readLine()) != null){
if (line.contains(Constants.PYTHON_HOME)){
sb.append(line);
break;
}
}
String result = sb.toString();
if (org.apache.commons.lang.StringUtils.isEmpty(result)){
return null;
}
String[] arrs = result.split("=");
if (arrs.length == 2){
return arrs[1];
}
}catch (IOException e){
logger.error("read file failed : " + e.getMessage(),e);
}finally {
try {
if (br != null){
br.close();
}
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
}
return null;
}
} }

2
escheduler-server/src/main/java/cn/escheduler/server/worker/task/python/PythonTask.java

@ -72,7 +72,7 @@ public class PythonTask extends AbstractTask {
this.pythonProcessTask = new PythonCommandExecutor(this::logHandle, this.pythonProcessTask = new PythonCommandExecutor(this::logHandle,
taskProps.getTaskDir(), taskProps.getTaskAppId(), taskProps.getTaskDir(), taskProps.getTaskAppId(),
taskProps.getTenantCode(), CommonUtils.getPythonSystemEnvPath(), taskProps.getTaskStartTime(), taskProps.getTenantCode(), null, taskProps.getTaskStartTime(),
taskProps.getTaskTimeout(), logger); taskProps.getTaskTimeout(), logger);
this.processDao = DaoFactory.getDaoInstance(ProcessDao.class); this.processDao = DaoFactory.getDaoInstance(ProcessDao.class);
} }

2
escheduler-server/src/main/java/cn/escheduler/server/zk/ZKMasterClient.java

@ -256,7 +256,7 @@ public class ZKMasterClient extends AbstractZKClient {
logger.info("start master failover ..."); logger.info("start master failover ...");
List<ProcessInstance> needFailoverProcessInstanceList = processDao.queryNeddFailoverProcessInstances(masterHost); List<ProcessInstance> needFailoverProcessInstanceList = processDao.queryNeedFailoverProcessInstances(masterHost);
//updateProcessInstance host is null and insert into command //updateProcessInstance host is null and insert into command
for(ProcessInstance processInstance : needFailoverProcessInstanceList){ for(ProcessInstance processInstance : needFailoverProcessInstanceList){

2
escheduler-server/src/main/resources/worker.properties

@ -5,7 +5,7 @@ worker.exec.threads=100
worker.heartbeat.interval=10 worker.heartbeat.interval=10
# submit the number of tasks at a time # submit the number of tasks at a time
worker.fetch.task.num = 10 worker.fetch.task.num = 3
# only less than cpu avg load, worker server can work. default value : the number of cpu cores * 2 # only less than cpu avg load, worker server can work. default value : the number of cpu cores * 2

65
escheduler-server/src/test/java/cn/escheduler/server/worker/EnvFileTest.java

@ -0,0 +1,65 @@
package cn.escheduler.server.worker;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/**
* Created by qiaozhanwei on 2019/4/15.
*/
public class EnvFileTest {
private static final Logger logger = LoggerFactory.getLogger(EnvFileTest.class);
public static void main(String[] args) {
String path = System.getProperty("user.dir")+"\\script\\env\\.escheduler_env.sh";
String pythonHome = getPythonHome(path);
logger.info(pythonHome);
}
/**
* get python home
* @param path
* @return
*/
private static String getPythonHome(String path){
BufferedReader br = null;
String line = null;
StringBuilder sb = new StringBuilder();
try {
br = new BufferedReader(new InputStreamReader(new FileInputStream(path)));
while ((line = br.readLine()) != null){
if (line.contains("PYTHON_HOME")){
sb.append(line);
break;
}
}
String result = sb.toString();
if (StringUtils.isEmpty(result)){
return null;
}
String[] arrs = result.split("=");
if (arrs.length == 2){
return arrs[1];
}
}catch (IOException e){
logger.error("read file failed : " + e.getMessage(),e);
}finally {
try {
if (br != null){
br.close();
}
} catch (IOException e) {
logger.error(e.getMessage(),e);
}
}
return null;
}
}

3
escheduler-server/src/test/java/cn/escheduler/server/zk/ZKWorkerClientTest.java

@ -5,6 +5,9 @@ import org.junit.Test;
import static org.junit.Assert.*; import static org.junit.Assert.*;
/**
*
*/
public class ZKWorkerClientTest { public class ZKWorkerClientTest {
@Test @Test

2
escheduler-ui/.env

@ -1,6 +1,6 @@
# 后端接口地址 # 后端接口地址
API_BASE = http://192.168.xx.xx:12345 API_BASE = http://192.168.220.154:12345
# 本地开发如需ip访问项目把"#"号去掉 # 本地开发如需ip访问项目把"#"号去掉
#DEV_HOST = 192.168.xx.xx #DEV_HOST = 192.168.xx.xx

5
escheduler-ui/dist/combo/1.0.0/3rd.css vendored

File diff suppressed because one or more lines are too long

10783
escheduler-ui/dist/combo/1.0.0/3rd.js vendored

File diff suppressed because one or more lines are too long

8
escheduler-ui/dist/combo/1.0.0/base.css vendored

File diff suppressed because one or more lines are too long

14
escheduler-ui/dist/combo/1.0.0/es5.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/combo/1.0.0/local.js vendored

@ -0,0 +1 @@
Not found

1
escheduler-ui/dist/css/common.8ba9af7.css vendored

File diff suppressed because one or more lines are too long

14
escheduler-ui/dist/css/home/index.0212fa5.css vendored

File diff suppressed because one or more lines are too long

14
escheduler-ui/dist/css/login/index.6083d91.css vendored

File diff suppressed because one or more lines are too long

BIN
escheduler-ui/dist/font/fontawesome-webfont.674f50d.eot vendored

Binary file not shown.

BIN
escheduler-ui/dist/font/fontawesome-webfont.af7ae50.woff2 vendored

Binary file not shown.

BIN
escheduler-ui/dist/font/fontawesome-webfont.b06871f.ttf vendored

Binary file not shown.

BIN
escheduler-ui/dist/font/fontawesome-webfont.fee66e7.woff vendored

Binary file not shown.

BIN
escheduler-ui/dist/font/iconfont.4f692dd.ttf vendored

Binary file not shown.

BIN
escheduler-ui/dist/font/iconfont.6f38b93.eot vendored

Binary file not shown.

BIN
escheduler-ui/dist/font/iconfont.be17177.woff vendored

Binary file not shown.

BIN
escheduler-ui/dist/images/close.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 B

BIN
escheduler-ui/dist/images/dag_bg.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

BIN
escheduler-ui/dist/images/down_error.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
escheduler-ui/dist/images/errorTip.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
escheduler-ui/dist/images/favicon.ico vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

2671
escheduler-ui/dist/images/fontawesome-webfont.svg vendored

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 434 KiB

266
escheduler-ui/dist/images/iconfont.svg vendored

@ -0,0 +1,266 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
<!--
2013-9-30: Created.
-->
<svg>
<metadata>
Created by iconfont
</metadata>
<defs>
<font id="iconfont" horiz-adv-x="1024" >
<font-face
font-family="iconfont"
font-weight="500"
font-stretch="normal"
units-per-em="1024"
ascent="896"
descent="-128"
/>
<missing-glyph />
<glyph glyph-name="bianjixiugai" unicode="&#58881;" d="M765.27521057 436.59767761c-13.25783386 0-23.02761841-10.75946045-23.02761841-24.0173767v-293.80471875c0-31.60263977-24.42062989-58.45415955-55.95578613-58.45415955h-428.473125c-31.53515625 0-68.20112 26.85151977-68.20111999 58.45415955V548.71265625c0 31.6245575 36.66687012 65.32058716 68.20111999 65.32058716h244.91615625c13.25783386 0 23.94981079 9.81362 23.94981079 23.07153625 0 13.28065796-10.69197693 23.07153625-23.94981079 23.07153626H257.818625c-62.97918091 0-114.25388489-48.21355591-114.25388489-111.4627533v-429.93703124c0-63.22727966 51.27470398-104.59714966 114.25388489-104.59714966h428.473125c63.0247467 0 102.009375 41.36987 102.009375 104.59714966V412.58034375C788.30109864 425.83821716 778.51022034 436.59767761 765.27521057 436.59767761zM859.67559204 697.17973023l-35.09068909 35.18017272c-26.69537659 26.7856842-73.60285034 26.7856842-100.2763092 0l-66.28752136-78.0595642L304.74888 315.47909546000005v-8.262l-0.27001648-1.41748353-44.43274841-150.91984862 32.61513977-29.17100831 142.54653626 50.35160523 1.80054931-0.38224182h6.99975l337.80964966 354.35308227 77.85703125 63.69974671C887.31689148 621.43800659 887.31689148 669.42628784 859.67559204 697.17973023zM322.80084534 188.0356842l20.7528717 66.2183075 41.46100158-41.59432068L322.80084534 188.0356842zM427.19554443 237.41870727000003l-61.04366455 61.19972534 315.81727295 314.78367921 59.08441772-59.26503296L427.19554443 237.41870727000003zM826.25048523 630.10333557l-47.0651825-47.17831421-68.5158783 68.74115296 47.04326478 47.1783142c4.4558075 4.43388977 10.37647705 6.88752136 16.72314147 6.88752137 6.3475708 0 12.28925171-2.45363159 16.72396546-6.88752137l35.04602967-35.1809967C835.45658875 654.39064636 835.45658875 639.35500488 826.25048523 630.10333557z" horiz-adv-x="1024" />
<glyph glyph-name="shibai" unicode="&#58918;" d="M512.61293427 778.23780703c-217.56339229 0-393.93291357-176.36952128-393.93291357-393.93291357 0-217.56429141 176.36952128-393.93291357 393.93291357-393.93291357 217.56429141 0 393.93291357 176.36862217 393.93291358 393.93291357C906.54584786 601.86828487 730.17722568 778.23780703 512.61293427 778.23780703zM669.04837138 266.92277842c10.78009102-10.78728662 10.78009102-28.2750293 0-39.04702647-10.79538047-10.78728662-28.2750293-10.78728662-39.07041064 0l-117.17255741 117.17255742-117.18155128-117.17255742c-10.78728662-10.78728662-28.26693545-10.78728662-39.06321504 0-10.78009102 10.77199629-10.78009102 28.25973984 0 39.04702647l117.188746 117.20493545L356.56063789 501.30116953c-10.78009102 10.77199629-10.78009102 28.2750293 0 39.06231592 10.79538047 10.77199629 28.2750293 10.77199629 39.06321503 0l117.18155128-117.188746 117.17255742 117.188746c10.79538047 10.77199629 28.2750293 10.77199629 39.07041065 0 10.78009102-10.78728662 10.78009102-28.29121875 0-39.06231592L551.85962539 384.12771299 669.04837138 266.92277842z" horiz-adv-x="1024" />
<glyph glyph-name="dengdai" unicode="&#58922;" d="M511.71354424 778.23780703c-217.56429141 0-393.93291357-176.35333271-393.93291357-393.93291357 0-217.54810195 176.36862217-393.93291357 393.93291357-393.93291357s393.93291357 176.38481075 393.93291357 393.93291357C905.64645781 601.88447432 729.27783565 778.23780703 511.71354424 778.23780703zM653.12466787 181.98616522999998c-12.80641729-12.92063994-33.83685879-12.92063994-46.63698047 0L490.04363604 299.06158857c-8.6953043 8.75106651-7.90923779 20.93330742-7.9092378 39.46344346 0 18.56251494-4.20105146 233.09676035-4.20105146 233.09676035 0 18.4006248 14.72391738 33.30801739 32.88350478 33.30801739 18.1604874 0 32.88350479-14.90739258 32.88350479-33.30801738l0-233.09676036c0-0.96144785 109.68063662-109.7040208 109.68063662-109.7040208C666.18021552 215.90217041000005 665.92388955 194.93648497000004 653.12466787 181.98616522999998z" horiz-adv-x="1024" />
<glyph glyph-name="shuaxin1" unicode="&#59074;" d="M801.28338945 349.07168168c0-159.52050352-129.76288594-289.28338945-289.28338945-289.28338946s-289.28338945 129.76288594-289.28338945 289.28338946c0 154.15268994 121.28848945 280.14846328 273.40012441 288.46696728l0-87.5757252c0-2.85586963 1.53802354-5.5253127 4.017825-6.96851542 1.25516865-0.72160137 2.63730059-1.06713457 4.017825-1.06713458s2.76265635 0.3455332 4.017825 1.06713458l208.80153632 120.5347456c2.47980146 1.44320273 4.017825 4.1126458 4.017825 6.96851544s-1.53802354 5.5253127-4.017825 6.96851542l-208.80153632 120.53474561c-2.5103373 1.44320273-5.5253127 1.44320273-8.03565 0-2.47980146-1.44320273-4.017825-4.1126458-4.017825-6.96851543l0-89.20856865C308.56627724 693.442664 158.4314123 538.6631935 158.4314123 349.07168168c0-194.95932627 158.60926143-353.5685877 353.5685877-353.56858769s353.5685877 158.60926143 353.5685877 353.56858769L801.28338945 349.07168168z" horiz-adv-x="1024" />
<glyph glyph-name="qidong" unicode="&#58891;" d="M510.5072525-36.38889655000003c-56.52199781 0-111.37280906 11.07856875-163.02994594 32.92775531-49.87466531 21.0951375-94.65998063 51.28778719-133.10975156 89.73755811s-68.64242062 83.23508626-89.73755813 133.10975157c-21.84918657 51.65809594-32.92775531 106.50794719-32.92775531 163.02994594 0 56.52199781 11.07856875 111.37280906 32.92775531 163.02994593 21.0951375 49.87562438 51.28778719 94.65998063 89.73755813 133.10975157 38.44977094 38.45072999 83.23508626 68.64242062 133.10975156 89.73851718 51.65809594 21.84918657 106.50794719 32.92775531 163.02994594 32.92775532s111.37280906-11.07856875 163.02994594-32.92775532c49.87466531-21.09609657 94.65998063-51.28778719 133.10975157-89.73851718 38.44977094-38.44977094 68.64242062-83.23508626 89.73755811-133.10975157 21.84918657-51.65713687 32.92775531-106.50794719 32.92775533-163.02994594 0-56.52199781-11.07856875-111.37280906-32.92775533-163.02994593-21.0951375-49.87466531-51.28778719-94.65998063-89.73755811-133.10975157s-83.23508626-68.64242062-133.10975157-89.73755813C621.88006156-25.31032780999999 567.02925031-36.38889655000003 510.5072525-36.38889655000003zM510.5072525 741.74241094c-95.97908624 0-186.21358688-37.37625844-254.08181249-105.24448407-67.86822563-67.86822563-105.24448406-158.10272625-105.24448407-254.0818125 0-95.97908624 37.37625844-186.21454687 105.24448407-254.0818125 67.86822563-67.86726563 158.10272625-105.24448406 254.08181249-105.24448406 95.97908624 0 186.21454687 37.37625844 254.0818125 105.24448406 67.86726563 67.86822563 105.24448406 158.10272625 105.24448405 254.0818125 0 95.97908624-37.37625844 186.21358688-105.24448405 254.0818125C696.72179844 704.3661515599999 606.48729781 741.74241094 510.5072525 741.74241094zM673.64464531 381.66206531L435.54751438 199.60917657000005 435.54751438 565.22401031Z" horiz-adv-x="1024" />
<glyph glyph-name="gantt" unicode="&#59028;" d="M669.99264645 569.32132087L669.99264645 727.32366384c0 14.50182376-11.82641941 26.33245944-26.33245944 26.33245945L169.67592365 753.65612329c-14.4571355 0-26.33245944-11.83147861-26.33245944-26.33245945l0-158.00234298c0-14.50604004 11.87532312-26.33330237 26.33245943-26.33330237l473.98342044 0C658.16538413 542.9880185 669.99264645 554.81612458 669.99264645 569.32132087L669.99264645 569.32132087zM196.00501056 569.32132087L196.00501056 727.32366384l210.6681048 0 0-158.00234298L196.00501056 569.32132087 196.00501056 569.32132087zM775.32585593 305.98408254000003L775.32585593 463.98558262c0 14.50604004-11.82726232 26.33245944-26.33245945 26.33245943L169.67592365 490.31804123c-14.4571355 0-26.33245944-11.82726232-26.33245944-26.33245944l0-158.002343c0-14.50098083 11.87532312-26.33245944 26.33245943-26.33245944l579.31662992 0C763.49774985 279.65078017999997 775.32585593 291.48225795999997 775.32585593 305.98408254000003L775.32585593 305.98408254000003zM196.00501056 305.98408254000003L196.00501056 463.98558262l263.32965033 0 0-158.00234299L196.00501056 305.98323879 196.00501056 305.98408254000003zM880.65653497 42.64262796000003L880.65653497 200.64244135c0 14.51194217-11.83063486 26.3417341-26.32908609 26.3417341l-684.65236816 0c-14.4571355 0-26.33245944-11.82979192-26.33245945-26.34173411l0-157.99981338c0-14.50182376 11.87532312-26.33161569 26.33245945-26.33161569l684.64730895-1e-8C868.82505719 16.311855199999968 880.65653497 28.140803369999958 880.65653497 42.64262796000003L880.65653497 42.64262796000003zM196.00501056 42.64262796000003L196.00501056 200.64244135l315.99372464-1e-8 0-157.99981338L196.00501056 42.64262796000003 196.00501056 42.64262796000003zM196.00501056 42.64262796000003" horiz-adv-x="1024" />
<glyph glyph-name="gongzuoliuchengtu" unicode="&#58880;" d="M925.57343749 826.46624999L925.5734375 697.41281251c0-20.3634375-16.4765625-36.87187501-36.7959375-36.87187501L778.3821875 660.5409375c-20.3221875 0-36.79593748 16.5084375-36.79593751 36.87187501l0 36.87187499L575.9965625 734.2846875c-20.3240625 0-36.7978125-16.5065625-36.79781249-36.871875L539.19874999 402.43500001l202.38750002 0-2e-8 36.87375001c0 20.3634375 16.47374998 36.871875 36.79593751 36.87187497l110.39625 3e-8c20.31937499 0 36.79593748-16.5084375 36.79593751-36.87187503L925.57437501 310.25624999c0-20.3653125-16.4765625-36.87187501-36.79593751-36.87187498L778.3821875 273.384375c-20.3221875 0-36.79593748 16.5065625-36.79593751 36.87187501l0 36.87187499-202.38749998 0L539.19874999 70.58718749000002c0-20.3634375 16.47374998-36.871875 36.79781251-36.87187499l165.58968749 0 2e-8 36.87187499c0 20.3634375 16.47374998 36.871875 36.79593749 36.87187501l110.39625 0c20.31937499 0 36.79593748-16.5084375 36.79593748-36.87187501L925.57437501-58.46624999000005c0-20.3634375-16.4765625-36.87187501-36.79593751-36.87187501L778.3821875-95.33812499999999c-20.3221875 0-36.79593748 16.5084375-36.79593751 36.87187501l0 36.87187499L557.59624999-21.594375000000014c-40.6453125 0-73.595625 33.0178125-73.59562498 73.7465625L484.00062501 347.12812499999995 281.6159375 347.12812499999995l0-36.87187501c0-20.3653125-16.4765625-36.87187501-36.79968751-36.87187499L134.42374999 273.384375c-20.3240625 0-36.7978125 16.5065625-36.79781249 36.87187501l0 129.05343749c0 20.3634375 16.47374998 36.871875 36.79781251 36.871875l110.39156249 0c20.3240625 0 36.7996875-16.5084375 36.7996875-36.87187501l0-36.87375 202.38562501 1e-8 0 313.4146875c0 40.72593751 32.95031249 73.74375001 73.595625 73.74375l183.98906249 0 0 36.87187501c0 20.3634375 16.47374998 36.871875 36.79593749 36.87187499l110.39625001 0C909.0978125 863.338125 925.57343749 846.82875001 925.57343749 826.46624999z" horiz-adv-x="1024" />
<glyph glyph-name="chenggongyijiejue" unicode="&#59092;" d="M513.37022099 781.06728838c-218.23163877 0-395.1452918-176.92354599-395.14529178-395.17856895 0-218.22894053 176.91365213-395.1515874 395.14529178-395.1515874 218.21275195 0 395.18576367 176.92354599 395.18576368 395.1515874C908.55598467 604.1437423699999 731.58297295 781.06728838 513.37022099 781.06728838zM735.53939053 476.06967657L489.0776917 225.56701728999997c-0.03867364-0.03957276-0.07464902-0.0809455-0.11242354-0.12051827s-0.07914638-0.07554903-0.11782002-0.11422266l-0.66015264-0.67094472c-5.49887168-5.58971017-12.78663047-8.38951172-20.18591367-8.43538096-0.05396309-0.00089913-0.10702705-0.00089913-0.16099101-0.00179912-0.14210332 0-0.28330752-0.00359737-0.42631084-0.00179912-7.38129551-0.06025957-14.69153935 2.61902461-20.26506007 8.10170683L310.30499902 358.95827870999995c-11.4249542 11.24237724-11.22888691 29.96858145 0.43800293 41.82794033 11.67318545 11.86025888 30.39669141 12.363917 41.81534912 1.12153975l114.58231348-112.73226768 225.44564766 229.15023574c11.24777373 11.4249542 29.97127968 11.22528955 41.82884033-0.44160029C746.27720967 506.21813584 746.78176778 487.49732901 735.53939053 476.06967657z" horiz-adv-x="1024" />
<glyph glyph-name="home" unicode="&#58909;" d="M874.44031573 436.3535045L579.06438066 748.21256426c-18.35655469 19.36297177-42.88742227 30.01714805-69.18739102 30.01714805s-50.82993721-10.65507627-69.18739101-30.01714806L145.31456269 436.3535045c-30.47673691-32.18467852-26.55269737-60.01451017-21.51161542-71.62743692 3.59216455-8.24920665 15.71144766-30.91563895 50.64376377-30.91563896l43.28765068 0 0-239.9024461c0-54.47516572 38.56585254-105.75839619 93.35940205-105.75839619l49.6868124 0 76.06592755 0 0 56.37827549L436.84650372 242.04834287000006c0 27.2182456-4.07153935 42.38196503 23.34637089 42.38196504l49.68591328 0 49.68501328 0c27.41791026 0 23.3463709-15.16371943 23.3463709-42.38196504l0-197.52048105 0-56.37827549 76.05423545 0 49.69940362 0c54.79265039 0 93.35940205 51.28322959 93.35940204 105.75839619L802.02321406 333.81042862000004l43.28765068 0c34.93141612 0 47.05159922 22.66643232 50.64376378 30.91563896C900.99391221 376.33899434 904.91795177 404.1688251 874.44031573 436.3535045zM845.30906651 383.19054844000004l-37.27612706 0L783.19717842 383.19054844000004l-29.86425176 0 0-289.2825668c0-27.2182456-17.29437451-56.37737637-44.67091289-56.37737637l-77.0651499 0L631.59686299 242.04834287000006c0 54.46077539-17.21252989 91.76208574-72.03486007 91.76208575l-49.68501327 0-49.68591328 0c-54.83402227 0-72.03396094-37.30220947-72.03396094-91.76208575l0-204.51773672-77.06425078 0c-27.39092873 0-44.67091289 29.15912988-44.67091288 56.37737637L266.42195175 383.19054844000004 236.55680089 383.19054844000004l-24.83486194 0-37.27612704 0c-0.86431377 0-1.64858203 3.39789638-2.3537039 3.44646299 1.67556357 2.99137148 4.57519834 10.56153955 9.40582266 15.65028896l295.40111835 311.63691006c8.8194208 9.33387187 21.28586836 15.04589854 33.3628796 14.92717938 12.06532002 0.11871914 23.77358174-5.59330752 32.59300166-14.92717938l295.40111835-311.63691006c4.81623487-5.08964941 7.73025908-12.65891748 9.40582266-15.65028896C846.95674942 386.58844482 846.17338027 383.19054844000004 845.30906651 383.19054844000004z" horiz-adv-x="1024" />
<glyph glyph-name="fuzhi" unicode="&#58910;" d="M731.68184 135.942527 731.68184 628.676741c0 30.233582-24.512277 54.745858-54.747905 54.745858L184.216093 683.422599c-30.233582 0-54.746882-24.512277-54.746882-54.745858l0-492.734214c0-30.207999 24.5133-54.746882 54.746882-54.746882l492.717841 0C707.16854 81.195645 731.68184 105.734528 731.68184 135.942527zM622.1891 135.942527 238.962975 135.942527c-30.233582 0-54.746882 24.538883-54.746882 54.745858L184.216093 573.92986c0 30.233582 24.5133 54.746882 54.746882 54.746882l383.226125 0c30.233582 0 54.744835-24.512277 54.744835-54.746882l0-383.242498C676.933935 160.48141 652.421658 135.942527 622.1891 135.942527zM841.17458 519.182978l-54.745858 0 0-54.746882c30.232558 0 54.745858-24.5133 54.745858-54.759161l0-383.228171c0-30.206976-24.5133-54.745858-54.745858-54.745858L403.201573-28.297095c-30.233582 0-54.746882 24.538883-54.746882 54.745858l-54.746882 0 0-54.745858c0-30.207999 24.5133-54.747905 54.746882-54.747905l492.719888 0c30.234605 0 54.747905 24.539906 54.747905 54.747905L895.922485 464.436096C895.922485 494.670701 871.408161 519.182978 841.17458 519.182978z" horiz-adv-x="1024" />
<glyph glyph-name="shanchu1" unicode="&#58897;" d="M680.18372158-8.618004789999986L323.26341348-8.618004789999986c-85.74426562 0-115.16241973 15.91650879-115.16241973 114.51216094L208.10099375 491.08229795c0 13.14009141 10.65417627 23.7951668 23.7951668 23.79516679 13.14009141 0 23.7951668-10.65417627 23.79516679-23.79516679l0-385.18814267c0-62.5301042-1.58022862-66.92362559 67.57298526-66.92362559l356.9203081 0c66.84088184 0 75.19441816 1.88332295 75.19441816 66.92362559L755.37903887 491.08229795c0 13.14009141 10.65417627 23.7951668 23.7951668 23.79516679 13.14009141 0 23.79426768-10.65417627 23.79426767-23.79516679l0-385.18814267C802.96757422 14.943320210000024 772.62034942-8.618004789999986 680.18372158-8.618004789999986zM672.0973042 621.95346797c-13.14009141 0-23.79426768 10.65417627-23.79426767 23.7951668l-1e-8 7.43615859c0 68.75838193-12.8504874 75.84557695-75.19441816 75.84557695L430.33941582 729.0303694300001c-65.00522636 0-67.57298526-9.21335362-67.57298525-75.84557695l0-7.4361586c0-13.14009141-10.65417627-23.7951668-23.7951668-23.79516679-13.14099052 0-23.7951668 10.65417627-23.79516679 23.79516679l0 7.4361586c0 92.28553067 24.25925215 123.43501143 115.16241972 123.43501143l142.76830341 0c98.94371572 0 122.78475175-39.8052123 122.78475176-123.43501143l0-7.4361586C695.89247099 632.60764424 685.23829473 621.95346797 672.0973042 621.95346797zM362.76643057 110.35603096c-6.57634131 0-11.8980334 5.34327714-11.8980334 11.89803339l0 23.79336768c0 6.57634131 5.32169209 11.8980334 11.8980334 11.8980334 6.57634131 0 11.89713339-5.32079209 11.89713339-11.8980334l0-23.79336768C374.66356396 115.69930810000005 369.34187188 110.35603096 362.76643057 110.35603096zM362.76643057 193.63776561999998c-6.57634131 0-11.8980334 5.34327714-11.8980334 11.89803341L350.86839717 407.80056328c0 6.5700457 5.32169209 11.89713339 11.8980334 11.8971334 6.57634131 0 11.89713339-5.32708857 11.89713339-11.8971334l0-202.26566425C374.66356396 198.98104278000005 369.34187188 193.63776561999998 362.76643057 193.63776561999998zM505.53383398 110.35603096c-6.57634131 0-11.89713339 5.34327714-11.89713339 11.89803339l0 285.54739893c0 6.5700457 5.32079209 11.89713339 11.89713339 11.89713339s11.8980334-5.32708857 11.89803341-11.89713339l0-285.54739893C517.43186739 115.69930810000005 512.11017529 110.35603096 505.53383398 110.35603096zM648.30303653 110.35603096c-6.57634131 0-11.8980334 5.34327714-11.89803341 11.89803339l0 285.54739893c0 6.5700457 5.32169209 11.89713339 11.89803341 11.89713339s11.89713339-5.32708857 11.89713339-11.89713339l0-285.54739893C660.1992708 115.69930810000005 654.87847872 110.35603096 648.30303653 110.35603096zM898.14734229 565.44118301c0-54.20624854-43.94060859-98.15315185-98.15315186-98.15315186l-577.02177949 0c-54.21164414 0-98.15315185 43.9469042-98.15315186 98.15315186l0 5.9485667c0 54.20624854 43.94060859 98.15315185 98.15315186 98.15315185l577.02177949 0c54.21164414 0 98.15315185-43.9469042 98.15315186-98.15315185L898.14734229 565.44118301zM850.55790781 571.38885059c0 27.92516661-22.63225518 50.56371739-50.56371738 50.56371738l-577.02177949 0c-27.93056308 0-50.56371739-22.63855078-50.56371739-50.56371738l0-5.94856671c0-27.92516661 22.6331543-50.56371739 50.56371739-50.56371737l577.02177949 0c27.93146221 0 50.56371739 22.63855078 50.56371738 50.56371737L850.55790781 571.38885059z" horiz-adv-x="1024" />
<glyph glyph-name="xitongcaozuorizhi" unicode="&#59025;" d="M896.69314575 271.37297058l-101.50337219 101.73511505c-6.95228576 7.02953339-16.45374298 10.96916198-26.41868591 10.96916199L603.15219117 384.07724763c-23.01979065 0-41.7137146-18.61667633-41.71371461-41.55921937L561.43847656 31.596359249999978c0-22.94254303 18.69392395-41.55921936 41.71371461-41.55921936l262.64190673 0c23.01979065 0 41.7137146 18.61667633 41.7137146 41.55921936L907.5078125 245.26327515000003C907.5078125 254.99647521999998 903.64543152 264.42068482 896.69314575 271.37297058zM858.06933594 39.47561645999997l-247.19238281 0 0 295.08590698 152.87303925 0L858.06933594 240.08768463 858.06933594 39.47561645999997zM650.81397248 235.68457031000003l70.99056244 0c13.67282868 0 24.71923828 11.04640961 24.71923828 24.71923828s-11.04640961 24.71923828-24.71923828 24.71923829l-70.99056245 0c-13.67282868 0-24.71923828-11.04640961-24.71923827-24.71923829S637.1411438 235.68457031000003 650.81397248 235.68457031000003zM626.0947342 186.24609375c0-13.67282868 11.04640961-24.71923828 24.71923827-24.71923828l159.82532501 0c13.67282868 0 24.71923828 11.04640961 24.71923828 24.71923828s-11.04640961 24.71923828-24.71923828 24.71923828l-159.82532501 0C637.1411438 210.96533203 626.0947342 199.91892241999994 626.0947342 186.24609375zM810.63929748 136.80761718999997l-159.82532501 0c-13.67282868 0-24.71923828-11.04640961-24.71923827-24.71923828s11.04640961-24.71923828 24.71923828-24.71923829l159.825325 0c13.67282868 0 24.71923828 11.04640961 24.71923828 24.71923829S824.23487854 136.80761718999997 810.63929748 136.80761718999997zM490.37066651 235.68457031000003l-52.52838135 0 0 49.43847657 50.13370514 0c13.67282868 0 24.71923828 11.04640961 24.71923828 24.71923828s-11.04640961 24.71923828-24.71923828 24.71923828L194.35778808 334.56152344c-15.68126679 0-28.42712403 12.74585724-28.42712402 28.42712403l0 289.2923355c0 15.68126679 12.74585724 28.42712403 28.42712403 28.42712402l437.6077652 0c15.68126679 0 28.42712403-12.74585724 28.42712402-28.42712402L660.39267732 456.22652436c0-13.67282868 11.04640961-24.71923828 24.71923827-24.71923829s24.71923828 11.04640961 24.71923828 24.71923828l0 196.05445862c0 42.94967651-34.91592407 77.86560059-77.86560058 77.86560059L194.35778808 730.14658357C151.40811157 730.06933594 116.4921875 695.15341187 116.4921875 652.28098297L116.4921875 362.98864746000004c0-42.94967651 34.91592407-77.86560059 77.86560059-77.86560058L388.40380859 285.12304687000005l0-49.43847656L289.52685547 235.68457031000003c-13.67282868 0-24.71923828-11.04640961-24.71923828-24.71923828s11.04640961-24.71923828 24.71923828-24.71923828l200.84381104 0c13.67282868 0 24.71923828 11.04640961 24.71923828 24.71923828S504.04349518 235.68457031000003 490.37066651 235.68457031000003z" horiz-adv-x="1024" />
<glyph glyph-name="dingwei" unicode="&#59332;" d="M511.99955 777.48321856c-137.58151992 0-249.11220234-111.53158154-249.11220234-249.11220234 0-41.85852012 10.44911513-81.2311251 28.68425244-115.87383721l-0.09083848-0.04496924 220.5196875-421.93542745 217.79363584 417.06972686c19.9116 35.78044043 31.31856562 76.93473867 31.31856562 120.78450791C761.11175234 665.95163701 649.58106992 777.48321856 511.99955 777.48321856zM511.99955 442.18335205c-42.30731602 0-76.61995136 34.31263623-76.61995136 76.65053115 0 42.30731602 34.31263623 76.61995136 76.61995136 76.61995137 42.3369958 0 76.65053115-34.31263623 76.65053115-76.61995137C588.64918203 476.4968874 554.3365458 442.18335205 511.99955 442.18335205z" horiz-adv-x="1024" />
<glyph glyph-name="yunxingzhong" unicode="&#59067;" d="M512-11.507812489999992c-217.52929689 0-395.50781249 177.97851563-395.50781249 395.50781249s177.97851563 395.50781249 395.50781249 395.50781249 395.50781249-177.97851563 395.50781249-395.50781249S729.52929689-11.507812489999992 512-11.507812489999992zM512 735.01318359C319.18994139 735.01318359 160.98681641 576.8100586099999 160.98681641 384s158.20312501-351.01318359 351.01318359-351.01318359 351.01318359 158.20312501 351.01318359 351.01318359S704.81005861 735.01318359 512 735.01318359zM413.12304687 522.42773437L689.97851563 384 413.12304687 245.57226562999995Z" horiz-adv-x="1024" />
<glyph glyph-name="shezhishedingpeizhichilun" unicode="&#59407;" d="M896 448l-71.04 0c-8.32 40.96-24.96 78.08-46.72 111.36l50.56 50.56c24.96 24.96 24.96 65.28 0 90.24-24.96 24.96-65.28 24.96-90.24 0l-50.56-50.56C654.08 672.64 616.96 689.28 576 697.6L576 768c0 35.2-28.8 64-64 64C476.8 832 448 803.2 448 768l0-70.4C407.04 689.28 369.92 672.64 336 650.24L285.44 700.8c-24.96 24.96-65.28 24.96-90.24 0-24.96-24.96-24.96-65.28 0-90.24l50.56-50.56C224 526.0799999999999 207.36 488.96 199.04 448L128 448C92.8 448 64 419.2 64 384c0-35.2 28.8-64 64-64l71.04 0c8.32-40.96 24.96-78.08 46.72-111.36l-50.56-50.56c-24.96-24.96-24.96-65.28 0-90.24 24.96-24.96 65.28-24.96 90.24 0l50.56 50.56C369.92 95.36000000000001 407.04 78.72000000000003 448 70.39999999999998L448 0c0-35.2 28.8-64 64-64 35.2 0 64 28.8 64 64l0 70.4c40.96 8.32 78.08 24.96 112 47.36l50.56-50.56c24.96-24.96 65.28-24.96 90.24 0 24.96 24.96 24.96 65.28 0 90.24l-50.56 50.56c21.76 33.28 38.4 71.04 46.72 111.36L896 319.36c35.2 0 64 28.8 64 64C960 419.2 931.2 448 896 448zM512 256c-70.4 0-128 57.6-128 128 0 70.4 57.6 128 128 128 70.4 0 128-57.6 128-128C640 313.6 582.4 256 512 256z" horiz-adv-x="1024" />
<glyph glyph-name="zhiyuanshuaxin9" unicode="&#58931;" d="M510.73509781 805.95455437c-232.36501688 0-420.67094531-188.30592844-420.67094531-420.67094531 0-232.31513062 188.30592844-420.67094531 420.67094531-420.67094531 232.31321156 0 420.67094531 188.35581469 420.67094531 420.67094531C931.40604312 617.64862594 743.04830938 805.95455437 510.73509781 805.95455437L510.73509781 805.95455437zM510.01558531 145.26682125000002c-97.61957437 0-180.85945688 62.03250188-212.90365125 148.71357188l0.35975625 0.154455c-2.0021625 4.00528406-3.33757687 8.32043906-3.33757687 13.09416187 0 16.53534938 13.3512675 29.88661688 29.88565781 29.88661688 13.24957688 0 24.13531594-8.78092688 27.987105-20.74497469l0.46144687 0.15253687c23.05700719-64.8558675 84.88324875-111.53493937 157.54630407-111.53493937 92.32972031 0 167.40553875 75.07485937 167.40553875 167.40553875 0 92.27791594-75.07581844 167.35373437-167.40553875 167.35373437-20.2326825 0-39.48970594-3.95347969-57.46312031-10.57778812l21.05484468-40.36271438c2.46456937-2.66986969 3.95443875-6.26455219 3.95443875-10.16718656 0-8.37032531-8.31852-14.7893325-15.19993406-14.94378844l-0.30891094 0c-0.20530125 0-0.41060156 0-0.61590281 0l-149.32947469 6.41900813c-5.28889406 0.20530125-10.11634125 3.28673156-12.58186968 8.01056906-2.46456937 4.72479656-2.20746375 10.42525125 0.66770718 14.94378844l80.15941219 126.06716625c2.87613 4.46769094 7.95972375 7.08671531 13.24861781 6.880455 5.34069937-0.25614656 10.11538219-3.28673156 12.58090969-8.01056906l18.43486125-35.32996594c26.39458406 10.78308938 55.20289219 16.791495 85.39842 16.791495 125.24596313 0 227.1787725-101.881005 227.1787725-227.07612281C737.19435781 247.14878531 635.26154844 145.26682125000002 510.01558531 145.26682125000002L510.01558531 145.26682125000002zM510.01558531 145.26682125000002" horiz-adv-x="1024" />
<glyph glyph-name="tishi2" unicode="&#59027;" d="M874.02587891 536.08857422c-20.61650391 47.67011719-48.66503906 89.24150391-84.1631836 124.69130859-35.48408203 35.46035156-76.97197266 63.48867187-124.44697265 84.09023438-47.48027344 20.60683594-98.31357422 30.90761719-152.49990235 30.90761719-54.19072266 0-105.02578125-10.30166016-152.50429687-30.90761719-47.475-20.6015625-88.95234375-48.62900391-124.44697266-84.09023438-35.49462891-35.45068359-63.54228516-77.01591797-84.16933594-124.69130859-20.62177734-47.67626953-30.92695313-98.57724609-30.92695312-152.72490235 0-54.14238281 10.30517578-104.92207031 30.92695312-152.35224609 20.62529297-47.44072266 48.67470703-88.88378906 84.1631836-124.34326172 35.49462891-35.45068359 76.97197266-63.47900391 124.44609375-84.09023437 47.47939453-20.59716797 98.31357422-30.90234375 152.50429687-30.90234375 54.18720703 0 105.01962891 10.30166016 152.49990235 30.90234375 47.475 20.61123047 88.96113281 48.64042969 124.44609375 84.09023437 35.49023438 35.46035156 63.54755859 76.90341797 84.16318359 124.34326172 20.63144531 47.43017578 30.93662109 98.21513672 30.93662109 152.35224609 0.00966797 54.15292969-10.30166016 105.04951172-30.93134765 152.72490235l0 0zM512.91582031 130.48564452999995c-24.51357422 0-44.38037109 19.84746094-44.38037109 44.34169922 0 24.48369141 19.87207031 44.34169922 44.38037109 44.34169922 24.51796875 0 44.37597656-19.85712891 44.37597657-44.34169922 0-24.49863281-19.86152344-44.34169922-44.37597657-44.34169922l0 0zM557.29179688 314.82216797c0-24.48896484-19.86152344-44.35136719-44.37597657-44.35136719-24.51357422 0-44.38037109 19.86152344-44.38037109 44.35136719l0 277.80820312c0 24.49863281 19.87207031 44.35136719 44.38037109 44.35136719 24.51796875 0 44.37597656-19.85273438 44.37597657-44.35136719l0-277.80820312zM557.29179688 314.82216797z" horiz-adv-x="1024" />
<glyph glyph-name="one-line-arrow" unicode="&#58908;" d="M962.011 834.022l-150.243-40.261 39.115-39.139-788.895-788.873 31.75-31.75 788.895 788.873 39.115-39.115z" horiz-adv-x="1024" />
<glyph glyph-name="quanping" unicode="&#59104;" d="M654.74667969 487.14492187l222.61992187 221.85175782-0.76289062-125.72226563c-0.30585937-10.42734375 8.12460938-19.62333984 18.55019531-19.31748047h13.33916016c10.42734375 0.30673828 19.16367187 6.43886719 19.31748046 17.01914063l0.61435547 187.20263672c0 0.15380859 0.30585937 9.96503906 0.30585938 9.96503906 0.15380859 5.21103516-1.07402344 9.96503906-4.44726563 13.33916016-3.37324219 3.37324219-7.96904297 5.51865234-13.33916015 5.36660156l-9.50625-0.15380859c-0.15292969 0-0.30234375 0-0.45703125-0.1538086l-185.67070313 0.76904297c-10.42734375-0.30673828-19.16367187-8.89628906-19.31748047-19.47304687v-13.33916016c1.53544922-12.41806641 11.34404297-19.62509766 21.77050782-19.31748047l122.34814453-0.30673828-222.00556641-221.08798828c-10.11972656-10.11972656-10.11972656-26.52275391 0-36.64072266 10.11972656-10.27265625 26.52539063-10.27265625 36.64423828 0h-0.00351562zM374.16992187 278.01708984000004l-222.77197265-221.08974609 0.76728516 125.1140625c0.30673828 10.42294922-8.128125 19.61982422-18.55371094 19.31748047h-14.10292969c-10.42734375-0.30673828-19.16367187-6.43974609-19.31748047-17.02001953l-0.61435547-187.35644531c0-0.15380859-0.30585937-9.96503906-0.30585937-9.96503907-0.15380859-5.2171875 1.07402344-9.96503906 4.44287109-13.33916015 3.37324219-3.37324219 7.97431641-5.51865234 13.33916016-5.36660157l9.50537109 0.1538086c0.15380859 0 0.30673828 0 0.46142578 0.15380859l186.43798828-0.76816406c10.42294922 0.30673828 19.16367187 8.89189453 19.31748047 19.47304687v13.33828125c-1.53457031 12.41806641-11.34667969 19.62509766-21.77490234 19.31748047l-122.34902344 0.30673828 221.85263672 221.08271485c10.11972656 10.11972656 10.11972656 26.52626953 0 36.64423828-9.96152344 10.27265625-26.2125 10.27265625-36.33398438-0.00087891v0zM928.42490234-3.016699219999964l-0.46054687 187.35644531c-0.30673828 10.42822266-8.89628906 16.71328125-19.31835938 17.02001954h-13.33828125c-10.42822266 0.30234375-18.70576172-8.89628906-18.55458984-19.31748047l0.76816406-125.72666016-222.77285156 221.70146484c-10.11972656 10.11972656-26.52539063 10.11972656-36.64423828 0-10.11533203-10.11884766-10.11533203-26.52539063 0-36.64423828l221.85527344-221.08183593-122.34814454-0.30673829c-10.42734375 0.30673828-20.08476562-7.05234375-21.77402343-19.31748046v-13.33916016c0.30585937-10.42734375 8.89628906-19.16367187 19.31748047-19.47304688l185.67158203 0.76816407c0.15292969 0 0.30585937-0.15380859 0.46054687-0.1538086l9.50625-0.15380859c5.21015625-0.15292969 9.96503906 1.83955078 13.33828125 5.36660156 3.37324219 3.37324219 4.5984375 8.12373047 4.44375 13.33916016 0 0-0.15380859 9.81210938-0.15380859 9.96503906h0.00439453zM188.81035156 744.87275391l122.34814453 0.30673828c10.42294922-0.30673828 20.08125 7.05234375 21.77050782 19.31748047v13.34091797c-0.30673828 10.42734375-8.89189453 19.16367187-19.31748047 19.47304687l-186.58828125-0.76816406c-0.15380859 0-0.30673828 0.15380859-0.46142578 0.15380859l-9.50449219 0.1538086c-5.2171875 0.15292969-9.96503906-1.83955078-13.33916016-5.36660157-3.37324219-3.37324219-4.60283203-8.12373047-4.44287109-13.33916015 0 0 0.30585937-9.81210938 0.30585937-9.96503907l0.45703125-187.35644531c0.15380859-10.42382813 8.89628906-16.71328125 19.31748047-17.015625h14.10732422c10.42734375-0.30585937 18.70488281 8.89189453 18.54931641 19.31748047l-0.61347657 125.10878906 222.6234375-221.24267578c10.11445313-10.11972656 26.521875-10.11972656 36.63984375 0 10.11972656 10.11972656 10.11972656 26.52539063 0 36.64423828l-221.85263671 221.23476563zM188.81035156 744.87275391z" horiz-adv-x="1024" />
<glyph glyph-name="quanping1" unicode="&#58976;" d="M167.09959268 728.9179459l163.25371406-1e-8c14.12762168 0 25.73784932 11.54367334 25.73784931 25.77202648 0 14.32908458-11.52568565 25.77112734-25.73784931 25.77112734l-189.05901768 0c-7.06381084 0-13.48995411-2.88524355-18.15419179-7.55038125-4.731692-4.66513682-7.58455752-11.09128008-7.58455753-18.18836807L115.55553974 565.6642318300001c0-14.12762168 11.54367334-25.73784932 25.77112735-25.73784931 14.32908458 0 25.77202646 11.52658477 25.77202646 25.73784932L167.09869268 728.9179459zM854.34344141 728.9179459L691.08972734 728.9179459c-14.14471026 0-25.73784932 11.54367334-25.73784931 25.77202647 0 14.32908458 11.52658477 25.77112734 25.73784931 25.77112734l189.05901768 0c7.06381084 0 13.48995411-2.88524355 18.1541918-7.55038125 4.73259112-4.66513682 7.58455752-11.09128008 7.58455751-18.18836807L905.88749433 565.6642318300001c0-14.12762168-11.54367334-25.73784932-25.77112733-25.73784931-14.32908458 0-25.77202646 11.52658477-25.77202648 25.73784932L854.34434053 728.9179459zM167.09959268 41.67499627999996l163.25371406 1e-8c14.12762168 0 25.73784932-11.54277422 25.73784931-25.77112734 0-14.32908458-11.52568565-25.77112734-25.73784931-25.77112734l-189.05901768 0c-7.06381084 0-13.48995411 2.88614356-18.15419179 7.55038125-4.731692 4.6642377-7.58455752 11.09128008-7.58455753 18.18836806L115.55553974 204.92781122999997c0 14.1285208 11.54367334 25.73964844 25.77112735 25.73964844 14.32908458 0 25.77202646-11.52658477 25.77202646-25.73964844L167.09869268 41.67499627999996zM854.34344141 41.67499627999996L691.08972734 41.67499627999996c-14.14471026 0-25.73784932-11.54277422-25.73784931-25.77112733 0-14.32908458 11.52658477-25.77112734 25.73784931-25.77112734l189.05901768 0c7.06381084 0 13.48995411 2.88614356 18.1541918 7.55038125 4.73259112 4.6642377 7.58455752 11.09128008 7.58455751 18.18836806L905.88749433 204.92781122999997c0 14.1285208-11.54367334 25.73964844-25.77112733 25.73964844-14.32908458 0-25.77202646-11.52658477-25.77202648-25.73964844L854.34434053 41.67499627999996z" horiz-adv-x="1024" />
<glyph glyph-name="shanchu" unicode="&#58928;" d="M817.968553 680.102858l-169.357176 0 0 58.869782c0 25.391297-20.657482 46.048779-46.048779 46.048779l-181.125197 0c-25.391297 0-46.048779-20.657482-46.048779-46.048779l0-58.869782-169.357176 0c-25.391297 0-46.048779-20.657482-46.048779-46.048779l0-71.631434c0-25.391297 20.657482-46.048779 46.048779-46.048779l28.321022 0 0-425.947112c0-59.246359 48.200792-107.447151 107.447151-107.447151l340.40076 0c59.246359 0 107.447151 48.200792 107.447151 107.447151L789.647531 516.373867l28.321022 0c25.391297 0 46.048779 20.657482 46.048779 46.048779l0 71.631434C864.017332 659.445376 843.35985 680.102858 817.968553 680.102858zM426.553932 733.85611l170.892135 0 0-53.753251-170.892135 0L426.553932 733.85611zM738.482221 90.425731c0-31.033807-25.248034-56.281841-56.281841-56.281841L341.79962 34.14389c-31.033807 0-56.281841 25.248034-56.281841 56.281841L285.517779 516.373867l452.964442 0L738.482221 90.425731zM812.852022 567.539176l-601.704045 0 0 61.398372 203.227588 0c2.302439-0.356111 4.66116-0.542352 7.061836-0.542352l181.125197 0c2.400676 0 4.759397 0.186242 7.062859 0.542352l203.226564 0L812.852022 567.539176zM513.023306 112.679571c14.128789 0 25.582655 11.453866 25.582655 25.582655l0 288.572348c0 14.128789-11.453866 25.582655-25.582655 25.582655-14.128789 0-25.582655-11.453866-25.582655-25.582655l0-288.572348C487.440651 124.133438 498.894518 112.679571 513.023306 112.679571zM645.541459 112.679571c14.128789 0 25.582655 11.453866 25.582655 25.582655l0 288.572348c0 14.128789-11.453866 25.582655-25.582655 25.582655s-25.582655-11.453866-25.582655-25.582655l0-288.572348C619.958804 124.133438 631.41267 112.679571 645.541459 112.679571zM380.505154 112.679571c14.128789 0 25.582655 11.453866 25.582655 25.582655l0 288.572348c0 14.128789-11.453866 25.582655-25.582655 25.582655s-25.582655-11.453866-25.582655-25.582655l0-288.572348C354.922499 124.133438 366.376365 112.679571 380.505154 112.679571z" horiz-adv-x="1024" />
<glyph glyph-name="yonghu" unicode="&#58936;" d="M502.36843027 778.68930029c110.43882247 0 199.96232519-88.06199414 199.9623252-196.67775234 0-108.63734414-89.52260362-196.70383477-199.96232519-196.70383477-110.4352251 0-199.95692959 88.06559151-199.9569296 196.70383477C302.41060156 690.65248945 391.96288497 778.68930029 502.36843027 778.68930029L502.36843027 778.68930029 502.36843027 778.68930029zM502.36843027 778.68930029c110.43882247 0 199.96232519-88.06199414 199.9623252-196.67775234 0-108.63734414-89.52260362-196.70383477-199.96232519-196.70383477-110.4352251 0-199.95692959 88.06559151-199.9569296 196.70383477C302.41060156 690.65248945 391.96288497 778.68930029 502.36843027 778.68930029L502.36843027 778.68930029 502.36843027 778.68930029zM427.38806709 319.72957528999996l166.66689991 0c142.65947724 0 258.29317705-113.71979795 258.29317704-254.05435107l0-16.36710293c0-55.30260498-115.65798398-57.4044794-258.29317705-57.40447939L427.38806709-8.09635897999999c-142.66397373 0-258.29317705 0.0809455-258.29317706 57.40447939l0 16.36710293C169.09668828 206.00977734000003 284.72499248 319.72957528999996 427.38806709 319.72957528999996L427.38806709 319.72957528999996 427.38806709 319.72957528999996z" horiz-adv-x="1024" />
<glyph glyph-name="ai06" unicode="&#58999;" d="M512.23227737 786.07299584c-220.42550386 0-400.83069382-180.37841124-400.83069387-400.82836479 0-220.42666781 180.40518997-400.83069382 400.83069387-400.83069382 220.45228257 0 400.83069382 180.40402602 400.8306938 400.83069382C913.06297003 605.69342066 732.68455878 786.07299584 512.23227737 786.07299584M472.18518473 224.92702380000003l-80.1710285 0 0 320.65966421 80.1710285 0L472.18518473 224.92702380000003zM632.52840562 224.92702380000003l-80.17102848 0 0 320.65966421 80.17102848 0L632.52840562 224.92702380000003z" horiz-adv-x="1024" />
<glyph glyph-name="ai05" unicode="&#59001;" d="M391.40755797 224.11434667000003l80.57853156 0 0 322.28502072-80.57853156 0L391.40755797 224.11434667000003zM512.23344128 788.10469149c-221.54089813 0-402.86122439-181.29354638-402.86122439-402.8612244 0-221.54322717 181.31916117-402.86238834 402.86122439-402.86238834 221.56884082 0 402.86005931 181.31916117 402.86005931 402.86238834C915.09350059 606.81114397 733.8022821 788.10469149 512.23344128 788.10469149M512.23344128 62.95844637000005c-177.23947122 0-322.2826917 145.04554951-322.2826917 322.28502072 0 177.26508601 145.04322048 322.31063552 322.2826917 322.31063552 177.26508601 0 322.31063552-145.04554951 322.31063552-322.31063552C834.54407566 208.00399587000004 689.49852729 62.95844637000005 512.23344128 62.95844637000005M552.56229319 224.11434667000003l80.57853156 0 0 322.28502072-80.57853156 0L552.56229319 224.11434667000003z" horiz-adv-x="1024" />
<glyph glyph-name="yonghu1" unicode="&#58921;" d="M670.01446625 357.18713906000005c58.26993281 47.0465025 94.18606219 118.78570312 94.18606219 195.97976532 0 139.07115-113.12937844 252.20052844-252.20052844 252.20052843-139.07115 0-252.20052844-113.12937844-252.20052844-252.20052843 0-77.35523344 36.06578719-149.23449938 94.55157375-196.27524563-140.62913344-61.70056687-236.44129313-202.84007438-236.44129312-360.50341875 0-18.65743031 15.11359312-33.75375469 33.75375468-33.75375469s33.75375469 15.09728438 33.75375469 33.75375469c0 152.75051531 108.58014281 286.77836438 258.18303188 318.75252562 15.27572344 3.25986938 25.87077937 16.38760875 26.6257875 31.28055188 0.02302406 0.35495906 0.0326175 0.708 0.04413 1.062 0.00959344 0.50078062 0.01534969 1.00156125 0.00287812 1.50521906-0.17556094 13.57767469-8.56027594 26.26699125-22.057365 31.25368969C375.89515906 406.87665 327.30794094 476.36233875 327.30794094 553.16690438c0 101.85606188 82.85230594 184.69205906 184.69205906 184.69205906 101.83975219 0 184.69205906-82.83599719 184.69205906-184.69205906 0-76.8036075-48.58721812-146.29025531-120.90874406-172.92371813-4.535805-1.67598375-8.48256844-4.23360938-11.75107312-7.38987-0.08634187-0.08346375-0.16500844-0.17460187-0.25039032-0.25902469-0.66099188-0.65139844-1.30375594-1.31814656-1.90526812-2.01751219-0.26574-0.30699188-0.50461781-0.63700781-0.75884531-0.95455312-0.40388625-0.50653687-0.81544688-1.0063575-1.18863375-1.53400031-0.33481312-0.47008125-0.63412969-0.96702469-0.94591875-1.45629282-0.26574-0.41827687-0.54395156-0.82791844-0.79050375-1.25770687-0.29452031-0.51229313-0.55450406-1.04856938-0.82312219-1.57908937-0.23024344-0.45473156-0.47008125-0.90178875-0.67921969-1.36611375-0.20913844-0.46624406-0.38949563-0.94975594-0.57848812-1.42847157-0.22928438-0.57561-0.45856875-1.14930094-0.65619469-1.7373825-0.12951187-0.38853656-0.23599969-0.78762562-0.35208094-1.18287844-0.20913844-0.708-0.40676438-1.41887812-0.56985375-2.14126781-0.02686219-0.11991844-0.06811406-0.2321625-0.09401625-0.35304093-0.05180531-0.24079688-0.07003219-0.47967469-0.11608125-0.72047157-0.14198344-0.74349562-0.26861812-1.48795125-0.36167437-2.24200031-0.04988625-0.40772344-0.08250375-0.81160969-0.11704032-1.21837406-0.05852062-0.67921969-0.10360969-1.35939844-0.11991843-2.04533344-0.01247156-0.48159375-0.00575625-0.95934938 0.00287812-1.438065 0.0115125-0.59863406 0.03069937-1.19630906 0.07482938-1.79686219 0.04029281-0.55930125 0.10169062-1.11380437 0.16884562-1.66734937 0.06331687-0.51613031 0.13143094-1.03130063 0.21969094-1.54647188 0.10744687-0.63125156 0.24079688-1.25386969 0.38278031-1.87552875 0.10169062-0.44226 0.20242313-0.88356094 0.32234156-1.32390281 0.18515438-0.67730062 0.39908906-1.34212969 0.62549625-2.00408156 0.09209719-0.26957719 0.154455-0.5420325 0.25326844-0.81160969 0.05947969-0.16021125 0.13239-0.30987 0.19378875-0.46912219 0.15349594-0.39717094 0.31946344-0.78666656 0.48735-1.17712219 0.24463406-0.57081281 0.50269875-1.13107312 0.77515406-1.68078 0.16213031-0.32713781 0.32425969-0.6533175 0.49694344-0.97469906 0.35591906-0.66387 0.73486219-1.30759312 1.13011406-1.93884562 0.12567469-0.20050406 0.24079688-0.40676438 0.37126782-0.60534938 0.55546312-0.84806531 1.14162563-1.66926844 1.76424375-2.45497594 0.07578844-0.09497531 0.16021125-0.18323531 0.23599968-0.27725156 0.53435813-0.65907281 1.08982125-1.29512156 1.66830844-1.90718719 0.26478094-0.28108969 0.54107344-0.54874781 0.81544688-0.82120312 0.40100812-0.39621094 0.80873156-0.78378844 1.2279675-1.15793531 0.35975625-0.32330063 0.72334969-0.64084594 1.09749562-0.94975594 0.32809781-0.26861812 0.66770719-0.52284562 1.00539844-0.77899219 1.62705656-1.23852 3.37499156-2.33217844 5.23517062-3.26850375 0.23120344-0.11608125 0.46048781-0.23408156 0.69360938-0.34536562 0.597675-0.28396781 1.20494344-0.55162594 1.82372344-0.80105719 0.26861812-0.10840687 0.54011344-0.20530125 0.81160968-0.30699188 1.10229281-0.41252063 2.23240688-0.76843875 3.39513844-1.06967437 0.30411375-0.07866656 0.60343125-0.17268281 0.90946313-0.242715 0.16980469-0.03933375 0.33001594-0.09689438 0.50078062-0.13335 149.58658031-31.84177125 258.16672312-166.06820531 258.16672312-319.1477775 0-18.65743031 15.11359312-33.75375469 33.75375469-33.75375469s33.75375469 15.09728438 33.75375469 33.75375469C906.08928781 154.19069062999995 810.44789188 295.37912530999995 670.01446625 357.18713906000005z" horiz-adv-x="1024" />
<glyph glyph-name="wenjianjia" unicode="&#59240;" d="M841.99029541 433.4046936v0h-566.12905884c-21.02618408 0-38.80178833-13.73483276-44.92391967-32.73568725v0l-49.39398194-152.17327881v420.76263428h235.90310669c0-52.10650635 42.21139526-94.31790161 94.32119751-94.31790161v0h235.85119629v-94.31954956h47.15524292v94.31954956c0 26.02770997-21.12588501 47.16101074-47.15524292 47.16101073h-235.90722657c-26.02606201 0-47.15936279 21.13082886-47.15936279 47.15689088v0c0 26.02853393-21.07727051 47.15936279-47.15936279 47.15936279v0h-235.85119629c-26.02688599 0-47.15936279-21.13165283-47.15936279-47.15936279v-566.02194214c0-26.02853393 21.13165283-47.15524292 47.15936279-47.15524293h566.02359009c21.02618408 0 38.80178833 13.72988891 44.92391968 32.73568726h0.0519104l96.50061035 297.43341065c0.00082398 26.02688599-21.02453614 47.10580445-47.05389404 47.15936279v0zM750.01660156 103.23312378000003h-568.47161865l91.871521 283.01138305h568.46749877l-91.8682251-283.01138305z" horiz-adv-x="1024" />
<glyph glyph-name="chenggong" unicode="&#58887;" d="M512.61293427 778.23870615c-217.56429141 0-393.93291357-176.36862217-393.93291357-393.93291357 0-217.56429141 176.36862217-393.93291357 393.93291357-393.93291357 217.56429141 0 393.93291357 176.36862217 393.93291358 393.93291357C906.54584786 601.87008398 730.17722568 778.23870615 512.61293427 778.23870615zM749.87656982 494.45681016L477.29208184 215.96692645999997c-0.92906982-1.39405518-1.96336846-2.72515254-3.18204229-3.95911581-10.68385605-10.85114268-28.00341386-10.85114268-38.69446552 0L300.01777402 349.48949824c-10.67576221 10.85204268-10.67576221 28.43691943 0 39.27277265 10.68295693 10.85204268 28.00251387 10.85204268 38.6863708 0L454.35403408 271.34777783000004l256.82807022 262.39709444c10.69195078 10.85114268 28.00341386 10.85114268 38.69446552 0C760.55233115 522.89373047 760.55233115 505.30975195 749.87656982 494.45681016z" horiz-adv-x="1024" />
<glyph glyph-name="anquan" unicode="&#58993;" d="M840.58007276 688.34555391c-0.81394805 8.2294207-5.74170732 15.50278916-13.06184414 19.33059375-85.93133818 44.87867227-186.40761593 67.5576958-298.55707823 67.5576958-5.74170732 0-11.33951221-0.19156992-16.98588369-0.28690577l0-0.09533496c-5.64547237 0.19156992-11.19560977 0.38313984-16.93731621 0.38313985-112.1503623 0-212.62663916-22.77435937-298.55707822-67.5576958-7.32103594-3.82780459-12.24879521-11.10117305-13.06184415-19.42592959-1.14762217-12.34503018-28.41983174-304.96973027 23.6359749-461.23338341 1.00461885-4.40161612 40.33405371-147.26885185 304.96793204-234.25247724l0 0c264.58800908 86.98362539 303.91654482 229.85086114 304.92116367 234.25247724C868.99990449 383.28138692000005 841.72769492 675.90608789 840.58007276 688.34555391zM769.95905381 240.79729102c-0.38313984-1.24385625-35.59696523-117.89206875-257.98468623-196.07156368l0 0c-222.3382544 78.08415908-257.55297891 194.73237158-257.93611963 196.07156368-43.25257442 129.85395908-27.65445029 370.32661846-22.9659293 429.46332361 76.26649131 37.12772724 164.97244864 55.97984531 263.96473184 55.97984534 5.74080732 0 11.29094473-0.47847568 16.93731621-0.57471065l0 0 0 0 0.04766748 0 0 0c5.69403984 0.19156992 11.24507549 0.57471065 16.93821621 0.57471065 98.9922832 0 187.69913965-18.85211807 263.96473183-55.97984532C797.61440322 611.1239103600001 813.21252823 370.74658594000005 769.95905381 240.79729102zM660.6795456 551.89097021L454.03475029 345.5789499 363.41399111 436.67728477c-9.56861279 9.66484688-25.11906943 9.56951193-34.64091387 0.09623495-9.61628028-9.56951193-9.61628028-25.07230107-0.09443583-34.64091386l104.59008808-105.06946289c3.11009151-3.15775898 6.88932862-4.88009092 10.81246905-5.93327725 3.58856719-1.91300273 7.41637177-3.25309482 11.3395122-3.25309483 6.26785049 0 12.53570097 2.39237753 17.32045694 7.17623438L695.32045859 517.25005635c9.56861279 9.47327695 9.56861279 25.07140195 0 34.64091386C685.75094668 561.45958213 670.24815753 561.45958213 660.6795456 551.89097021z" horiz-adv-x="1024" />
<glyph glyph-name="shuaxin" unicode="&#58882;" d="M422.0140625 134.78437499999995c-27.7734375 9.6890625-53.015625 23.315625-75.6984375 40.9078125-22.6828125 17.578125-42.1734375 38.3625-58.4859375 62.3109375-16.3125 23.9625-28.546875 49.95-36.703125 77.99062499l79.509375 2e-8c4.078125 3.571875 6.75 7.65 8.0296875 12.23437499 1.2796875 4.584375-0.1265625 8.6625-4.2046875 12.234375l-91.74375 93.2765625c-3.571875 3.571875-8.0296875 5.3578125-13.37343749 5.3578125-5.3578125 0-10.06875001-1.7859375-14.14687501-5.3578125l-90.984375-93.2765625c-5.6109375-6.1171875-7.2703125-10.828125-4.9640625-14.146875 2.2921875-3.31875001 5.23125001-6.75 8.7890625-10.32187501l72.6328125 2e-8c8.6625-35.1703125 22.55625001-67.66875001 41.6671875-97.48125001 19.1109375-29.8125 42.1734375-55.6875 69.1875-77.596875 27.0140625-21.9234375 57.4734375-38.9953125 91.3640625-51.2296875s69.7078125-18.3515625 107.4234375-18.3515625c28.546875 0 56.0671875 3.571875 82.575 10.7015625 26.5078125 7.1296875 51.35625001 17.325 74.5453125 30.5859375 23.1890625 13.246875 44.3390625 29.1796875 63.4640625 47.78437501 19.1109375 18.6046875 35.803125 39.375 50.0765625 62.31093749l-45.871875 18.35156251c-12.234375-18.3515625-26.38125001-34.9171875-42.4265625-49.69687501-16.059375-14.7796875-33.7640625-27.39375001-53.1421875-37.8421875-19.3640625-10.4484375-39.88125001-18.6046875-61.55156251-24.46875-21.65625001-5.8640625-44.2125-8.7890625-67.66874999-8.7890625C479.234375 120.2578125 449.8015625 125.09531249999998 422.0140625 134.78437499999995zM778.68124999 320.5640625c3.571875-3.571875 9.8015625-8.1703125 15.15937501-8.17031249s8.296875 4.5984375 12.375 8.17031249l91.74375 93.2765625c3.571875 3.571875 4.7109375 7.65 3.4453125 12.234375-1.2796875 4.584375-3.6984375 8.6625-7.2703125 12.234375l-69.58125 0c-6.1171875 38.221875-18.478125 73.659375-37.0828125 106.2703125-18.6046875 32.625-41.79375001 61.03125001-69.58125 85.246875-27.7734375 24.215625-59.3859375 43.2-94.809375 56.953125C587.6703125 700.5609375 550.08125001 707.4375 510.3265625 707.4375c-30.5859375 0-60.01875001-4.2046875-88.3125-12.6140625-28.29375001-8.409375-54.534375-20.1375-78.75-35.1703125-24.215625-15.0328125-46.125-33.0046875-65.75625-53.9015625-19.6171875-20.896875-36.05625001-44.0859375-49.3171875-69.58125l45.1125-18.35156251c11.728125 20.896875 25.8609375 40.0078125 42.4265625 57.34687501 16.565625 17.325 34.9171875 32.1046875 55.0546875 44.3390625 20.1375 12.234375 42.046875 21.796875 65.75625 28.6734375 23.6953125 6.8765625 48.290625 10.321875 73.7859375 10.321875 33.13125001 0 64.4765625-5.6109375 94.0359375-16.81875001 29.559375-11.2078125 55.940625-26.634375 79.1296875-46.25156249 23.1890625-19.6171875 42.8203125-42.946875 58.865625-69.96093751 16.059375-27.0140625 26.8875-56.0671875 32.49843751-87.15937499l-83.33437501 0c-4.078125-3.571875-7.1296875-7.003125-9.16875-10.321875-2.0390625-3.31875001-0.253125-8.0296875 5.3578125-14.146875" horiz-adv-x="1024" />
<glyph glyph-name="wendangxiugai" unicode="&#59171;" d="M397.459421 58.444601000000034H190.057869c-9.394495 0-16.62103 7.949188-16.621031 16.621031V737.0162310000001c0 9.394495 7.949188 16.62103 16.621031 16.621031h581.736062c9.394495 0 16.62103-7.949188 16.62103-16.621031v-278.944248c0-13.730416 11.562456-25.292872 25.292872-25.292872s25.292872 11.562456 25.292873 25.292872V737.0162310000001c0 36.855328-30.351447 67.206775-67.206775 67.206775H190.057869c-36.855328 0-67.206775-30.351447-67.206775-67.206775v-661.950599c0-36.855328 30.351447-67.206775 67.206775-67.206775H397.459421c13.730416 0 25.292872 11.562456 25.292873 25.292872s-11.562456 25.292872-25.292873 25.292872zM880.191955 366.294989c-33.242061 33.242061-87.441073 33.242061-120.683134 0l-247.870148-247.870148c-3.613267-3.613267-5.781228-7.226535-6.503881-12.285109l-24.570219-107.675371c-2.16796-8.671842 0.722653-17.343684 6.503881-23.124911 5.058574-5.058574 11.562456-7.949188 18.066338-7.949189 1.445307 0 3.613267 0 5.058574 0.722654l109.843331 22.402258c5.058574 0.722653 9.394495 3.613267 13.007763 7.226535L880.191955 245.611856c15.898377 15.898377 25.292872 37.577982 25.292872 60.702893s-9.394495 44.081863-25.292872 59.98024z m-35.410021-85.273112l-242.088921-242.08892-64.31616-13.007763 14.453069 62.1482L794.918843 330.88496799999996c13.730416 13.730416 36.132675 13.730416 49.140437 0 6.503881-6.503881 10.117149-15.175723 10.117149-24.570219s-2.890614-18.788991-9.394495-25.292872zM698.805928 687.875794H255.096683c-13.730416 0-25.292872-11.562456-25.292872-25.292872s11.562456-25.292872 25.292872-25.292873h444.431899c13.730416 0 25.292872 11.562456 25.292872 25.292873s-11.562456 25.292872-26.015526 25.292872zM724.0988 539.731828c0 13.730416-11.562456 25.292872-25.292872 25.292872H255.096683c-13.730416 0-25.292872-11.562456-25.292872-25.292872s11.562456-25.292872 25.292872-25.292872h444.431899c13.730416 0 24.570219 11.562456 24.570218 25.292872zM257.987297 410.376853m-27.460833 0a27.460833 27.460833 0 1 1 54.921666 0 27.460833 27.460833 0 1 1-54.921666 0ZM354.100212 410.376853m-27.460833 0a27.460833 27.460833 0 1 1 54.921665 0 27.460833 27.460833 0 1 1-54.921665 0ZM450.213126 410.376853m-27.460832 0a27.460833 27.460833 0 1 1 54.921665 0 27.460833 27.460833 0 1 1-54.921665 0Z" horiz-adv-x="1024" />
<glyph glyph-name="download" unicode="&#58896;" d="M485 93v240c0 12 12 24 24 24s24-12 24-24v-240l48 36c12 6 24 6 36-6 12-18 6-30-6-36l-90-66c0-6-6-6-12-6s-12 0-12 6l-90 66c-12 6-12 24-6 36 6 12 24 12 36 6l48-36z m-192 36h-18c-108 0-192 96-192 210 0 120 90 216 198 210 36 120 138 204 252 204 126 0 234-96 264-234 84-18 144-96 144-192 0-108-78-198-174-198-30 0-90 0-156 54-12 12-12 30 0 36 12 12 24 12 36 0 48-48 90-42 114-42h6c72 0 126 66 126 150 0 78-54 144-120 150-12 0-18 12-24 18-18 120-108 210-216 210-96 0-186-78-210-186 0-12-12-18-30-18h-24c-78 0-138-72-138-162 0-90 60-162 138-162h12c24 0 54 0 96 42 12 12 24 12 36 0 12-12 12-24 0-36-48-48-90-54-120-54z" horiz-adv-x="1024" />
<glyph glyph-name="ITjiankong" unicode="&#58975;" d="M373.79835107 43.24803018H203.10038369v-51.21037969h614.50926329v51.21037969H373.79835107zM851.74420362 777.21430049H168.95953144c-28.28762138 0-51.20678145-22.90207237-51.20678144-51.20768057v-477.92876484c0-28.2750293 22.91916094-51.21127881 51.20678144-51.21127881h682.78467218c28.2759293 0 51.21577529 22.93624951 51.21577529 51.21127881V726.00661992c0 28.30560908-22.93984687 51.20768145-51.21577529 51.20768057z m6.75352089-516.41816836h-0.00899384c0-9.62257588-7.79501513-17.4049998-17.40589893-17.40499893H179.62450068c-9.62167675 0-17.40949629 7.78152393-17.40949628 17.40499893V713.35669629c0 9.61807852 7.78781953 17.40589893 17.40949628 17.40589892h661.45833106c9.61088379 0 17.41399365-7.78692041 17.41399365-17.40589893v-452.56056415zM659.65783818 86.05630606V134.49656309H370.42383886v-48.44025703h289.23399932zM619.30579678 666.47508193h-48.43935791v-347.24017089h48.43935791V666.47508193zM773.10152334 609.3665012700001h-48.43935791v-291.93037119h48.43935791V609.3665012700001zM459.21433906 555.4057866200001h-48.43935879v-235.27238467h48.43935879V555.4057866200001zM307.21739258 497.84751182h-48.43935791v-178.61350078h48.43935791V497.84751182z" horiz-adv-x="1024" />
<glyph glyph-name="icon-xiugai" unicode="&#58893;" d="M783.78987676 441.79931221c-14.75719453 0-24.59472451-9.83663086-24.5947254-24.59562452v-314.83514179c0-34.4331545-24.59832276-63.94934268-59.03507373-63.9493418h-457.49281992c-34.43855098 0-73.7895709 29.51528906-73.78957089 63.94934179V559.86496318c0 34.43405362 39.35101991 68.87080547 73.78957089 68.87080635h260.72422911c14.75899365 0 24.59652363 9.83752998 24.59652363 24.59652276 0 14.75809365-9.83752998 24.59562451-24.59652363 24.59562452h-260.72422911c-68.86900721 0-122.98171817-49.19214815-122.98171816-118.06295363v-457.49641729c0-68.86630898 54.11361094-113.14148995 122.98171816-113.14148993h457.49371904c68.87170459 0 108.22542275 44.27518185 108.22542364 113.14148993V412.28762139c0 14.75449628-9.8393291 29.51169082-24.59652365 29.51169082m98.38699367 275.48232274l-39.35191992 39.35371817c-29.51798643 29.5170873-78.71553106 29.5170873-108.22722187 0l-68.86810725-83.62710089-373.87021639-364.02818905v-9.83752999l-49.19124815-162.33543632 34.4331545-29.51528906 152.49970547 54.11091357h9.83752998L798.54976953 540.1872049799999l83.62889912 68.87080547c29.51438906 29.51618818 29.51438906 78.70653721-0.00179824 108.22362452M311.53806318 176.15991593l24.59472452 68.87170458 44.27608095-44.27608096-68.87080547-24.59562364m113.14148994 49.19124815l-68.8672081 68.86900635L695.24580957 628.73576953 759.19515136 564.7828294999999 424.67955312 225.35116405999997m423.05876631 423.06056456l-49.19034902-49.19214728-73.79047002 73.78867089 49.1957455 49.1948464c4.91516719 0 14.75719453 4.91696633 19.67416085 4.9169663 4.92056368 0 14.75719453-4.91696633 19.6777582-4.9169663l39.35551728-39.35371816c4.91966457-9.84202734 4.91966457-24.60012099-4.92236279-34.43765185m0 0z" horiz-adv-x="1024" />
<glyph glyph-name="remove" unicode="&#58894;" d="M769.00449219 725.51308594h-137.90302735c-6.87919922 59.65224609-57.63164063 106.14287109-119.10058593 106.14287109-61.46630859 0-112.21171875-46.48798828-119.09091797-106.14287109h-137.9100586c-55.80878906 0-101.20605469-45.41044922-101.20605468-101.21748047v-5.19345703c0-42.64716797 26.55439453-79.14990234 63.96240233-94.02275391v-478.14433594c0-55.80878906 45.40341797-101.21748047 101.20781251-101.21748046h386.07890625c55.80615234 0 101.20605469 45.41308594 101.2060547 101.21748046v478.14257812c37.40537109 14.87460938 63.96240234 51.37734375 63.96240233 94.02275392v5.19345703c0 55.80878906-45.40166015 101.21923828-101.20605469 101.21923828zM512 783.65449219c34.96025391 0 64.14082031-25.05761719 70.59726562-58.14052735h-141.18134765c6.4546875 33.08466797 35.63701172 58.14052734 70.58408203 58.14052735zM758.24667969 46.93593750000002c0-29.34228516-23.87373049-53.21777344-53.20634765-53.21777344h-386.07890626c-29.33261719 0-53.20634766 23.87724609-53.20634766 53.21777344v470.94960937h492.49248047v-470.94960937zM822.20820313 619.1030273399999c0-29.34228516-23.87373049-53.21777344-53.20634766-53.21777343h-514.00371094c-29.33261719 0-53.20634766 23.87548828-53.20634766 53.21777343v5.19345703c0 29.34228516 23.87373049 53.21777344 53.20634766 53.21777344h514.00546875c29.33261719 0 53.20634766-23.87548828 53.20634766-53.21777344v-5.19345703zM383.32285156 55.10537108999995c13.25566406 0 24.00029297 10.74902345 24.00029297 23.99853516v270.23554687c0 13.25214844-10.74638672 24.00205078-24.00029297 24.00205081s-24.00029297-10.75078125-24.00029297-24.00205081v-270.23554687c-0.00175781-13.25390625 10.74462891-23.99853516 24.00029297-23.99853516zM512 55.10537108999995c13.25566406 0 24.00205078 10.74902345 24.00205078 23.99853516v270.23554687c0 13.25214844-10.75078125 24.00205078-24.00205078 24.00205081-13.25390625 0-24.00029297-10.75078125-24.00029297-24.00205081v-270.23554687c0-13.25390625 10.74462891-23.99853516 24.00029297-23.99853516zM640.67714844 55.10537108999995c13.25390625 0 23.99853516 10.74902345 23.99853515 23.99853516v270.23554687c0 13.25214844-10.74638672 24.00205078-23.99853515 24.00205081-13.25742187 0-24.00205078-10.75078125-24.00205078-24.00205081v-270.23554687c-0.00175781-13.25390625 10.74902345-23.99853516 24.00205078-23.99853516z" horiz-adv-x="1024" />
<glyph glyph-name="paibanguanli" unicode="&#58898;" d="M185.046875 51.7734375c-47.4609375 0-84.375 36.9140625-84.375 84.375V631.8515625c0 47.4609375 36.9140625 84.375 84.375 84.375h73.828125v52.734375H301.0625v-52.734375h321.6796875v52.734375h42.1875v-52.734375h73.828125c47.4609375 0 84.375-36.9140625 84.375-84.375v-168.75H142.859375v-332.2265625c0-21.09375 15.8203125-42.1875 42.1875-42.1875H459.265625c10.546875 0 21.09375-10.546875 21.09375-21.09375s-10.546875-21.09375-21.09375-21.09375l-274.21875 5.2734375z m0 622.265625c-21.09375 0-42.1875-15.8203125-42.1875-42.1875v-126.5625h632.8125V631.8515625c0 21.09375-15.8203125 42.1875-42.1875 42.1875h-73.828125V594.9375H617.46875V674.0390625H301.0625V594.9375h-42.1875V674.0390625H185.046875zM232.5078125 378.7265625h168.75v-42.1875H232.5078125v42.1875zM232.5078125 220.5234375h168.75v-42.1875H232.5078125v42.1875zM696.5703125 178.3359375V299.625h42.1875v-79.1015625h79.1015625v-42.1875h-121.2890625zM717.6640625-0.9609375c-52.734375 0-105.46875 21.09375-142.3828125 58.0078125-36.9140625 36.9140625-58.0078125 89.6484375-58.0078125 142.3828125 0 52.734375 21.09375 105.46875 58.0078125 142.3828125 36.9140625 36.9140625 89.6484375 58.0078125 142.3828125 58.0078125 52.734375 0 105.46875-21.09375 142.3828125-58.0078125 36.9140625-36.9140625 58.0078125-89.6484375 58.0078125-142.3828125 0-52.734375-21.09375-105.46875-58.0078125-142.3828125-36.9140625-36.9140625-84.375-58.0078125-142.3828125-58.0078125z m0 363.8671875c-89.6484375 0-163.4765625-73.828125-163.4765625-163.4765625 0-89.6484375 73.828125-163.4765625 163.4765625-163.4765625s163.4765625 73.828125 163.4765625 163.4765625c0 89.6484375-73.828125 163.4765625-163.4765625 163.4765625z" horiz-adv-x="1024" />
<glyph glyph-name="shezhi-xue" unicode="&#58929;" d="M845.5625 509.26875h-17.8875a312.01875 312.01875 0 0 1-17.60625 42.3l12.76875 12.7125a83.8125 83.8125 0 0 1 24.69375 59.68125 84.0375 84.0375 0 0 1-24.69375 59.625l-19.96875 19.9125c-31.95 31.8375-87.4125 31.89375-119.3625 0l-12.7125-12.7125a304.5375 304.5375 0 0 1-42.35625 17.60625v17.94375c0 46.51875-37.85625 84.375-84.31875 84.375h-28.125c-46.51875 0-84.375-37.85625-84.375-84.375v-17.94375c-14.5125-4.78125-28.63125-10.6875-42.35625-17.60625l-12.7125 12.76875c-31.95 31.8375-87.525 31.78125-119.30625 0l-19.9125-19.9125a84.4875 84.4875 0 0 1 0-119.3625l12.76875-12.76875a313.14375 313.14375 0 0 1-17.60625-42.24375h-18c-46.51875 0-84.375-37.9125-84.375-84.375v-28.125c0-46.51875 37.85625-84.375 84.375-84.375h17.94375c4.78125-14.5125 10.6875-28.63125 17.60625-42.35625l-12.76875-12.76875a84.54375 84.54375 0 0 1 0-119.30625l19.9125-19.9125c31.89375-31.89375 87.525-31.8375 119.30625 0l12.76875 12.76875c13.725-6.91875 27.84375-12.825 42.35625-17.60625v-17.94375c0-46.51875 37.85625-84.375 84.375-84.375h28.125c46.4625 0 84.31875 37.85625 84.31875 84.375v17.94375a315 315 0 0 1 42.3 17.60625l12.825-12.825c31.78125-31.78125 87.3-31.8375 119.30625 0l19.9125 19.9125a84.6 84.6 0 0 1 0 119.3625l-12.76875 12.76875c6.91875 13.725 12.88125 27.84375 17.60625 42.35625h17.94375c46.4625 0 84.31875 37.85625 84.31875 84.375v28.125a84.4875 84.4875 0 0 1-84.31875 84.375z m28.125-112.55625a28.125 28.125 0 0 0-28.06875-28.125h-38.98125a28.06875 28.06875 0 0 1-27.225-21.15c-6.01875-23.7375-15.525-46.6875-28.29375-68.00625a28.125 28.125 0 0 1 4.275-34.25625l27.61875-27.61875a28.29375 28.29375 0 0 0 0-39.825l-19.9125-19.9125a28.96875 28.96875 0 0 0-39.76875 0l-27.675 27.675a28.125 28.125 0 0 1-34.25625 4.275 256.5 256.5 0 0 0-68.00625-28.29375 28.18125 28.18125 0 0 1-21.20625-27.225v-38.98125a28.125 28.125 0 0 0-28.06875-28.125h-28.125a28.125 28.125 0 0 0-28.125 28.125v38.98125a28.06875 28.06875 0 0 1-21.15 27.225 252.9 252.9 0 0 0-67.95 28.35 28.35 28.35 0 0 1-34.3125-4.275l-27.675-27.675a28.85625 28.85625 0 0 0-39.76875 0l-19.9125 19.9125a28.125 28.125 0 0 0 0 39.76875l27.675 27.675a28.125 28.125 0 0 1 4.275 34.25625A253.35 253.35 0 0 0 280.8125 347.4375a28.2375 28.2375 0 0 1-27.28125 21.20625h-38.98125a28.125 28.125 0 0 0-28.125 28.125v28.125c0 15.46875 12.65625 28.125 28.125 28.125h38.98125a28.06875 28.06875 0 0 1 27.225 21.20625 258.1875 258.1875 0 0 0 28.29375 67.95 28.0125 28.0125 0 0 1-4.275 34.2l-27.675 27.675a28.125 28.125 0 0 0 0 39.825l19.9125 19.9125a28.85625 28.85625 0 0 0 39.76875 0l27.675-27.675a28.125 28.125 0 0 1 34.3125-4.275 255.375 255.375 0 0 0 67.95 28.29375 28.06875 28.06875 0 0 1 21.15 27.225v38.98125a28.125 28.125 0 0 0 28.125 28.125h28.125a28.125 28.125 0 0 0 28.06875-28.125v-38.98125c0-12.88125 8.71875-24.075 21.20625-27.225 23.625-6.01875 46.51875-15.525 67.95-28.29375a28.18125 28.18125 0 0 1 34.25625 4.275l27.61875 27.61875a28.74375 28.74375 0 0 0 39.825 0l19.9125-19.9125a28.0125 28.0125 0 0 0 0-39.76875l-27.675-27.675a28.125 28.125 0 0 1-4.275-34.3125c12.76875-21.31875 22.275-44.15625 28.35-67.95a28.125 28.125 0 0 1 27.225-21.15h38.925c15.46875 0 28.125-12.65625 28.125-28.125v-28.125zM530.05625 592.6875a182.1375 182.1375 0 0 1-181.9125-181.9125 182.1375 182.1375 0 0 1 181.9125-181.9125 182.1375 182.1375 0 0 1 181.96875 181.9125A182.19375 182.19375 0 0 1 530.05625 592.6875z m0-307.575c-69.3 0-125.6625 56.3625-125.6625 125.6625S460.75625 536.4375 530.05625 536.4375s125.71875-56.3625 125.71875-125.6625-56.41875-125.6625-125.71875-125.6625z" horiz-adv-x="1024" />
<glyph glyph-name="tianjia-xue" unicode="&#58934;" d="M515.54375 775.55625a393.3 393.3 0 0 1-392.85-392.85c0-216.675 176.23125-392.85 392.85-392.85s392.85 176.23125 392.85 392.85a393.3 393.3 0 0 1-392.85 392.85z m0-729.50625c-185.625 0-336.6 151.03125-336.6 336.6S329.975 719.25 515.54375 719.25s336.6-151.03125 336.6-336.6-151.03125-336.6-336.6-336.6zM677.2625 410.83125H543.66875V544.425a28.125 28.125 0 0 1-56.25 0v-133.59375H353.825a28.125 28.125 0 0 1 0-56.25h133.59375v-133.59375a28.125 28.125 0 0 1 56.25 0V354.58124999999995h133.59375a28.125 28.125 0 0 1 0 56.25z" horiz-adv-x="1024" />
<glyph glyph-name="tuichufffpx" unicode="&#58892;" d="M693.23046875 14.5078125zM145.3203125 14.5078125zM870.68164063 777.75zM493.98242187-9.75C301.4140625-9.75 145.3203125 146.34375 145.3203125 338.91210937000005c0 145.72265625 89.47265625 270.61523438 216.38671875 322.64648438v-0.08789063c3.77929688 1.31835938 7.82226563 2.02148438 12.04101563 2.02148438 19.86328125 0 36.12304688-16.171875 36.12304687-36.03515625 0-15.64453125-10.01953125-29.09179688-24.08203125-34.01367188-98.87695313-42.09960938-168.31054688-140.18554688-168.31054688-254.53124999 0-152.75390625 123.75-276.50390625 276.50390626-276.50390626S770.48632813 186.24609375 770.48632813 338.91210937000005c0 114.2578125-69.34570313 212.43164063-168.31054688 254.53125001-14.0625 4.921875-23.99414063 18.36914063-23.99414063 34.01367187 0 19.95117188 16.08398438 36.03515625 36.03515626 36.03515625 4.21875 0 8.17382813-0.703125 12.04101562-2.02148438v0.08789063c127.00195313-52.11914063 216.38671875-176.92382813 216.38671875-322.64648438 0-192.56835938-156.09375-348.66210938-348.66210938-348.66210937z m1e-8 372.65625c-19.86328125 0-36.03515625 16.171875-36.03515625 36.12304688V723.69726563c0 19.86328125 16.171875 36.03515625 36.03515625 36.03515624 19.95117188 0 36.03515625-16.171875 36.03515625-36.03515625V399.1171875c0-20.0390625-16.08398438-36.2109375-36.03515625-36.2109375z" horiz-adv-x="1024" />
<glyph glyph-name="icon_jinzhi" unicode="&#58942;" d="M512.26367188 777.57421875c-217.44140625 0-393.75-176.30859375-393.75000001-393.75s176.30859375-393.75 393.75000001-393.75 393.75 176.30859375 393.74999999 393.75-176.30859375 393.75-393.74999999 393.75z m-1e-8-53.96484375c84.0234375 0 161.015625-30.67382813 220.42968751-81.38671875L253.77734375 163.39453125c-50.71289063 59.4140625-81.38671875 136.40625001-81.38671875 220.4296875 0 187.3828125 152.49023438 339.78515625 339.87304688 339.78515625z m0-679.65820313c-84.0234375 0-161.015625 30.67382813-220.34179687 81.38671875l478.91601563 478.91601563c50.71289063-59.4140625 81.38671875-136.40625001 81.38671874-220.34179688-0.17578125-187.47070313-152.578125-339.9609375-339.96093749-339.9609375z" horiz-adv-x="1024" />
<glyph glyph-name="jiazaizhong" unicode="&#59055;" d="M864 416H704c-17.6 0-32-14.4-32-32s14.4-32 32-32h160c17.6 0 32 14.4 32 32s-14.4 32-32 32z m-512-32c0 17.6-14.4 32-32 32H160c-17.6 0-32-14.4-32-32s14.4-32 32-32h160c17.6 0 32 14.4 32 32z m160-160c-17.6 0-32-14.4-32-32v-160c0-17.6 14.4-32 32-32s32 14.4 32 32V192c0 17.6-14.4 32-32 32z m0 544c-17.6 0-32-14.4-32-32v-160c0-17.6 14.4-32 32-32s32 14.4 32 32V736c0 17.6-14.4 32-32 32z m138.6-304c8.8-15.4 28.4-20.6 43.8-11.8l138.6 80c15.4 8.8 20.6 28.4 11.8 43.8s-28.4 20.6-43.8 11.8l-138.6-80c-15.4-9-20.6-28.4-11.8-43.8zM373.4 304c-8.8 15.4-28.4 20.6-43.8 11.8l-138.6-80c-15.4-8.8-20.6-28.4-11.8-43.8s28.4-20.6 43.8-11.8l138.6 80c15.4 9 20.6 28.4 11.8 43.8z m262.4-70.2c-8.8 15.4-28.4 20.6-43.8 11.8s-20.6-28.4-11.8-43.8l80-138.6c8.8-15.4 28.4-20.6 43.8-11.8 15.4 8.8 20.6 28.4 11.8 43.8l-80 138.6z m-272 471c-8.8 15.4-28.4 20.6-43.8 11.8-15.4-8.8-20.6-28.4-11.8-43.8l80-138.6c8.8-15.4 28.4-20.6 43.8-11.8s20.6 28.4 11.8 43.8l-80 138.6zM592 522.6c15.4-8.8 34.8-3.6 43.8 11.8l80 138.6c8.8 15.4 3.6 34.8-11.8 43.8-15.4 8.8-34.8 3.6-43.8-11.8l-80-138.6c-8.8-15.4-3.6-35 11.8-43.8zM432 245.4c-15.4 8.8-34.8 3.6-43.8-11.8l-80-138.6c-8.8-15.4-3.6-34.8 11.8-43.8 15.4-8.8 34.8-3.6 43.8 11.8l80 138.6c8.8 15.4 3.6 35-11.8 43.8z m400.8-9.6l-138.6 80c-15.4 8.8-34.8 3.6-43.8-11.8-8.8-15.4-3.6-34.8 11.8-43.8l138.6-80c15.4-8.8 34.8-3.6 43.8 11.8 8.8 15.4 3.6 34.8-11.8 43.8zM191.2 532.2l138.6-80c15.4-8.8 34.8-3.6 43.8 11.8s3.6 34.8-11.8 43.8l-138.6 80c-15.4 8.8-34.8 3.6-43.8-11.8-8.8-15.4-3.6-34.8 11.8-43.8z" horiz-adv-x="1024" />
<glyph glyph-name="gou1" unicode="&#58961;" d="M427.24832567 124.09486597c-11.30022289 0-16.95033472 5.65011183-28.25055758 11.30022364L127.79241038 406.60044653c-16.95033472 16.95033472-16.95033472 39.55078125 1e-8 56.50111597 16.95033472 16.95033472 39.55078125 16.95033472 56.50111672 0L427.24832567 214.49665212000002l418.10825904 418.10825827c16.95033472 16.95033472 39.55078125 16.95033472 56.50111596-1e-8 16.95033472-16.95033472 16.95033472-39.55078125 0-56.50111595L455.49888404 135.39508962000002c-11.30022289-5.65011183-16.95033472-11.30022289-28.25055837-11.30022366z" horiz-adv-x="1033" />
<glyph glyph-name="shalou" unicode="&#58926;" d="M795.35937501 753.140625H228.64062499c-11.953125 0-21.09375003 9.84375001-21.09374999 21.09375 0 11.953125 9.84375001 21.09375003 21.09375001 21.09375h566.71875c11.953125 0 21.09375003-9.84375001 21.09374999-21.09375 0.703125-11.25-9.140625-21.09375003-21.09375001-21.09375zM823.484375-38.578125H201.21874999c-12.65625001 0-23.203125 10.546875-23.20312499 23.203125 0 12.65625001 10.546875 23.203125 23.20312501 23.203125h622.26562499c12.65625001 0 23.203125-10.546875 23.203125-23.203125 0-12.65625001-10.546875-23.203125-23.203125-23.203125zM735.59375001 248.296875l-0.70312501 1.40625c-35.859375 62.578125-83.671875 103.359375-134.29687501 127.96875 50.625 25.3125 97.73437499 65.390625 134.29687501 127.96875l0.70312499 1.40625c35.859375 61.875 59.765625 146.25 63.98437501 258.75H758.09375001c-3.515625-104.0625-25.3125-181.40625001-58.359375-238.359375l-0.70312502-0.70312501C658.25 454.3125 612.546875 415.640625 553.484375 397.359375l-2.8125-0.70312499h-0.70312499c-1.40625001-0.703125-2.109375-1.40625001-3.51562501-2.10937501l-0.703125-0.70312499-1.40624999-1.40625001-1.40625001-1.40625001v-0.70312499c-0.703125-0.703125-1.40625001-2.109375-2.109375-3.515625l-0.703125-0.703125-1.40624999-4.921875v-7.734375l1.40624999-4.92187501 0.703125-0.70312499c0.703125-1.40625001 1.40625001-2.109375 2.109375-3.51562499v-0.703125l1.40625001-1.40625001V362.90624997l1.40624999-0.70312497 0.703125-0.70312501c0.703125-0.703125 2.109375-1.40625001 3.51562501-2.10937499h0.70312499l2.8125-1.40625c59.765625-18.98437499 104.765625-56.95312501 146.25000001-128.671875l0.70312499-1.40625001c17.578125-29.53125001 30.9375-65.390625 41.484375-106.875 2.109375-11.953125 9.84375001-37.96875001 11.25-71.71874999-33.046875 29.53125001-124.453125 50.625-234.14062501 52.03125002V426.1875c1.40625001 0 2.109375 0.703125 3.51562501 1.40625001v0.70312499l5.625 2.10937499h1.40625c40.078125 12.65625001 71.71875001 32.34375001 98.4375 58.35937501 28.125 28.125 49.921875 62.578125 64.6875 101.25 4.21875001 10.546875-0.703125 22.50000001-11.953125 26.71875001-10.546875 4.21875001-22.50000001-0.703125-26.71875001-11.25000001v-0.70312501c-12.65625001-32.34375001-30.9375-62.578125-54.84374999-86.48437499-21.796875-21.09375003-47.8125-37.96875001-80.859375-47.8125l-0.703125-0.70312499-2.109375-0.70312501-3.515625-0.703125-2.109375 0.703125-1.40625 0.70312501-2.109375 0.70312499c-32.34375001 10.546875-59.765625 26.71875001-80.859375 47.8125-24.609375 23.90625001-42.1875 53.4375-54.84375 86.48437501-4.21875001 10.546875-16.171875 16.171875-26.01562501 11.953125-10.546875-4.21875001-15.46875001-15.46875001-11.95312499-26.71875001 14.765625-38.671875 35.859375-73.125 64.6875-101.25 26.015625-26.015625 58.359375-45.703125 97.734375-58.35937501h0.703125l5.625-2.10937499 1.40625-0.70312501c0.703125-0.703125 1.40625001-0.703125 2.8125-1.40624999v-324.84375001c-102.65625001 0-191.953125-17.578125-234.14062499-42.18749998 1.40625001 16.875 4.921875 35.15625001 11.24999998 61.87500001 10.546875 42.1875 24.609375 77.34375001 41.484375 106.87499997l0.70312499 1.40625001c41.484375 71.71875001 86.484375 109.6875 146.95312502 128.671875l2.10937499 1.40625h0.703125c1.40625001 0.703125 2.109375 1.40625001 3.51562501 2.10937501l0.703125 0.70312499 1.40625 0.70312501v0.703125l1.40625 1.40625v0.70312498c0.703125 0.703125 1.40625001 2.109375 2.109375 3.51562501V369.9375c0.703125 1.40625001 1.40625001 3.515625 1.40625001 4.921875v7.03125c0 1.40625001-0.703125 3.515625-1.40625001 4.921875v0.703125c-0.703125 1.40625001-1.40625001 2.8125-2.109375 3.51562499v0.70312502l-1.40625 1.40624999-1.40625 1.40625-2.10937499-0.70312501c-1.40625001 0.703125-2.109375 1.40625001-3.51562501 2.10937501h-0.703125l-2.109375 0.70312501c-59.765625 18.28125001-105.46875001 56.95312501-146.953125 129.37499998l-0.703125 0.70312502c-32.34375001 56.95312501-54.140625 134.296875-58.35937499 238.359375h-41.48437501c4.21875001-112.50000001 28.125-196.171875 63.984375-258.75000002l0.703125-1.40624999C323.5625 442.359375 371.375 402.28125001 422 376.96874998c-50.625-24.609375-97.73437499-65.390625-134.296875-127.96874998l-0.703125-1.40625001c-33.75-59.0625-57.65624999-137.8125-62.578125-242.57812499h573.75c-4.921875 105.46875001-28.125 184.21875001-62.57812501 243.28125z" horiz-adv-x="1024" />
<glyph glyph-name="stop" unicode="&#59110;" d="M512 801.1875C281.56249999 801.1875 94.8125 614.43750001 94.8125 384s186.75-417.1875 417.1875-417.1875 417.1875 186.75 417.1875 417.1875S742.43750001 801.1875 512 801.1875z m261.84375002-679.03124999c-34.03125002-34.03125002-73.59375001-60.75000001-117.75000003-79.40625001-45.65625001-19.3125-94.125-29.0625-144.09374999-29.0625s-98.53125001 9.75-144.09375001 29.0625c-44.06250001 18.65625001-83.71875001 45.375-117.74999998 79.40625001-34.03125002 34.03125002-60.75000001 73.59375001-79.40625001 117.74999998-19.3125 45.65625001-29.0625 94.125-29.0625 144.09375001s9.75 98.53125001 29.0625 144.09374999c18.65625001 44.06250001 45.375 83.71875001 79.40625001 117.75 34.03125002 34.03125002 73.59375001 60.75000001 117.75 79.40625001 45.65625001 19.3125 94.125 29.0625 144.09374999 29.0625s98.53125001-9.75 144.09375001-29.0625c44.06250001-18.65625001 83.71875001-45.375 117.74999998-79.40625001 34.03125002-34.03125002 60.75000001-73.59375001 79.40625001-117.75 19.3125-45.65625001 29.0625-94.125 29.0625-144.09374999s-9.75-98.53125001-29.0625-144.09375001c-18.65625001-44.15625001-45.375-83.71875001-79.40625001-117.74999998zM362 234h300V534H362v-300z m46.875 253.125h206.25v-206.25H408.875V487.125z" horiz-adv-x="1024" />
<glyph glyph-name="timer" unicode="&#59230;" d="M535.4375 734.34375v20.53125h89.0625v46.875H399.5v-46.875h89.0625v-20.53125c-201.375-12.09375-360.9375-179.25-360.9375-383.625 0-212.25 172.125-384.375 384.375-384.375s384.375 172.125 384.375 384.375c0 204.375-159.5625 371.53125-360.9375 383.625z m215.25-622.3125c-31.03125-31.03125-67.125-55.3125-107.25-72.375-41.625-17.625-85.78125-26.53125-131.34375-26.53125s-89.8125 8.90625-131.34375 26.53125c-40.21875 16.96875-76.3125 41.34375-107.25 72.375-31.03125 31.03125-55.3125 67.125-72.375 107.25-17.625 41.625-26.53125 85.78125-26.53125 131.34375s8.90625 89.8125 26.53125 131.34375c16.96875 40.21875 41.34375 76.3125 72.375 107.25s67.125 55.3125 107.25 72.375c41.625 17.625 85.78125 26.53125 131.34375 26.53125s89.8125-8.90625 131.34375-26.53125c40.125-16.96875 76.21875-41.25 107.25-72.28125s55.3125-67.125 72.375-107.25c17.625-41.625 26.53125-85.78125 26.53125-131.34375s-8.90625-89.8125-26.53125-131.34375c-17.0625-40.21875-41.4375-76.3125-72.375-107.34375zM535.4375 623.15625h-46.875v46.875h46.875v-46.875z m-46.875-544.96875h46.875v-46.875h-46.875v46.875zM192.6875 374.0625h46.875v-46.875h-46.875v46.875z m638.625 0v-46.875h-46.875v46.875h46.875z m-312.46875-27.1875l155.53125-65.625-18.1875-43.21875-176.625 74.53125-69.46875 256.5 45.28125 12.28125 63.46875-234.46875z" horiz-adv-x="1024" />
<glyph glyph-name="jiantou-copy" unicode="&#58930;" d="M814.94826667 461.53386667l-274.65813334 274.65813333c-21.45066667 21.45066667-56.22293333 21.45066667-77.6736 0l-274.65813333-274.65813333c-21.45066667-21.45066667-21.45066667-56.22293333 0-77.6736s56.22293333-21.45066667 77.6736 0l180.89066667 180.89066666v-526.57493333c0-30.34986667 24.5824-54.93226667 54.93226666-54.93226667s54.93226667 24.5824 54.93226667 54.93226667v526.57493333l180.89066667-180.89066666c10.71146667-10.71253333 24.7744-16.09493333 38.83733333-16.09493334s28.1248 5.35573333 38.83733333 16.09493334c21.45066667 21.45066667 21.45066667 56.22293333 0 77.6736z" horiz-adv-x="1000" />
<glyph glyph-name="tingzhi" unicode="&#59054;" d="M512-42.666666549999945c-234.66666656 0-426.66666655 192-426.66666655 426.66666655s192 426.66666655 426.66666655 426.66666655 426.66666655-192 426.66666655-426.66666655-192-426.66666655-426.66666655-426.66666655z m0 53.33333343c208.00000031 0 373.33333312 165.33333375 373.33333312 373.33333312s-165.33333375 373.33333312-373.33333312 373.33333312-373.33333312-165.33333375-373.33333312-373.33333312 165.33333375-373.33333312 373.33333312-373.33333312zM351.99999969 544.00000031h320.00000062v-320.00000062H351.99999969z" horiz-adv-x="1024" />
<glyph glyph-name="yunsuan-dengyu" unicode="&#58884;" d="M984.615385 580.923077H39.384615a39.384615 39.384615 0 0 1 0-78.769231h945.23077a39.384615 39.384615 0 0 1 0 78.769231zM984.615385 265.846154H39.384615a39.384615 39.384615 0 0 1 0-78.769231h945.23077a39.384615 39.384615 0 0 1 0 78.769231z" horiz-adv-x="1024" />
<glyph glyph-name="bianji" unicode="&#58883;" d="M367.780625 344.0390625c-0.4996875-0.6375-0.999375-1.3040625-1.2225-2.1103125l-38.535-141.28125c-2.25-8.2246875 0.05625-17.086875 6.140625-23.3371875 4.55625-4.445625 10.558125-6.890625 16.948125-6.890625 2.11125 0 4.2234375 0.249375 6.3065625 0.80625l140.2790625 38.2575c0.223125 0 0.3346875-0.1940625 0.500625-0.1940625 1.610625 0 3.1959375 0.583125 4.39125 1.8075l375.106875 375.050625c11.1403125 11.154375 17.25375 26.353125 17.25375 42.8840625 0 18.7396875-7.94625 37.4653125-21.86625 51.3440625l-35.4253125 35.4796875c-13.89 13.92-32.645625 21.8803125-51.3721875 21.8803125-16.53 0-31.7278125-6.1134375-42.898125-17.240625l-375.0525-375.15c-0.3871875-0.36-0.2765625-0.88875-0.555-1.3059375m473.2115625 278.8378125l-37.258125-37.2309375-60.4021875 61.3603125 36.73125 36.73125c5.806875 5.833125 17.0578125 4.985625 23.728125-1.7090625l35.44875-35.480625c3.6975-3.6946875 5.8078125-8.611875 5.8078125-13.47375-0.0253125-3.988125-1.44375-7.6003125-4.055625-10.1971875m-406.5028125-284.728125l270.6684375 270.6834375 60.43125-61.4025-270.16875-270.15375-60.9309375 60.8728125zM385.173125 228.40312500000005l19.56 71.79375 52.1775-52.179375-71.7375-19.614375zM864.7484375 474.2475c-14.1984375 0-25.8403125-11.5434375-25.89375-25.9359375v-349.670625c0-18.3375-14.893125-33.2296875-33.25875-33.2296875H214.0821875c-18.3375 0-33.2859375 14.89125-33.2859375 33.2296875v570.73125c0 18.3534375 14.9484375 33.25875 33.2859375 33.25875h380.9690625c14.28 0 25.8684375 11.59875 25.8684375 25.880625 0 14.2528125-11.5884375 25.865625-25.8684375 25.865625H210.1371875c-44.70375 0-81.0871875-36.354375-81.0871875-81.08625v-578.596875c0-44.7309375 36.384375-81.0721875 81.0871875-81.0721875h599.375625c44.73375 0 81.103125 36.34125 81.103125 81.073125v353.784375c-0.0590625 14.2246875-11.67 25.768125-25.8675 25.768125" horiz-adv-x="1024" />
<glyph glyph-name="xiangmuguanli" unicode="&#58933;" d="M869.16209412 219.36987305000002l-21.34351731-6.72054292c0.62570572-4.54216003 1.34410858-9.0379715 1.34410859-13.81187437 0-4.70438003-0.78792573-9.31606293-1.45998002-13.78870012l21.48256302-6.7205429a19.23465729 19.23465729 0 0 0 13.07029724-24.4720459 20.43972016 20.43972016 0 0 0-25.51488876-12.4909401l-21.83017731 6.7437172c-4.54216003-8.18052293-10.19668579-15.80486298-16.70866012-22.5022316l13.25569153-17.5661087a18.86386872 18.86386872 0 0 0 3.63836287-14.50710297 18.93339158 18.93339158 0 0 0-8.15734863-12.58363724 20.74098587 20.74098587 0 0 0-28.2494545 4.28724289l-13.37156296 17.63563156a111.23657227 111.23657227 0 0 0-27.4151802-8.8757515v-21.41304016c0-10.70652008-9.06114578-19.44322586-20.25432586-19.44322585-11.17000581 0-20.27750015 8.66718293-20.27750016 19.44322585v21.41304016a112.673378 112.673378 0 0 0-27.39200592 8.8757515l-13.27886581-17.63563156a20.92638016 20.92638016 0 0 0-28.36532593-4.28724289 18.77117157 18.77117157 0 0 0-4.44946289 27.09074021l13.39473725 17.7283287a106.36997224 106.36997224 0 0 0-17.33436585 22.17779159l-21.25082016-6.62784576c-10.70652008-3.38344574-22.10826875 2.27108002-25.53806305 12.4909401a19.28100586 19.28100586 0 0 0 12.97760009 24.4488716l21.34351731 6.60467149c-0.57935715 4.61168289-1.29776001 9.17701721-1.29776001 13.90457153 0 4.75072861 0.76475144 9.29288864 1.45998001 13.85822296l-21.50573731 6.69736862c-10.6833458 3.33709717-16.43056869 14.27536011-12.97760009 24.4720459 3.40662002 10.19668579 14.83154297 15.78168869 25.53806305 12.51411438l21.71430588-6.81324004a107.29694367 107.29694367 0 0 0 16.77818298 22.52540588l-13.25569152 17.51976013a18.95656586 18.95656586 0 0 0 4.44946289 27.16026306 20.8568573 20.8568573 0 0 0 28.36532592-4.33359146l13.27886581-17.63563156a110.5413437 110.5413437 0 0 0 27.4383545 8.92210006v21.36669159c0 10.75286865 9.06114578 19.46640015 20.27750015 19.46640015 11.14683152 0 20.23115158-8.66718293 20.23115158-19.46640015v-21.34351731c9.71002579-1.69172287 18.79434585-4.9361229 27.41518021-8.92210006l13.34838868 17.63563156a20.90320587 20.90320587 0 0 0 28.29580306 4.33359147 18.91021729 18.91021729 0 0 0 4.49581146-27.16026306l-13.4642601-17.65880586c6.62784576-6.76689148 12.69950867-14.04361725 17.33436584-22.1777916l21.34351731 6.5814972a20.46289444 20.46289444 0 0 0 25.51488876-12.51411438c3.4529686-10.15033722-2.41012573-21.11177444-13.09347152-24.42569732z m-131.44454956 47.41458893c-39.14136887 0-70.93648911-30.45101167-70.93648911-67.9933548s31.77194595-67.97018051 70.93648911-67.97018052c39.11819458 0 70.89014053 30.42783738 70.89014053 67.97018052 0 37.54234314-31.7024231 67.9933548-70.89014053 67.9933548zM409.75505066 279.36809920999997c0-19.00291443 15.34137727-34.36746597 34.29794312-34.36746598h82.33823775a214.17675018 214.17675018 0 0 0 28.17993165 68.68858339h-110.5181694a34.29794312 34.29794312 0 0 1-34.29794312-34.32111741zM786.0822792 614.63049317s-286.78178787-0.30126572-271.48675918-1e-8c-16.33787155-0.30126572-24.65744018 8.64400864-24.65744018 8.64400865s-11.40174865 19.72131728-31.98051453 50.68216322c-21.45938873 32.53669739-46.44126893 27.27613449-46.44126893 27.2761345H200.35220337c-58.56142043 0-59.14077758-56.35986328-59.14077759-56.35986328v-509.20858383c0-62.77914048 47.4609375-55.08527756 47.4609375-55.08527756h367.98448563a213.82913589 213.82913589 0 0 0-21.55208588 42.91877747H219.35511779a34.9931717 34.9931717 0 0 0-35.03952026 35.10904311V521.93334961c0 19.39687729 15.6194687 35.01634598 35.03952026 35.01634597h536.67011263c19.42005157 0 35.03952026-15.6194687 35.03952026-35.01634597v-113.66987228a213.20343018 213.20343018 0 0 0 43.08099746-15.99025726V566.89146424c-0.02317429 52.74467468-48.06346894 47.73902893-48.06346894 47.73902892z m-109.63754654-165.13996125H444.07616806c-18.95656586 0-34.29794312-15.34137727-34.29794312-34.3211174s15.34137727-34.32111741 34.29794312-34.3211174h176.98202133a214.91832734 214.91832734 0 0 0 89.4990921 32.44400025c0.02317429 0.62570572 0.18539429 1.22823715 0.18539429 1.87711715 0 18.97974014-15.31820298 34.32111741-34.29794312 34.32111741zM316.61759567 315.98347091999995a36.6153717 36.6153717 0 1 1 0-73.30026627 36.66172028 36.66172028 0 0 1 0 73.30026627z m0 135.82448959a36.66172028 36.66172028 0 1 1-0.04634857-73.32344055 36.66172028 36.66172028 0 0 1 0.04634857 73.32344056z" horiz-adv-x="1025" />
<glyph glyph-name="yilaiguanxi" unicode="&#59020;" d="M561.43847656 581.75390625H907.5078125v-49.43847656H561.43847656zM116.4921875 235.68457031000003h346.06933594V186.24609375H116.4921875zM314.24609375 37.930664060000026h593.26171875v-49.43847656H314.24609375zM116.4921875 779.5078125h593.26171875v-49.43847656H116.4921875zM660.31542969 779.5078125H709.75390625v-148.31542969h-49.43847656zM314.24609375 136.80761718999997h49.43847656V-11.5078125H314.24609375zM116.4921875 779.5078125h49.43847656v-593.26171875H116.4921875zM858.06933594 581.75390625h49.43847656v-593.26171875h-49.43847656zM349.20239283 581.75390625L720.50512721 210.43798803000004l-34.95629909-34.95629832L314.24609375 546.79101563z" horiz-adv-x="1024" />
<glyph glyph-name="erji-xiaxianjilu" unicode="&#60086;" d="M649.109375 162.515625l-110.7421875-110.7421875V489.46875c0 15.8203125-10.546875 26.3671875-26.3671875 26.3671875s-26.3671875-10.546875-26.3671875-26.3671875v-437.6953125l-110.7421875 110.7421875c-10.546875 10.546875-26.3671875 10.546875-36.9140625 0-10.546875-10.546875-10.546875-26.3671875 0-36.9140625l152.9296875-158.203125s5.2734375-5.2734375 10.546875-5.2734375h26.3671875s5.2734375 0 5.2734375 5.2734375l152.9296875 158.203125c10.546875 10.546875 10.546875 26.3671875 0 36.9140625-10.546875 10.546875-26.3671875 10.546875-36.9140625 0zM512 805.875C295.7890625 805.875 116.4921875 626.578125 116.4921875 410.3671875c0-89.6484375 31.640625-179.296875 89.6484375-253.125 5.2734375-5.2734375 10.546875-10.546875 21.09375-10.546875 5.2734375 0 10.546875 0 15.8203125 5.2734375 10.546875 10.546875 10.546875 26.3671875 5.2734375 36.9140625C195.59375 252.1640625 169.2265625 331.265625 169.2265625 410.3671875 169.2265625 600.2109375 322.15625 753.140625 512 753.140625s342.7734375-152.9296875 342.7734375-342.7734375c0-79.1015625-26.3671875-158.203125-79.1015625-216.2109375-10.546875-10.546875-5.2734375-26.3671875 5.2734375-36.9140625 10.546875-10.546875 26.3671875-5.2734375 36.9140625 5.2734375 58.0078125 68.5546875 89.6484375 158.203125 89.6484375 253.125 0 210.9375-179.296875 390.234375-395.5078125 390.234375z" horiz-adv-x="1024" />
<glyph glyph-name="daima" unicode="&#58939;" d="M410.86741638 14.026870970000004h-25.36135911c-65.78600408 0-109.83742476 9.76578892-132.16367663 29.29736674-22.32335509 19.53157782-33.48684311 58.46437811-33.4868431 116.79622829v79.18363809c0 28.76870334-8.12258721 53.57894898-24.3699342 74.43146109-16.24734699 20.85251212-18.23816299 31.27804399-52.31812299 31.27804399v56.61478043c37.25049198 0 40.03357887 8.84388685 54.69565988 26.52731538 14.66280519 17.68487692 21.99239731 43.6835289 21.99239731 77.99595594V609.09183884c0 58.32967759 11.16348802 97.1973002 33.4868431 116.59707426C275.6686325 745.0879629799999 319.72294998 754.78857422 385.50533308 754.78857422h25.3620833v-56.61478043h-27.7396202c-36.98616028 0-61.09465957-5.74287772-72.32260108-17.2228396-11.22794151-11.48285866-16.84263647-35.96431911-16.84263647-73.44438135v-106.10564052c0-46.45502866-9.11473631-77.66644657-27.34565735-93.63352955-18.22657585-15.96925556-30.58571219-27.5172919-83.42525661-34.64555741 51.25427843-6.06876612 63.21727931-17.7493304 82.23829866-35.03662347 19.02174353-17.28874147 28.5326153-48.49943519 28.5326153-93.63352955v-82.74885713c0-37.74366975 5.61469495-62.29248047 16.84263647-73.6406386 11.22794151-11.34815812 35.3364408-17.02368557 72.32260108-17.02368558h27.7396202v-57.01164006z m205.0554961 0h25.36135912c65.78527987 0 109.83742476 9.76578892 132.16367662 29.29736674 22.32335509 19.53157782 33.48684311 58.46437811 33.4868431 116.79622829v79.18363809c0 28.76870334 8.12258721 53.57894898 24.36921001 74.43146109 16.24807119 20.85251212 18.2388872 31.27804399 52.31884718 31.27804399v56.61478043c-37.25049198 0-40.03357887 8.84388685-54.69565988 26.52731538-14.66280519 17.68487692-21.99239731 43.6835289-21.99239731 77.99595594V609.09183884c0 58.32967759-11.16348802 97.1973002-33.4868431 116.59707426C751.12097216 745.0879629799999 707.06955147 754.78857422 641.28499579 754.78857422H615.92218828v-56.61478043h27.73962021c36.98616028 0 61.09393537-5.74287772 72.32187688-17.2228396 11.22794151-11.48285866 16.84336066-35.96431911 16.84336066-73.44438135v-106.10564052c0-46.45502866 9.11473631-77.66644657 27.34348477-93.63352955 18.22874843-15.96925556 30.59005737-27.5172919 83.42742918-34.64555741-51.25500261-6.06876612-63.21727931-17.7493304-82.23902284-35.03662347-19.02101934-17.28874147-28.53189111-48.49943519-28.53189111-93.63352955v-82.74885713c0-37.74366975-5.61541915-62.29248047-16.84336066-73.6406386-11.22794151-11.34815812-35.33571661-17.02368557-72.32187688-17.02368558H615.92218828v-57.01164006zM351.97214138 239.33017515999995h81.33450152V158.89802241999996h-81.33450152V239.33017515999995z m121.73959315 0h81.33450151V158.89802241999996H473.71173453V239.33017515999995z m121.73886895 0h81.33450151V158.89802241999996h-81.33450151V239.33017515999995z" horiz-adv-x="1027" />
<glyph glyph-name="wendangxiazai1" unicode="&#58920;" d="M275.681468-72.553688h182.140477a27.525872 27.525872 0 0 1 27.441321 27.441321 27.516477 27.516477 0 0 1-27.441321 27.441321H275.681468c-58.997431 0-107.022092 48.024661-107.022092 107.031486V700.989064c0 58.997431 48.015266 107.022092 107.022092 107.022092h487.424c58.997431 0 107.022092-48.015266 107.022092-107.022092v-224.312367a27.525872 27.525872 0 0 1 27.441321-27.441321 27.516477 27.516477 0 0 1 27.441321 27.441321V700.989064c0 89.181945-72.713394 161.904734-161.89534 161.904734H275.681468c-89.181945 0-161.904734-72.722789-161.904734-161.904734v-611.628624c0.685798-89.181945 72.722789-161.914128 161.904734-161.914128zM290.017468 601.858349h398.23266a27.525872 27.525872 0 0 1 27.441322 27.441321 27.516477 27.516477 0 0 1-27.441322 27.441321h-398.23266a27.525872 27.525872 0 0 1-27.441321-27.441321 27.525872 27.525872 0 0 1 27.441321-27.441321zM546.928734 412.014385a27.525872 27.525872 0 0 1-27.450716 27.441321H290.017468c-15.08756 0-27.441321-12.344367-27.441321-27.441321s12.344367-27.441321 27.441321-27.441321h228.784147c15.773358 0.009394 28.127119 12.353761 28.127119 27.441321zM290.017468 222.161028c-15.08756 0-27.441321-12.344367-27.441321-27.441322s12.344367-27.441321 27.441321-27.441321h70.317798c15.08756 0 27.441321 12.344367 27.441321 27.441321s-12.344367 27.441321-27.441321 27.441322h-70.317798zM715.353248 381.106495c-119.34767 0-217.125578-97.204844-217.125578-217.125578 0-119.920734 97.214239-217.134972 217.125578-217.134972 119.338275 0 217.134972 97.223633 217.134972 217.134972 0 119.338275-97.223633 217.125578-217.134972 217.125578z m0-383.643009c-91.756037 0-165.953761 74.18833-165.953762 165.953762 0 91.756037 74.761394 165.953761 165.953762 165.953761s165.953761-74.197725 165.953761-165.953761-74.207119-165.953761-165.953761-165.953762zM704.371083 63.891963c0.685798 0 0.685798 0 0 0l1.371596-1.371596 0.685798-0.676404s0.676404 0 0.676404-0.685798c0 0 0.685798 0 0.685798-0.685798 0 0 0.685798 0 0.685798-0.676404 0 0 0.676404 0 0.676404-0.685798 0 0 0.695193 0 0.695192-0.685798h12.344367s0.676404 0 0.676404 0.685798c0 0 0.685798 0 0.685798 0.685798 0 0 0.685798 0 0.685798 0.676404 0 0 0.676404 0 0.676404 0.685798 0 0 0.685798 0 0.685798 0.685798l0.685798 0.676404 0.685799 0.695193 0.685798 0.676403 93.982532 93.306129c6.857982 6.857982 6.857982 18.525945 0 25.383926-6.848587 6.848587-18.525945 6.848587-25.383927 0l-63.11222-63.121614V251.697321c0 9.601174-8.238972 17.840147-17.830752 17.840147-9.601174 0-17.840147-8.238972-17.840147-17.840147v-132.236917L634.363303 182.582018c-6.857982 6.848587-18.525945 6.848587-25.383927 0-6.857982-6.857982-6.857982-18.525945 0-25.383926l95.391707-93.306129z" horiz-adv-x="1024" />
<glyph glyph-name="lishi" unicode="&#59118;" d="M512-4.125C297.636875-4.125 123.875 169.63687500000003 123.875 384S297.636875 772.125 512 772.125s388.125-173.761875 388.125-388.125c0-10.918125-0.455625-21.718125-1.333125-32.4l-50.45625 4.168125c0.77625 9.34875 1.164375 18.765 1.164375 28.231875 0 186.40125-151.09875 337.5-337.5 337.5S174.5 570.40125 174.5 384s151.09875-337.5 337.5-337.5v-50.625z m-25.3125 413.4375V603.375h50.625v-244.6875H343.25v50.625h143.4375z m92.8125-168.75v50.625h320.625v-50.625H579.5z m0-118.125v50.625h320.625v-50.625H579.5z m0-118.125v50.625h320.625v-50.625H579.5z" horiz-adv-x="1024" />
<glyph glyph-name="fangda" unicode="&#58890;" d="M970.14518518-29.483614819999957l-266.99851851 266.87715557c54.61333333 64.80782222 87.5026963 148.4269037 87.5026963 239.69185184 0 205.58885925-167.23816297 372.94838518-372.94838519 372.94838519S44.87395555 682.79561482 44.87395555 477.08539259s167.23816297-372.94838518 372.9483852-372.94838518c92.35721482 0 176.82583703 33.7389037 241.99774814 89.56586667l266.75579259-266.7557926c5.94678518-6.06814815 13.83537778-8.98085925 21.72397037-8.98085926s15.77718518 3.03407408 21.72397037 8.98085926c12.1362963 12.01493333 12.1362963 31.55437037 0.12136296 43.5693037zM417.82234075 165.78939259000003c-171.60722963 0-311.296 139.68877037-311.296 311.296 0 171.72859259 139.68877037 311.296 311.296 311.296s311.296-139.68877037 311.296-311.296-139.68877037-311.296-311.296-311.296zM564.18607408 497.7170963h-121.12023705v121.12023703c0 16.99081482-13.83537778 30.82619259-30.82619258 30.82619259s-30.82619259-13.83537778-30.8261926-30.82619259v-121.12023703h-121.12023703c-16.99081482 0-30.82619259-13.83537778-30.8261926-30.8261926s13.83537778-30.82619259 30.8261926-30.82619259h121.12023703v-121.12023703c0-16.99081482 13.83537778-30.82619259 30.8261926-30.8261926s30.82619259 13.83537778 30.82619258 30.8261926v121.12023703H564.18607408c16.99081482 0 30.82619259 13.83537778 30.82619259 30.82619259S581.17688889 497.7170963 564.18607408 497.7170963z" horiz-adv-x="1024" />
<glyph glyph-name="suoxiao" unicode="&#58895;" d="M970.14518518-29.483614819999957l-266.99851851 266.87715557c54.61333333 64.80782222 87.5026963 148.4269037 87.5026963 239.69185184 0 205.58885925-167.23816297 372.94838518-372.94838519 372.94838519S44.87395555 682.79561482 44.87395555 477.08539259s167.23816297-372.94838518 372.9483852-372.94838518c92.35721482 0 176.82583703 33.7389037 241.99774814 89.56586667l266.75579259-266.7557926c5.94678518-6.06814815 13.83537778-8.98085925 21.72397037-8.98085926s15.77718518 3.03407408 21.72397037 8.98085926c12.1362963 12.01493333 12.1362963 31.55437037 0.12136296 43.5693037zM417.82234075 165.78939259000003c-171.60722963 0-311.296 139.68877037-311.296 311.296 0 171.72859259 139.68877037 311.296 311.296 311.296s311.296-139.68877037 311.296-311.296-139.68877037-311.296-311.296-311.296zM564.18607408 497.7170963H260.41457778c-16.99081482 0-30.82619259-13.83537778-30.8261926-30.8261926s13.83537778-30.82619259 30.8261926-30.82619259H564.18607408c16.99081482 0 30.82619259 13.83537778 30.82619259 30.82619259S581.17688889 497.7170963 564.18607408 497.7170963z" horiz-adv-x="1024" />
<glyph glyph-name="daohang" unicode="&#58889;" d="M838.37634278 426.10510254H183.975708c-23.23608398 0-42.26989747-19.03381348-42.26989745-42.26989746 0-23.23608398 19.03381348-42.26989747 42.26989746-42.26989747h654.40063477c23.23608398 0 42.26989747 19.03381348 42.26989745 42.26989747-0.08239747 23.23608398-19.03381348 42.26989747-42.26989745 42.26989746zM838.37634278 713.83703614H183.975708c-23.23608398 0-42.26989747-19.03381348-42.26989745-42.26989747 0-23.23608398 19.03381348-42.26989747 42.26989746-42.26989746h654.40063477c23.23608398 0 42.26989747 19.03381348 42.26989745 42.26989746-0.08239747 23.31848145-19.03381348 42.26989747-42.26989745 42.26989746zM838.37634278 138.29077148H183.975708c-23.23608398 0-42.26989747-19.03381348-42.26989745-42.26989746 0-23.23608398 19.03381348-42.26989747 42.26989746-42.26989746h654.40063477c23.23608398 0 42.26989747 19.03381348 42.26989745 42.26989747-0.08239747 23.23608398-19.03381348 42.26989747-42.26989745 42.26989745z" horiz-adv-x="1024" />
<glyph glyph-name="shijianguanli" unicode="&#58906;" d="M567.03125 58.36458332999996H207.5c-54.375 0-98.625 44.25-98.625 98.625V624.61458333c0 54.375 44.25 98.625 98.625 98.625h528c54.375 0 98.625-44.25 98.625-98.625v-187.875c0-12.9375-10.5-23.4375-23.4375-23.4375s-23.4375 10.5-23.4375 23.4375V624.61458333c0 28.5-23.25 51.75-51.75 51.75H207.5c-28.5 0-51.75-23.25-51.75-51.75v-467.625c0-28.5 23.25-51.75 51.75-51.75h359.53125c12.9375 0 23.4375-10.5 23.4375-23.4375s-10.5-23.4375-23.4375-23.4375zM810.6875 549.89583333H133.90625c-12.9375 0-23.4375 10.5-23.4375 23.4375s10.5 23.4375 23.4375 23.4375h676.78125c12.9375 0 23.4375-10.5 23.4375-23.4375s-10.5-23.4375-23.4375-23.4375zM588.03125 624.70833333c-12.9375 0-23.4375 10.5-23.4375 23.4375V752.20833333c0 12.9375 10.5 23.4375 23.4375 23.4375s23.4375-10.5 23.4375-23.4375v-104.0625c0-12.9375-10.5-23.4375-23.4375-23.4375zM355.8125 624.70833333c-12.9375 0-23.4375 10.5-23.4375 23.4375V752.20833333c0 12.9375 10.5 23.4375 23.4375 23.4375s23.4375-10.5 23.4375-23.4375v-104.0625c0-12.9375-10.5-23.4375-23.4375-23.4375zM282.78125 421.64583333h-29.15625c-4.875 0-8.90625 4.03125-8.90625 8.90625V459.70833333c0 4.875 4.03125 8.90625 8.90625 8.90625h29.15625c4.875 0 8.90625-4.03125 8.90625-8.90625v-29.15625c-0.09375-4.96875-4.03125-8.90625-8.90625-8.90625zM443.5625 421.64583333h-29.0625c-4.875 0-8.90625 4.03125-8.90625 8.90625V459.70833333c0 4.875 4.03125 8.90625 8.90625 8.90625h29.0625c4.875 0 8.90625-4.03125 8.90625-8.90625v-29.15625c0-4.96875-4.03125-8.90625-8.90625-8.90625zM604.4375 421.64583333h-29.15625c-4.875 0-8.90625 4.03125-8.90625 8.90625V459.70833333c0 4.875 4.03125 8.90625 8.90625 8.90625h29.15625c4.875 0 8.90625-4.03125 8.90625-8.90625v-29.15625c0-4.96875-4.03125-8.90625-8.90625-8.90625zM282.78125 309.14583332999996h-29.15625c-4.875 0-8.90625 4.03125-8.90625 8.90625V347.20833332999996c0 4.875 4.03125 8.90625 8.90625 8.90625h29.15625c4.875 0 8.90625-4.03125 8.90625-8.90625v-29.15625c-0.09375-4.96875-4.03125-8.90625-8.90625-8.90625zM443.5625 309.14583332999996h-29.0625c-4.875 0-8.90625 4.03125-8.90625 8.90625V347.20833332999996c0 4.875 4.03125 8.90625 8.90625 8.90625h29.0625c4.875 0 8.90625-4.03125 8.90625-8.90625v-29.15625c0-4.96875-4.03125-8.90625-8.90625-8.90625zM280.90625 196.64583332999996h-29.15625c-4.875 0-8.90625 4.03125-8.90625 8.90625V234.70833332999996c0 4.875 4.03125 8.90625 8.90625 8.90625h29.15625c4.875 0 8.90625-4.03125 8.90625-8.90625v-29.15625c-0.09375-4.875-4.03125-8.90625-8.90625-8.90625zM441.6875 196.64583332999996h-29.0625c-4.875 0-8.90625 4.03125-8.90625 8.90625V234.70833332999996c0 4.875 4.03125 8.90625 8.90625 8.90625h29.0625c4.875 0 8.90625-4.03125 8.90625-8.90625v-29.15625c0-4.875-4.03125-8.90625-8.90625-8.90625zM695.9375 20.77083332999996c-62.8125 0-121.875 24.46875-166.21875 68.90625-44.4375 44.4375-68.90625 103.5-68.90625 166.21875s24.46875 121.875 68.90625 166.21875c44.4375 44.4375 103.5 68.90625 166.21875 68.90625s121.875-24.46875 166.21875-68.90625c44.4375-44.4375 68.90625-103.5 68.90625-166.21875s-24.46875-121.875-68.90625-166.21875c-44.34375-44.4375-103.40625-68.90625-166.21875-68.90625z m0 423.375c-103.78125 0-188.25-84.46875-188.25-188.25s84.46875-188.25 188.25-188.25S884.1875 152.11458332999996 884.1875 255.89583332999996s-84.46875 188.25-188.25 188.25zM787.625 177.23958332999996c-1.59375 0-3.1875 0.1875-4.78125 0.46875L695.75 195.80208332999996c-13.5 2.8125-23.25 14.8125-23.25 28.59375v86.71875c0 12.9375 10.5 23.4375 23.4375 23.4375s23.4375-10.5 23.4375-23.4375v-72.28125l73.03125-15.1875c12.65625-2.625 20.8125-15 18.1875-27.75-2.34375-11.0625-12.09375-18.65625-22.96875-18.65625z m-82.3125 64.5z" horiz-adv-x="1024" />
<glyph glyph-name="shujuku" unicode="&#61172;" d="M512 772.528125c-202.14375 0-354.58125-72.1875-354.58125-167.896875v-441.2625c0-95.71875 152.446875-167.896875 354.58125-167.896875s354.58125 72.1875 354.58125 167.896875V604.63125c0 95.71875-152.4375 167.896875-354.58125 167.896875zM512 365.25c-149.240625 0-290.353125 50.371875-290.353125 103.640625V505.875c64.940625-43.4625 172.153125-69.159375 290.353125-69.159375S737.403125 462.440625 802.353125 505.875v-37.05C802.353125 415.584375 661.240625 365.25 512 365.25z m0-152.8125c-149.240625 0-290.353125 50.371875-290.353125 103.659375V370.125c64.93125-43.4625 172.14375-69.159375 290.353125-69.159375s225.421875 25.696875 290.353125 69.159375v-54C802.353125 262.8375 661.240625 212.4375 512 212.4375z m-290.353125 4.9125C286.596875 173.91562499999998 393.8 148.21875 512 148.21875s225.403125 25.696875 290.353125 69.15v-54c0-53.2875-141.1125-103.659375-290.353125-103.659375s-290.353125 50.371875-290.353125 103.659375zM512 500.971875c-149.240625 0-290.353125 50.38125-290.353125 103.659375S362.759375 708.290625 512 708.290625s290.353125-50.38125 290.353125-103.659375S661.240625 500.971875 512 500.971875z m0 0" horiz-adv-x="1024" />
<glyph glyph-name="tiaoduzhongxin" unicode="&#59026;" d="M646.435754 661.452514H503.418994c-57.206704 0-108.692737 51.486034-108.692737 108.692737 0 57.206704 51.486034 108.692737 108.692737 108.692738h143.01676c57.206704 0 108.692737-51.486034 108.692738-108.692738 0-62.927374-51.486034-108.692737-108.692738-108.692737z m0-400.446927H503.418994c-57.206704 0-108.692737 51.486034-108.692737 108.692737 0 57.206704 51.486034 108.692737 108.692737 108.692737h143.01676c57.206704 0 108.692737-51.486034 108.692738-108.692737 0-57.206704-51.486034-108.692737-108.692738-108.692737z m0-389.005587H503.418994c-57.206704 0-108.692737 51.486034-108.692737 108.692737 0 57.206704 51.486034 108.692737 108.692737 108.692738h143.01676c57.206704 0 108.692737-51.486034 108.692738-108.692738 0-57.206704-51.486034-108.692737-108.692738-108.692737z m-411.888268 80.089385c-125.854749 0-234.547486 102.972067-234.547486 234.547487 0 125.854749 102.972067 234.547486 234.547486 234.547486h40.044693c22.882682 0 40.044693-17.162011 40.044693-40.044693 0-22.882682-17.162011-40.044693-40.044693-40.044693h-40.044693c-85.810056 0-154.458101-68.648045-154.458101-154.4581 0-85.810056 68.648045-154.458101 154.458101-154.458101 22.882682 0 40.044693-17.162011 40.044693-40.044693 0-22.882682-17.162011-40.044693-40.044693-40.044693z m0 0M343.240223-2.145251l-114.413407-120.134079v234.547486l114.413407-114.413407z m566.346369 360.402234h-40.044693c-22.882682 0-40.044693 17.162011-40.044692 40.044693 0 22.882682 17.162011 40.044693 40.044692 40.044693h40.044693c85.810056 0 154.458101 68.648045 154.458101 154.4581 0 85.810056-68.648045 154.458101-154.458101 154.458101-22.882682 0-40.044693 17.162011-40.044693 40.044693 0 22.882682 17.162011 40.044693 40.044693 40.044692C1035.441341 827.351955 1144.134078 724.379888 1144.134078 592.804469s-102.972067-234.547486-234.547486-234.547486z m0 0M800.893855 775.865922L915.307263 896v-234.547486l-114.413408 114.413408z m0 0" horiz-adv-x="1144" />
<glyph glyph-name="shubiaozhizhen" unicode="&#59265;" d="M777.06666667 303.67999999999995c9.81333333-9.49333333 12.05333333-20.48 6.72-32.85333333-5.44-12.69333333-14.72-18.98666667-28.16-18.98666667H573.65333333l95.78666667-226.66666667c3.2-7.89333333 3.2-15.68 0-23.36-3.2-7.57333333-8.64-13.22666667-16.21333333-16.64l-84.37333334-35.73333333c-7.89333333-3.2-15.68-3.2-23.36 0-7.57333333 3.2-13.22666667 8.64-16.64 16.21333333l-90.98666666 215.25333334-148.48-148.8c-5.97333333-5.97333333-13.22666667-9.06666667-21.44-9.06666667-3.84 0-7.57333333 0.85333333-11.41333334 2.45333333-12.69333333 5.44-18.98666667 14.72-18.98666666 28.16V769.81333333c0 13.33333333 6.29333333 22.72 18.98666666 28.16 3.84 1.6 7.57333333 2.45333333 11.41333334 2.45333334 8.64 0 15.68-2.98666667 21.44-9.06666667l487.68-487.68z" horiz-adv-x="1024" />
<glyph glyph-name="yuandian" unicode="&#59330;" d="M881.38666668 598.18666667C919.46666667 532.8000000100001 938.66666667 461.44 938.66666667 384s-19.09333334-148.80000001-57.28000001-214.18666667C843.20000001 104.53333333 791.46666667 52.69333332999997 726.18666667 14.613333320000038S589.44-42.66666667000004 512-42.66666667000004s-148.80000001 19.09333334-214.18666667 57.28000001c-65.28 38.08000001-117.01333334 89.81333333-155.30666666 155.30666665C104.42666666 235.19999999000004 85.33333333 306.55999999999995 85.33333333 384c0 77.33333334 19.09333334 148.69333333 57.28000001 214.18666667 38.08000001 65.28 89.81333333 117.01333334 155.30666665 155.30666666C363.19999999 791.46666667 434.56 810.66666667 512 810.66666667c77.33333334 0 148.69333333-19.09333334 214.18666667-57.28000001C791.46666667 715.2000000099999 843.20000001 663.46666667 881.38666668 598.18666667z m-217.70666668 47.36c-46.29333333 26.98666668-96.85333333 40.53333333-151.68 40.53333332s-105.38666667-13.54666668-151.68-40.53333332-82.98666667-63.68000001-109.97333334-109.97333335-40.53333333-96.85333333-40.53333332-151.67999998c0-54.82666667 13.54666668-105.38666667 40.53333332-151.68s63.68000001-82.98666667 109.97333334-109.97333334c46.29333333-26.98666668 96.85333333-40.53333333 151.68-40.53333333s105.38666667 13.54666668 151.68 40.53333333c46.29333333 26.98666668 82.98666667 63.68000001 109.97333334 109.97333334 26.98666668 46.29333333 40.53333333 96.85333333 40.53333332 151.68s-13.54666668 105.38666667-40.53333335 151.68c-27.09333333 46.29333333-63.78666667 82.98666667-109.97333331 109.97333333z m-51.09333334-161.06666667c27.84000001-27.84000001 41.70666668-61.33333334 41.70666667-100.58666668s-13.86666667-72.74666667-41.70666667-100.58666666c-27.84000001-27.84000001-61.33333334-41.70666668-100.58666666-41.70666667s-72.74666667 13.86666667-100.58666668 41.70666667c-27.84000001 27.84000001-41.70666668 61.33333334-41.70666665 100.58666668s13.86666667 72.74666667 41.70666667 100.58666666c27.84000001 27.84000001 61.33333334 41.70666668 100.58666666 41.70666668s72.74666667-13.86666667 100.58666668-41.70666668z" horiz-adv-x="1024" />
<glyph glyph-name="-Tree-Structure" unicode="&#58935;" d="M632 714v-105l-240-167.82V504H92v-240h300V326.82000000000005l240-167.82V54h300v240H632V231.17999999999995L413.57 384 632 536.8199999999999V474h300V714H632z m60-60h180v-120h-180V654zM152 444h180v-120H152v120z m540-210h180v-120h-180v120z" horiz-adv-x="1024" />
<glyph glyph-name="xia" unicode="&#58907;" d="M512 271.67999999999995l264.32 293.76a32 32 0 1 0 47.36-42.88l-288-320a32 32 0 0 0-47.36 0l-288 320a32 32 0 0 0 47.36 42.88z" horiz-adv-x="1024" />
<glyph glyph-name="zanting" unicode="&#58900;" d="M899.09375001 547.59375001c-21.09375001 49.96875001-51.375 94.875-89.90625001 133.40624999-38.53125001 38.53125001-83.4375 68.8125-133.40625001 89.90625001C624.03125001 792.75 569.09375001 803.90625001 512.46875001 803.90625001c-56.625 0-111.5625-11.0625-163.31250002-33.00000002-49.96875001-21.09375001-94.875-51.375-133.40624999-89.90624999-38.53125001-38.53125001-68.8125-83.4375-89.90625001-133.40625001-21.9375-51.75-33-106.6875-32.99999998-163.31249998s11.0625-111.5625 33-163.31250002c21.09375001-49.96875001 51.375-94.875 89.90624999-133.40624999s83.4375-68.8125 133.40625001-89.90625001c51.75-21.9375 106.6875-33 163.31249998-32.99999998 56.625 0 111.5625 11.0625 163.31250002 33 49.96875001 21.09375001 94.875 51.375 133.40624999 89.90624999s68.8125 83.4375 89.90625001 133.40625001c21.9375 51.75 33 106.6875 32.99999998 163.31249998s-11.0625 111.5625-33 163.31250002zM761.46875001 135.1875c-66.46875001-66.46875001-154.96875001-103.125-249.00000002-103.125s-182.53125001 36.65625001-248.99999998 103.125c-66.46875001 66.46875001-103.125 154.96875001-103.12500002 249 0 94.03125001 36.65625001 182.53125001 103.125 249 66.46875001 66.46875001 154.96875001 103.125 249.00000002 103.125s182.53125001-36.65625001 248.99999998-103.125c66.46875001-66.46875001 103.125-154.96875001 103.12500002-249 0-94.03125001-36.5625-182.4375-103.125-249zM582.875 532.96875001H442.0625c-43.3125 0-78.375-35.0625-78.375-78.37500002v-140.71874999c0-43.3125 35.0625-78.375 78.375-78.375h140.71875001c43.3125 0 78.375 35.0625 78.37499998 78.375V454.59375001c0 43.3125-35.0625 78.375-78.28124999 78.37499998z" horiz-adv-x="1024" />
<glyph glyph-name="yonghu3" unicode="&#58954;" d="M133.7-35.4c0 208.6 169.1 377.6 377.6 377.6s377.6-169.1 377.6-377.6h-75.5c0 166.8-135.3 302.1-302.1 302.1S209.2 131.4 209.2-35.4h-75.5z m377.6 377.7c-125.1 0-226.6 101.5-226.6 226.6s101.4 226.6 226.6 226.6S737.9 694 737.9 568.9c0-125.2-101.4-226.6-226.6-226.6z m0 75.5c83.4 0 151.1 67.6 151.1 151.1S594.8 720 511.3 720c-83.4 0-151.1-67.6-151.1-151.1s67.7-151.1 151.1-151.1z" horiz-adv-x="1024" />
<glyph glyph-name="shanchu2" unicode="&#59086;" d="M512 753.140625c49.85046387 0 98.21777344-9.72290039 143.70117188-29.00390625 43.91784668-18.62182617 83.46862793-45.23620606 117.33398437-79.1015625 33.94775391-33.94775391 60.56213379-73.4161377 79.1015625-117.33398438C871.41772461 482.21777344 881.140625 433.85046387 881.140625 384s-9.72290039-98.21777344-29.00390625-143.70117188c-18.62182617-43.91784668-45.23620606-83.46862793-79.1015625-117.33398437-33.94775391-33.94775391-73.4161377-60.56213379-117.33398438-79.1015625C610.21777344 24.58227538999995 561.85046387 14.859375 512 14.859375s-98.21777344 9.72290039-143.70117188 29.00390625c-43.91784668 18.62182617-83.46862793 45.23620606-117.33398437 79.1015625-33.94775391 33.94775391-60.56213379 73.4161377-79.1015625 117.33398438C152.58227539 285.78222656 142.859375 334.14953613 142.859375 384s9.72290039 98.21777344 29.00390625 143.70117188c18.62182617 43.91784668 45.23620606 83.46862793 79.1015625 117.33398437s73.4161377 60.56213379 117.33398438 79.1015625C413.78222656 743.41772461 462.14953613 753.140625 512 753.140625m0 52.734375C278.97998047 805.875 90.125 617.02001953 90.125 384s188.85498047-421.875 421.875-421.875 421.875 188.85498047 421.875 421.875S745.02001953 805.875 512 805.875zM719.64160156 410.3671875H304.35839844c-14.50195313 0-26.3671875-11.86523438-26.3671875-26.3671875s11.86523438-26.3671875 26.3671875-26.3671875h415.28320312c14.50195313 0 26.3671875 11.86523438 26.3671875 26.3671875s-11.86523438 26.3671875-26.3671875 26.3671875z" horiz-adv-x="1024" />
<glyph glyph-name="guanbi" unicode="&#59106;" d="M571.904 394.24L885.76 708.096c15.872 15.872 15.872 41.984 0 57.856l-1.536 1.536c-15.872 15.872-41.984 15.872-57.856 0L512 453.632 198.144 768c-15.872 15.872-41.984 15.872-57.856 0l-1.536-1.536a40.192 40.192 0 0 1 0-57.856L452.608 394.24l-313.856-313.856c-15.872-15.872-15.872-41.984 0-57.856l1.536-1.536c15.872-15.872 41.984-15.872 57.856 0l313.856 313.856 313.856-313.856c15.872-15.872 41.984-15.872 57.856 0l1.536 1.536c15.872 15.872 15.872 41.984 0 57.856L571.904 394.24z" horiz-adv-x="1024" />
<glyph glyph-name="cuowuguanbishibai" unicode="&#59229;" d="M512-36.46875001000001c-56.71875001 0-111.84375001 11.15625001-163.68749999 33.09375001-50.06250001 21.1875-95.0625 51.46875001-133.59375002 90.09375002-38.625 38.53125001-68.90625001 83.53125001-90.09374999 133.59374997C102.6875 272.15624999 91.53124999 327.28124999 91.53124999 384s11.15625001 111.84375001 33.09375001 163.68749999c21.1875 50.06250001 51.46875001 95.0625 90.09375002 133.68750001 38.625 38.625 83.53125001 68.90625001 133.68749997 90.09375001 51.75 21.84375002 106.875 33 163.59375001 32.99999998s111.84375001-11.15625001 163.68749999-33.09374999c50.06250001-21.1875 95.0625-51.46875001 133.68750001-90.09375002 38.625-38.625 68.90625001-83.53125001 90.09375001-133.68749997 21.9375-51.84375001 33.09375001-106.96875002 33.09374999-163.68750002s-11.15625001-111.84375001-33.09374999-163.68749998c-21.28125001-49.96875001-51.56250002-94.96875001-90.1875-133.50000002-38.625-38.625-83.53125001-68.90625001-133.6875-90.09374999-51.75-21.9375-106.875-33.09375001-163.59375001-33.09375001z m0 780c-198.28125001 0-359.53125001-161.25-359.53125001-359.53124999s161.25-359.53125001 359.53125001-359.53125001 359.53125001 161.25 359.53125001 359.53125001-161.25 359.53125001-359.53125001 359.53124999zM681.6875 511.3125L384.6875 214.3125c-11.625-11.625-30.75-11.625-42.46875001 0-11.625 11.625-11.625 30.75 0 42.46875001L639.3125 553.6875c11.625 11.625 30.75 11.625 42.46875001 0 11.625-11.625 11.625-30.75-0.09375001-42.375zM384.6875 553.6875L681.6875 256.6875c11.625-11.625 11.625-30.75 0-42.46875001-11.625-11.625-30.75-11.625-42.46875001 0L342.3125 511.3125c-11.625 11.625-11.625 30.75 0 42.46875001 11.625 11.625 30.75 11.625 42.375-0.09375001z" horiz-adv-x="1024" />
<glyph glyph-name="icon_paging_left" unicode="&#58962;" d="M316.28543091 384l209.75046157-209.7496891c12.87099838-12.87099838 12.87099838-33.73944282 0-46.61121369-12.87099838-12.87099838-33.7402153-12.87099838-46.61121367 0l-233.05529595 233.05606842c-12.87099838 12.87022591-12.87099838 33.73944282 0 46.61044121l233.05606841 233.05529595c12.87022591 12.87099838 33.73944282 12.87099838 46.61044121 0 12.87099838-12.87177085 12.87099838-33.7402153 0-46.61121369L316.28543091 384zM548.02828979 384l209.75046158-209.7496891c12.87099838-12.87099838 12.87099838-33.73944282 0-46.61121369-12.87099838-12.87099838-33.7402153-12.87099838-46.61121368 0l-233.05529595 233.05606842c-12.87099838 12.87022591-12.87099838 33.73944282 0 46.61044121l233.05606843 233.05529595c12.87022591 12.87099838 33.73944282 12.87099838 46.6104412 0 12.87099838-12.87177085 12.87099838-33.7402153 0-46.61121369L548.02828979 384z" horiz-adv-x="1024" />
<glyph glyph-name="icon_paging_left-copy" unicode="&#61173;" d="M707.71456909 384l-209.75046157 209.74968909c-12.87099838 12.87099838-12.87099838 33.73944282 0 46.6112137 12.87099838 12.87099838 33.7402153 12.87099838 46.61121367 0l233.05529595-233.05606842c12.87099838-12.87022591 12.87099838-33.73944282 0-46.61044121l-233.05606841-233.05529595c-12.87022591-12.87099838-33.73944282-12.87099838-46.61044121 0-12.87099838 12.87177085-12.87099838 33.7402153 0 46.6112137L707.71456909 384zM475.97171022 384l-209.75046159 209.7496891c-12.87099838 12.87099838-12.87099838 33.73944282 0 46.6112137 12.87099838 12.87099838 33.7402153 12.87099838 46.61121368-1e-8l233.05529595-233.05606842c12.87099838-12.87022591 12.87099838-33.73944282 0-46.61044121l-233.05606843-233.05529596c-12.87022591-12.87099838-33.73944282-12.87099838-46.6104412 0-12.87099838 12.87177085-12.87099838 33.7402153 0 46.6112137L475.97171022 384z" horiz-adv-x="1024" />
<glyph glyph-name="rizhishezhi" unicode="&#58899;" d="M862.18464985 213.88488819999998c-27.10318786 0-44.04079497 29.34293377-30.48920105 52.81124781a35.20247105 35.20247105 0 0 1-12.88796551 48.09043657l-47.23073611 27.26909495a35.20247105 35.20247105 0 0 1-48.09043656-12.88796551c-13.55159393-23.46831402-47.42680814-23.46831402-60.97840207 0a35.20247105 35.20247105 0 0 1-48.09043655 12.88796551l-47.23073612-27.26909495a35.20247105 35.20247105 0 0 1-12.8879655-48.09043657c13.55159393-23.46831402-3.38601318-52.81124779-30.48920105-52.81124781a35.21755351 35.21755351 0 0 1-35.21001226-35.21001229v-54.5381899a35.21755351 35.21755351 0 0 1 35.21001226-35.21001229c27.10318786 0 44.04079497-29.34293377 30.48920105-52.81124779a35.20247105 35.20247105 0 0 1 12.8879655-48.09043658l47.23073612-27.26909496a35.20247105 35.20247105 0 0 1 48.09043655 12.88796552c13.55159393 23.46831402 47.42680814 23.46831402 60.97840207 0a35.20247105 35.20247105 0 0 1 48.09043656-12.88796552l47.23073611 27.26909496a35.20247105 35.20247105 0 0 1 12.88796551 48.09043658c-13.55159393 23.46831402 3.38601318 52.81124779 30.48920105 52.81124779a35.21755351 35.21755351 0 0 1 35.21001227 35.21001229v54.5381899a35.21755351 35.21755351 0 0 1-35.21001227 35.21001229zM730.69572844 86.09871170999998c-36.06971274-20.82134158-82.19188773-8.46880354-103.01322933 27.60090918-20.82134158 36.06971274-8.46880354 82.19188773 27.60090917 103.01322934 36.06971274 20.82134158 82.19188773 8.46880354 103.01322933-27.60090921 20.82888283-36.06217149 8.46880354-82.18434651-27.60090917-103.01322931zM284.97875142 640.14548662h407.2265288v-60.32985612h-407.2265288zM284.97875142 483.37081426h407.2265288v-60.32985612h-407.2265288zM284.97875142 323.72293250999996h226.23696046v-60.32985612h-226.23696046zM790.24129642 811.96491684h-603.2985612c-33.26437441 0-60.32985613-27.0654817-60.32985613-60.32985611v-693.79334537c0-33.26437441 27.0654817-60.32985613 60.32985613-60.32985613h264.21460489a30.16492806 30.16492806 0 0 1 0 60.32985613H186.94273522v693.79334537h603.2985612v-328.59410259a30.16492806 30.16492806 0 0 1 60.32985612 0V751.63506073c0 33.26437441-27.0654817 60.32985613-60.32985612 60.32985611z" horiz-adv-x="1024" />
<glyph glyph-name="icon-test" unicode="&#58901;" d="M690.76953125 34.28320312000005h105.38085938v-43.68164062H577.56640625V209.09765625h43.68164063v-156.88476563C760.81835938 98.1796875 861.71679688 229.04882812000005 861.71679688 384c0 193.18359375-156.62109375 349.71679688-349.71679688 349.71679688-7.3828125 0-14.58984375-0.61523438-21.88476563-1.14257813V776.34375c7.29492188 0.43945313 14.50195313 1.14257813 21.88476563 1.14257813 217.265625 0 393.48632813-176.1328125 393.48632813-393.48632813 0-152.84179688-87.45117188-284.67773438-214.71679688-349.71679688zM402.6640625 715.78710938C263.18164062 669.8203125 162.28320312 538.95117188 162.28320312 384c0-193.18359375 156.62109375-349.71679688 349.71679688-349.71679688 7.3828125 0 14.58984375 0.61523438 21.88476563 1.14257813v-43.68164062c-7.29492188-0.43945313-14.50195313-1.14257813-21.88476563-1.14257813-217.265625-0.08789063-393.48632813 176.1328125-393.48632813 393.3984375 0 152.84179688 87.36328125 284.67773438 214.71679688 349.71679688H227.84960937V777.48632813h218.58398438V558.90234375h-43.68164063V715.78710938z" horiz-adv-x="1024" />
<glyph glyph-name="zanting1" unicode="&#59016;" d="M435.5 544.6800000000001c-17.1 0-31.02-11.94-31.02-26.76v-267.84c0-14.76 13.86-26.76 31.02-26.76 17.1 0 30.96 12 30.96 26.76V517.9200000000001c0 14.82-13.92 26.76-30.96 26.76z m153.96 0c-17.1 0-30.96-11.94-30.96-26.76v-267.84c0-14.76 13.8-26.76 30.96-26.76s31.02 12 31.02 26.76V517.9200000000001c0 14.82-13.92 26.76-31.02 26.76zM512.48 802.14C281.9 802.14 94.34 614.5799999999999 94.34 384S281.9-34.139999999999986 512.48-34.139999999999986 930.62 153.41999999999996 930.62 384 743.06 802.14 512.48 802.14z m0-776.28c-197.46 0-358.14 160.68-358.14 358.14s160.68 358.14 358.14 358.14S870.62 581.46 870.62 384 709.94 25.860000000000014 512.48 25.860000000000014z" horiz-adv-x="1024" />
<glyph glyph-name="shijianfenlei" unicode="&#59101;" d="M490.66666667-9.75C274.10416667-9.75 96.91666667 167.4375 96.91666667 384S274.10416667 777.75 490.66666667 777.75c88.59375 0 172.96875-29.53125 241.875-82.96875 12.65625-9.84375 14.0625-26.71875 4.21875-39.375-9.84375-12.65625-26.71875-14.0625-39.375-4.21875-59.0625 45-130.78125 70.3125-206.71875 70.3125-185.625 0-337.5-151.875-337.5-337.5s151.875-337.5 337.5-337.5c75.9375 0 147.65625 25.3125 208.125 71.71875 12.65625 9.84375 29.53125 7.03125 39.375-4.21875s7.03125-29.53125-4.21875-39.375c-70.3125-54.84375-154.6875-84.375-243.28125-84.375z m196.875 365.625H490.66666667c-15.46875 0-28.125 12.65625-28.125 28.125V637.125c0 15.46875 12.65625 28.125 28.125 28.125s28.125-12.65625 28.125-28.125v-225h168.75c15.46875 0 28.125-12.65625 28.125-28.125s-12.65625-28.125-28.125-28.125z m225 0h-56.25c-15.46875 0-28.125 12.65625-28.125 28.125s12.65625 28.125 28.125 28.125h56.25c15.46875 0 28.125-12.65625 28.125-28.125s-12.65625-28.125-28.125-28.125z m0 168.75H814.10416667c-15.46875 0-28.125 12.65625-28.125 28.125s12.65625 28.125 28.125 28.125h98.4375c15.46875 0 28.125-12.65625 28.125-28.125s-12.65625-28.125-28.125-28.125z m0-337.5H814.10416667c-15.46875 0-28.125 12.65625-28.125 28.125s12.65625 28.125 28.125 28.125h98.4375c15.46875 0 28.125-12.65625 28.125-28.125s-12.65625-28.125-28.125-28.125z" horiz-adv-x="1024" />
<glyph glyph-name="erji-xiaxianjilu-copy" unicode="&#61174;" d="M374.890625 605.484375l110.7421875 110.7421875L485.6328125 278.53125c0-15.8203125 10.546875-26.3671875 26.3671875-26.3671875s26.3671875 10.546875 26.3671875 26.3671875l0 437.6953125 110.7421875-110.7421875c10.546875-10.546875 26.3671875-10.546875 36.9140625 0 10.546875 10.546875 10.546875 26.3671875 0 36.9140625l-152.9296875 158.203125s-5.2734375 5.2734375-10.546875 5.2734375l-26.3671875 0s-5.27343751 0-5.2734375-5.2734375l-152.9296875-158.203125c-10.546875-10.546875-10.546875-26.3671875 0-36.9140625 10.546875-10.546875 26.3671875-10.546875 36.9140625 0zM512-37.875C728.2109375-37.875 907.50781251 141.421875 907.5078125 357.6328125c0 89.6484375-31.640625 179.296875-89.6484375 253.125-5.2734375 5.2734375-10.546875 10.546875-21.09375 10.54687499-5.27343751 0-10.546875 0-15.8203125-5.27343749-10.546875-10.546875-10.546875-26.3671875-5.2734375-36.9140625C828.40625 515.83593751 854.7734375 436.734375 854.7734375 357.6328125 854.7734375 167.7890625 701.84375 14.859375 512 14.859375s-342.7734375 152.9296875-342.7734375 342.7734375c0 79.10156251 26.3671875 158.203125 79.1015625 216.2109375 10.546875 10.546875 5.2734375 26.3671875-5.2734375 36.9140625-10.546875 10.546875-26.3671875 5.2734375-36.9140625-5.2734375-58.0078125-68.5546875-89.6484375-158.203125-89.6484375-253.125 0-210.9375 179.296875-390.234375 395.5078125-390.234375z" horiz-adv-x="1024" />
<glyph glyph-name="tiaoduzhongxin-copy" unicode="&#61175;" d="M615.84841989 598.32546267H505.37137712c-44.19081711 0-83.96255204 39.7717357-83.96255203 83.96255203 0 44.19081711 39.7717357 83.96255204 83.96255204 83.96255282h110.47704277c44.19081711 0 83.96255204-39.7717357 83.96255281-83.96255282 0-48.60989852-39.7717357-83.96255204-83.96255282-83.96255203z m1e-8-309.33571899H505.37137712c-44.19081711 0-83.96255204 39.7717357-83.96255203 83.96255205 0 44.19081711 39.7717357 83.96255204 83.96255204 83.96255204h110.47704277c44.19081711 0 83.96255204-39.7717357 83.96255281-83.96255204 0-44.19081711-39.7717357-83.96255204-83.96255282-83.96255205z m0-300.49755618H505.37137712c-44.19081711 0-83.96255204 39.7717357-83.96255203 83.96255204 0 44.19081711 39.7717357 83.96255204 83.96255204 83.96255281h110.47704277c44.19081711 0 83.96255204-39.7717357 83.96255281-83.96255281 0-44.19081711-39.7717357-83.96255204-83.96255282-83.96255204z m-318.17388257 61.86714349c-97.2197978 0-181.18234983 79.54347064-181.18234983 181.1823506 0 97.2197978 79.54347064 181.18234983 181.18234983 181.18234983h30.93357214c17.67632715 0 30.93357213-13.25724498 30.93357212-30.93357213 0-17.67632715-13.25724498-30.93357213-30.93357212-30.93357212h-30.93357213c-66.28622566 0-119.31520634-53.02898068-119.31520634-119.31520558 0-66.28622566 53.02898068-119.31520634 119.31520633-119.31520634 17.67632715 0 30.93357213-13.25724498 30.93357214-30.93357212 0-17.67632715-13.25724498-30.93357213-30.93357214-30.93357214z m1e-8 0M381.63708937 85.71198530000004l-88.38163344-92.8007164v181.18234983l88.38163344-88.38163343z m437.48908892 278.40214684h-30.93357213c-17.67632715 0-30.93357213 13.25724498-30.93357136 30.93357213 0 17.67632715 13.25724498 30.93357213 30.93357136 30.93357214h30.93357212c66.28622566 0 119.31520634 53.02898068 119.31520636 119.31520557 0 66.28622566-53.02898068 119.31520634-119.31520636 119.31520635-17.67632715 0-30.93357213 13.25724498-30.93357212 30.93357213 0 17.67632715 13.25724498 30.93357213 30.93357213 30.93357136C916.34597608 726.47883182 1000.30852813 646.93536118 1000.30852813 545.29648198s-79.54347064-181.18234983-181.18234984-181.18234984z m-1e-8 0M735.16362624 686.70709688L823.54526046 779.5078125v-181.18234983l-88.38163422 88.38163421z m0 0" horiz-adv-x="1144" />
<glyph glyph-name="juxingkaobei" unicode="&#59301;" d="M128.692 768.01v-191.05H319.04V768.01H128.692z m127.261-127.963h-64.169v64.169h64.169v-64.169zM511.333 191.77700000000004v-191.416h385.792V191.77700000000004H511.333zM832 64H576.112v64.198H832V64zM384.075 768.01v-191.05h512.099V768.01H384.075z m448.087-127.963H448.087v64.169h384.075v-64.169zM511.333 447.791v-191.416H896.23V447.791H511.333z m319.922-127.776H575.961v64.198h255.294v-64.198zM192.037 576.9590000000001h64.012v-512.68h-64.012zM256.05 128.19799999999998h255.284v-63.919H256.05zM256.05 384h255.284v-63.381H256.05z" horiz-adv-x="1024" />
<glyph glyph-name="LOGO-" unicode="&#58937;" d="M578.122795 640.18066301H450.21312601c-51.30839798 0-97.55822201 46.24982399-97.55822102 97.55822199S398.904728 835.297107 450.21312601 835.297107H578.122795c51.30839798 0 97.55822201-46.24982399 97.558221-97.558222 0-56.366972-46.24982399-97.55822201-97.558221-97.55822199zM578.122795 281.02187698H450.21312601c-51.30839798 0-97.55822201 46.24982399-97.55822102 97.55822202s46.24982399 97.55822201 97.55822102 97.558221H578.122795c51.30839798 0 97.55822201-46.24982399 97.558221-97.558221S629.43119299 281.02187698 578.122795 281.02187698zM578.122795-67.29710699999998H450.21312601c-51.30839798 0-97.55822201 46.24982399-97.55822102 97.558222s46.24982399 97.55822201 97.55822102 97.55822199H578.122795c51.30839798 0 97.55822201-46.24982399 97.558221-97.55822199s-46.24982399-97.55822201-97.558221-97.558222zM814.430487 414.712773c117.792519 0 210.29216699-92.499647 210.29216601-210.292166s-97.55822201-210.29216699-210.29216601-210.292167c-20.23429799 0-36.132675 15.175723-36.132675 36.132675 0 20.23429799 15.175723 36.132675 36.132675 36.13267501 76.60126997 0 138.026817 61.425547 138.026817 138.02681699 0 76.60126997-61.425547 138.026817-138.026817 138.026817h-36.132675c-20.23429799 0-36.132675 15.175723-36.13267403 36.132675 0 20.23429799 15.175723 36.132675 36.13267403 36.132674h36.132675zM819.48906101 142.99505999999997v-210.292167l-102.61679602 107.675371 102.61679602 102.616796z m-102.61679602-102.616796M210.29216699 350.396613C92.499647 350.396613 0 442.89626 0 560.6887790000001s97.55822201 210.29216699 210.29216699 210.29216699c20.23429799 0 36.132675-15.175723 36.13267401-36.13267499 0-20.23429799-15.175723-36.132675-36.13267399-36.132675-76.60126997 0-138.026817-61.425547-138.02681802-138.026817 0-76.60126997 61.425547-138.026817 138.026818-138.02681699h36.13267401c20.23429799 0 36.132675-15.175723 36.13267501-36.13267502 0-20.23429799-15.175723-36.132675-36.13267501-36.13267399h-36.13267401zM205.233592 622.11432601V832.406493l102.616796-107.67537101-102.616796-102.616796z m102.616796 102.616796" horiz-adv-x="1024" />
<glyph glyph-name="jiantou-copy-copy" unicode="&#61176;" d="M209.05173332 306.46613333000005l274.65813335-274.65813333c21.45066667-21.45066667 56.22293333-21.45066667 77.6736 0l274.65813333 274.65813333c21.45066667 21.45066667 21.45066667 56.22293333 0 77.6736s-56.22293333 21.45066667-77.6736 0l-180.89066667-180.89066666 0 526.57493333c0 30.34986667-24.5824 54.93226667-54.93226665 54.93226667s-54.93226667-24.5824-54.93226668-54.93226667l0-526.57493333-180.89066667 180.89066666c-10.71146667 10.71253333-24.7744 16.09493333-38.83733333 16.09493334s-28.1248-5.35573334-38.83733333-16.09493334c-21.45066667-21.45066667-21.45066667-56.22293333 0-77.6736z" horiz-adv-x="1000" />
</font>
</defs></svg>

After

Width:  |  Height:  |  Size: 123 KiB

BIN
escheduler-ui/dist/images/login-logo.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
escheduler-ui/dist/images/logo.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
escheduler-ui/dist/images/m_logo.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
escheduler-ui/dist/images/open.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 586 B

BIN
escheduler-ui/dist/images/toolbar_DEPENDENT.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
escheduler-ui/dist/images/toolbar_MR.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
escheduler-ui/dist/images/toolbar_PROCEDURE.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

BIN
escheduler-ui/dist/images/toolbar_PYTHON.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

BIN
escheduler-ui/dist/images/toolbar_SHELL.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
escheduler-ui/dist/images/toolbar_SPARK.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
escheduler-ui/dist/images/toolbar_SQL.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

BIN
escheduler-ui/dist/images/toolbar_SUB_PROCESS.png vendored

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

7
escheduler-ui/dist/index.html vendored

@ -0,0 +1,7 @@
<!doctype html><html><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta http-equiv="Cache-Control" content="no-siteapp"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="标题"><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"><meta name="format-detection" content="telphone=no, email=no"><meta name="screen-orientation" content="portrait"><meta name="x5-orientation" content="portrait"><meta name="theme-color" content="#4a8dee"><meta name="msapplication-navbutton-color" content="#4a8dee"><meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1,maximum-scale=1,minimum-scale=1"><link rel="shortcut icon" href="/images/favicon.ico"><link href="/combo/1.0.0/base.css?v1.0.0.1" rel="stylesheet"><link href="/combo/1.0.0/3rd.css?v1.0.0.1" rel="stylesheet"><!--[if lt IE 9]>
<script src="/combo/1.0.0/es5.js"></script>
<![endif]--><script>let NODE_ENV = 'true'</script><title>EasyScheduler</title><link href="/css/common.8ba9af7.css" rel="stylesheet"><link href="/css/home/index.0212fa5.css" rel="stylesheet"></head><body><div id="app"></div><div id="contextmenu" class="contextmenu"></div><div class="global-loading"><div class="svg-box"><svg class="lds-gears" width="54px" height="54px" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid" style="background: none;"><g transform="translate(50 50)"><g transform="translate(-19 -19) scale(0.6)"><g transform="rotate(107.866)"><animateTransform attributeName="transform" type="rotate" values="0;360" keyTimes="0;1" dur="1s" begin="0s" repeatCount="indefinite"></animateTransform><path
d="M37.3496987939662 -7 L47.3496987939662 -7 L47.3496987939662 7 L37.3496987939662 7 A38 38 0 0 1 31.359972760794346 21.46047782418268 L31.359972760794346 21.46047782418268 L38.431040572659825 28.531545636048154 L28.531545636048154 38.431040572659825 L21.46047782418268 31.359972760794346 A38 38 0 0 1 7.0000000000000036 37.3496987939662 L7.0000000000000036 37.3496987939662 L7.000000000000004 47.3496987939662 L-6.999999999999999 47.3496987939662 L-7 37.3496987939662 A38 38 0 0 1 -21.46047782418268 31.35997276079435 L-21.46047782418268 31.35997276079435 L-28.531545636048154 38.431040572659825 L-38.43104057265982 28.531545636048158 L-31.359972760794346 21.460477824182682 A38 38 0 0 1 -37.3496987939662 7.000000000000007 L-37.3496987939662 7.000000000000007 L-47.3496987939662 7.000000000000008 L-47.3496987939662 -6.9999999999999964 L-37.3496987939662 -6.999999999999997 A38 38 0 0 1 -31.35997276079435 -21.460477824182675 L-31.35997276079435 -21.460477824182675 L-38.431040572659825 -28.531545636048147 L-28.53154563604818 -38.4310405726598 L-21.4604778241827 -31.35997276079433 A38 38 0 0 1 -6.999999999999992 -37.3496987939662 L-6.999999999999992 -37.3496987939662 L-6.999999999999994 -47.3496987939662 L6.999999999999977 -47.3496987939662 L6.999999999999979 -37.3496987939662 A38 38 0 0 1 21.460477824182686 -31.359972760794342 L21.460477824182686 -31.359972760794342 L28.531545636048158 -38.43104057265982 L38.4310405726598 -28.53154563604818 L31.35997276079433 -21.4604778241827 A38 38 0 0 1 37.3496987939662 -6.999999999999995 M0 -23A23 23 0 1 0 0 23 A23 23 0 1 0 0 -23"
fill="#0097e0"></path></g></g><g transform="translate(19 19) scale(0.6)"><g transform="rotate(229.634)"><animateTransform attributeName="transform" type="rotate" values="360;0" keyTimes="0;1" dur="1s" begin="-0.0625s" repeatCount="indefinite"></animateTransform><path
d="M37.3496987939662 -7 L47.3496987939662 -7 L47.3496987939662 7 L37.3496987939662 7 A38 38 0 0 1 31.359972760794346 21.46047782418268 L31.359972760794346 21.46047782418268 L38.431040572659825 28.531545636048154 L28.531545636048154 38.431040572659825 L21.46047782418268 31.359972760794346 A38 38 0 0 1 7.0000000000000036 37.3496987939662 L7.0000000000000036 37.3496987939662 L7.000000000000004 47.3496987939662 L-6.999999999999999 47.3496987939662 L-7 37.3496987939662 A38 38 0 0 1 -21.46047782418268 31.35997276079435 L-21.46047782418268 31.35997276079435 L-28.531545636048154 38.431040572659825 L-38.43104057265982 28.531545636048158 L-31.359972760794346 21.460477824182682 A38 38 0 0 1 -37.3496987939662 7.000000000000007 L-37.3496987939662 7.000000000000007 L-47.3496987939662 7.000000000000008 L-47.3496987939662 -6.9999999999999964 L-37.3496987939662 -6.999999999999997 A38 38 0 0 1 -31.35997276079435 -21.460477824182675 L-31.35997276079435 -21.460477824182675 L-38.431040572659825 -28.531545636048147 L-28.53154563604818 -38.4310405726598 L-21.4604778241827 -31.35997276079433 A38 38 0 0 1 -6.999999999999992 -37.3496987939662 L-6.999999999999992 -37.3496987939662 L-6.999999999999994 -47.3496987939662 L6.999999999999977 -47.3496987939662 L6.999999999999979 -37.3496987939662 A38 38 0 0 1 21.460477824182686 -31.359972760794342 L21.460477824182686 -31.359972760794342 L28.531545636048158 -38.43104057265982 L38.4310405726598 -28.53154563604818 L31.35997276079433 -21.4604778241827 A38 38 0 0 1 37.3496987939662 -6.999999999999995 M0 -23A23 23 0 1 0 0 23 A23 23 0 1 0 0 -23"
fill="#7f8b95"></path></g></g></g></svg> <span class="sp1">Loading ...</span></div></div><script src="/combo/1.0.0/3rd.js?v1.0.0.1"></script><script src="/js/common.804ec41.js"></script><script src="/js/home/index.2ed28db.js"></script></body></html>

2
escheduler-ui/dist/js/0.8ca091c.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/0.8ca091c.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/1.bdb0cc7.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/1.bdb0cc7.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/10.73c0240.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/10.73c0240.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/11.078cbab.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/11.078cbab.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/12.864692a.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/12.864692a.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/13.7e1b794.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/13.7e1b794.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/14.22fa282.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/14.22fa282.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/15.eea1d19.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/15.eea1d19.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/16.fd660eb.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/16.fd660eb.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/17.4aef6ba.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/17.4aef6ba.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/18.b14d7b0.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/18.b14d7b0.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/19.35e5748.js vendored

File diff suppressed because one or more lines are too long

1
escheduler-ui/dist/js/19.35e5748.js.map vendored

File diff suppressed because one or more lines are too long

2
escheduler-ui/dist/js/2.d6885e7.js vendored

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save