瀏覽代碼

即时通讯

yp 3 年之前
父節點
當前提交
cdfef3110b
共有 100 個文件被更改,包括 4162 次插入10 次删除
  1. 106 0
      communication/pom.xml
  2. 13 0
      communication/src/main/java/com/jd/CommunicationApplication.java
  3. 19 0
      communication/src/main/java/com/jd/configer/WebSocketConfig.java
  4. 26 0
      communication/src/main/java/com/jd/configer/corsConfiguration.java
  5. 36 0
      communication/src/main/java/com/jd/controller/ChatRoomController.java
  6. 178 0
      communication/src/main/java/com/jd/controller/CommunicationController.java
  7. 32 0
      communication/src/main/java/com/jd/entity/Message.java
  8. 4 0
      communication/src/main/resources/application.yml
  9. 58 0
      communication/src/main/resources/log4j2.yml
  10. 13 0
      communication/src/test/java/com/jd/communication/CommunicationApplicationTests.java
  11. 9 10
      spring-cloud/server-page/src/main/resources/static/fz/index.html
  12. 224 0
      spring-cloud/server-page/src/main/resources/static/fz/js/basic/index.js
  13. 61 0
      spring-cloud/server-page/src/main/resources/static/fz/js/basic/login.js
  14. 160 0
      spring-cloud/server-page/src/main/resources/static/fz/js/util.min.js
  15. 724 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/aes.js
  16. 131 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/ajax.js
  17. 227 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/md5.js
  18. 63 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/multiSelect.js
  19. 1887 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/pako.js
  20. 12 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/sign.js
  21. 1 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/jquery.min.js
  22. 147 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/inputTags.css
  23. 1 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/layui.css
  24. 1 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/layui.mobile.css
  25. 2 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/code.css
  26. 1 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/laydate/default/laydate.css
  27. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/icon-ext.png
  28. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/icon.png
  29. 1 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/layer.css
  30. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/loading-0.gif
  31. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/loading-1.gif
  32. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/loading-2.gif
  33. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.eot
  34. 25 0
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.svg
  35. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.ttf
  36. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.woff
  37. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.woff2
  38. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/0.gif
  39. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/1.gif
  40. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/10.gif
  41. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/11.gif
  42. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/12.gif
  43. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/13.gif
  44. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/14.gif
  45. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/15.gif
  46. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/16.gif
  47. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/17.gif
  48. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/18.gif
  49. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/19.gif
  50. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/2.gif
  51. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/20.gif
  52. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/21.gif
  53. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/22.gif
  54. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/23.gif
  55. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/24.gif
  56. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/25.gif
  57. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/26.gif
  58. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/27.gif
  59. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/28.gif
  60. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/29.gif
  61. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/3.gif
  62. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/30.gif
  63. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/31.gif
  64. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/32.gif
  65. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/33.gif
  66. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/34.gif
  67. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/35.gif
  68. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/36.gif
  69. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/37.gif
  70. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/38.gif
  71. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/39.gif
  72. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/4.gif
  73. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/40.gif
  74. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/41.gif
  75. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/42.gif
  76. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/43.gif
  77. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/44.gif
  78. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/45.gif
  79. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/46.gif
  80. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/47.gif
  81. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/48.gif
  82. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/49.gif
  83. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/5.gif
  84. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/50.gif
  85. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/51.gif
  86. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/52.gif
  87. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/53.gif
  88. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/54.gif
  89. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/55.gif
  90. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/56.gif
  91. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/57.gif
  92. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/58.gif
  93. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/59.gif
  94. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/6.gif
  95. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/60.gif
  96. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/61.gif
  97. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/62.gif
  98. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/63.gif
  99. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/64.gif
  100. 二進制
      spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/65.gif

+ 106 - 0
communication/pom.xml

@@ -0,0 +1,106 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.5.6</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.jd</groupId>
+    <artifactId>communication</artifactId>
+    <version>1.0.0</version>
+    <name>communication</name>
+    <description>即时通讯</description>
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.68</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <scope>provided</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.7</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.springframework.boot</groupId>
+                    <artifactId>spring-boot-starter-logging</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-log4j2</artifactId>
+        </dependency>
+
+        <!-- 支持识别yml配置 -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.dataformat</groupId>
+            <artifactId>jackson-dataformat-yaml</artifactId>
+        </dependency>
+    </dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <addClasspath>true</addClasspath>
+                            <classpathPrefix>lib/</classpathPrefix>
+                            <mainClass>com.jd.CommunicationApplication</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+            <!-- 添加配置跳过测试 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skipTests>true</skipTests>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>

+ 13 - 0
communication/src/main/java/com/jd/CommunicationApplication.java

@@ -0,0 +1,13 @@
+package com.jd;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class CommunicationApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(CommunicationApplication.class, args);
+    }
+
+}

+ 19 - 0
communication/src/main/java/com/jd/configer/WebSocketConfig.java

@@ -0,0 +1,19 @@
+package com.jd.configer;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+/**
+* 开启WebSocket支持,如果采用springboot内置容器启动项目的,则需要配置一个Bean。如果是采用外部的容器,则 不需要配置。
+* @author zhengkai
+*/
+@Configuration
+public class WebSocketConfig {
+
+  @Bean
+  public ServerEndpointExporter serverEndpointExporter() {
+      return new ServerEndpointExporter();
+  }
+
+}

+ 26 - 0
communication/src/main/java/com/jd/configer/corsConfiguration.java

@@ -0,0 +1,26 @@
+package com.jd.configer;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+@Configuration
+public class corsConfiguration {
+    private CorsConfiguration buildConfig() {
+        CorsConfiguration corsConfiguration = new CorsConfiguration();
+        corsConfiguration.addAllowedOriginPattern("*"); // 1允许任何域名使用
+        corsConfiguration.addAllowedHeader("*"); // 2允许任何头
+        corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
+        corsConfiguration.setAllowCredentials(true);// 允许跨域带上cookies
+        return corsConfiguration;
+    }
+
+    @Bean
+    public CorsFilter corsFilter() {
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", buildConfig()); // 4
+        return new CorsFilter(source);
+    }
+}

+ 36 - 0
communication/src/main/java/com/jd/controller/ChatRoomController.java

@@ -0,0 +1,36 @@
+package com.jd.controller;
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.websocket.Session;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+/**
+ * @author :yp
+ * @date :Created in 2022/4/5 20:25
+ * @description:即时聊天
+ */
+@RestController
+@RequestMapping("chat")
+public class ChatRoomController {
+
+    @RequestMapping("/onlineUsers")
+    public Set<String> onlineUsers(@RequestParam("currentUser") String currentUser) {
+        ConcurrentHashMap<String, Session> map = CommunicationController.getSessionPools();
+        Set<String> set = map.keySet();
+        Iterator<String> it = set.iterator();
+        Set<String> clientIdSet = new HashSet<String>();
+        while (it.hasNext()) {
+            String entry = it.next();
+            if (!entry.equals(currentUser)) {
+                clientIdSet.add(entry);
+            }
+        }
+        return clientIdSet;
+    }
+}

+ 178 - 0
communication/src/main/java/com/jd/controller/CommunicationController.java

@@ -0,0 +1,178 @@
+package com.jd.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.jd.entity.Message;
+import lombok.extern.log4j.Log4j2;
+import org.springframework.stereotype.Component;
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * @author :yp
+ * @date :Created in 2022/4/5 10:24
+ * @description:
+ */
+@ServerEndpoint("/socketServer/{clientName}")
+@Component
+@Log4j2
+public class CommunicationController {
+    /**
+     * 静态变量,用来记录当前在线连接数。应该把它设计成线程安全的。
+     */
+    private static AtomicInteger onlineNum = new AtomicInteger();
+
+    /**
+     * concurrent包的线程安全Set,用来存放每个客户端对应的WebSocketServer对象。
+     */
+    private static ConcurrentHashMap<String, Session> sessionPools = new ConcurrentHashMap<>();
+
+
+    /**
+     * 建立连接成功调用
+     * @param session
+     * @param clientName
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam(value = "clientName") String clientName) {
+        sessionPools.put(clientName, session);
+        addOnlineCount();
+        System.out.println(clientName + "加入webSocket!当前人数为" + onlineNum);
+        // 广播上线消息
+        Message msg = new Message();
+//        Map<String, String> userInfo = new HashMap<>();
+//        userInfo.put("userId", clientId);
+//        userInfo.put("userName", clientName);
+        msg.setDate(new Date());
+        msg.setTo("0");
+        msg.setText(clientName);
+        broadcast(JSON.toJSONString(msg, true));
+    }
+
+    /**
+     * 关闭连接时调用
+     * @param clientName
+     */
+    @OnClose
+    public void onClose(@PathParam(value = "clientName") String clientName){
+        sessionPools.remove(clientName);
+        subOnlineCount();
+        System.out.println(clientName + "断开webSocket连接!当前人数为" + onlineNum);
+        // 广播下线消息
+        Message msg = new Message();
+        msg.setDate(new Date());
+        msg.setTo("-2");
+        msg.setText(clientName);
+        broadcast(JSON.toJSONString(msg,true));
+    }
+
+    /**
+     * 收到客户端信息后,根据接收人的username把消息推下去或者群发; to=-1群发消息
+     * @param message
+     * @throws IOException
+     */
+    @OnMessage
+    public void onMessage(String message) throws IOException{
+        System.out.println("server get" + message);
+        Message msg=JSON.parseObject(message, Message.class);
+        msg.setDate(new Date());
+        if (msg.getTo().equals("-1")) {
+            broadcast(JSON.toJSONString(msg,true));
+        } else {
+            sendInfo(msg.getTo(), JSON.toJSONString(msg,true));
+        }
+    }
+
+    /**
+     * 错误时调用
+     * @param session
+     * @param throwable
+     */
+    @OnError
+    public void onError(Session session, Throwable throwable){
+        System.out.println("发生错误");
+        throwable.printStackTrace();
+    }
+
+    /**
+     * 群发消息
+     * @param message
+     */
+    public void broadcast(String message){
+        Message msg=JSON.parseObject(message, Message.class);
+        String from = msg.getFrom();
+        for (Session session: sessionPools.values()) {
+            try {
+                if (from == null) {
+                    sendMessage(session, message);
+                } else {
+                    Session formSession = sessionPools.get(from);
+                    if (!formSession.equals(session)) {
+                        sendMessage(session, message);
+                    }
+                }
+            } catch(Exception e){
+                e.printStackTrace();
+                continue;
+            }
+        }
+    }
+
+    /**
+     * 发送消息
+     * @param session
+     * @param message
+     * @throws IOException
+     */
+    public void sendMessage(Session session, String message) throws IOException {
+        if(session != null){
+            synchronized (session) {
+                System.out.println("发送数据:" + message);
+                session.getBasicRemote().sendText(message);
+            }
+        }
+    }
+
+    /**
+     * 给指定用户发送信息
+     * @param clientName
+     * @param message
+     */
+    public void sendInfo(String clientName, String message){
+        Session session = sessionPools.get(clientName);
+        try {
+            sendMessage(session, message);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 增加在线人数
+     */
+    public static void addOnlineCount(){
+        onlineNum.incrementAndGet();
+    }
+
+    /**
+     * 减少在线人数
+     */
+    public static void subOnlineCount() {
+        onlineNum.decrementAndGet();
+    }
+
+    /**
+     * 获取sessionPools
+     * @return
+     */
+    public static ConcurrentHashMap<String, Session> getSessionPools() {
+        return sessionPools;
+    }
+}

+ 32 - 0
communication/src/main/java/com/jd/entity/Message.java

@@ -0,0 +1,32 @@
+package com.jd.entity;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author :yp
+ * @date :Created in 2022/4/5 10:30
+ * @description:消息实体类
+ */
+@Data
+public class Message {
+    /**
+     * 发送者name
+     */
+    public String from;
+    /**
+     * 接收者name
+     */
+    public String to;
+    /**
+     * 发送的文本
+     */
+    public Object text;
+    /**
+     * 发送时间
+     */
+    @JSONField(format="yyyy-MM-dd HH:mm:ss")
+    public Date date;
+}

+ 4 - 0
communication/src/main/resources/application.yml

@@ -0,0 +1,4 @@
+server:
+  port: 8088
+logging:
+  config: classpath:log4j2.yml

+ 58 - 0
communication/src/main/resources/log4j2.yml

@@ -0,0 +1,58 @@
+# 共有8个级别,按照从低到高为:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF。
+Configuration:  
+  status: warn  
+  monitorInterval: 30
+  
+  Properties: # 定义全局变量  
+    Property: # 缺省配置(用于开发环境)。其他环境需要在VM参数中指定,如下:  
+      #测试:-Dlog.level.console=warn -Dlog.level.xjj=trace  
+      #生产:-Dlog.level.console=warn -Dlog.level.xjj=info        
+      - name: log.level.console  
+        value: debug  
+      - name: log.sql.level  
+        value: trace         
+      - name: LOG_HOME  
+        value: D:/worksoft/dt2/log
+      - name: LOG_NAME
+        value: websocket 
+  Appenders:  
+    Console:  #输出到控制台  
+      name: CONSOLE  
+      target: SYSTEM_OUT  
+      ThresholdFilter:  
+        level: ${sys:log.level.console} # “sys:”表示:如果VM参数中没指定这个变量值,则使用本文件中定义的缺省全局变量值  
+        onMatch: ACCEPT  
+        onMismatch: DENY  
+      PatternLayout:  
+        pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n"  
+        disableAnsi: false
+        noConsoleNoAnsi: false
+    RollingFile: # 输出到文件,超过128MB归档  
+      - name: ROLLING_FILE    
+        ignoreExceptions: false  
+        fileName: ${LOG_HOME}/${date:yyyy-MM}/${date:yyyy-MM-dd}/${LOG_NAME}.log  
+        filePattern: "${LOG_HOME}/${date:yyyy-MM}/${LOG_NAME}-%d{yyyy-MM-dd}-%i.log"  
+        ThresholdFilter:  
+          level: info
+          onMatch: ACCEPT  
+          onMismatch: DENY 
+        PatternLayout:  
+          pattern: "%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight{%-5level} [%t] %highlight{%c{1.}.%M(%L)}: %msg%n"  
+        Policies:  
+          SizeBasedTriggeringPolicy:  
+            size: "20 MB"  
+        DefaultRolloverStrategy:  
+          max: 1000  
+  Loggers:  
+    Root:  
+      level: info  
+      AppenderRef:  
+        - ref: CONSOLE
+        - ref: ROLLING_FILE  
+    Logger: # 为com.xjj包配置特殊的Log级别,方便调试  
+      - name: com.jd
+        additivity: false  
+        level: ${sys:log.sql.level}  
+        AppenderRef:
+          - ref: CONSOLE    
+          - ref: ROLLING_FILE 

+ 13 - 0
communication/src/test/java/com/jd/communication/CommunicationApplicationTests.java

@@ -0,0 +1,13 @@
+package com.jd.communication;
+
+import org.junit.jupiter.api.Test;
+import org.springframework.boot.test.context.SpringBootTest;
+
+@SpringBootTest
+class CommunicationApplicationTests {
+
+    @Test
+    void contextLoads() {
+    }
+
+}

+ 9 - 10
spring-cloud/server-page/src/main/resources/static/fz/index.html

@@ -205,17 +205,17 @@
 			<!-- 在线列表 -->
 			<div class="boxg-list">
 				<div class="guest-title">在线列表</div>
-				<ul class="guest-list">						
-					<li class="guest-item"><img src="img/avatr.png" /><span class="chat-name">来宾1</span></li>
-					<li class="guest-item"><img src="img/avatr.png" /><span class="chat-name">来宾1</span></li>
-					<li class="guest-item"><img src="img/avatr.png" /><span class="chat-name">来宾2</span></li>
-					<li class="guest-item"><img src="img/avatr.png" /><span class="chat-name">来宾3</span></li>
+				<ul class="guest-list" id="onlineList">
+<!--					<li class="guest-item"><img src="img/avatr.png" /><span class="chat-name">来宾1</span></li>-->
+<!--					<li class="guest-item"><img src="img/avatr.png" /><span class="chat-name">来宾1</span></li>-->
+<!--					<li class="guest-item"><img src="img/avatr.png" /><span class="chat-name">来宾2</span></li>-->
+<!--					<li class="guest-item"><img src="img/avatr.png" /><span class="chat-name">来宾3</span></li>-->
 				</ul>
 			</div>
 			<!-- 聊天窗口 -->
 			<div class="win-chat">
 				<!-- 信息 -->
-				<div class="win-info" style="display: none;"><img src="img/avatr.png" /><span class="chat-name">来宾1</span><button type="button" class="handle-qu" data-iden="on">切至群聊</button></div>
+				<div class="win-info" style="display: none;"><img src="img/avatr.png" /><span class="chat-name" id="guestNow">来宾1</span><button type="button" class="handle-qu" data-iden="on">切至群聊</button></div>
 				<div class="win-info"><span class="chat-name">群聊</span><button type="button" class="handle-qu" data-iden="off" style="background-color: #A84335;">关闭群聊</button></div>
 				<!-- 互聊 -->
 				<ul class="msgs-list"  style="display: none;" id="chatOther">
@@ -272,10 +272,9 @@
 		</div>
 	</div>
 
-
-    <script src="./js/jquery-1.11.3.min.js"></script>
-    <script src="./js/common.js"></script>
-    <script src="./js/index.js"></script>
+    <script type="text/javascript" src="js/constant.js"></script>
+    <script type="text/javascript" src="js/util.min.js"></script>
+    <script src="./js/basic/index.js"></script>
 </body>
 
 </html>

+ 224 - 0
spring-cloud/server-page/src/main/resources/static/fz/js/basic/index.js

@@ -0,0 +1,224 @@
+
+//聊天室主人
+var userName = sessionStorage.LOGIN_USERNAME;
+var userId = sessionStorage.LOGIN_USERID;
+// 发送给谁
+var toName;
+// 格式化时间日期
+var date = new Date();
+var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
+var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
+var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
+var curTime = date.getFullYear() +'/'+ (date.getMonth() + 1) +'/'+ date.getDate() + ' ' + hours + ':' + minutes + ':' + seconds
+
+//标识变量
+var idens = "on"
+
+util.init(['jquery', 'ajax', 'layer', 'layedit'], function(layui) {
+	$ = layui.jquery;
+	layer = layui.layer;
+	ly = layui.ajax;
+	layedit = layui.layedit;
+	// 创建websocket客户端连接
+	initWebsocket();
+
+	$('.page .page_right button').click(() => {
+		const val = $('.page .page_right input').val();
+		if (val == '') {
+			return alert('请输入关键字')
+		}
+		//页面跳转
+		location.href = `http://23.37.100.80/zt/8k-screenpages/Other/IRPing/index.html?val=${val}`;
+	})
+
+	// 消息弹窗
+	$(".chat-icon").on("click",function(){
+		$(".chat-box").css("display","block")
+		$("body").css("overflow","hidden")
+	})
+
+	// 切换群聊
+	$(".handle-qu").on("click",function(){
+		idens = $(this).attr("data-iden")
+		if(idens == "off"){
+			$(".win-chat .win-info:nth-child(1)").css("display","flex")
+			$(".win-chat .win-info:nth-child(2)").css("display","none")
+			$($(".win-chat .msgs-list")[0]).css("display","block")
+			$($(".win-chat .msgs-list")[1]).css("display","none")
+		}else{
+			toName = "群聊"
+			$(".guest-item").removeClass("act-p")
+			$(".win-chat .win-info:nth-child(1)").css("display","none")
+			$(".win-chat .win-info:nth-child(2)").css("display","flex")
+			$($(".win-chat .msgs-list")[0]).css("display","none")
+			$($(".win-chat .msgs-list")[1]).css("display","block")
+			// 清空聊天界面
+			$("#chatGroup").html("");
+			var chatData = sessionStorage.getItem(toName);
+			if (chatData != null) {
+				//渲染聊天数据到聊天区
+				$("#chatGroup").html(chatData);
+			}
+		}
+	})
+
+	// 点击用户列表切换
+	$(".guest-list").on("click",".guest-item",function(){
+		$(this).siblings(".guest-item").removeClass("act-p")
+		$(this).addClass("act-p")
+		$("#guestNow").text($(".act-p").find("span").text())
+		//清空聊天区
+		$("#chatOther").html("");
+		//当点击聊天人列表时,需要获与之对应的聊天记录,聊天记录存放在sessionStorage中
+		toName = $(".act-p").attr("data-name");
+		var chatData = sessionStorage.getItem(toName);
+		if (chatData != null) {
+			//渲染聊天数据到聊天区
+			$("#chatOther").html(chatData);
+		}
+
+		// 切换消息列表
+		$($(".win-chat .msgs-list")[0]).css("display","block")
+		$($(".win-chat .msgs-list")[1]).css("display","none")
+		$(".win-chat .win-info:nth-child(1)").css("display","flex")
+		$(".win-chat .win-info:nth-child(2)").css("display","none")
+		// 改变标识
+		idens = "off"
+	})
+
+	// 关闭消息弹窗
+	$(".back-page").on("click",function(){
+		$(".chat-box").css("display","none")
+		$("body").css("overflow","auto")
+	})
+
+	// 发送信息自动显示最新信息
+	$(".send").on("click",function(){
+		// 获取输入框的值
+		var inputVal = $(".input-msg>input").val()
+		var html = '<li class="chat-namel" style="background-color: #94C2ED;"><div class="msg-text"><span>我</span><span>'+ curTime +'</span></div><p class="msg-t">'+ inputVal +'</p></li>'
+		// 判断是否输入
+		if(inputVal.trim() !== ''){
+			// 将html结构插入 判断是群聊还是互聊
+			if(idens == "off"){
+				toName = $(".act-p").attr("data-name");
+				if (toName == undefined) {
+					alert("请选择聊天对象");
+					return false;
+				} else {
+					// 消息发送格式
+					var data = {
+						from: userName,
+						to: toName,
+						text: inputVal
+					};
+					$("#chatOther").append(html)
+					let chatData = sessionStorage.getItem(toName);
+					if (chatData != null) {
+						html = chatData + html;
+					}
+					sessionStorage.setItem(toName,html);
+					//发送数据给服务端
+					websocket.send(JSON.stringify(data));
+					handleScroll($("#chatOther"))
+				}
+			} else {
+				var data = {
+					from: userName,
+					to: -1,
+					text: inputVal
+				};
+				$("#chatGroup").append(html)
+				let chatData = sessionStorage.getItem(toName);
+				if (chatData != null) {
+					html = chatData + html;
+				}
+				sessionStorage.setItem(toName,html);
+				websocket.send(JSON.stringify(data));
+				handleScroll($("#chatGroup"))
+			}
+			// 清空输入框的值
+			$(".input-msg>input").val('')
+		}else{
+			// 显示提示
+			$(".tip").css("display","block")
+			setTimeout(function(){
+				$(".tip").css("display","none")
+			},700)
+		}
+	})
+});
+
+// 初始化在线用户列表
+function initCurrentOnlineUser(){
+	util.get({
+		url: CHAT_PATH + 'chat/onlineUsers',
+		data: {
+			'currentUser': userName
+		},
+		success: function(res) {
+			console.log(res)
+			if (res) {
+				for (var i = 0; i < res.length; i++) {
+					$("#onlineList").append('<li class="guest-item" data-name="'+res[i]+'"><img src="img/avatr.png"/><span class="chat-name">'+res[i]+'</span></li>');
+				}
+			}
+		}
+	});
+}
+
+// 创建websocket连接
+function initWebsocket() {
+	// 指定websocket路径
+	if ('WebSocket' in window) {
+		websocket = new WebSocket("ws://192.168.0.95:8088/socketServer/" + userName);
+	}
+	websocket.onmessage = function (event) {
+		var data = JSON.parse(event.data);
+		console.log(data)
+		if (data.to == 0) {//上线消息
+			if (data.text != userName) {
+				var str = '<li class="guest-item" data-name="'+data.text+'"><img src="img/avatr.png"/><span class="chat-name">'+data.text+'</span></li>'
+				$("#onlineList").append(str);
+			}
+		} else if (data.to == -2) {//下线消息
+			if (data.text != userName) {
+				$("#onlineList > li").remove(":contains('" + data.text + "')");
+			}
+		} else {
+			// 普通消息
+			if(idens == "off"){
+				var html = '<li class="chat-namel" style="background-color: #94C2ED;"><div class="msg-text"><span>'+data.from+'</span><span>'+ curTime +'</span></div><p class="msg-t">'+ data.text +'</p></li>'
+				if (toName === data.from) {
+					$("#chatOther").append(html)
+				}
+				let chatData = sessionStorage.getItem(data.from);
+				if (chatData != null) {
+					html = chatData + html;
+				}
+				sessionStorage.setItem(data.from, html);
+				handleScroll($("#chatOther"))
+			}else{
+				let html = '<li class="chat-namel" style="background-color: #94C2ED;"><div class="msg-text"><span>'+data.from+'</span><span>'+ curTime +'</span></div><p class="msg-t">'+ data.text +'</p></li>'
+				$("#chatGroup").append(html)
+				let chatData = sessionStorage.getItem(toName);
+				if (chatData != null) {
+					html = chatData + html;
+				}
+				sessionStorage.setItem(toName, html);
+				handleScroll($("#chatGroup"))
+			}
+		}
+	};
+	// 初始化在线用户列表
+	initCurrentOnlineUser();
+}
+
+// 操作滚动条信息列表 互聊
+function handleScroll(domEl){
+	// 获取信息列表最后一条消息距离顶部的距离
+	var lastDom = $(domEl)[0].lastElementChild
+	// 滚动的距离
+	var scrDis = $(domEl)[0].scrollHeight + lastDom.scrollHeight
+	$(domEl).scrollTop(scrDis)
+}

+ 61 - 0
spring-cloud/server-page/src/main/resources/static/fz/js/basic/login.js

@@ -0,0 +1,61 @@
+util.init(['jquery', 'ajax', 'layer'], function(layui) {
+    $ = layui.jquery;
+    layer = layui.layer;
+    ly = layui.ajax;
+    $('#subLogin').on('click', function() {
+        console.log(111)
+        verify();
+    });
+    $(document).on('keydown', function(e) {
+        if (e.keyCode == 13) {
+            verify();
+        }
+    });
+});
+
+function verify() {
+    const account = $('#loginAccount').val();
+    if (!account) {
+        util.layer.errorMsg('请输入账号!');
+        return;
+    }
+    if (/\s/.test(account)) {
+        util.layer.errorMsg('帐号中不能存在空格');
+        return;
+    }
+    if (!new RegExp('^[a-zA-Z0-9_\u4e00-\u9fa5\\s·]+$').test(account)) {
+        util.layer.errorMsg('帐号不能有特殊字符');
+        return;
+    }
+    const password = $('#password').val();
+    if (!password) {
+        util.layer.errorMsg('请输入密码!');
+        return;
+    }
+    login(account, password);
+}
+
+function login(account, password) {
+    util.postJSON({
+        url: FLAT_PATH_BASIC + 'flat/guide/login',
+        data: {
+            'account': account,
+            'password': window.btoa(password)
+        },
+        success: function(res) {
+            if (res.result && res.msg == '100') {
+                sessionStorage.LOGIN_USERID = res.data.userId;
+                sessionStorage.ACCESS_TOKEN = res.data.access_token;
+                sessionStorage.REFRESH_TOKEN = res.data.refresh_token;
+                sessionStorage.TOKEN_TYPE = res.data.token_type;
+                sessionStorage.ROLE_ID = res.data.roleId;
+                sessionStorage.ACCOUNT = res.data.account;
+                sessionStorage.LOGIN_USERNAME = res.data.userName;
+                sessionStorage.ROLE_TYPE = res.data.roleType;
+                window.location.href = 'index.html';
+            } else {
+                util.layer.errorMsg('账号或密码错误!');
+            }
+        }
+    });
+}

+ 160 - 0
spring-cloud/server-page/src/main/resources/static/fz/js/util.min.js

@@ -0,0 +1,160 @@
+var util = {
+	// 变量池
+	variable: {},
+	link: function() {
+		document.write('<script type="text/javascript" src="lib/layui/layui.js"></script>');
+		document.write('<script type="text/javascript" src="js/constant.js"></script>');
+	},
+	init: function(config, callback) {
+		this.link();
+		setTimeout(function() {
+			layui.config({
+				base: 'lib/encryption/'
+			}).use(config, function() {
+				let res = {};
+				for (let i = 0; i < config.length; i++) {
+					res[config[i]] = layui[config[i]];
+				}
+				callback(res);
+			});
+		}, 100);
+	},
+	ajax: function(config) {
+		let index = layer.load(2);
+		ly.ajax({
+			type: config.type,
+			url: config.url,
+			dataType: 'json',
+			data: config.data ? config.data : {},
+			success: function(res) {
+				if (config.success) {
+					config.success(res);
+				}
+				layer.close(index);
+			},
+			error: function(err) {
+				console.error('报错接口:', config.url, '报错内容:', err);
+				layer.close(index);
+				sessionStorage.clear();
+				util.layer.errorMsg('系统错误,请重新登录!');
+				setTimeout(function() {
+					window.location.href = 'login.html';
+				}, 2000);
+			}
+		});
+	},
+	postJSON: function(config) {
+		config.type = 'POST';
+		this.ajax(config);
+	},
+	getJSON: function(config) {
+		config.type = 'GET';
+		this.ajax(config);
+	},
+	ptAjax: function(config) {
+		let index = layer.load(2);
+		$.ajax({
+			type: config.type,
+			url: config.url,
+			dataType: 'json',
+			data: config.data ? config.data : {},
+			success: function(res) {
+				if (config.success) {
+					config.success(res);
+				}
+				layer.close(index);
+			},
+			error: function(err) {
+				console.error('报错接口:', config.url, '报错内容:', err);
+				layer.close(index);
+			}
+		});
+	},
+	get: function(config) {
+		config.type = 'GET';
+		this.ptAjax(config);
+	},
+	htmlHeader: function(userName, signOut) {
+		if (userName) {
+			$(userName).text(sessionStorage.LOGIN_USERNAME ? sessionStorage.LOGIN_USERNAME : '未知用户');
+		}
+		$(signOut).on('click', function() {
+			layer.confirm('是否确认退出?', {
+			  btn: ['确认','取消']
+			}, function() {
+				sessionStorage.clear();
+				window.location.href = 'login.html';
+			});
+		});
+	},
+	getQueryVariable: function(variable) {
+		let query = window.location.search.substring(1);
+		let vars = query.split("&");
+		for (let i = 0; i < vars.length; i++) {
+			let pair = vars[i].split("=");
+			if (pair[0] == variable) {
+				return pair[1];
+			}
+		}
+		return "";
+	},
+	HTMLDecode: function(text) { 
+	    return text.replace(/&lt;/g,"<").replace(/&nbsp;/g," ").replace(/&gt;/g,">"); 
+	},
+	blank: {
+		isNotNull: function(data) {
+			return data && data != undefined && data != 'null';
+		},
+		isArrayNull: function(data) {
+			return (!data) || data == null || data.length == 0;
+		}
+	},
+	layer: {
+		errorMsg: function(msg) {
+			layer.msg(msg, {icon: 5});
+		},
+		okMsg: function(msg) {
+			layer.msg(msg, {icon: 6});
+		},
+		openNoTitle: function(clazz) {
+			return layer.open({
+				type: 1,
+				title: false,
+				closeBtn: 0,
+				shadeClose: true,
+				skin: 'yourclass',
+				content: $(clazz),
+				success: function() {
+					$(clazz).css('display', 'block');
+				},
+				end: function() {
+					$(clazz).css('display', 'none');
+				}
+			});
+		},
+		// 缓存弹窗索引
+		index: {}
+	},
+	click: {
+		longPress: function(main, son, time, callback, tap) {
+			let timeout;
+			$(main).on('touchstart', son, function(e) {
+				// 添加长按标识
+				$(main + ' ' + son).attr('data-sign', null);
+				$(this).attr('data-sign', 'longPress');
+				timeout = setTimeout(callback, time);
+			});
+			$(main).on('touchmove', son, function(e) {
+				clearTimeout(timeout);
+				timeout = 0;
+				// e.preventDefault();
+			});
+			$(main).on('touchend', son, function(e) {
+				clearTimeout(timeout);
+				if (timeout != 0) {
+					tap();
+				}
+			});
+		}
+	}
+};

+ 724 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/aes.js

@@ -0,0 +1,724 @@
+layui.define(["jquery"], function(exports) {
+	var $ = layui.jquery;
+	! function(t, n) {
+		"object" == typeof exports ? module.exports = exports = n() : "function" == typeof define && define.amd ? define([],
+				n) :
+			t.CryptoJS = n()
+	}(this, function() {
+		var t = t || function(t, n) {
+			var i = Object.create || function() {
+					function t() {}
+					return function(n) {
+						var i;
+						return t.prototype = n, i = new t, t.prototype = null, i
+					}
+				}(),
+				e = {},
+				r = e.lib = {},
+				o = r.Base = function() {
+					return {
+						extend: function(t) {
+							var n = i(this);
+							return t && n.mixIn(t), n.hasOwnProperty("init") && this.init !== n.init || (n.init = function() {
+								n.$super.init.apply(this, arguments)
+							}), n.init.prototype = n, n.$super = this, n
+						},
+						create: function() {
+							var t = this.extend();
+							return t.init.apply(t, arguments), t
+						},
+						init: function() {},
+						mixIn: function(t) {
+							for (var n in t) t.hasOwnProperty(n) && (this[n] = t[n]);
+							t.hasOwnProperty("toString") && (this.toString = t.toString)
+						},
+						clone: function() {
+							return this.init.prototype.extend(this)
+						}
+					}
+				}(),
+				s = r.WordArray = o.extend({
+					init: function(t, i) {
+						t = this.words = t || [], i != n ? this.sigBytes = i : this.sigBytes = 4 * t.length
+					},
+					toString: function(t) {
+						return (t || c).stringify(this)
+					},
+					concat: function(t) {
+						var n = this.words,
+							i = t.words,
+							e = this.sigBytes,
+							r = t.sigBytes;
+						if (this.clamp(), e % 4)
+							for (var o = 0; o < r; o++) {
+								var s = i[o >>> 2] >>> 24 - o % 4 * 8 & 255;
+								n[e + o >>> 2] |= s << 24 - (e + o) % 4 * 8
+							} else
+								for (var o = 0; o < r; o += 4) n[e + o >>> 2] = i[o >>> 2];
+						return this.sigBytes += r, this
+					},
+					clamp: function() {
+						var n = this.words,
+							i = this.sigBytes;
+						n[i >>> 2] &= 4294967295 << 32 - i % 4 * 8, n.length = t.ceil(i / 4)
+					},
+					clone: function() {
+						var t = o.clone.call(this);
+						return t.words = this.words.slice(0), t
+					},
+					random: function(n) {
+						for (var i, e = [], r = function(n) {
+								var n = n,
+									i = 987654321,
+									e = 4294967295;
+								return function() {
+									i = 36969 * (65535 & i) + (i >> 16) & e, n = 18e3 * (65535 & n) + (n >> 16) & e;
+									var r = (i << 16) + n & e;
+									return r /= 4294967296, r += .5, r * (t.random() > .5 ? 1 : -1)
+								}
+							}, o = 0; o < n; o += 4) {
+							var a = r(4294967296 * (i || t.random()));
+							i = 987654071 * a(), e.push(4294967296 * a() | 0)
+						}
+						return new s.init(e, n)
+					}
+				}),
+				a = e.enc = {},
+				c = a.Hex = {
+					stringify: function(t) {
+						for (var n = t.words, i = t.sigBytes, e = [], r = 0; r < i; r++) {
+							var o = n[r >>> 2] >>> 24 - r % 4 * 8 & 255;
+							e.push((o >>> 4).toString(16)), e.push((15 & o).toString(16))
+						}
+						return e.join("")
+					},
+					parse: function(t) {
+						for (var n = t.length, i = [], e = 0; e < n; e += 2) i[e >>> 3] |= parseInt(t.substr(e, 2), 16) << 24 - e %
+							8 *
+							4;
+						return new s.init(i, n / 2)
+					}
+				},
+				u = a.Latin1 = {
+					stringify: function(t) {
+						for (var n = t.words, i = t.sigBytes, e = [], r = 0; r < i; r++) {
+							var o = n[r >>> 2] >>> 24 - r % 4 * 8 & 255;
+							e.push(String.fromCharCode(o))
+						}
+						return e.join("")
+					},
+					parse: function(t) {
+						for (var n = t.length, i = [], e = 0; e < n; e++) i[e >>> 2] |= (255 & t.charCodeAt(e)) << 24 - e % 4 * 8;
+						return new s.init(i, n)
+					}
+				},
+				f = a.Utf8 = {
+					stringify: function(t) {
+						try {
+							return decodeURIComponent(escape(u.stringify(t)))
+						} catch (t) {
+							throw new Error("Malformed UTF-8 data")
+						}
+					},
+					parse: function(t) {
+						return u.parse(unescape(encodeURIComponent(t)))
+					}
+				},
+				h = r.BufferedBlockAlgorithm = o.extend({
+					reset: function() {
+						this._data = new s.init, this._nDataBytes = 0
+					},
+					_append: function(t) {
+						"string" == typeof t && (t = f.parse(t)), this._data.concat(t), this._nDataBytes += t.sigBytes
+					},
+					_process: function(n) {
+						var i = this._data,
+							e = i.words,
+							r = i.sigBytes,
+							o = this.blockSize,
+							a = 4 * o,
+							c = r / a;
+						c = n ? t.ceil(c) : t.max((0 | c) - this._minBufferSize, 0);
+						var u = c * o,
+							f = t.min(4 * u, r);
+						if (u) {
+							for (var h = 0; h < u; h += o) this._doProcessBlock(e, h);
+							var p = e.splice(0, u);
+							i.sigBytes -= f
+						}
+						return new s.init(p, f)
+					},
+					clone: function() {
+						var t = o.clone.call(this);
+						return t._data = this._data.clone(), t
+					},
+					_minBufferSize: 0
+				}),
+				p = (r.Hasher = h.extend({
+					cfg: o.extend(),
+					init: function(t) {
+						this.cfg = this.cfg.extend(t), this.reset()
+					},
+					reset: function() {
+						h.reset.call(this), this._doReset()
+					},
+					update: function(t) {
+						return this._append(t), this._process(), this
+					},
+					finalize: function(t) {
+						t && this._append(t);
+						var n = this._doFinalize();
+						return n
+					},
+					blockSize: 16,
+					_createHelper: function(t) {
+						return function(n, i) {
+							return new t.init(i).finalize(n)
+						}
+					},
+					_createHmacHelper: function(t) {
+						return function(n, i) {
+							return new p.HMAC.init(t, i).finalize(n)
+						}
+					}
+				}), e.algo = {});
+			return e
+		}(Math);
+		return t
+	});
+	//# sourceMappingURL=core.min.js.map
+	! function(e, t, i) {
+		"object" == typeof exports ? module.exports = exports = t(require("./core.min"), require("./sha1.min"), require(
+				"./hmac.min")) : "function" == typeof define && define.amd ? define(["./core.min", "./sha1.min", "./hmac.min"], t) :
+			t(e.CryptoJS)
+	}(this, function(e) {
+		return function() {
+			var t = e,
+				i = t.lib,
+				r = i.Base,
+				n = i.WordArray,
+				o = t.algo,
+				a = o.MD5,
+				c = o.EvpKDF = r.extend({
+					cfg: r.extend({
+						keySize: 4,
+						hasher: a,
+						iterations: 1
+					}),
+					init: function(e) {
+						this.cfg = this.cfg.extend(e)
+					},
+					compute: function(e, t) {
+						for (var i = this.cfg, r = i.hasher.create(), o = n.create(), a = o.words, c = i.keySize, f = i.iterations; a
+							.length <
+							c;) {
+							s && r.update(s);
+							var s = r.update(e).finalize(t);
+							r.reset();
+							for (var u = 1; u < f; u++) s = r.finalize(s), r.reset();
+							o.concat(s)
+						}
+						return o.sigBytes = 4 * c, o
+					}
+				});
+			t.EvpKDF = function(e, t, i) {
+				return c.create(i).compute(e, t)
+			}
+		}(), e.EvpKDF
+	});
+	//# sourceMappingURL=evpkdf.min.js.map
+	! function(r, e) {
+		"object" == typeof exports ? module.exports = exports = e(require("./core.min")) : "function" == typeof define &&
+			define.amd ? define(["./core.min"], e) : e(r.CryptoJS)
+	}(this, function(r) {
+		return function() {
+			function e(r, e, t) {
+				for (var n = [], i = 0, o = 0; o < e; o++)
+					if (o % 4) {
+						var f = t[r.charCodeAt(o - 1)] << o % 4 * 2,
+							c = t[r.charCodeAt(o)] >>> 6 - o % 4 * 2;
+						n[i >>> 2] |= (f | c) << 24 - i % 4 * 8, i++
+					} return a.create(n, i)
+			}
+			var t = r,
+				n = t.lib,
+				a = n.WordArray,
+				i = t.enc;
+			i.Base64 = {
+				stringify: function(r) {
+					var e = r.words,
+						t = r.sigBytes,
+						n = this._map;
+					r.clamp();
+					for (var a = [], i = 0; i < t; i += 3)
+						for (var o = e[i >>> 2] >>> 24 - i % 4 * 8 & 255, f = e[i + 1 >>> 2] >>> 24 - (i + 1) % 4 * 8 & 255, c = e[
+								i +
+								2 >>> 2] >>> 24 - (i + 2) % 4 * 8 & 255, s = o << 16 | f << 8 | c, h = 0; h < 4 && i + .75 * h < t; h++) a
+							.push(
+								n.charAt(s >>> 6 * (3 - h) & 63));
+					var p = n.charAt(64);
+					if (p)
+						for (; a.length % 4;) a.push(p);
+					return a.join("")
+				},
+				parse: function(r) {
+					var t = r.length,
+						n = this._map,
+						a = this._reverseMap;
+					if (!a) {
+						a = this._reverseMap = [];
+						for (var i = 0; i < n.length; i++) a[n.charCodeAt(i)] = i
+					}
+					var o = n.charAt(64);
+					if (o) {
+						var f = r.indexOf(o);
+						f !== -1 && (t = f)
+					}
+					return e(r, t, a)
+				},
+				_map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
+			}
+		}(), r.enc.Base64
+	});
+	//# sourceMappingURL=enc-base64.min.js.map
+	! function(e, t, r) {
+		"object" == typeof exports ? module.exports = exports = t(require("./core.min"), require("./evpkdf.min")) :
+			"function" ==
+			typeof define && define.amd ? define(["./core.min", "./evpkdf.min"], t) : t(e.CryptoJS)
+	}(this, function(e) {
+		e.lib.Cipher || function(t) {
+			var r = e,
+				i = r.lib,
+				n = i.Base,
+				c = i.WordArray,
+				o = i.BufferedBlockAlgorithm,
+				s = r.enc,
+				a = (s.Utf8, s.Base64),
+				f = r.algo,
+				p = f.EvpKDF,
+				d = i.Cipher = o.extend({
+					cfg: n.extend(),
+					createEncryptor: function(e, t) {
+						return this.create(this._ENC_XFORM_MODE, e, t)
+					},
+					createDecryptor: function(e, t) {
+						return this.create(this._DEC_XFORM_MODE, e, t)
+					},
+					init: function(e, t, r) {
+						this.cfg = this.cfg.extend(r), this._xformMode = e, this._key = t, this.reset()
+					},
+					reset: function() {
+						o.reset.call(this), this._doReset()
+					},
+					process: function(e) {
+						return this._append(e), this._process()
+					},
+					finalize: function(e) {
+						e && this._append(e);
+						var t = this._doFinalize();
+						return t
+					},
+					keySize: 4,
+					ivSize: 4,
+					_ENC_XFORM_MODE: 1,
+					_DEC_XFORM_MODE: 2,
+					_createHelper: function() {
+						function e(e) {
+							return "string" == typeof e ? B : x
+						}
+						return function(t) {
+							return {
+								encrypt: function(r, i, n) {
+									return e(i).encrypt(t, r, i, n)
+								},
+								decrypt: function(r, i, n) {
+									return e(i).decrypt(t, r, i, n)
+								}
+							}
+						}
+					}()
+				}),
+				h = (i.StreamCipher = d.extend({
+					_doFinalize: function() {
+						var e = this._process(!0);
+						return e
+					},
+					blockSize: 1
+				}), r.mode = {}),
+				u = i.BlockCipherMode = n.extend({
+					createEncryptor: function(e, t) {
+						return this.Encryptor.create(e, t)
+					},
+					createDecryptor: function(e, t) {
+						return this.Decryptor.create(e, t)
+					},
+					init: function(e, t) {
+						this._cipher = e, this._iv = t
+					}
+				}),
+				l = h.CBC = function() {
+					function e(e, r, i) {
+						var n = this._iv;
+						if (n) {
+							var c = n;
+							this._iv = t
+						} else var c = this._prevBlock;
+						for (var o = 0; o < i; o++) e[r + o] ^= c[o]
+					}
+					var r = u.extend();
+					return r.Encryptor = r.extend({
+						processBlock: function(t, r) {
+							var i = this._cipher,
+								n = i.blockSize;
+							e.call(this, t, r, n), i.encryptBlock(t, r), this._prevBlock = t.slice(r, r + n)
+						}
+					}), r.Decryptor = r.extend({
+						processBlock: function(t, r) {
+							var i = this._cipher,
+								n = i.blockSize,
+								c = t.slice(r, r + n);
+							i.decryptBlock(t, r), e.call(this, t, r, n), this._prevBlock = c
+						}
+					}), r
+				}(),
+				_ = r.pad = {},
+				v = _.Pkcs7 = {
+					pad: function(e, t) {
+						for (var r = 4 * t, i = r - e.sigBytes % r, n = i << 24 | i << 16 | i << 8 | i, o = [], s = 0; s < i; s += 4)
+							o
+							.push(n);
+						var a = c.create(o, i);
+						e.concat(a)
+					},
+					unpad: function(e) {
+						var t = 255 & e.words[e.sigBytes - 1 >>> 2];
+						e.sigBytes -= t
+					}
+				},
+				y = (i.BlockCipher = d.extend({
+					cfg: d.cfg.extend({
+						mode: l,
+						padding: v
+					}),
+					reset: function() {
+						d.reset.call(this);
+						var e = this.cfg,
+							t = e.iv,
+							r = e.mode;
+						if (this._xformMode == this._ENC_XFORM_MODE) var i = r.createEncryptor;
+						else {
+							var i = r.createDecryptor;
+							this._minBufferSize = 1
+						}
+						this._mode && this._mode.__creator == i ? this._mode.init(this, t && t.words) : (this._mode = i.call(r,
+							this,
+							t && t.words), this._mode.__creator = i)
+					},
+					_doProcessBlock: function(e, t) {
+						this._mode.processBlock(e, t)
+					},
+					_doFinalize: function() {
+						var e = this.cfg.padding;
+						if (this._xformMode == this._ENC_XFORM_MODE) {
+							e.pad(this._data, this.blockSize);
+							var t = this._process(!0)
+						} else {
+							var t = this._process(!0);
+							e.unpad(t)
+						}
+						return t
+					},
+					blockSize: 4
+				}), i.CipherParams = n.extend({
+					init: function(e) {
+						this.mixIn(e)
+					},
+					toString: function(e) {
+						return (e || this.formatter).stringify(this)
+					}
+				})),
+				m = r.format = {},
+				k = m.OpenSSL = {
+					stringify: function(e) {
+						var t = e.ciphertext,
+							r = e.salt;
+						if (r) var i = c.create([1398893684, 1701076831]).concat(r).concat(t);
+						else var i = t;
+						return i.toString(a)
+					},
+					parse: function(e) {
+						var t = a.parse(e),
+							r = t.words;
+						if (1398893684 == r[0] && 1701076831 == r[1]) {
+							var i = c.create(r.slice(2, 4));
+							r.splice(0, 4), t.sigBytes -= 16
+						}
+						return y.create({
+							ciphertext: t,
+							salt: i
+						})
+					}
+				},
+				x = i.SerializableCipher = n.extend({
+					cfg: n.extend({
+						format: k
+					}),
+					encrypt: function(e, t, r, i) {
+						i = this.cfg.extend(i);
+						var n = e.createEncryptor(r, i),
+							c = n.finalize(t),
+							o = n.cfg;
+						return y.create({
+							ciphertext: c,
+							key: r,
+							iv: o.iv,
+							algorithm: e,
+							mode: o.mode,
+							padding: o.padding,
+							blockSize: e.blockSize,
+							formatter: i.format
+						})
+					},
+					decrypt: function(e, t, r, i) {
+						i = this.cfg.extend(i), t = this._parse(t, i.format);
+						var n = e.createDecryptor(r, i).finalize(t.ciphertext);
+						return n
+					},
+					_parse: function(e, t) {
+						return "string" == typeof e ? t.parse(e, this) : e
+					}
+				}),
+				g = r.kdf = {},
+				S = g.OpenSSL = {
+					execute: function(e, t, r, i) {
+						i || (i = c.random(8));
+						var n = p.create({
+								keySize: t + r
+							}).compute(e, i),
+							o = c.create(n.words.slice(t), 4 * r);
+						return n.sigBytes = 4 * t, y.create({
+							key: n,
+							iv: o,
+							salt: i
+						})
+					}
+				},
+				B = i.PasswordBasedCipher = x.extend({
+					cfg: x.cfg.extend({
+						kdf: S
+					}),
+					encrypt: function(e, t, r, i) {
+						i = this.cfg.extend(i);
+						var n = i.kdf.execute(r, e.keySize, e.ivSize);
+						i.iv = n.iv;
+						var c = x.encrypt.call(this, e, t, n.key, i);
+						return c.mixIn(n), c
+					},
+					decrypt: function(e, t, r, i) {
+						i = this.cfg.extend(i), t = this._parse(t, i.format);
+						var n = i.kdf.execute(r, e.keySize, e.ivSize, t.salt);
+						i.iv = n.iv;
+						var c = x.decrypt.call(this, e, t, n.key, i);
+						return c
+					}
+				})
+		}()
+	});
+	//# sourceMappingURL=cipher-core.min.js.map
+	! function(e, i) {
+		"object" == typeof exports ? module.exports = exports = i(require("./core.min")) : "function" == typeof define &&
+			define.amd ? define(["./core.min"], i) : i(e.CryptoJS)
+	}(this, function(e) {
+		! function() {
+			var i = e,
+				t = i.lib,
+				n = t.Base,
+				s = i.enc,
+				r = s.Utf8,
+				o = i.algo;
+			o.HMAC = n.extend({
+				init: function(e, i) {
+					e = this._hasher = new e.init, "string" == typeof i && (i = r.parse(i));
+					var t = e.blockSize,
+						n = 4 * t;
+					i.sigBytes > n && (i = e.finalize(i)), i.clamp();
+					for (var s = this._oKey = i.clone(), o = this._iKey = i.clone(), a = s.words, f = o.words, c = 0; c < t; c++)
+						a[
+							c] ^= 1549556828, f[c] ^= 909522486;
+					s.sigBytes = o.sigBytes = n, this.reset()
+				},
+				reset: function() {
+					var e = this._hasher;
+					e.reset(), e.update(this._iKey)
+				},
+				update: function(e) {
+					return this._hasher.update(e), this
+				},
+				finalize: function(e) {
+					var i = this._hasher,
+						t = i.finalize(e);
+					i.reset();
+					var n = i.finalize(this._oKey.clone().concat(t));
+					return n
+				}
+			})
+		}()
+	});
+	//# sourceMappingURL=hmac.min.js.map
+	! function(e, o, r) {
+		"object" == typeof exports ? module.exports = exports = o(require("./core.min"), require("./cipher-core.min")) :
+			"function" == typeof define && define.amd ? define(["./core.min", "./cipher-core.min"], o) : o(e.CryptoJS)
+	}(this, function(e) {
+		return e.mode.ECB = function() {
+			var o = e.lib.BlockCipherMode.extend();
+			return o.Encryptor = o.extend({
+				processBlock: function(e, o) {
+					this._cipher.encryptBlock(e, o)
+				}
+			}), o.Decryptor = o.extend({
+				processBlock: function(e, o) {
+					this._cipher.decryptBlock(e, o)
+				}
+			}), o
+		}(), e.mode.ECB
+	});
+	//# sourceMappingURL=mode-ecb.min.js.map
+	! function(e, r, i) {
+		"object" == typeof exports ? module.exports = exports = r(require("./core.min"), require("./cipher-core.min")) :
+			"function" == typeof define && define.amd ? define(["./core.min", "./cipher-core.min"], r) : r(e.CryptoJS)
+	}(this, function(e) {
+		return e.pad.Pkcs7
+	});
+	//# sourceMappingURL=pad-pkcs7.min.js.map
+	! function(e, r, i) {
+		"object" == typeof exports ? module.exports = exports = r(require("./core.min"), require("./enc-base64.min"),
+				require(
+					"./md5.min"), require("./evpkdf.min"), require("./cipher-core.min")) : "function" == typeof define && define.amd ?
+			define(["./core.min", "./enc-base64.min", "./md5.min", "./evpkdf.min", "./cipher-core.min"], r) : r(e.CryptoJS)
+	}(this, function(e) {
+		return function() {
+			var r = e,
+				i = r.lib,
+				n = i.BlockCipher,
+				o = r.algo,
+				t = [],
+				c = [],
+				s = [],
+				f = [],
+				a = [],
+				d = [],
+				u = [],
+				v = [],
+				h = [],
+				y = [];
+			! function() {
+				for (var e = [], r = 0; r < 256; r++) r < 128 ? e[r] = r << 1 : e[r] = r << 1 ^ 283;
+				for (var i = 0, n = 0, r = 0; r < 256; r++) {
+					var o = n ^ n << 1 ^ n << 2 ^ n << 3 ^ n << 4;
+					o = o >>> 8 ^ 255 & o ^ 99, t[i] = o, c[o] = i;
+					var p = e[i],
+						l = e[p],
+						_ = e[l],
+						k = 257 * e[o] ^ 16843008 * o;
+					s[i] = k << 24 | k >>> 8, f[i] = k << 16 | k >>> 16, a[i] = k << 8 | k >>> 24, d[i] = k;
+					var k = 16843009 * _ ^ 65537 * l ^ 257 * p ^ 16843008 * i;
+					u[o] = k << 24 | k >>> 8, v[o] = k << 16 | k >>> 16, h[o] = k << 8 | k >>> 24, y[o] = k, i ? (i = p ^ e[e[e[_ ^
+							p]]],
+						n ^= e[e[n]]) : i = n = 1
+				}
+			}();
+			var p = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54],
+				l = o.AES = n.extend({
+					_doReset: function() {
+						if (!this._nRounds || this._keyPriorReset !== this._key) {
+							for (var e = this._keyPriorReset = this._key, r = e.words, i = e.sigBytes / 4, n = this._nRounds = i + 6,
+									o =
+									4 * (n + 1), c = this._keySchedule = [], s = 0; s < o; s++)
+								if (s < i) c[s] = r[s];
+								else {
+									var f = c[s - 1];
+									s % i ? i > 6 && s % i == 4 && (f = t[f >>> 24] << 24 | t[f >>> 16 & 255] << 16 | t[f >>> 8 & 255] << 8 |
+										t[
+											255 & f]) : (f = f << 8 | f >>> 24, f = t[f >>> 24] << 24 | t[f >>> 16 & 255] << 16 | t[f >>> 8 & 255] <<
+										8 | t[255 & f], f ^= p[s / i | 0] << 24), c[s] = c[s - i] ^ f
+								} for (var a = this._invKeySchedule = [], d = 0; d < o; d++) {
+								var s = o - d;
+								if (d % 4) var f = c[s];
+								else var f = c[s - 4];
+								d < 4 || s <= 4 ? a[d] = f : a[d] = u[t[f >>> 24]] ^ v[t[f >>> 16 & 255]] ^ h[t[f >>> 8 & 255]] ^ y[t[255 &
+									f]]
+							}
+						}
+					},
+					encryptBlock: function(e, r) {
+						this._doCryptBlock(e, r, this._keySchedule, s, f, a, d, t)
+					},
+					decryptBlock: function(e, r) {
+						var i = e[r + 1];
+						e[r + 1] = e[r + 3], e[r + 3] = i, this._doCryptBlock(e, r, this._invKeySchedule, u, v, h, y, c);
+						var i = e[r + 1];
+						e[r + 1] = e[r + 3], e[r + 3] = i
+					},
+					_doCryptBlock: function(e, r, i, n, o, t, c, s) {
+						for (var f = this._nRounds, a = e[r] ^ i[0], d = e[r + 1] ^ i[1], u = e[r + 2] ^ i[2], v = e[r + 3] ^ i[3],
+								h =
+								4, y = 1; y < f; y++) {
+							var p = n[a >>> 24] ^ o[d >>> 16 & 255] ^ t[u >>> 8 & 255] ^ c[255 & v] ^ i[h++],
+								l = n[d >>> 24] ^ o[u >>> 16 & 255] ^ t[v >>> 8 & 255] ^ c[255 & a] ^ i[h++],
+								_ = n[u >>> 24] ^ o[v >>> 16 & 255] ^ t[a >>> 8 & 255] ^ c[255 & d] ^ i[h++],
+								k = n[v >>> 24] ^ o[a >>> 16 & 255] ^ t[d >>> 8 & 255] ^ c[255 & u] ^ i[h++];
+							a = p, d = l, u = _, v = k
+						}
+						var p = (s[a >>> 24] << 24 | s[d >>> 16 & 255] << 16 | s[u >>> 8 & 255] << 8 | s[255 & v]) ^ i[h++],
+							l = (s[d >>> 24] << 24 | s[u >>> 16 & 255] << 16 | s[v >>> 8 & 255] << 8 | s[255 & a]) ^ i[h++],
+							_ = (s[u >>> 24] << 24 | s[v >>> 16 & 255] << 16 | s[a >>> 8 & 255] << 8 | s[255 & d]) ^ i[h++],
+							k = (s[v >>> 24] << 24 | s[a >>> 16 & 255] << 16 | s[d >>> 8 & 255] << 8 | s[255 & u]) ^ i[h++];
+						e[r] = p, e[r + 1] = l, e[r + 2] = _, e[r + 3] = k
+					},
+					keySize: 8
+				});
+			r.AES = n._createHelper(l)
+		}(), e.AES
+	});
+	//# sourceMappingURL=aes.min.js.map
+	! function(e, n) {
+		"object" == typeof exports ? module.exports = exports = n(require("./core.min")) : "function" == typeof define &&
+			define.amd ? define(["./core.min"], n) : n(e.CryptoJS)
+	}(this, function(e) {
+		return e.enc.Utf8
+	});
+	//# sourceMappingURL=enc-utf8.min.js.map
+	var api = {
+		/**
+		 * 加密
+		 * 
+		 * @param word
+		 * @returns {*}
+		 */
+		encrypt: function(key, word) {
+			key = CryptoJS.enc.Utf8.parse(key);
+			var srcs = CryptoJS.enc.Utf8.parse(word);
+			var encrypted = CryptoJS.AES.encrypt(srcs, key, {
+				mode: CryptoJS.mode.ECB,
+				padding: CryptoJS.pad.Pkcs7
+			});
+			return encrypted.toString();
+		},
+		/**
+		 * 解密
+		 * 
+		 * @param word
+		 * @returns {*}
+		 */
+		decrypt: function(key, word) {
+			key = CryptoJS.enc.Utf8.parse(key);
+			var decrypt = CryptoJS.AES.decrypt(word, key, {
+				mode: CryptoJS.mode.ECB,
+				padding: CryptoJS.pad.Pkcs7
+			});
+			return CryptoJS.enc.Utf8.stringify(decrypt).toString();
+		}
+	}
+
+	exports('aes', api);
+});

+ 131 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/ajax.js

@@ -0,0 +1,131 @@
+layui.define(['jquery', 'sign', 'aes', 'pako'], function(exports) {
+	var $ = layui.jquery;
+	var sign = layui.sign;
+	var aes = layui.aes;
+	var pako = layui.pako;
+	/**
+	 * 转换json格式
+	 * @param {Object} param
+	 * @param {Object} key
+	 */
+	var parseParam = function(param, key) {
+		var paramStr = "";
+		if (param instanceof String || param instanceof Number || param instanceof Boolean) {
+			paramStr += "&" + key + "=" + encodeURIComponent(param);
+		} else if (param == null || param == "") {
+			paramStr += "&" + key + "=";
+		} else {
+			$.each(param, function(i, val) {
+				if (val == null || val == undefined) {
+					return true;
+				}
+				var k = key == null ? i : key + (param instanceof Array ? "[" + i + "]" : "." + i);
+				paramStr += '&' + parseParam(this, k);
+			});
+		}
+		return paramStr.substr(1);
+	};
+
+	/*重写Jquery中的ajax 封装壳*/
+	// $(function() {
+	// 	(function($) {
+			// 首先备份下jquery的ajax方法
+			var _ajax = $.ajax;
+
+			// 重写jquery的ajax方法
+			var api = {
+				ajax : function(opt) {
+				// 备份opt中error和success方法
+					var fn = {
+						beforeSend: function(XHR) {},
+						error: function(XMLHttpRequest, textStatus, errorThrown) {},
+						success: function(data, textStatus) {},
+						complete: function(XHR, TS) {}
+					}
+
+					if (opt.beforeSend) {
+						fn.beforeSend = opt.beforeSend;
+					}
+					if (opt.error) {
+						fn.error = opt.error;
+					}
+					if (opt.success) {
+						fn.success = opt.success;
+					}
+					if (opt.complete) {
+						fn.complete = opt.complete;
+					}
+					// 生成时间戳
+					var timestamp = new Date().getTime();
+
+					// 扩展增强处理
+					var _opt = $.extend(opt, {
+						// 全局允许跨域
+						xhrFields: {
+							withCredentials: true
+						},
+						error: function(XMLHttpRequest, textStatus, errorThrown) {
+							// 错误方法增强处理
+							fn.error(XMLHttpRequest, textStatus, errorThrown);
+						},
+						success: function(data, textStatus) {
+							// 成功回调方法增强处理
+							if (data && JSON.stringify(data) != '{}') {
+								var content = data.content;
+								if (content) {
+									// 解压数据
+									content = pako.unzip(content);
+									// aes解密
+									var aeskey = (Array(16).join('0') + timestamp).slice(-16);
+									content = aes.decrypt(aeskey, content);
+									data = JSON.parse(content);
+									console.log("url:" + opt.url)
+									console.log(data)
+								}
+							}
+							fn.success(data, textStatus);
+						},
+						beforeSend: function(XHR) {
+							// 提交前回调方法
+							XHR.setRequestHeader('timestamp', timestamp);
+							// XHR.setRequestHeader('Authorization', 'bearer 9b7af52ceb3483a2a44d15a113079958');
+							XHR.setRequestHeader('Authorization', sessionStorage.TOKEN_TYPE + ' '+ sessionStorage.ACCESS_TOKEN);
+							fn.beforeSend(XHR);
+						},
+						complete: function(XHR, TS) {
+							// 请求完成后回调函数 (请求成功或失败之后均调用)。
+							fn.complete(XHR, TS);
+						}
+					});
+					if (opt.xhrFields) {
+						_opt.xhrFields = opt.xhrFields;
+					}
+					if (opt.data) {
+						console.log(opt.data)
+						var dataStr = JSON.stringify(opt.data);
+						if (dataStr != '{}') {
+							if (opt.data instanceof Object) {
+								dataStr = parseParam(opt.data);
+							}
+							// 自定义加密
+							dataStr = sign.getSign(dataStr, timestamp);
+							// aes加密请求参数
+							var aeskey = (Array(16).join('0') + timestamp).slice(-16);
+							dataStr = aes.encrypt(aeskey, dataStr);
+							// 压缩密文
+							dataStr = pako.zip(dataStr);
+							_opt.data = {
+								'content': dataStr
+							};
+						}
+					}
+
+					// 调用native ajax 方法
+					return _ajax(_opt);
+				}
+			}
+	// 	})($);
+	// });
+
+	exports('ajax', api);
+});

+ 227 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/md5.js

@@ -0,0 +1,227 @@
+layui.define([], function(exports) {
+// (function($) {
+	function safeAdd(x, y) {
+		var lsw = (x & 65535) + (y & 65535);
+		var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+		return (msw << 16) | (lsw & 65535)
+	}
+
+	function bitRotateLeft(num, cnt) {
+		return (num << cnt) | (num >>> (32 - cnt))
+	}
+
+	function md5cmn(q, a, b, x, s, t) {
+		return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b)
+	}
+
+	function md5ff(a, b, c, d, x, s, t) {
+		return md5cmn((b & c) | (~b & d), a, b, x, s, t)
+	}
+
+	function md5gg(a, b, c, d, x, s, t) {
+		return md5cmn((b & d) | (c & ~d), a, b, x, s, t)
+	}
+
+	function md5hh(a, b, c, d, x, s, t) {
+		return md5cmn(b ^ c ^ d, a, b, x, s, t)
+	}
+
+	function md5ii(a, b, c, d, x, s, t) {
+		return md5cmn(c ^ (b | ~d), a, b, x, s, t)
+	}
+
+	function binlMD5(x, len) {
+		x[len >> 5] |= 128 << (len % 32);
+		x[((len + 64) >>> 9 << 4) + 14] = len;
+		var i;
+		var olda;
+		var oldb;
+		var oldc;
+		var oldd;
+		var a = 1732584193;
+		var b = -271733879;
+		var c = -1732584194;
+		var d = 271733878;
+		for (i = 0; i < x.length; i += 16) {
+			olda = a;
+			oldb = b;
+			oldc = c;
+			oldd = d;
+			a = md5ff(a, b, c, d, x[i], 7, -680876936);
+			d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);
+			c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);
+			b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);
+			a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);
+			d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);
+			c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);
+			b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);
+			a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);
+			d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);
+			c = md5ff(c, d, a, b, x[i + 10], 17, -42063);
+			b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);
+			a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);
+			d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);
+			c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);
+			b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);
+			a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);
+			d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);
+			c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);
+			b = md5gg(b, c, d, a, x[i], 20, -373897302);
+			a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);
+			d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);
+			c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);
+			b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);
+			a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);
+			d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);
+			c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);
+			b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);
+			a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);
+			d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);
+			c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);
+			b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);
+			a = md5hh(a, b, c, d, x[i + 5], 4, -378558);
+			d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);
+			c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);
+			b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);
+			a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);
+			d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);
+			c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);
+			b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);
+			a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);
+			d = md5hh(d, a, b, c, x[i], 11, -358537222);
+			c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);
+			b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);
+			a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);
+			d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);
+			c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);
+			b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);
+			a = md5ii(a, b, c, d, x[i], 6, -198630844);
+			d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);
+			c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);
+			b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);
+			a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);
+			d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);
+			c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);
+			b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);
+			a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);
+			d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);
+			c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);
+			b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);
+			a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);
+			d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);
+			c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);
+			b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);
+			a = safeAdd(a, olda);
+			b = safeAdd(b, oldb);
+			c = safeAdd(c, oldc);
+			d = safeAdd(d, oldd)
+		}
+		return [a, b, c, d]
+	}
+
+	function binl2rstr(input) {
+		var i;
+		var output = "";
+		var length32 = input.length * 32;
+		for (i = 0; i < length32; i += 8) {
+			output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 255)
+		}
+		return output
+	}
+
+	function rstr2binl(input) {
+		var i;
+		var output = [];
+		output[(input.length >> 2) - 1] = undefined;
+		for (i = 0; i < output.length; i += 1) {
+			output[i] = 0
+		}
+		var length8 = input.length * 8;
+		for (i = 0; i < length8; i += 8) {
+			output[i >> 5] |= (input.charCodeAt(i / 8) & 255) << (i % 32)
+		}
+		return output
+	}
+
+	function rstrMD5(s) {
+		return binl2rstr(binlMD5(rstr2binl(s), s.length * 8))
+	}
+
+	function rstrHMACMD5(key, data) {
+		var i;
+		var bkey = rstr2binl(key);
+		var ipad = [];
+		var opad = [];
+		var hash;
+		ipad[15] = opad[15] = undefined;
+		if (bkey.length > 16) {
+			bkey = binlMD5(bkey, key.length * 8)
+		}
+		for (i = 0; i < 16; i += 1) {
+			ipad[i] = bkey[i] ^ 909522486;
+			opad[i] = bkey[i] ^ 1549556828
+		}
+		hash = binlMD5(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
+		return binl2rstr(binlMD5(opad.concat(hash), 512 + 128))
+	}
+
+	function rstr2hex(input) {
+		var hexTab = "0123456789abcdef";
+		var output = "";
+		var x;
+		var i;
+		for (i = 0; i < input.length; i += 1) {
+			x = input.charCodeAt(i);
+			output += hexTab.charAt((x >>> 4) & 15) + hexTab.charAt(x & 15)
+		}
+		return output
+	}
+
+	function str2rstrUTF8(input) {
+		return unescape(encodeURIComponent(input))
+	}
+
+	function rawMD5(s) {
+		return rstrMD5(str2rstrUTF8(s))
+	}
+
+	function hexMD5(s) {
+		return rstr2hex(rawMD5(s))
+	}
+
+	function rawHMACMD5(k, d) {
+		return rstrHMACMD5(str2rstrUTF8(k), str2rstrUTF8(d))
+	}
+
+	function hexHMACMD5(k, d) {
+		return rstr2hex(rawHMACMD5(k, d))
+	}
+
+	var api = {
+		md5: function(string, key, raw) {
+			if (!key) {
+				if (!raw) {
+					return hexMD5(string)
+				}
+				return rawMD5(string)
+			}
+			if (!raw) {
+				return hexHMACMD5(key, string)
+			}
+			return rawHMACMD5(key, string)
+		}
+	} 
+	// if (typeof define === "function" && define.amd) {
+	// 	define(function() {
+	// 		return md5
+	// 	})
+	// } else {
+	// 	if (typeof module === "object" && module.exports) {
+	// 		module.exports = md5
+	// 	} else {
+	// 		$.md5 = md5
+	// 	}
+	// }
+// })(this);
+	exports('md5', api);
+});

+ 63 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/multiSelect.js

@@ -0,0 +1,63 @@
+layui.define("form", function(exports) {
+	var MOD_NAME = "multiSelect",
+		o = layui.jquery,
+		form = layui.form,
+		selected_vals = [],
+		multiSelect = function() {};
+
+	multiSelect.prototype.init = function() {
+		var ts = this;
+		o('select[multiple]').each(function(idx, item) {
+			var t = o(this),
+				selds = [];
+			t.find('option:selected').each(function() {
+				selds.push(o(this).val());
+			})
+			t.next().addClass('multi').find('.layui-select-title').click(function() {
+				selected_vals[idx] && o(this).find('input').val(selected_vals[idx].join(','));
+			}).next().find('dd').each(function() {
+				var dt = o(this),
+					checked = (dt.hasClass('layui-this') || o.inArray(dt.attr('lay-value'), selds) > -1) ? 'checked' : '',
+					title = dt.text(),
+					disabled = dt.attr('lay-value') === '' ? 'disabled' : '';
+				dt.html('<input type="checkbox" lay-skin="primary" title="' + title + '" ' + checked + ' ' + disabled + '>');
+				ts.selected(idx, t, dt);
+			}).click(function(e) {
+				var dt = o(this);
+				// 点击下拉框每一行触发选中和反选
+				if(e.target.localName == 'dd' && dt.attr('lay-value') !== '') {
+					var status = dt.find('.layui-form-checkbox').toggleClass('layui-form-checked').hasClass('layui-form-checked');
+					dt.find('input').prop('checked', status);
+				}
+				// 禁止下拉框收回
+				dt.parents('.layui-form-select').addClass('layui-form-selected');
+				ts.selected(idx, t, dt);
+			});
+		})
+		form.render('checkbox');
+	}
+
+	multiSelect.prototype.selected = function(idx, t, dt) {
+		// 选中值存入数组
+		selected_vals[idx] = [];
+		// 先清除真实下拉款选中的值,在下面循环中重新赋值选中
+		t.find('option').prop('selected', false);
+		dt.parents('dl').find('[type=checkbox]:checked').each(function() {
+			var val = o(this).parent().attr('lay-value');
+			t.find('option[value=' + val + ']').prop('selected', true);
+			selected_vals[idx].push(o(this).attr('title'));
+		})
+		// 显示已选信息
+		dt.parents('dl').prev().find('input').val(selected_vals[idx].join(','));
+	}
+
+	multiSelect.prototype.render = function(type, filter) {
+		form.render(type, filter);
+		this.init();
+	}
+
+	var i = new multiSelect();
+	i.init();
+
+	exports(MOD_NAME, i);
+});

+ 1887 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/pako.js

@@ -0,0 +1,1887 @@
+layui.define(["jquery"], function(exports) {
+	var $ = layui.jquery;
+	! function(t) {
+		if ("object" == typeof exports && "undefined" != typeof module) module.exports = t();
+		else if ("function" == typeof define && define.amd) define([], t);
+		else {
+			("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self :
+				this).pako = t()
+		}
+	}(function() {
+		return function t(e, a, i) {
+			function n(s, o) {
+				if (!a[s]) {
+					if (!e[s]) {
+						var l = "function" == typeof require && require;
+						if (!o && l) return l(s, !0);
+						if (r) return r(s, !0);
+						var h = new Error("Cannot find module '" + s + "'");
+						throw h.code = "MODULE_NOT_FOUND", h
+					}
+					var d = a[s] = {
+						exports: {}
+					};
+					e[s][0].call(d.exports, function(t) {
+						var a = e[s][1][t];
+						return n(a || t)
+					}, d, d.exports, t, e, a, i)
+				}
+				return a[s].exports
+			}
+			for (var r = "function" == typeof require && require, s = 0; s < i.length; s++) n(i[s]);
+			return n
+		}({
+			1: [function(t, e, a) {
+				"use strict";
+
+				function i(t) {
+					if (!(this instanceof i)) return new i(t);
+					this.options = s.assign({
+						level: _,
+						method: c,
+						chunkSize: 16384,
+						windowBits: 15,
+						memLevel: 8,
+						strategy: u,
+						to: ""
+					}, t || {});
+					var e = this.options;
+					e.raw && e.windowBits > 0 ? e.windowBits = -e.windowBits : e.gzip && e.windowBits > 0 && e.windowBits < 16 &&
+						(e.windowBits += 16), this.err = 0, this.msg = "", this.ended = !1, this.chunks = [], this.strm = new h,
+						this
+						.strm.avail_out = 0;
+					var a = r.deflateInit2(this.strm, e.level, e.method, e.windowBits, e.memLevel, e.strategy);
+					if (a !== f) throw new Error(l[a]);
+					if (e.header && r.deflateSetHeader(this.strm, e.header), e.dictionary) {
+						var n;
+						if (n = "string" == typeof e.dictionary ? o.string2buf(e.dictionary) : "[object ArrayBuffer]" === d.call(e
+								.dictionary) ?
+							new Uint8Array(e.dictionary) : e.dictionary, (a = r.deflateSetDictionary(this.strm, n)) !== f) throw new Error(
+							l[a]);
+						this._dict_set = !0
+					}
+				}
+
+				function n(t, e) {
+					var a = new i(e);
+					if (a.push(t, !0), a.err) throw a.msg || l[a.err];
+					return a.result
+				}
+				var r = t("./zlib/deflate"),
+					s = t("./utils/common"),
+					o = t("./utils/strings"),
+					l = t("./zlib/messages"),
+					h = t("./zlib/zstream"),
+					d = Object.prototype.toString,
+					f = 0,
+					_ = -1,
+					u = 0,
+					c = 8;
+				i.prototype.push = function(t, e) {
+					var a, i, n = this.strm,
+						l = this.options.chunkSize;
+					if (this.ended) return !1;
+					i = e === ~~e ? e : !0 === e ? 4 : 0, "string" == typeof t ? n.input = o.string2buf(t) :
+						"[object ArrayBuffer]" === d.call(t) ? n.input = new Uint8Array(t) : n.input = t, n.next_in = 0, n.avail_in =
+						n.input.length;
+					do {
+						if (0 === n.avail_out && (n.output = new s.Buf8(l), n.next_out = 0, n.avail_out = l), 1 !== (a = r.deflate(
+								n,
+								i)) && a !== f) return this.onEnd(a), this.ended = !0, !1;
+						0 !== n.avail_out && (0 !== n.avail_in || 4 !== i && 2 !== i) || ("string" === this.options.to ? this.onData(
+							o.buf2binstring(s.shrinkBuf(n.output, n.next_out))) : this.onData(s.shrinkBuf(n.output, n.next_out)))
+					} while ((n.avail_in > 0 || 0 === n.avail_out) && 1 !== a);
+					return 4 === i ? (a = r.deflateEnd(this.strm), this.onEnd(a), this.ended = !0, a === f) : 2 !== i || (this
+						.onEnd(
+							f), n.avail_out = 0, !0)
+				}, i.prototype.onData = function(t) {
+					this.chunks.push(t)
+				}, i.prototype.onEnd = function(t) {
+					t === f && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = s.flattenChunks(
+						this.chunks)), this.chunks = [], this.err = t, this.msg = this.strm.msg
+				}, a.Deflate = i, a.deflate = n, a.deflateRaw = function(t, e) {
+					return e = e || {}, e.raw = !0, n(t, e)
+				}, a.gzip = function(t, e) {
+					return e = e || {}, e.gzip = !0, n(t, e)
+				}
+			}, {
+				"./utils/common": 3,
+				"./utils/strings": 4,
+				"./zlib/deflate": 8,
+				"./zlib/messages": 13,
+				"./zlib/zstream": 15
+			}],
+			2: [function(t, e, a) {
+				"use strict";
+
+				function i(t) {
+					if (!(this instanceof i)) return new i(t);
+					this.options = s.assign({
+						chunkSize: 16384,
+						windowBits: 0,
+						to: ""
+					}, t || {});
+					var e = this.options;
+					e.raw && e.windowBits >= 0 && e.windowBits < 16 && (e.windowBits = -e.windowBits, 0 === e.windowBits && (e.windowBits = -
+							15)), !(e.windowBits >= 0 && e.windowBits < 16) || t && t.windowBits || (e.windowBits += 32), e.windowBits >
+						15 && e.windowBits < 48 && 0 == (15 & e.windowBits) && (e.windowBits |= 15), this.err = 0, this.msg = "",
+						this.ended = !1, this.chunks = [], this.strm = new d, this.strm.avail_out = 0;
+					var a = r.inflateInit2(this.strm, e.windowBits);
+					if (a !== l.Z_OK) throw new Error(h[a]);
+					this.header = new f, r.inflateGetHeader(this.strm, this.header)
+				}
+
+				function n(t, e) {
+					var a = new i(e);
+					if (a.push(t, !0), a.err) throw a.msg || h[a.err];
+					return a.result
+				}
+				var r = t("./zlib/inflate"),
+					s = t("./utils/common"),
+					o = t("./utils/strings"),
+					l = t("./zlib/constants"),
+					h = t("./zlib/messages"),
+					d = t("./zlib/zstream"),
+					f = t("./zlib/gzheader"),
+					_ = Object.prototype.toString;
+				i.prototype.push = function(t, e) {
+					var a, i, n, h, d, f, u = this.strm,
+						c = this.options.chunkSize,
+						b = this.options.dictionary,
+						g = !1;
+					if (this.ended) return !1;
+					i = e === ~~e ? e : !0 === e ? l.Z_FINISH : l.Z_NO_FLUSH, "string" == typeof t ? u.input = o.binstring2buf(
+							t) :
+						"[object ArrayBuffer]" === _.call(t) ? u.input = new Uint8Array(t) : u.input = t, u.next_in = 0, u.avail_in =
+						u.input.length;
+					do {
+						if (0 === u.avail_out && (u.output = new s.Buf8(c), u.next_out = 0, u.avail_out = c), (a = r.inflate(u, l
+								.Z_NO_FLUSH)) ===
+							l.Z_NEED_DICT && b && (f = "string" == typeof b ? o.string2buf(b) : "[object ArrayBuffer]" === _.call(b) ?
+								new Uint8Array(b) : b, a = r.inflateSetDictionary(this.strm, f)), a === l.Z_BUF_ERROR && !0 === g && (a =
+								l.Z_OK, g = !1), a !== l.Z_STREAM_END && a !== l.Z_OK) return this.onEnd(a), this.ended = !0, !1;
+						u.next_out && (0 !== u.avail_out && a !== l.Z_STREAM_END && (0 !== u.avail_in || i !== l.Z_FINISH && i !==
+								l.Z_SYNC_FLUSH) || ("string" === this.options.to ? (n = o.utf8border(u.output, u.next_out), h = u.next_out -
+								n, d = o.buf2string(u.output, n), u.next_out = h, u.avail_out = c - h, h && s.arraySet(u.output, u.output,
+									n, h, 0), this.onData(d)) : this.onData(s.shrinkBuf(u.output, u.next_out)))), 0 === u.avail_in && 0 ===
+							u.avail_out && (g = !0)
+					} while ((u.avail_in > 0 || 0 === u.avail_out) && a !== l.Z_STREAM_END);
+					return a === l.Z_STREAM_END && (i = l.Z_FINISH), i === l.Z_FINISH ? (a = r.inflateEnd(this.strm), this.onEnd(
+						a), this.ended = !0, a === l.Z_OK) : i !== l.Z_SYNC_FLUSH || (this.onEnd(l.Z_OK), u.avail_out = 0, !0)
+				}, i.prototype.onData = function(t) {
+					this.chunks.push(t)
+				}, i.prototype.onEnd = function(t) {
+					t === l.Z_OK && ("string" === this.options.to ? this.result = this.chunks.join("") : this.result = s.flattenChunks(
+						this.chunks)), this.chunks = [], this.err = t, this.msg = this.strm.msg
+				}, a.Inflate = i, a.inflate = n, a.inflateRaw = function(t, e) {
+					return e = e || {}, e.raw = !0, n(t, e)
+				}, a.ungzip = n
+			}, {
+				"./utils/common": 3,
+				"./utils/strings": 4,
+				"./zlib/constants": 6,
+				"./zlib/gzheader": 9,
+				"./zlib/inflate": 11,
+				"./zlib/messages": 13,
+				"./zlib/zstream": 15
+			}],
+			3: [function(t, e, a) {
+				"use strict";
+
+				function i(t, e) {
+					return Object.prototype.hasOwnProperty.call(t, e)
+				}
+				var n = "undefined" != typeof Uint8Array && "undefined" != typeof Uint16Array && "undefined" != typeof Int32Array;
+				a.assign = function(t) {
+					for (var e = Array.prototype.slice.call(arguments, 1); e.length;) {
+						var a = e.shift();
+						if (a) {
+							if ("object" != typeof a) throw new TypeError(a + "must be non-object");
+							for (var n in a) i(a, n) && (t[n] = a[n])
+						}
+					}
+					return t
+				}, a.shrinkBuf = function(t, e) {
+					return t.length === e ? t : t.subarray ? t.subarray(0, e) : (t.length = e, t)
+				};
+				var r = {
+						arraySet: function(t, e, a, i, n) {
+							if (e.subarray && t.subarray) t.set(e.subarray(a, a + i), n);
+							else
+								for (var r = 0; r < i; r++) t[n + r] = e[a + r]
+						},
+						flattenChunks: function(t) {
+							var e, a, i, n, r, s;
+							for (i = 0, e = 0, a = t.length; e < a; e++) i += t[e].length;
+							for (s = new Uint8Array(i), n = 0, e = 0, a = t.length; e < a; e++) r = t[e], s.set(r, n), n += r.length;
+							return s
+						}
+					},
+					s = {
+						arraySet: function(t, e, a, i, n) {
+							for (var r = 0; r < i; r++) t[n + r] = e[a + r]
+						},
+						flattenChunks: function(t) {
+							return [].concat.apply([], t)
+						}
+					};
+				a.setTyped = function(t) {
+					t ? (a.Buf8 = Uint8Array, a.Buf16 = Uint16Array, a.Buf32 = Int32Array, a.assign(a, r)) : (a.Buf8 = Array,
+						a.Buf16 =
+						Array, a.Buf32 = Array, a.assign(a, s))
+				}, a.setTyped(n)
+			}, {}],
+			4: [function(t, e, a) {
+				"use strict";
+
+				function i(t, e) {
+					if (e < 65537 && (t.subarray && s || !t.subarray && r)) return String.fromCharCode.apply(null, n.shrinkBuf(
+						t,
+						e));
+					for (var a = "", i = 0; i < e; i++) a += String.fromCharCode(t[i]);
+					return a
+				}
+				var n = t("./common"),
+					r = !0,
+					s = !0;
+				try {
+					String.fromCharCode.apply(null, [0])
+				} catch (t) {
+					r = !1
+				}
+				try {
+					String.fromCharCode.apply(null, new Uint8Array(1))
+				} catch (t) {
+					s = !1
+				}
+				for (var o = new n.Buf8(256), l = 0; l < 256; l++) o[l] = l >= 252 ? 6 : l >= 248 ? 5 : l >= 240 ? 4 : l >=
+					224 ?
+					3 : l >= 192 ? 2 : 1;
+				o[254] = o[254] = 1, a.string2buf = function(t) {
+					var e, a, i, r, s, o = t.length,
+						l = 0;
+					for (r = 0; r < o; r++) 55296 == (64512 & (a = t.charCodeAt(r))) && r + 1 < o && 56320 == (64512 & (i = t.charCodeAt(
+							r + 1))) && (a = 65536 + (a - 55296 << 10) + (i - 56320), r++), l += a < 128 ? 1 : a < 2048 ? 2 : a <
+						65536 ?
+						3 : 4;
+					for (e = new n.Buf8(l), s = 0, r = 0; s < l; r++) 55296 == (64512 & (a = t.charCodeAt(r))) && r + 1 < o &&
+						56320 == (64512 & (i = t.charCodeAt(r + 1))) && (a = 65536 + (a - 55296 << 10) + (i - 56320), r++), a <
+						128 ?
+						e[s++] = a : a < 2048 ? (e[s++] = 192 | a >>> 6, e[s++] = 128 | 63 & a) : a < 65536 ? (e[s++] = 224 | a >>>
+							12, e[s++] = 128 | a >>> 6 & 63, e[s++] = 128 | 63 & a) : (e[s++] = 240 | a >>> 18, e[s++] = 128 | a >>>
+							12 &
+							63, e[s++] = 128 | a >>> 6 & 63, e[s++] = 128 | 63 & a);
+					return e
+				}, a.buf2binstring = function(t) {
+					return i(t, t.length)
+				}, a.binstring2buf = function(t) {
+					for (var e = new n.Buf8(t.length), a = 0, i = e.length; a < i; a++) e[a] = t.charCodeAt(a);
+					return e
+				}, a.buf2string = function(t, e) {
+					var a, n, r, s, l = e || t.length,
+						h = new Array(2 * l);
+					for (n = 0, a = 0; a < l;)
+						if ((r = t[a++]) < 128) h[n++] = r;
+						else if ((s = o[r]) > 4) h[n++] = 65533, a += s - 1;
+					else {
+						for (r &= 2 === s ? 31 : 3 === s ? 15 : 7; s > 1 && a < l;) r = r << 6 | 63 & t[a++], s--;
+						s > 1 ? h[n++] = 65533 : r < 65536 ? h[n++] = r : (r -= 65536, h[n++] = 55296 | r >> 10 & 1023, h[n++] =
+							56320 | 1023 & r)
+					}
+					return i(h, n)
+				}, a.utf8border = function(t, e) {
+					var a;
+					for ((e = e || t.length) > t.length && (e = t.length), a = e - 1; a >= 0 && 128 == (192 & t[a]);) a--;
+					return a < 0 ? e : 0 === a ? e : a + o[t[a]] > e ? a : e
+				}
+			}, {
+				"./common": 3
+			}],
+			5: [function(t, e, a) {
+				"use strict";
+				e.exports = function(t, e, a, i) {
+					for (var n = 65535 & t | 0, r = t >>> 16 & 65535 | 0, s = 0; 0 !== a;) {
+						a -= s = a > 2e3 ? 2e3 : a;
+						do {
+							r = r + (n = n + e[i++] | 0) | 0
+						} while (--s);
+						n %= 65521, r %= 65521
+					}
+					return n | r << 16 | 0
+				}
+			}, {}],
+			6: [function(t, e, a) {
+				"use strict";
+				e.exports = {
+					Z_NO_FLUSH: 0,
+					Z_PARTIAL_FLUSH: 1,
+					Z_SYNC_FLUSH: 2,
+					Z_FULL_FLUSH: 3,
+					Z_FINISH: 4,
+					Z_BLOCK: 5,
+					Z_TREES: 6,
+					Z_OK: 0,
+					Z_STREAM_END: 1,
+					Z_NEED_DICT: 2,
+					Z_ERRNO: -1,
+					Z_STREAM_ERROR: -2,
+					Z_DATA_ERROR: -3,
+					Z_BUF_ERROR: -5,
+					Z_NO_COMPRESSION: 0,
+					Z_BEST_SPEED: 1,
+					Z_BEST_COMPRESSION: 9,
+					Z_DEFAULT_COMPRESSION: -1,
+					Z_FILTERED: 1,
+					Z_HUFFMAN_ONLY: 2,
+					Z_RLE: 3,
+					Z_FIXED: 4,
+					Z_DEFAULT_STRATEGY: 0,
+					Z_BINARY: 0,
+					Z_TEXT: 1,
+					Z_UNKNOWN: 2,
+					Z_DEFLATED: 8
+				}
+			}, {}],
+			7: [function(t, e, a) {
+				"use strict";
+				var i = function() {
+					for (var t, e = [], a = 0; a < 256; a++) {
+						t = a;
+						for (var i = 0; i < 8; i++) t = 1 & t ? 3988292384 ^ t >>> 1 : t >>> 1;
+						e[a] = t
+					}
+					return e
+				}();
+				e.exports = function(t, e, a, n) {
+					var r = i,
+						s = n + a;
+					t ^= -1;
+					for (var o = n; o < s; o++) t = t >>> 8 ^ r[255 & (t ^ e[o])];
+					return -1 ^ t
+				}
+			}, {}],
+			8: [function(t, e, a) {
+				"use strict";
+
+				function i(t, e) {
+					return t.msg = A[e], e
+				}
+
+				function n(t) {
+					return (t << 1) - (t > 4 ? 9 : 0)
+				}
+
+				function r(t) {
+					for (var e = t.length; --e >= 0;) t[e] = 0
+				}
+
+				function s(t) {
+					var e = t.state,
+						a = e.pending;
+					a > t.avail_out && (a = t.avail_out), 0 !== a && (z.arraySet(t.output, e.pending_buf, e.pending_out, a, t.next_out),
+						t.next_out += a, e.pending_out += a, t.total_out += a, t.avail_out -= a, e.pending -= a, 0 === e.pending &&
+						(e.pending_out = 0))
+				}
+
+				function o(t, e) {
+					B._tr_flush_block(t, t.block_start >= 0 ? t.block_start : -1, t.strstart - t.block_start, e), t.block_start =
+						t.strstart, s(t.strm)
+				}
+
+				function l(t, e) {
+					t.pending_buf[t.pending++] = e
+				}
+
+				function h(t, e) {
+					t.pending_buf[t.pending++] = e >>> 8 & 255, t.pending_buf[t.pending++] = 255 & e
+				}
+
+				function d(t, e, a, i) {
+					var n = t.avail_in;
+					return n > i && (n = i), 0 === n ? 0 : (t.avail_in -= n, z.arraySet(e, t.input, t.next_in, n, a), 1 === t.state
+						.wrap ? t.adler = S(t.adler, e, n, a) : 2 === t.state.wrap && (t.adler = E(t.adler, e, n, a)), t.next_in +=
+						n, t.total_in += n, n)
+				}
+
+				function f(t, e) {
+					var a, i, n = t.max_chain_length,
+						r = t.strstart,
+						s = t.prev_length,
+						o = t.nice_match,
+						l = t.strstart > t.w_size - it ? t.strstart - (t.w_size - it) : 0,
+						h = t.window,
+						d = t.w_mask,
+						f = t.prev,
+						_ = t.strstart + at,
+						u = h[r + s - 1],
+						c = h[r + s];
+					t.prev_length >= t.good_match && (n >>= 2), o > t.lookahead && (o = t.lookahead);
+					do {
+						if (a = e, h[a + s] === c && h[a + s - 1] === u && h[a] === h[r] && h[++a] === h[r + 1]) {
+							r += 2, a++;
+							do {} while (h[++r] === h[++a] && h[++r] === h[++a] && h[++r] === h[++a] && h[++r] === h[++a] && h[++r] ===
+								h[++a] && h[++r] === h[++a] && h[++r] === h[++a] && h[++r] === h[++a] && r < _);
+							if (i = at - (_ - r), r = _ - at, i > s) {
+								if (t.match_start = e, s = i, i >= o) break;
+								u = h[r + s - 1], c = h[r + s]
+							}
+						}
+					} while ((e = f[e & d]) > l && 0 != --n);
+					return s <= t.lookahead ? s : t.lookahead
+				}
+
+				function _(t) {
+					var e, a, i, n, r, s = t.w_size;
+					do {
+						if (n = t.window_size - t.lookahead - t.strstart, t.strstart >= s + (s - it)) {
+							z.arraySet(t.window, t.window, s, s, 0), t.match_start -= s, t.strstart -= s, t.block_start -= s, e = a =
+								t.hash_size;
+							do {
+								i = t.head[--e], t.head[e] = i >= s ? i - s : 0
+							} while (--a);
+							e = a = s;
+							do {
+								i = t.prev[--e], t.prev[e] = i >= s ? i - s : 0
+							} while (--a);
+							n += s
+						}
+						if (0 === t.strm.avail_in) break;
+						if (a = d(t.strm, t.window, t.strstart + t.lookahead, n), t.lookahead += a, t.lookahead + t.insert >= et)
+							for (r = t.strstart - t.insert, t.ins_h = t.window[r], t.ins_h = (t.ins_h << t.hash_shift ^ t.window[r +
+									1]) &
+								t.hash_mask; t.insert && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[r + et - 1]) & t.hash_mask, t.prev[
+									r & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = r, r++, t.insert--, !(t.lookahead + t.insert < et));
+							);
+					} while (t.lookahead < it && 0 !== t.strm.avail_in)
+				}
+
+				function u(t, e) {
+					for (var a, i;;) {
+						if (t.lookahead < it) {
+							if (_(t), t.lookahead < it && e === Z) return _t;
+							if (0 === t.lookahead) break
+						}
+						if (a = 0, t.lookahead >= et && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + et - 1]) & t.hash_mask,
+								a = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart), 0 !== a && t.strstart -
+							a <= t.w_size - it && (t.match_length = f(t, a)), t.match_length >= et)
+							if (i = B._tr_tally(t, t.strstart - t.match_start, t.match_length - et), t.lookahead -= t.match_length, t
+								.match_length <=
+								t.max_lazy_match && t.lookahead >= et) {
+								t.match_length--;
+								do {
+									t.strstart++, t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + et - 1]) & t.hash_mask, a = t.prev[
+										t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart
+								} while (0 != --t.match_length);
+								t.strstart++
+							} else t.strstart += t.match_length, t.match_length = 0, t.ins_h = t.window[t.strstart], t.ins_h = (t.ins_h <<
+								t.hash_shift ^ t.window[t.strstart + 1]) & t.hash_mask;
+						else i = B._tr_tally(t, 0, t.window[t.strstart]), t.lookahead--, t.strstart++;
+						if (i && (o(t, !1), 0 === t.strm.avail_out)) return _t
+					}
+					return t.insert = t.strstart < et - 1 ? t.strstart : et - 1, e === N ? (o(t, !0), 0 === t.strm.avail_out ?
+						ct :
+						bt) : t.last_lit && (o(t, !1), 0 === t.strm.avail_out) ? _t : ut
+				}
+
+				function c(t, e) {
+					for (var a, i, n;;) {
+						if (t.lookahead < it) {
+							if (_(t), t.lookahead < it && e === Z) return _t;
+							if (0 === t.lookahead) break
+						}
+						if (a = 0, t.lookahead >= et && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + et - 1]) & t.hash_mask,
+								a = t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart), t.prev_length = t.match_length,
+							t.prev_match = t.match_start, t.match_length = et - 1, 0 !== a && t.prev_length < t.max_lazy_match && t.strstart -
+							a <= t.w_size - it && (t.match_length = f(t, a), t.match_length <= 5 && (t.strategy === H || t.match_length ===
+								et && t.strstart - t.match_start > 4096) && (t.match_length = et - 1)), t.prev_length >= et && t.match_length <=
+							t.prev_length) {
+							n = t.strstart + t.lookahead - et, i = B._tr_tally(t, t.strstart - 1 - t.prev_match, t.prev_length - et),
+								t.lookahead -=
+								t.prev_length - 1, t.prev_length -= 2;
+							do {
+								++t.strstart <= n && (t.ins_h = (t.ins_h << t.hash_shift ^ t.window[t.strstart + et - 1]) & t.hash_mask,
+									a =
+									t.prev[t.strstart & t.w_mask] = t.head[t.ins_h], t.head[t.ins_h] = t.strstart)
+							} while (0 != --t.prev_length);
+							if (t.match_available = 0, t.match_length = et - 1, t.strstart++, i && (o(t, !1), 0 === t.strm.avail_out))
+								return _t
+						} else if (t.match_available) {
+							if ((i = B._tr_tally(t, 0, t.window[t.strstart - 1])) && o(t, !1), t.strstart++, t.lookahead--, 0 === t.strm
+								.avail_out) return _t
+						} else t.match_available = 1, t.strstart++, t.lookahead--
+					}
+					return t.match_available && (i = B._tr_tally(t, 0, t.window[t.strstart - 1]), t.match_available = 0), t.insert =
+						t.strstart < et - 1 ? t.strstart : et - 1, e === N ? (o(t, !0), 0 === t.strm.avail_out ? ct : bt) : t.last_lit &&
+						(o(t, !1), 0 === t.strm.avail_out) ? _t : ut
+				}
+
+				function b(t, e) {
+					for (var a, i, n, r, s = t.window;;) {
+						if (t.lookahead <= at) {
+							if (_(t), t.lookahead <= at && e === Z) return _t;
+							if (0 === t.lookahead) break
+						}
+						if (t.match_length = 0, t.lookahead >= et && t.strstart > 0 && (n = t.strstart - 1, (i = s[n]) === s[++n] &&
+								i === s[++n] && i === s[++n])) {
+							r = t.strstart + at;
+							do {} while (i === s[++n] && i === s[++n] && i === s[++n] && i === s[++n] && i === s[++n] && i === s[++n] &&
+								i === s[++n] && i === s[++n] && n < r);
+							t.match_length = at - (r - n), t.match_length > t.lookahead && (t.match_length = t.lookahead)
+						}
+						if (t.match_length >= et ? (a = B._tr_tally(t, 1, t.match_length - et), t.lookahead -= t.match_length, t.strstart +=
+								t.match_length, t.match_length = 0) : (a = B._tr_tally(t, 0, t.window[t.strstart]), t.lookahead--, t.strstart++),
+							a && (o(t, !1), 0 === t.strm.avail_out)) return _t
+					}
+					return t.insert = 0, e === N ? (o(t, !0), 0 === t.strm.avail_out ? ct : bt) : t.last_lit && (o(t, !1), 0 ===
+						t.strm.avail_out) ? _t : ut
+				}
+
+				function g(t, e) {
+					for (var a;;) {
+						if (0 === t.lookahead && (_(t), 0 === t.lookahead)) {
+							if (e === Z) return _t;
+							break
+						}
+						if (t.match_length = 0, a = B._tr_tally(t, 0, t.window[t.strstart]), t.lookahead--, t.strstart++, a && (o(
+								t,
+								!1), 0 === t.strm.avail_out)) return _t
+					}
+					return t.insert = 0, e === N ? (o(t, !0), 0 === t.strm.avail_out ? ct : bt) : t.last_lit && (o(t, !1), 0 ===
+						t.strm.avail_out) ? _t : ut
+				}
+
+				function m(t, e, a, i, n) {
+					this.good_length = t, this.max_lazy = e, this.nice_length = a, this.max_chain = i, this.func = n
+				}
+
+				function w(t) {
+					t.window_size = 2 * t.w_size, r(t.head), t.max_lazy_match = x[t.level].max_lazy, t.good_match = x[t.level].good_length,
+						t.nice_match = x[t.level].nice_length, t.max_chain_length = x[t.level].max_chain, t.strstart = 0, t.block_start =
+						0, t.lookahead = 0, t.insert = 0, t.match_length = t.prev_length = et - 1, t.match_available = 0, t.ins_h =
+						0
+				}
+
+				function p() {
+					this.strm = null, this.status = 0, this.pending_buf = null, this.pending_buf_size = 0, this.pending_out = 0,
+						this.pending = 0, this.wrap = 0, this.gzhead = null, this.gzindex = 0, this.method = q, this.last_flush = -
+						1,
+						this.w_size = 0, this.w_bits = 0, this.w_mask = 0, this.window = null, this.window_size = 0, this.prev =
+						null,
+						this.head = null, this.ins_h = 0, this.hash_size = 0, this.hash_bits = 0, this.hash_mask = 0, this.hash_shift =
+						0, this.block_start = 0, this.match_length = 0, this.prev_match = 0, this.match_available = 0, this.strstart =
+						0, this.match_start = 0, this.lookahead = 0, this.prev_length = 0, this.max_chain_length = 0, this.max_lazy_match =
+						0, this.level = 0, this.strategy = 0, this.good_match = 0, this.nice_match = 0, this.dyn_ltree = new z.Buf16(
+							2 * $), this.dyn_dtree = new z.Buf16(2 * (2 * Q + 1)), this.bl_tree = new z.Buf16(2 * (2 * V + 1)), r(
+							this.dyn_ltree),
+						r(this.dyn_dtree), r(this.bl_tree), this.l_desc = null, this.d_desc = null, this.bl_desc = null, this.bl_count =
+						new z.Buf16(tt + 1), this.heap = new z.Buf16(2 * J + 1), r(this.heap), this.heap_len = 0, this.heap_max =
+						0,
+						this.depth = new z.Buf16(2 * J + 1), r(this.depth), this.l_buf = 0, this.lit_bufsize = 0, this.last_lit =
+						0,
+						this.d_buf = 0, this.opt_len = 0, this.static_len = 0, this.matches = 0, this.insert = 0, this.bi_buf = 0,
+						this.bi_valid = 0
+				}
+
+				function v(t) {
+					var e;
+					return t && t.state ? (t.total_in = t.total_out = 0, t.data_type = Y, e = t.state, e.pending = 0, e.pending_out =
+						0, e.wrap < 0 && (e.wrap = -e.wrap), e.status = e.wrap ? rt : dt, t.adler = 2 === e.wrap ? 0 : 1, e.last_flush =
+						Z, B._tr_init(e), D) : i(t, U)
+				}
+
+				function k(t) {
+					var e = v(t);
+					return e === D && w(t.state), e
+				}
+
+				function y(t, e, a, n, r, s) {
+					if (!t) return U;
+					var o = 1;
+					if (e === L && (e = 6), n < 0 ? (o = 0, n = -n) : n > 15 && (o = 2, n -= 16), r < 1 || r > G || a !== q ||
+						n <
+						8 || n > 15 || e < 0 || e > 9 || s < 0 || s > M) return i(t, U);
+					8 === n && (n = 9);
+					var l = new p;
+					return t.state = l, l.strm = t, l.wrap = o, l.gzhead = null, l.w_bits = n, l.w_size = 1 << l.w_bits, l.w_mask =
+						l.w_size - 1, l.hash_bits = r + 7, l.hash_size = 1 << l.hash_bits, l.hash_mask = l.hash_size - 1, l.hash_shift = ~
+						~((l.hash_bits + et - 1) / et), l.window = new z.Buf8(2 * l.w_size), l.head = new z.Buf16(l.hash_size), l.prev =
+						new z.Buf16(l.w_size), l.lit_bufsize = 1 << r + 6, l.pending_buf_size = 4 * l.lit_bufsize, l.pending_buf =
+						new z.Buf8(l.pending_buf_size), l.d_buf = 1 * l.lit_bufsize, l.l_buf = 3 * l.lit_bufsize, l.level = e, l.strategy =
+						s, l.method = a, k(t)
+				}
+				var x, z = t("../utils/common"),
+					B = t("./trees"),
+					S = t("./adler32"),
+					E = t("./crc32"),
+					A = t("./messages"),
+					Z = 0,
+					R = 1,
+					C = 3,
+					N = 4,
+					O = 5,
+					D = 0,
+					I = 1,
+					U = -2,
+					T = -3,
+					F = -5,
+					L = -1,
+					H = 1,
+					j = 2,
+					K = 3,
+					M = 4,
+					P = 0,
+					Y = 2,
+					q = 8,
+					G = 9,
+					X = 15,
+					W = 8,
+					J = 286,
+					Q = 30,
+					V = 19,
+					$ = 2 * J + 1,
+					tt = 15,
+					et = 3,
+					at = 258,
+					it = at + et + 1,
+					nt = 32,
+					rt = 42,
+					st = 69,
+					ot = 73,
+					lt = 91,
+					ht = 103,
+					dt = 113,
+					ft = 666,
+					_t = 1,
+					ut = 2,
+					ct = 3,
+					bt = 4,
+					gt = 3;
+				x = [new m(0, 0, 0, 0, function(t, e) {
+					var a = 65535;
+					for (a > t.pending_buf_size - 5 && (a = t.pending_buf_size - 5);;) {
+						if (t.lookahead <= 1) {
+							if (_(t), 0 === t.lookahead && e === Z) return _t;
+							if (0 === t.lookahead) break
+						}
+						t.strstart += t.lookahead, t.lookahead = 0;
+						var i = t.block_start + a;
+						if ((0 === t.strstart || t.strstart >= i) && (t.lookahead = t.strstart - i, t.strstart = i, o(t, !1), 0 ===
+								t.strm.avail_out)) return _t;
+						if (t.strstart - t.block_start >= t.w_size - it && (o(t, !1), 0 === t.strm.avail_out)) return _t
+					}
+					return t.insert = 0, e === N ? (o(t, !0), 0 === t.strm.avail_out ? ct : bt) : (t.strstart > t.block_start &&
+						(o(t, !1), t.strm.avail_out), _t)
+				}), new m(4, 4, 8, 4, u), new m(4, 5, 16, 8, u), new m(4, 6, 32, 32, u), new m(4, 4, 16, 16, c), new m(8,
+					16,
+					32, 32, c), new m(8, 16, 128, 128, c), new m(8, 32, 128, 256, c), new m(32, 128, 258, 1024, c), new m(32,
+					258, 258, 4096, c)], a.deflateInit = function(t, e) {
+					return y(t, e, q, X, W, P)
+				}, a.deflateInit2 = y, a.deflateReset = k, a.deflateResetKeep = v, a.deflateSetHeader = function(t, e) {
+					return t && t.state ? 2 !== t.state.wrap ? U : (t.state.gzhead = e, D) : U
+				}, a.deflate = function(t, e) {
+					var a, o, d, f;
+					if (!t || !t.state || e > O || e < 0) return t ? i(t, U) : U;
+					if (o = t.state, !t.output || !t.input && 0 !== t.avail_in || o.status === ft && e !== N) return i(t, 0 ===
+						t.avail_out ? F : U);
+					if (o.strm = t, a = o.last_flush, o.last_flush = e, o.status === rt)
+						if (2 === o.wrap) t.adler = 0, l(o, 31), l(o, 139), l(o, 8), o.gzhead ? (l(o, (o.gzhead.text ? 1 : 0) + (
+								o.gzhead
+								.hcrc ? 2 : 0) + (o.gzhead.extra ? 4 : 0) + (o.gzhead.name ? 8 : 0) + (o.gzhead.comment ? 16 : 0)), l(
+								o,
+								255 & o.gzhead.time), l(o, o.gzhead.time >> 8 & 255), l(o, o.gzhead.time >> 16 & 255), l(o, o.gzhead.time >>
+								24 & 255), l(o, 9 === o.level ? 2 : o.strategy >= j || o.level < 2 ? 4 : 0), l(o, 255 & o.gzhead.os),
+							o.gzhead
+							.extra && o.gzhead.extra.length && (l(o, 255 & o.gzhead.extra.length), l(o, o.gzhead.extra.length >> 8 &
+								255)), o.gzhead.hcrc && (t.adler = E(t.adler, o.pending_buf, o.pending, 0)), o.gzindex = 0, o.status =
+							st
+						) : (l(o, 0), l(o, 0), l(o, 0), l(o, 0), l(o, 0), l(o, 9 === o.level ? 2 : o.strategy >= j || o.level <
+							2 ?
+							4 : 0), l(o, gt), o.status = dt);
+						else {
+							var _ = q + (o.w_bits - 8 << 4) << 8;
+							_ |= (o.strategy >= j || o.level < 2 ? 0 : o.level < 6 ? 1 : 6 === o.level ? 2 : 3) << 6, 0 !== o.strstart &&
+								(_ |= nt), _ += 31 - _ % 31, o.status = dt, h(o, _), 0 !== o.strstart && (h(o, t.adler >>> 16), h(o,
+									65535 &
+									t.adler)), t.adler = 1
+						} if (o.status === st)
+						if (o.gzhead.extra) {
+							for (d = o.pending; o.gzindex < (65535 & o.gzhead.extra.length) && (o.pending !== o.pending_buf_size ||
+									(o.gzhead
+										.hcrc && o.pending > d && (t.adler = E(t.adler, o.pending_buf, o.pending - d, d)), s(t), d = o.pending,
+										o.pending !== o.pending_buf_size));) l(o, 255 & o.gzhead.extra[o.gzindex]), o.gzindex++;
+							o.gzhead.hcrc && o.pending > d && (t.adler = E(t.adler, o.pending_buf, o.pending - d, d)), o.gzindex ===
+								o.gzhead
+								.extra.length && (o.gzindex = 0, o.status = ot)
+						} else o.status = ot;
+					if (o.status === ot)
+						if (o.gzhead.name) {
+							d = o.pending;
+							do {
+								if (o.pending === o.pending_buf_size && (o.gzhead.hcrc && o.pending > d && (t.adler = E(t.adler, o.pending_buf,
+										o.pending - d, d)), s(t), d = o.pending, o.pending === o.pending_buf_size)) {
+									f = 1;
+									break
+								}
+								f = o.gzindex < o.gzhead.name.length ? 255 & o.gzhead.name.charCodeAt(o.gzindex++) : 0, l(o, f)
+							} while (0 !== f);
+							o.gzhead.hcrc && o.pending > d && (t.adler = E(t.adler, o.pending_buf, o.pending - d, d)), 0 === f && (o
+								.gzindex =
+								0, o.status = lt)
+						} else o.status = lt;
+					if (o.status === lt)
+						if (o.gzhead.comment) {
+							d = o.pending;
+							do {
+								if (o.pending === o.pending_buf_size && (o.gzhead.hcrc && o.pending > d && (t.adler = E(t.adler, o.pending_buf,
+										o.pending - d, d)), s(t), d = o.pending, o.pending === o.pending_buf_size)) {
+									f = 1;
+									break
+								}
+								f = o.gzindex < o.gzhead.comment.length ? 255 & o.gzhead.comment.charCodeAt(o.gzindex++) : 0, l(o, f)
+							} while (0 !== f);
+							o.gzhead.hcrc && o.pending > d && (t.adler = E(t.adler, o.pending_buf, o.pending - d, d)), 0 === f && (o
+								.status =
+								ht)
+						} else o.status = ht;
+					if (o.status === ht && (o.gzhead.hcrc ? (o.pending + 2 > o.pending_buf_size && s(t), o.pending + 2 <= o.pending_buf_size &&
+							(l(o, 255 & t.adler), l(o, t.adler >> 8 & 255), t.adler = 0, o.status = dt)) : o.status = dt), 0 !== o.pending) {
+						if (s(t), 0 === t.avail_out) return o.last_flush = -1, D
+					} else if (0 === t.avail_in && n(e) <= n(a) && e !== N) return i(t, F);
+					if (o.status === ft && 0 !== t.avail_in) return i(t, F);
+					if (0 !== t.avail_in || 0 !== o.lookahead || e !== Z && o.status !== ft) {
+						var u = o.strategy === j ? g(o, e) : o.strategy === K ? b(o, e) : x[o.level].func(o, e);
+						if (u !== ct && u !== bt || (o.status = ft), u === _t || u === ct) return 0 === t.avail_out && (o.last_flush = -
+							1), D;
+						if (u === ut && (e === R ? B._tr_align(o) : e !== O && (B._tr_stored_block(o, 0, 0, !1), e === C && (r(o.head),
+								0 === o.lookahead && (o.strstart = 0, o.block_start = 0, o.insert = 0))), s(t), 0 === t.avail_out))
+							return o
+								.last_flush = -1, D
+					}
+					return e !== N ? D : o.wrap <= 0 ? I : (2 === o.wrap ? (l(o, 255 & t.adler), l(o, t.adler >> 8 & 255), l(o,
+							t
+							.adler >> 16 & 255), l(o, t.adler >> 24 & 255), l(o, 255 & t.total_in), l(o, t.total_in >> 8 & 255), l(
+							o,
+							t.total_in >> 16 & 255), l(o, t.total_in >> 24 & 255)) : (h(o, t.adler >>> 16), h(o, 65535 & t.adler)),
+						s(
+							t), o.wrap > 0 && (o.wrap = -o.wrap), 0 !== o.pending ? D : I)
+				}, a.deflateEnd = function(t) {
+					var e;
+					return t && t.state ? (e = t.state.status) !== rt && e !== st && e !== ot && e !== lt && e !== ht && e !==
+						dt &&
+						e !== ft ? i(t, U) : (t.state = null, e === dt ? i(t, T) : D) : U
+				}, a.deflateSetDictionary = function(t, e) {
+					var a, i, n, s, o, l, h, d, f = e.length;
+					if (!t || !t.state) return U;
+					if (a = t.state, 2 === (s = a.wrap) || 1 === s && a.status !== rt || a.lookahead) return U;
+					for (1 === s && (t.adler = S(t.adler, e, f, 0)), a.wrap = 0, f >= a.w_size && (0 === s && (r(a.head), a.strstart =
+								0, a.block_start = 0, a.insert = 0), d = new z.Buf8(a.w_size), z.arraySet(d, e, f - a.w_size, a.w_size,
+								0),
+							e = d, f = a.w_size), o = t.avail_in, l = t.next_in, h = t.input, t.avail_in = f, t.next_in = 0, t.input =
+						e, _(a); a.lookahead >= et;) {
+						i = a.strstart, n = a.lookahead - (et - 1);
+						do {
+							a.ins_h = (a.ins_h << a.hash_shift ^ a.window[i + et - 1]) & a.hash_mask, a.prev[i & a.w_mask] = a.head[
+									a.ins_h],
+								a.head[a.ins_h] = i, i++
+						} while (--n);
+						a.strstart = i, a.lookahead = et - 1, _(a)
+					}
+					return a.strstart += a.lookahead, a.block_start = a.strstart, a.insert = a.lookahead, a.lookahead = 0, a.match_length =
+						a.prev_length = et - 1, a.match_available = 0, t.next_in = l, t.input = h, t.avail_in = o, a.wrap = s, D
+				}, a.deflateInfo = "pako deflate (from Nodeca project)"
+			}, {
+				"../utils/common": 3,
+				"./adler32": 5,
+				"./crc32": 7,
+				"./messages": 13,
+				"./trees": 14
+			}],
+			9: [function(t, e, a) {
+				"use strict";
+				e.exports = function() {
+					this.text = 0, this.time = 0, this.xflags = 0, this.os = 0, this.extra = null, this.extra_len = 0, this.name =
+						"", this.comment = "", this.hcrc = 0, this.done = !1
+				}
+			}, {}],
+			10: [function(t, e, a) {
+				"use strict";
+				e.exports = function(t, e) {
+					var a, i, n, r, s, o, l, h, d, f, _, u, c, b, g, m, w, p, v, k, y, x, z, B, S;
+					a = t.state, i = t.next_in, B = t.input, n = i + (t.avail_in - 5), r = t.next_out, S = t.output, s = r - (
+							e -
+							t.avail_out), o = r + (t.avail_out - 257), l = a.dmax, h = a.wsize, d = a.whave, f = a.wnext, _ = a.window,
+						u = a.hold, c = a.bits, b = a.lencode, g = a.distcode, m = (1 << a.lenbits) - 1, w = (1 << a.distbits) -
+						1;
+					t: do {
+						c < 15 && (u += B[i++] << c, c += 8, u += B[i++] << c, c += 8), p = b[u & m];
+						e: for (;;) {
+							if (v = p >>> 24, u >>>= v, c -= v, 0 === (v = p >>> 16 & 255)) S[r++] = 65535 & p;
+							else {
+								if (!(16 & v)) {
+									if (0 == (64 & v)) {
+										p = b[(65535 & p) + (u & (1 << v) - 1)];
+										continue e
+									}
+									if (32 & v) {
+										a.mode = 12;
+										break t
+									}
+									t.msg = "invalid literal/length code", a.mode = 30;
+									break t
+								}
+								k = 65535 & p, (v &= 15) && (c < v && (u += B[i++] << c, c += 8), k += u & (1 << v) - 1, u >>>= v, c -=
+									v), c < 15 && (u += B[i++] << c, c += 8, u += B[i++] << c, c += 8), p = g[u & w];
+								a: for (;;) {
+									if (v = p >>> 24, u >>>= v, c -= v, !(16 & (v = p >>> 16 & 255))) {
+										if (0 == (64 & v)) {
+											p = g[(65535 & p) + (u & (1 << v) - 1)];
+											continue a
+										}
+										t.msg = "invalid distance code", a.mode = 30;
+										break t
+									}
+									if (y = 65535 & p, v &= 15, c < v && (u += B[i++] << c, (c += 8) < v && (u += B[i++] << c, c += 8)),
+										(
+											y += u & (1 << v) - 1) > l) {
+										t.msg = "invalid distance too far back", a.mode = 30;
+										break t
+									}
+									if (u >>>= v, c -= v, v = r - s, y > v) {
+										if ((v = y - v) > d && a.sane) {
+											t.msg = "invalid distance too far back", a.mode = 30;
+											break t
+										}
+										if (x = 0, z = _, 0 === f) {
+											if (x += h - v, v < k) {
+												k -= v;
+												do {
+													S[r++] = _[x++]
+												} while (--v);
+												x = r - y, z = S
+											}
+										} else if (f < v) {
+											if (x += h + f - v, (v -= f) < k) {
+												k -= v;
+												do {
+													S[r++] = _[x++]
+												} while (--v);
+												if (x = 0, f < k) {
+													k -= v = f;
+													do {
+														S[r++] = _[x++]
+													} while (--v);
+													x = r - y, z = S
+												}
+											}
+										} else if (x += f - v, v < k) {
+											k -= v;
+											do {
+												S[r++] = _[x++]
+											} while (--v);
+											x = r - y, z = S
+										}
+										for (; k > 2;) S[r++] = z[x++], S[r++] = z[x++], S[r++] = z[x++], k -= 3;
+										k && (S[r++] = z[x++], k > 1 && (S[r++] = z[x++]))
+									} else {
+										x = r - y;
+										do {
+											S[r++] = S[x++], S[r++] = S[x++], S[r++] = S[x++], k -= 3
+										} while (k > 2);
+										k && (S[r++] = S[x++], k > 1 && (S[r++] = S[x++]))
+									}
+									break
+								}
+							}
+							break
+						}
+					} while (i < n && r < o);
+					i -= k = c >> 3, u &= (1 << (c -= k << 3)) - 1, t.next_in = i, t.next_out = r, t.avail_in = i < n ? n - i +
+						5 :
+						5 - (i - n), t.avail_out = r < o ? o - r + 257 : 257 - (r - o), a.hold = u, a.bits = c
+				}
+			}, {}],
+			11: [function(t, e, a) {
+				"use strict";
+
+				function i(t) {
+					return (t >>> 24 & 255) + (t >>> 8 & 65280) + ((65280 & t) << 8) + ((255 & t) << 24)
+				}
+
+				function n() {
+					this.mode = 0, this.last = !1, this.wrap = 0, this.havedict = !1, this.flags = 0, this.dmax = 0, this.check =
+						0, this.total = 0, this.head = null, this.wbits = 0, this.wsize = 0, this.whave = 0, this.wnext = 0, this.window =
+						null, this.hold = 0, this.bits = 0, this.length = 0, this.offset = 0, this.extra = 0, this.lencode = null,
+						this.distcode = null, this.lenbits = 0, this.distbits = 0, this.ncode = 0, this.nlen = 0, this.ndist = 0,
+						this.have = 0, this.next = null, this.lens = new u.Buf16(320), this.work = new u.Buf16(288), this.lendyn =
+						null, this.distdyn = null, this.sane = 0, this.back = 0, this.was = 0
+				}
+
+				function r(t) {
+					var e;
+					return t && t.state ? (e = t.state, t.total_in = t.total_out = e.total = 0, t.msg = "", e.wrap && (t.adler =
+							1 &
+							e.wrap), e.mode = N, e.last = 0, e.havedict = 0, e.dmax = 32768, e.head = null, e.hold = 0, e.bits = 0,
+						e.lencode =
+						e.lendyn = new u.Buf32(dt), e.distcode = e.distdyn = new u.Buf32(ft), e.sane = 1, e.back = -1, z) : E
+				}
+
+				function s(t) {
+					var e;
+					return t && t.state ? (e = t.state, e.wsize = 0, e.whave = 0, e.wnext = 0, r(t)) : E
+				}
+
+				function o(t, e) {
+					var a, i;
+					return t && t.state ? (i = t.state, e < 0 ? (a = 0, e = -e) : (a = 1 + (e >> 4), e < 48 && (e &= 15)), e &&
+							(e <
+								8 || e > 15) ? E : (null !== i.window && i.wbits !== e && (i.window = null), i.wrap = a, i.wbits = e, s(
+								t))) :
+						E
+				}
+
+				function l(t, e) {
+					var a, i;
+					return t ? (i = new n, t.state = i, i.window = null, (a = o(t, e)) !== z && (t.state = null), a) : E
+				}
+
+				function h(t) {
+					if (ut) {
+						var e;
+						for (f = new u.Buf32(512), _ = new u.Buf32(32), e = 0; e < 144;) t.lens[e++] = 8;
+						for (; e < 256;) t.lens[e++] = 9;
+						for (; e < 280;) t.lens[e++] = 7;
+						for (; e < 288;) t.lens[e++] = 8;
+						for (m(p, t.lens, 0, 288, f, 0, t.work, {
+								bits: 9
+							}), e = 0; e < 32;) t.lens[e++] = 5;
+						m(v, t.lens, 0, 32, _, 0, t.work, {
+							bits: 5
+						}), ut = !1
+					}
+					t.lencode = f, t.lenbits = 9, t.distcode = _, t.distbits = 5
+				}
+
+				function d(t, e, a, i) {
+					var n, r = t.state;
+					return null === r.window && (r.wsize = 1 << r.wbits, r.wnext = 0, r.whave = 0, r.window = new u.Buf8(r.wsize)),
+						i >= r.wsize ? (u.arraySet(r.window, e, a - r.wsize, r.wsize, 0), r.wnext = 0, r.whave = r.wsize) : ((n =
+							r.wsize -
+							r.wnext) > i && (n = i), u.arraySet(r.window, e, a - i, n, r.wnext), (i -= n) ? (u.arraySet(r.window, e,
+							a -
+							i, i, 0), r.wnext = i, r.whave = r.wsize) : (r.wnext += n, r.wnext === r.wsize && (r.wnext = 0), r.whave <
+							r.wsize && (r.whave += n))), 0
+				}
+				var f, _, u = t("../utils/common"),
+					c = t("./adler32"),
+					b = t("./crc32"),
+					g = t("./inffast"),
+					m = t("./inftrees"),
+					w = 0,
+					p = 1,
+					v = 2,
+					k = 4,
+					y = 5,
+					x = 6,
+					z = 0,
+					B = 1,
+					S = 2,
+					E = -2,
+					A = -3,
+					Z = -4,
+					R = -5,
+					C = 8,
+					N = 1,
+					O = 2,
+					D = 3,
+					I = 4,
+					U = 5,
+					T = 6,
+					F = 7,
+					L = 8,
+					H = 9,
+					j = 10,
+					K = 11,
+					M = 12,
+					P = 13,
+					Y = 14,
+					q = 15,
+					G = 16,
+					X = 17,
+					W = 18,
+					J = 19,
+					Q = 20,
+					V = 21,
+					$ = 22,
+					tt = 23,
+					et = 24,
+					at = 25,
+					it = 26,
+					nt = 27,
+					rt = 28,
+					st = 29,
+					ot = 30,
+					lt = 31,
+					ht = 32,
+					dt = 852,
+					ft = 592,
+					_t = 15,
+					ut = !0;
+				a.inflateReset = s, a.inflateReset2 = o, a.inflateResetKeep = r, a.inflateInit = function(t) {
+					return l(t, _t)
+				}, a.inflateInit2 = l, a.inflate = function(t, e) {
+					var a, n, r, s, o, l, f, _, dt, ft, _t, ut, ct, bt, gt, mt, wt, pt, vt, kt, yt, xt, zt, Bt, St = 0,
+						Et = new u.Buf8(4),
+						At = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];
+					if (!t || !t.state || !t.output || !t.input && 0 !== t.avail_in) return E;
+					(a = t.state).mode === M && (a.mode = P), o = t.next_out, r = t.output, f = t.avail_out, s = t.next_in, n =
+						t
+						.input, l = t.avail_in, _ = a.hold, dt = a.bits, ft = l, _t = f, xt = z;
+					t: for (;;) switch (a.mode) {
+						case N:
+							if (0 === a.wrap) {
+								a.mode = P;
+								break
+							}
+							for (; dt < 16;) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							if (2 & a.wrap && 35615 === _) {
+								a.check = 0, Et[0] = 255 & _, Et[1] = _ >>> 8 & 255, a.check = b(a.check, Et, 2, 0), _ = 0, dt = 0, a
+									.mode =
+									O;
+								break
+							}
+							if (a.flags = 0, a.head && (a.head.done = !1), !(1 & a.wrap) || (((255 & _) << 8) + (_ >> 8)) % 31) {
+								t.msg = "incorrect header check", a.mode = ot;
+								break
+							}
+							if ((15 & _) !== C) {
+								t.msg = "unknown compression method", a.mode = ot;
+								break
+							}
+							if (_ >>>= 4, dt -= 4, yt = 8 + (15 & _), 0 === a.wbits) a.wbits = yt;
+							else if (yt > a.wbits) {
+								t.msg = "invalid window size", a.mode = ot;
+								break
+							}
+							a.dmax = 1 << yt, t.adler = a.check = 1, a.mode = 512 & _ ? j : M, _ = 0, dt = 0;
+							break;
+						case O:
+							for (; dt < 16;) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							if (a.flags = _, (255 & a.flags) !== C) {
+								t.msg = "unknown compression method", a.mode = ot;
+								break
+							}
+							if (57344 & a.flags) {
+								t.msg = "unknown header flags set", a.mode = ot;
+								break
+							}
+							a.head && (a.head.text = _ >> 8 & 1), 512 & a.flags && (Et[0] = 255 & _, Et[1] = _ >>> 8 & 255, a.check =
+								b(a.check, Et, 2, 0)), _ = 0, dt = 0, a.mode = D;
+						case D:
+							for (; dt < 32;) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							a.head && (a.head.time = _), 512 & a.flags && (Et[0] = 255 & _, Et[1] = _ >>> 8 & 255, Et[2] = _ >>>
+								16 &
+								255, Et[3] = _ >>> 24 & 255, a.check = b(a.check, Et, 4, 0)), _ = 0, dt = 0, a.mode = I;
+						case I:
+							for (; dt < 16;) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							a.head && (a.head.xflags = 255 & _, a.head.os = _ >> 8), 512 & a.flags && (Et[0] = 255 & _, Et[1] = _ >>>
+								8 & 255, a.check = b(a.check, Et, 2, 0)), _ = 0, dt = 0, a.mode = U;
+						case U:
+							if (1024 & a.flags) {
+								for (; dt < 16;) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								a.length = _, a.head && (a.head.extra_len = _), 512 & a.flags && (Et[0] = 255 & _, Et[1] = _ >>> 8 &
+									255,
+									a.check = b(a.check, Et, 2, 0)), _ = 0, dt = 0
+							} else a.head && (a.head.extra = null);
+							a.mode = T;
+						case T:
+							if (1024 & a.flags && ((ut = a.length) > l && (ut = l), ut && (a.head && (yt = a.head.extra_len - a.length,
+										a.head.extra || (a.head.extra = new Array(a.head.extra_len)), u.arraySet(a.head.extra, n, s, ut,
+											yt)),
+									512 & a.flags && (a.check = b(a.check, n, ut, s)), l -= ut, s += ut, a.length -= ut), a.length))
+								break t;
+							a.length = 0, a.mode = F;
+						case F:
+							if (2048 & a.flags) {
+								if (0 === l) break t;
+								ut = 0;
+								do {
+									yt = n[s + ut++], a.head && yt && a.length < 65536 && (a.head.name += String.fromCharCode(yt))
+								} while (yt && ut < l);
+								if (512 & a.flags && (a.check = b(a.check, n, ut, s)), l -= ut, s += ut, yt) break t
+							} else a.head && (a.head.name = null);
+							a.length = 0, a.mode = L;
+						case L:
+							if (4096 & a.flags) {
+								if (0 === l) break t;
+								ut = 0;
+								do {
+									yt = n[s + ut++], a.head && yt && a.length < 65536 && (a.head.comment += String.fromCharCode(yt))
+								} while (yt && ut < l);
+								if (512 & a.flags && (a.check = b(a.check, n, ut, s)), l -= ut, s += ut, yt) break t
+							} else a.head && (a.head.comment = null);
+							a.mode = H;
+						case H:
+							if (512 & a.flags) {
+								for (; dt < 16;) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								if (_ !== (65535 & a.check)) {
+									t.msg = "header crc mismatch", a.mode = ot;
+									break
+								}
+								_ = 0, dt = 0
+							}
+							a.head && (a.head.hcrc = a.flags >> 9 & 1, a.head.done = !0), t.adler = a.check = 0, a.mode = M;
+							break;
+						case j:
+							for (; dt < 32;) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							t.adler = a.check = i(_), _ = 0, dt = 0, a.mode = K;
+						case K:
+							if (0 === a.havedict) return t.next_out = o, t.avail_out = f, t.next_in = s, t.avail_in = l, a.hold =
+								_,
+								a.bits = dt, S;
+							t.adler = a.check = 1, a.mode = M;
+						case M:
+							if (e === y || e === x) break t;
+						case P:
+							if (a.last) {
+								_ >>>= 7 & dt, dt -= 7 & dt, a.mode = nt;
+								break
+							}
+							for (; dt < 3;) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							switch (a.last = 1 & _, _ >>>= 1, dt -= 1, 3 & _) {
+								case 0:
+									a.mode = Y;
+									break;
+								case 1:
+									if (h(a), a.mode = Q, e === x) {
+										_ >>>= 2, dt -= 2;
+										break t
+									}
+									break;
+								case 2:
+									a.mode = X;
+									break;
+								case 3:
+									t.msg = "invalid block type", a.mode = ot
+							}
+							_ >>>= 2, dt -= 2;
+							break;
+						case Y:
+							for (_ >>>= 7 & dt, dt -= 7 & dt; dt < 32;) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							if ((65535 & _) != (_ >>> 16 ^ 65535)) {
+								t.msg = "invalid stored block lengths", a.mode = ot;
+								break
+							}
+							if (a.length = 65535 & _, _ = 0, dt = 0, a.mode = q, e === x) break t;
+						case q:
+							a.mode = G;
+						case G:
+							if (ut = a.length) {
+								if (ut > l && (ut = l), ut > f && (ut = f), 0 === ut) break t;
+								u.arraySet(r, n, s, ut, o), l -= ut, s += ut, f -= ut, o += ut, a.length -= ut;
+								break
+							}
+							a.mode = M;
+							break;
+						case X:
+							for (; dt < 14;) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							if (a.nlen = 257 + (31 & _), _ >>>= 5, dt -= 5, a.ndist = 1 + (31 & _), _ >>>= 5, dt -= 5, a.ncode = 4 +
+								(15 & _), _ >>>= 4, dt -= 4, a.nlen > 286 || a.ndist > 30) {
+								t.msg = "too many length or distance symbols", a.mode = ot;
+								break
+							}
+							a.have = 0, a.mode = W;
+						case W:
+							for (; a.have < a.ncode;) {
+								for (; dt < 3;) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								a.lens[At[a.have++]] = 7 & _, _ >>>= 3, dt -= 3
+							}
+							for (; a.have < 19;) a.lens[At[a.have++]] = 0;
+							if (a.lencode = a.lendyn, a.lenbits = 7, zt = {
+									bits: a.lenbits
+								}, xt = m(w, a.lens, 0, 19, a.lencode, 0, a.work, zt), a.lenbits = zt.bits, xt) {
+								t.msg = "invalid code lengths set", a.mode = ot;
+								break
+							}
+							a.have = 0, a.mode = J;
+						case J:
+							for (; a.have < a.nlen + a.ndist;) {
+								for (; St = a.lencode[_ & (1 << a.lenbits) - 1], gt = St >>> 24, mt = St >>> 16 & 255, wt = 65535 &
+									St,
+									!(gt <= dt);) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								if (wt < 16) _ >>>= gt, dt -= gt, a.lens[a.have++] = wt;
+								else {
+									if (16 === wt) {
+										for (Bt = gt + 2; dt < Bt;) {
+											if (0 === l) break t;
+											l--, _ += n[s++] << dt, dt += 8
+										}
+										if (_ >>>= gt, dt -= gt, 0 === a.have) {
+											t.msg = "invalid bit length repeat", a.mode = ot;
+											break
+										}
+										yt = a.lens[a.have - 1], ut = 3 + (3 & _), _ >>>= 2, dt -= 2
+									} else if (17 === wt) {
+										for (Bt = gt + 3; dt < Bt;) {
+											if (0 === l) break t;
+											l--, _ += n[s++] << dt, dt += 8
+										}
+										dt -= gt, yt = 0, ut = 3 + (7 & (_ >>>= gt)), _ >>>= 3, dt -= 3
+									} else {
+										for (Bt = gt + 7; dt < Bt;) {
+											if (0 === l) break t;
+											l--, _ += n[s++] << dt, dt += 8
+										}
+										dt -= gt, yt = 0, ut = 11 + (127 & (_ >>>= gt)), _ >>>= 7, dt -= 7
+									}
+									if (a.have + ut > a.nlen + a.ndist) {
+										t.msg = "invalid bit length repeat", a.mode = ot;
+										break
+									}
+									for (; ut--;) a.lens[a.have++] = yt
+								}
+							}
+							if (a.mode === ot) break;
+							if (0 === a.lens[256]) {
+								t.msg = "invalid code -- missing end-of-block", a.mode = ot;
+								break
+							}
+							if (a.lenbits = 9, zt = {
+									bits: a.lenbits
+								}, xt = m(p, a.lens, 0, a.nlen, a.lencode, 0, a.work, zt), a.lenbits = zt.bits, xt) {
+								t.msg = "invalid literal/lengths set", a.mode = ot;
+								break
+							}
+							if (a.distbits = 6, a.distcode = a.distdyn, zt = {
+									bits: a.distbits
+								}, xt = m(v, a.lens, a.nlen, a.ndist, a.distcode, 0, a.work, zt), a.distbits = zt.bits, xt) {
+								t.msg = "invalid distances set", a.mode = ot;
+								break
+							}
+							if (a.mode = Q, e === x) break t;
+						case Q:
+							a.mode = V;
+						case V:
+							if (l >= 6 && f >= 258) {
+								t.next_out = o, t.avail_out = f, t.next_in = s, t.avail_in = l, a.hold = _, a.bits = dt, g(t, _t), o =
+									t
+									.next_out, r = t.output, f = t.avail_out, s = t.next_in, n = t.input, l = t.avail_in, _ = a.hold, dt =
+									a.bits, a.mode === M && (a.back = -1);
+								break
+							}
+							for (a.back = 0; St = a.lencode[_ & (1 << a.lenbits) - 1], gt = St >>> 24, mt = St >>> 16 & 255, wt =
+								65535 & St, !(gt <= dt);) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							if (mt && 0 == (240 & mt)) {
+								for (pt = gt, vt = mt, kt = wt; St = a.lencode[kt + ((_ & (1 << pt + vt) - 1) >> pt)], gt = St >>> 24,
+									mt = St >>> 16 & 255, wt = 65535 & St, !(pt + gt <= dt);) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								_ >>>= pt, dt -= pt, a.back += pt
+							}
+							if (_ >>>= gt, dt -= gt, a.back += gt, a.length = wt, 0 === mt) {
+								a.mode = it;
+								break
+							}
+							if (32 & mt) {
+								a.back = -1, a.mode = M;
+								break
+							}
+							if (64 & mt) {
+								t.msg = "invalid literal/length code", a.mode = ot;
+								break
+							}
+							a.extra = 15 & mt, a.mode = $;
+						case $:
+							if (a.extra) {
+								for (Bt = a.extra; dt < Bt;) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								a.length += _ & (1 << a.extra) - 1, _ >>>= a.extra, dt -= a.extra, a.back += a.extra
+							}
+							a.was = a.length, a.mode = tt;
+						case tt:
+							for (; St = a.distcode[_ & (1 << a.distbits) - 1], gt = St >>> 24, mt = St >>> 16 & 255, wt = 65535 &
+								St,
+								!(gt <= dt);) {
+								if (0 === l) break t;
+								l--, _ += n[s++] << dt, dt += 8
+							}
+							if (0 == (240 & mt)) {
+								for (pt = gt, vt = mt, kt = wt; St = a.distcode[kt + ((_ & (1 << pt + vt) - 1) >> pt)], gt = St >>>
+									24,
+									mt = St >>> 16 & 255, wt = 65535 & St, !(pt + gt <= dt);) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								_ >>>= pt, dt -= pt, a.back += pt
+							}
+							if (_ >>>= gt, dt -= gt, a.back += gt, 64 & mt) {
+								t.msg = "invalid distance code", a.mode = ot;
+								break
+							}
+							a.offset = wt, a.extra = 15 & mt, a.mode = et;
+						case et:
+							if (a.extra) {
+								for (Bt = a.extra; dt < Bt;) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								a.offset += _ & (1 << a.extra) - 1, _ >>>= a.extra, dt -= a.extra, a.back += a.extra
+							}
+							if (a.offset > a.dmax) {
+								t.msg = "invalid distance too far back", a.mode = ot;
+								break
+							}
+							a.mode = at;
+						case at:
+							if (0 === f) break t;
+							if (ut = _t - f, a.offset > ut) {
+								if ((ut = a.offset - ut) > a.whave && a.sane) {
+									t.msg = "invalid distance too far back", a.mode = ot;
+									break
+								}
+								ut > a.wnext ? (ut -= a.wnext, ct = a.wsize - ut) : ct = a.wnext - ut, ut > a.length && (ut = a.length),
+									bt = a.window
+							} else bt = r, ct = o - a.offset, ut = a.length;
+							ut > f && (ut = f), f -= ut, a.length -= ut;
+							do {
+								r[o++] = bt[ct++]
+							} while (--ut);
+							0 === a.length && (a.mode = V);
+							break;
+						case it:
+							if (0 === f) break t;
+							r[o++] = a.length, f--, a.mode = V;
+							break;
+						case nt:
+							if (a.wrap) {
+								for (; dt < 32;) {
+									if (0 === l) break t;
+									l--, _ |= n[s++] << dt, dt += 8
+								}
+								if (_t -= f, t.total_out += _t, a.total += _t, _t && (t.adler = a.check = a.flags ? b(a.check, r, _t,
+										o -
+										_t) : c(a.check, r, _t, o - _t)), _t = f, (a.flags ? _ : i(_)) !== a.check) {
+									t.msg = "incorrect data check", a.mode = ot;
+									break
+								}
+								_ = 0, dt = 0
+							}
+							a.mode = rt;
+						case rt:
+							if (a.wrap && a.flags) {
+								for (; dt < 32;) {
+									if (0 === l) break t;
+									l--, _ += n[s++] << dt, dt += 8
+								}
+								if (_ !== (4294967295 & a.total)) {
+									t.msg = "incorrect length check", a.mode = ot;
+									break
+								}
+								_ = 0, dt = 0
+							}
+							a.mode = st;
+						case st:
+							xt = B;
+							break t;
+						case ot:
+							xt = A;
+							break t;
+						case lt:
+							return Z;
+						case ht:
+						default:
+							return E
+					}
+					return t.next_out = o, t.avail_out = f, t.next_in = s, t.avail_in = l, a.hold = _, a.bits = dt, (a.wsize ||
+							_t !== t.avail_out && a.mode < ot && (a.mode < nt || e !== k)) && d(t, t.output, t.next_out, _t - t.avail_out) ?
+						(a.mode = lt, Z) : (ft -= t.avail_in, _t -= t.avail_out, t.total_in += ft, t.total_out += _t, a.total +=
+							_t,
+							a.wrap && _t && (t.adler = a.check = a.flags ? b(a.check, r, _t, t.next_out - _t) : c(a.check, r, _t, t.next_out -
+								_t)), t.data_type = a.bits + (a.last ? 64 : 0) + (a.mode === M ? 128 : 0) + (a.mode === Q || a.mode ===
+								q ?
+								256 : 0), (0 === ft && 0 === _t || e === k) && xt === z && (xt = R), xt)
+				}, a.inflateEnd = function(t) {
+					if (!t || !t.state) return E;
+					var e = t.state;
+					return e.window && (e.window = null), t.state = null, z
+				}, a.inflateGetHeader = function(t, e) {
+					var a;
+					return t && t.state ? 0 == (2 & (a = t.state).wrap) ? E : (a.head = e, e.done = !1, z) : E
+				}, a.inflateSetDictionary = function(t, e) {
+					var a, i, n = e.length;
+					return t && t.state ? 0 !== (a = t.state).wrap && a.mode !== K ? E : a.mode === K && (i = 1, (i = c(i, e,
+						n,
+						0)) !== a.check) ? A : d(t, e, n, n) ? (a.mode = lt, Z) : (a.havedict = 1, z) : E
+				}, a.inflateInfo = "pako inflate (from Nodeca project)"
+			}, {
+				"../utils/common": 3,
+				"./adler32": 5,
+				"./crc32": 7,
+				"./inffast": 10,
+				"./inftrees": 12
+			}],
+			12: [function(t, e, a) {
+				"use strict";
+				var i = t("../utils/common"),
+					n = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163,
+						195,
+						227, 258, 0, 0
+					],
+					r = [16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, 19, 19, 19, 19, 20, 20, 20, 20, 21, 21,
+						21, 21, 16, 72, 78
+					],
+					s = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
+						4097, 6145, 8193, 12289, 16385, 24577, 0, 0
+					],
+					o = [16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+						28, 28, 29, 29, 64, 64
+					];
+				e.exports = function(t, e, a, l, h, d, f, _) {
+					var u, c, b, g, m, w, p, v, k, y = _.bits,
+						x = 0,
+						z = 0,
+						B = 0,
+						S = 0,
+						E = 0,
+						A = 0,
+						Z = 0,
+						R = 0,
+						C = 0,
+						N = 0,
+						O = null,
+						D = 0,
+						I = new i.Buf16(16),
+						U = new i.Buf16(16),
+						T = null,
+						F = 0;
+					for (x = 0; x <= 15; x++) I[x] = 0;
+					for (z = 0; z < l; z++) I[e[a + z]]++;
+					for (E = y, S = 15; S >= 1 && 0 === I[S]; S--);
+					if (E > S && (E = S), 0 === S) return h[d++] = 20971520, h[d++] = 20971520, _.bits = 1, 0;
+					for (B = 1; B < S && 0 === I[B]; B++);
+					for (E < B && (E = B), R = 1, x = 1; x <= 15; x++)
+						if (R <<= 1, (R -= I[x]) < 0) return -1;
+					if (R > 0 && (0 === t || 1 !== S)) return -1;
+					for (U[1] = 0, x = 1; x < 15; x++) U[x + 1] = U[x] + I[x];
+					for (z = 0; z < l; z++) 0 !== e[a + z] && (f[U[e[a + z]]++] = z);
+					if (0 === t ? (O = T = f, w = 19) : 1 === t ? (O = n, D -= 257, T = r, F -= 257, w = 256) : (O = s, T = o,
+							w = -
+							1), N = 0, z = 0, x = B, m = d, A = E, Z = 0, b = -1, C = 1 << E, g = C - 1, 1 === t && C > 852 || 2 ===
+						t &&
+						C > 592) return 1;
+					for (;;) {
+						p = x - Z, f[z] < w ? (v = 0, k = f[z]) : f[z] > w ? (v = T[F + f[z]], k = O[D + f[z]]) : (v = 96, k = 0),
+							u =
+							1 << x - Z, B = c = 1 << A;
+						do {
+							h[m + (N >> Z) + (c -= u)] = p << 24 | v << 16 | k | 0
+						} while (0 !== c);
+						for (u = 1 << x - 1; N & u;) u >>= 1;
+						if (0 !== u ? (N &= u - 1, N += u) : N = 0, z++, 0 == --I[x]) {
+							if (x === S) break;
+							x = e[a + f[z]]
+						}
+						if (x > E && (N & g) !== b) {
+							for (0 === Z && (Z = E), m += B, R = 1 << (A = x - Z); A + Z < S && !((R -= I[A + Z]) <= 0);) A++, R <<=
+								1;
+							if (C += 1 << A, 1 === t && C > 852 || 2 === t && C > 592) return 1;
+							h[b = N & g] = E << 24 | A << 16 | m - d | 0
+						}
+					}
+					return 0 !== N && (h[m + N] = x - Z << 24 | 64 << 16 | 0), _.bits = E, 0
+				}
+			}, {
+				"../utils/common": 3
+			}],
+			13: [function(t, e, a) {
+				"use strict";
+				e.exports = {
+					2: "need dictionary",
+					1: "stream end",
+					0: "",
+					"-1": "file error",
+					"-2": "stream error",
+					"-3": "data error",
+					"-4": "insufficient memory",
+					"-5": "buffer error",
+					"-6": "incompatible version"
+				}
+			}, {}],
+			14: [function(t, e, a) {
+				"use strict";
+
+				function i(t) {
+					for (var e = t.length; --e >= 0;) t[e] = 0
+				}
+
+				function n(t, e, a, i, n) {
+					this.static_tree = t, this.extra_bits = e, this.extra_base = a, this.elems = i, this.max_length = n, this.has_stree =
+						t && t.length
+				}
+
+				function r(t, e) {
+					this.dyn_tree = t, this.max_code = 0, this.stat_desc = e
+				}
+
+				function s(t) {
+					return t < 256 ? et[t] : et[256 + (t >>> 7)]
+				}
+
+				function o(t, e) {
+					t.pending_buf[t.pending++] = 255 & e, t.pending_buf[t.pending++] = e >>> 8 & 255
+				}
+
+				function l(t, e, a) {
+					t.bi_valid > M - a ? (t.bi_buf |= e << t.bi_valid & 65535, o(t, t.bi_buf), t.bi_buf = e >> M - t.bi_valid,
+						t.bi_valid +=
+						a - M) : (t.bi_buf |= e << t.bi_valid & 65535, t.bi_valid += a)
+				}
+
+				function h(t, e, a) {
+					l(t, a[2 * e], a[2 * e + 1])
+				}
+
+				function d(t, e) {
+					var a = 0;
+					do {
+						a |= 1 & t, t >>>= 1, a <<= 1
+					} while (--e > 0);
+					return a >>> 1
+				}
+
+				function f(t) {
+					16 === t.bi_valid ? (o(t, t.bi_buf), t.bi_buf = 0, t.bi_valid = 0) : t.bi_valid >= 8 && (t.pending_buf[t.pending++] =
+						255 & t.bi_buf, t.bi_buf >>= 8, t.bi_valid -= 8)
+				}
+
+				function _(t, e) {
+					var a, i, n, r, s, o, l = e.dyn_tree,
+						h = e.max_code,
+						d = e.stat_desc.static_tree,
+						f = e.stat_desc.has_stree,
+						_ = e.stat_desc.extra_bits,
+						u = e.stat_desc.extra_base,
+						c = e.stat_desc.max_length,
+						b = 0;
+					for (r = 0; r <= K; r++) t.bl_count[r] = 0;
+					for (l[2 * t.heap[t.heap_max] + 1] = 0, a = t.heap_max + 1; a < j; a++)(r = l[2 * l[2 * (i = t.heap[a]) + 1] +
+						1] + 1) > c && (r = c, b++), l[2 * i + 1] = r, i > h || (t.bl_count[r]++, s = 0, i >= u && (s = _[i - u]),
+						o =
+						l[2 * i], t.opt_len += o * (r + s), f && (t.static_len += o * (d[2 * i + 1] + s)));
+					if (0 !== b) {
+						do {
+							for (r = c - 1; 0 === t.bl_count[r];) r--;
+							t.bl_count[r]--, t.bl_count[r + 1] += 2, t.bl_count[c]--, b -= 2
+						} while (b > 0);
+						for (r = c; 0 !== r; r--)
+							for (i = t.bl_count[r]; 0 !== i;)(n = t.heap[--a]) > h || (l[2 * n + 1] !== r && (t.opt_len += (r - l[2 *
+								n +
+								1]) * l[2 * n], l[2 * n + 1] = r), i--)
+					}
+				}
+
+				function u(t, e, a) {
+					var i, n, r = new Array(K + 1),
+						s = 0;
+					for (i = 1; i <= K; i++) r[i] = s = s + a[i - 1] << 1;
+					for (n = 0; n <= e; n++) {
+						var o = t[2 * n + 1];
+						0 !== o && (t[2 * n] = d(r[o]++, o))
+					}
+				}
+
+				function c() {
+					var t, e, a, i, r, s = new Array(K + 1);
+					for (a = 0, i = 0; i < U - 1; i++)
+						for (it[i] = a, t = 0; t < 1 << W[i]; t++) at[a++] = i;
+					for (at[a - 1] = i, r = 0, i = 0; i < 16; i++)
+						for (nt[i] = r, t = 0; t < 1 << J[i]; t++) et[r++] = i;
+					for (r >>= 7; i < L; i++)
+						for (nt[i] = r << 7, t = 0; t < 1 << J[i] - 7; t++) et[256 + r++] = i;
+					for (e = 0; e <= K; e++) s[e] = 0;
+					for (t = 0; t <= 143;) $[2 * t + 1] = 8, t++, s[8]++;
+					for (; t <= 255;) $[2 * t + 1] = 9, t++, s[9]++;
+					for (; t <= 279;) $[2 * t + 1] = 7, t++, s[7]++;
+					for (; t <= 287;) $[2 * t + 1] = 8, t++, s[8]++;
+					for (u($, F + 1, s), t = 0; t < L; t++) tt[2 * t + 1] = 5, tt[2 * t] = d(t, 5);
+					rt = new n($, W, T + 1, F, K), st = new n(tt, J, 0, L, K), ot = new n(new Array(0), Q, 0, H, P)
+				}
+
+				function b(t) {
+					var e;
+					for (e = 0; e < F; e++) t.dyn_ltree[2 * e] = 0;
+					for (e = 0; e < L; e++) t.dyn_dtree[2 * e] = 0;
+					for (e = 0; e < H; e++) t.bl_tree[2 * e] = 0;
+					t.dyn_ltree[2 * Y] = 1, t.opt_len = t.static_len = 0, t.last_lit = t.matches = 0
+				}
+
+				function g(t) {
+					t.bi_valid > 8 ? o(t, t.bi_buf) : t.bi_valid > 0 && (t.pending_buf[t.pending++] = t.bi_buf), t.bi_buf = 0,
+						t.bi_valid =
+						0
+				}
+
+				function m(t, e, a, i) {
+					g(t), i && (o(t, a), o(t, ~a)), A.arraySet(t.pending_buf, t.window, e, a, t.pending), t.pending += a
+				}
+
+				function w(t, e, a, i) {
+					var n = 2 * e,
+						r = 2 * a;
+					return t[n] < t[r] || t[n] === t[r] && i[e] <= i[a]
+				}
+
+				function p(t, e, a) {
+					for (var i = t.heap[a], n = a << 1; n <= t.heap_len && (n < t.heap_len && w(e, t.heap[n + 1], t.heap[n], t.depth) &&
+							n++, !w(e, i, t.heap[n], t.depth));) t.heap[a] = t.heap[n], a = n, n <<= 1;
+					t.heap[a] = i
+				}
+
+				function v(t, e, a) {
+					var i, n, r, o, d = 0;
+					if (0 !== t.last_lit)
+						do {
+							i = t.pending_buf[t.d_buf + 2 * d] << 8 | t.pending_buf[t.d_buf + 2 * d + 1], n = t.pending_buf[t.l_buf +
+									d],
+								d++, 0 === i ? h(t, n, e) : (h(t, (r = at[n]) + T + 1, e), 0 !== (o = W[r]) && l(t, n -= it[r], o), h(t,
+									r =
+									s(--i), a), 0 !== (o = J[r]) && l(t, i -= nt[r], o))
+						} while (d < t.last_lit);
+					h(t, Y, e)
+				}
+
+				function k(t, e) {
+					var a, i, n, r = e.dyn_tree,
+						s = e.stat_desc.static_tree,
+						o = e.stat_desc.has_stree,
+						l = e.stat_desc.elems,
+						h = -1;
+					for (t.heap_len = 0, t.heap_max = j, a = 0; a < l; a++) 0 !== r[2 * a] ? (t.heap[++t.heap_len] = h = a, t.depth[
+						a] = 0) : r[2 * a + 1] = 0;
+					for (; t.heap_len < 2;) r[2 * (n = t.heap[++t.heap_len] = h < 2 ? ++h : 0)] = 1, t.depth[n] = 0, t.opt_len--,
+						o && (t.static_len -= s[2 * n + 1]);
+					for (e.max_code = h, a = t.heap_len >> 1; a >= 1; a--) p(t, r, a);
+					n = l;
+					do {
+						a = t.heap[1], t.heap[1] = t.heap[t.heap_len--], p(t, r, 1), i = t.heap[1], t.heap[--t.heap_max] = a, t.heap[
+							--t.heap_max] = i, r[2 * n] = r[2 * a] + r[2 * i], t.depth[n] = (t.depth[a] >= t.depth[i] ? t.depth[a] :
+							t.depth[
+								i]) + 1, r[2 * a + 1] = r[2 * i + 1] = n, t.heap[1] = n++, p(t, r, 1)
+					} while (t.heap_len >= 2);
+					t.heap[--t.heap_max] = t.heap[1], _(t, e), u(r, h, t.bl_count)
+				}
+
+				function y(t, e, a) {
+					var i, n, r = -1,
+						s = e[1],
+						o = 0,
+						l = 7,
+						h = 4;
+					for (0 === s && (l = 138, h = 3), e[2 * (a + 1) + 1] = 65535, i = 0; i <= a; i++) n = s, s = e[2 * (i + 1) +
+							1],
+						++o < l && n === s || (o < h ? t.bl_tree[2 * n] += o : 0 !== n ? (n !== r && t.bl_tree[2 * n]++, t.bl_tree[
+								2 *
+								q]++) : o <= 10 ? t.bl_tree[2 * G]++ : t.bl_tree[2 * X]++, o = 0, r = n, 0 === s ? (l = 138, h = 3) : n ===
+							s ? (l = 6, h = 3) : (l = 7, h = 4))
+				}
+
+				function x(t, e, a) {
+					var i, n, r = -1,
+						s = e[1],
+						o = 0,
+						d = 7,
+						f = 4;
+					for (0 === s && (d = 138, f = 3), i = 0; i <= a; i++)
+						if (n = s, s = e[2 * (i + 1) + 1], !(++o < d && n === s)) {
+							if (o < f)
+								do {
+									h(t, n, t.bl_tree)
+								} while (0 != --o);
+							else 0 !== n ? (n !== r && (h(t, n, t.bl_tree), o--), h(t, q, t.bl_tree), l(t, o - 3, 2)) : o <= 10 ? (h(
+								t,
+								G, t.bl_tree), l(t, o - 3, 3)) : (h(t, X, t.bl_tree), l(t, o - 11, 7));
+							o = 0, r = n, 0 === s ? (d = 138, f = 3) : n === s ? (d = 6, f = 3) : (d = 7, f = 4)
+						}
+				}
+
+				function z(t) {
+					var e;
+					for (y(t, t.dyn_ltree, t.l_desc.max_code), y(t, t.dyn_dtree, t.d_desc.max_code), k(t, t.bl_desc), e = H - 1; e >=
+						3 && 0 === t.bl_tree[2 * V[e] + 1]; e--);
+					return t.opt_len += 3 * (e + 1) + 5 + 5 + 4, e
+				}
+
+				function B(t, e, a, i) {
+					var n;
+					for (l(t, e - 257, 5), l(t, a - 1, 5), l(t, i - 4, 4), n = 0; n < i; n++) l(t, t.bl_tree[2 * V[n] + 1], 3);
+					x(t, t.dyn_ltree, e - 1), x(t, t.dyn_dtree, a - 1)
+				}
+
+				function S(t) {
+					var e, a = 4093624447;
+					for (e = 0; e <= 31; e++, a >>>= 1)
+						if (1 & a && 0 !== t.dyn_ltree[2 * e]) return R;
+					if (0 !== t.dyn_ltree[18] || 0 !== t.dyn_ltree[20] || 0 !== t.dyn_ltree[26]) return C;
+					for (e = 32; e < T; e++)
+						if (0 !== t.dyn_ltree[2 * e]) return C;
+					return R
+				}
+
+				function E(t, e, a, i) {
+					l(t, (O << 1) + (i ? 1 : 0), 3), m(t, e, a, !0)
+				}
+				var A = t("../utils/common"),
+					Z = 4,
+					R = 0,
+					C = 1,
+					N = 2,
+					O = 0,
+					D = 1,
+					I = 2,
+					U = 29,
+					T = 256,
+					F = T + 1 + U,
+					L = 30,
+					H = 19,
+					j = 2 * F + 1,
+					K = 15,
+					M = 16,
+					P = 7,
+					Y = 256,
+					q = 16,
+					G = 17,
+					X = 18,
+					W = [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0],
+					J = [0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13],
+					Q = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7],
+					V = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15],
+					$ = new Array(2 * (F + 2));
+				i($);
+				var tt = new Array(2 * L);
+				i(tt);
+				var et = new Array(512);
+				i(et);
+				var at = new Array(256);
+				i(at);
+				var it = new Array(U);
+				i(it);
+				var nt = new Array(L);
+				i(nt);
+				var rt, st, ot, lt = !1;
+				a._tr_init = function(t) {
+					lt || (c(), lt = !0), t.l_desc = new r(t.dyn_ltree, rt), t.d_desc = new r(t.dyn_dtree, st), t.bl_desc =
+						new r(
+							t.bl_tree, ot), t.bi_buf = 0, t.bi_valid = 0, b(t)
+				}, a._tr_stored_block = E, a._tr_flush_block = function(t, e, a, i) {
+					var n, r, s = 0;
+					t.level > 0 ? (t.strm.data_type === N && (t.strm.data_type = S(t)), k(t, t.l_desc), k(t, t.d_desc), s = z(
+								t),
+							n = t.opt_len + 3 + 7 >>> 3, (r = t.static_len + 3 + 7 >>> 3) <= n && (n = r)) : n = r = a + 5, a + 4 <=
+						n &&
+						-1 !== e ? E(t, e, a, i) : t.strategy === Z || r === n ? (l(t, (D << 1) + (i ? 1 : 0), 3), v(t, $, tt)) :
+						(l(
+							t, (I << 1) + (i ? 1 : 0), 3), B(t, t.l_desc.max_code + 1, t.d_desc.max_code + 1, s + 1), v(t, t.dyn_ltree,
+							t.dyn_dtree)), b(t), i && g(t)
+				}, a._tr_tally = function(t, e, a) {
+					return t.pending_buf[t.d_buf + 2 * t.last_lit] = e >>> 8 & 255, t.pending_buf[t.d_buf + 2 * t.last_lit + 1] =
+						255 & e, t.pending_buf[t.l_buf + t.last_lit] = 255 & a, t.last_lit++, 0 === e ? t.dyn_ltree[2 * a]++ : (t
+							.matches++,
+							e--, t.dyn_ltree[2 * (at[a] + T + 1)]++, t.dyn_dtree[2 * s(e)]++), t.last_lit === t.lit_bufsize - 1
+				}, a._tr_align = function(t) {
+					l(t, D << 1, 3), h(t, Y, $), f(t)
+				}
+			}, {
+				"../utils/common": 3
+			}],
+			15: [function(t, e, a) {
+				"use strict";
+				e.exports = function() {
+					this.input = null, this.next_in = 0, this.avail_in = 0, this.total_in = 0, this.output = null, this.next_out =
+						0, this.avail_out = 0, this.total_out = 0, this.msg = "", this.state = null, this.data_type = 2, this.adler =
+						0
+				}
+			}, {}],
+			"/": [function(t, e, a) {
+				"use strict";
+				var i = {};
+				(0, t("./lib/utils/common").assign)(i, t("./lib/deflate"), t("./lib/inflate"), t("./lib/zlib/constants")), e
+					.exports =
+					i
+			}, {
+				"./lib/deflate": 1,
+				"./lib/inflate": 2,
+				"./lib/utils/common": 3,
+				"./lib/zlib/constants": 6
+			}]
+		}, {}, [])("/")
+	});
+	var api = {
+		unzip: function(b64Data) {
+			var strData = atob(b64Data);
+			// Convert binary string to character-number array
+			var charData = strData.split('').map(function(x) {
+				return x.charCodeAt(0);
+			});
+			// Turn number array into byte-array
+			var binData = new Uint8Array(charData);
+			// // unzip
+			var data = pako.inflate(binData);
+			// Convert gunzipped byteArray back to ascii string:
+			strData = String.fromCharCode.apply(null, new Uint16Array(data));
+			return decodeURIComponent(strData);
+		},
+
+		/**
+		 * 压缩
+		 * @param {Object} str
+		 */
+		zip: function(str) {
+			var binaryString = pako.gzip(encodeURIComponent(str), {
+				to: 'string'
+			})
+			return btoa(binaryString);
+		}
+	}
+	exports('pako', api);
+});

+ 12 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/encryption/sign.js

@@ -0,0 +1,12 @@
+layui.define(['md5'], function(exports) {
+	var md5 = layui.md5;
+	var api = {
+		getSign: function(data, key) {
+			var content = 'content=' + data + '&sign=' + key;
+			var sign = md5.md5(content);
+			return 'content=' + data + '&sign=' + sign;
+		}
+	};
+	
+	exports('sign', api);
+});

File diff suppressed because it is too large
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/jquery.min.js


+ 147 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/inputTags.css

@@ -0,0 +1,147 @@
+/*
+* @Author: layui-2
+* @Date:   2018-08-31 11:40:53
+* @Last Modified by:   xuzhiwen
+* @Last Modified time: 2018-09-07 15:26:19
+*/
+em{
+  font-style: normal;
+}
+#tags
+{
+    width: 406px;
+    margin: 40px auto;
+    padding: 10px;
+
+    color: #777;
+    border: 1px solid #d5d5d5;
+    background-color: #fff;
+}
+
+#tags span{
+    font-size: 12px;
+    font-weight: normal;
+    line-height: 16px;
+    position: relative;
+    display: inline-block;
+    height: 16px;
+    margin-right: 3px;
+    margin-bottom: 3px;
+    padding: 4px 22px 5px 9px;
+    cursor: pointer;
+    transition: all .2s ease 0s;
+    vertical-align: baseline;
+    white-space: nowrap;
+    color: #fff;
+    background-color: #009688;
+    text-shadow: 1px 1px 1px rgba(0, 0, 0, .15);
+}
+#tags .close{
+    font-size: 12px;
+    font-weight: bold;
+    line-height: 20px;
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    float: none;
+    width: 18px;
+    padding: 0;
+    cursor: pointer;
+    text-align: center;
+    opacity: 1;
+    color: #fff;
+    border: 0 none;
+    background: transparent none repeat scroll 0 0;
+    text-shadow: none;
+}
+#tags .close:hover{
+  background: #ffb800;
+}
+#inputTags[type='text'],
+#inputTags[type='text']:focus{
+    line-height: 25px;
+    display: inline;
+    width: 150px;
+    margin: 0;
+    padding: 0 6px;
+    border: 0 none;
+    outline: 0 none;
+    box-shadow: none;
+}
+
+#tags_outport
+{
+    width: 406px;
+    margin: 40px auto;
+    padding: 10px;
+
+    color: #777;
+    border: 1px solid #d5d5d5;
+    background-color: #fff;
+}
+
+#tags_outport span{
+    font-size: 12px;
+    font-weight: normal;
+    line-height: 16px;
+    position: relative;
+    display: inline-block;
+    height: 16px;
+    margin-right: 3px;
+    margin-bottom: 3px;
+    padding: 4px 22px 5px 9px;
+    cursor: pointer;
+    transition: all .2s ease 0s;
+    vertical-align: baseline;
+    white-space: nowrap;
+    color: #fff;
+    background-color: #009688;
+    text-shadow: 1px 1px 1px rgba(0, 0, 0, .15);
+}
+#tags_outport .close{
+    font-size: 12px;
+    font-weight: bold;
+    line-height: 20px;
+    position: absolute;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    float: none;
+    width: 18px;
+    padding: 0;
+    cursor: pointer;
+    text-align: center;
+    opacity: 1;
+    color: #fff;
+    border: 0 none;
+    background: transparent none repeat scroll 0 0;
+    text-shadow: none;
+}
+#tags_outport .close:hover{
+  background: #ffb800;
+}
+
+#outportTags[type='text'],
+#outportTags[type='text']:focus{
+    line-height: 25px;
+    display: inline;
+    width: 150px;
+    margin: 0;
+    padding: 0 6px;
+    border: 0 none;
+    outline: 0 none;
+    box-shadow: none;
+}
+
+.albtn{
+    line-height: 30px;
+    display: block;
+    width: 100px;
+    height: 30px;
+    margin: 0 auto;
+    cursor: pointer;
+    text-align: center;
+    color: #fff;
+    background: #ffb800;
+}

File diff suppressed because it is too large
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/layui.css


File diff suppressed because it is too large
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/layui.mobile.css


+ 2 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/code.css

@@ -0,0 +1,2 @@
+/** layui-v2.5.6 MIT License By https://www.layui.com */
+ html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #e2e2e2;border-left-width:6px;background-color:#F2F2F2;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:32px;line-height:32px;border-bottom:1px solid #e2e2e2}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 5px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}

File diff suppressed because it is too large
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/laydate/default/laydate.css


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/icon-ext.png


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/icon.png


File diff suppressed because it is too large
+ 1 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/layer.css


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/loading-0.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/loading-1.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/css/modules/layer/default/loading-2.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.eot


File diff suppressed because it is too large
+ 25 - 0
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.svg


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.ttf


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.woff


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/font/iconfont.woff2


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/0.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/1.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/10.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/11.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/12.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/13.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/14.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/15.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/16.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/17.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/18.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/19.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/2.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/20.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/21.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/22.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/23.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/24.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/25.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/26.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/27.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/28.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/29.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/3.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/30.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/31.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/32.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/33.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/34.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/35.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/36.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/37.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/38.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/39.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/4.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/40.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/41.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/42.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/43.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/44.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/45.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/46.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/47.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/48.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/49.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/5.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/50.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/51.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/52.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/53.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/54.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/55.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/56.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/57.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/58.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/59.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/6.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/60.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/61.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/62.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/63.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/64.gif


二進制
spring-cloud/server-page/src/main/resources/static/fz/lib/layui/images/face/65.gif


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