From e48ef997c03b49c8090970f5fbb29ce80b0ac6df Mon Sep 17 00:00:00 2001
From: 64850858 <648540858@qq.com>
Date: 星期三, 14 七月 2021 15:57:39 +0800
Subject: [PATCH] 更换播放器, 修正和优化sql脚本,

---
 web_src/static/js/jessibuca/index.js                                               | 4602 ++++++++++++++++++++++++++++++++++++++
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java                       |    5 
 src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java             |   16 
 src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java              |    1 
 web_src/static/js/jessibuca/ff.worker.js                                           |    1 
 src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java                          |    2 
 web_src/src/components/dialog/jessibuca.vue                                        |  296 ++
 web_src/static/css/iconfont.css                                                    | 1655 +++++++++++++
 web_src/static/js/jessibuca/ff.js                                                  |    1 
 web_src/package.json                                                               |    2 
 web_src/package-lock.json                                                          |   39 
 web_src/index.html                                                                 |    3 
 src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java              |    2 
 /dev/null                                                                          |  396 ---
 web_src/static/css/iconfont.woff2                                                  |    0 
 src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java |   12 
 web_src/src/components/channelList.vue                                             |    8 
 web_src/src/components/dialog/devicePlayer.vue                                     |    6 
 web_src/static/js/jessibuca/logo.png                                               |    0 
 src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java                          |    2 
 sql/mysql.sql                                                                      |   48 
 web_src/static/js/jessibuca/ff.wasm                                                |    0 
 web_src/src/router/index.js                                                        |    2 
 src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java      |   51 
 24 files changed, 6,693 insertions(+), 457 deletions(-)

diff --git a/sql/mysql.sql b/sql/mysql.sql
index 7055edd..21d7a52 100644
--- a/sql/mysql.sql
+++ b/sql/mysql.sql
@@ -5,10 +5,10 @@
 (
     deviceId           varchar(50) not null
         primary key,
-    name               varchar(50) null,
-    manufacturer       varchar(50) null,
-    model              varchar(50) null,
-    firmware           varchar(50) null,
+    name               varchar(255) null,
+    manufacturer       varchar(255) null,
+    model              varchar(255) null,
+    firmware           varchar(255) null,
     transport          varchar(50) null,
     streamMode         varchar(50) null,
     online             varchar(50) null,
@@ -25,7 +25,7 @@
 create table device_channel
 (
     channelId   varchar(50) not null,
-    name        varchar(50) null,
+    name        varchar(255) null,
     manufacture varchar(50) null,
     model       varchar(50) null,
     owner       varchar(50) null,
@@ -42,7 +42,7 @@
     secrecy     varchar(50) null,
     ipAddress   varchar(50) null,
     port        int          null,
-    password    varchar(50) null,
+    password    varchar(255) null,
     PTZType     int          null,
     status      int          null,
     longitude   double       null,
@@ -59,7 +59,7 @@
 create table device_mobile_position
 (
     deviceId       varchar(50) not null,
-    deviceName     varchar(50) null,
+    deviceName     varchar(255) null,
     time           varchar(50) not null,
     longitude      double       not null,
     latitude       double       not null,
@@ -75,10 +75,10 @@
 
 create table gb_stream
 (
-    app        varchar(50) not null,
-    stream     varchar(50) not null,
+    app        varchar(255) not null,
+    stream     varchar(255) not null,
     gbId       varchar(50) not null,
-    name       varchar(50) null,
+    name       varchar(255) null,
     longitude  double       null,
     latitude   double       null,
     streamType varchar(50) null,
@@ -90,7 +90,7 @@
 (
     id          int auto_increment,
     enable         int          null,
-    name           varchar(50) null,
+    name           varchar(255) null,
     serverGBId     varchar(50) not null,
     serverGBDomain varchar(50) null,
     serverIP       varchar(50) null,
@@ -98,7 +98,7 @@
     deviceGBId     varchar(50) not null,
     deviceIp       varchar(50) null,
     devicePort     varchar(50) null,
-    username       varchar(50) null,
+    username       varchar(255) null,
     password       varchar(50) null,
     expires        varchar(50) null,
     keepTimeout    varchar(50) null,
@@ -122,21 +122,21 @@
 create table platform_gb_stream
 (
     platformId varchar(50) not null,
-    app        varchar(50) not null,
-    stream     varchar(50) not null,
+    app        varchar(255) not null,
+    stream     varchar(255) not null,
     primary key (platformId, app, stream)
 );
 
 create table stream_proxy
 (
     type           varchar(50) not null,
-    app            varchar(50) not null,
-    stream         varchar(50) not null,
-    url            varchar(50) null,
-    src_url        varchar(50) null,
-    dst_url        blob         null,
+    app            varchar(255) not null,
+    stream         varchar(255) not null,
+    url            varchar(255) null,
+    src_url        varchar(255) null,
+    dst_url        varchar(255) null,
     timeout_ms     int          null,
-    ffmpeg_cmd_key varchar(50) null,
+    ffmpeg_cmd_key varchar(255) null,
     rtp_type       varchar(50) null,
     enable_hls     bit(1)   null,
     enable_mp4     bit(1)   null,
@@ -146,8 +146,8 @@
 
 create table stream_push
 (
-    app              varchar(50) not null,
-    stream           varchar(50) not null,
+    app              varchar(255) not null,
+    stream           varchar(255) not null,
     totalReaderCount varchar(50) null,
     originType       int          null,
     originTypeStr    varchar(50) null,
@@ -160,8 +160,8 @@
 (
     id          int auto_increment
         primary key,
-    username    varchar(50) not null,
-    password    varchar(50) not null,
+    username    varchar(255) not null,
+    password    varchar(255) not null,
     roleId      int          not null,
     create_time varchar(50) not null
 );
diff --git a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
index f8b95fc..e5f13ec 100644
--- a/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
+++ b/src/main/java/com/genersoft/iot/vmp/VManageBootstrap.java
@@ -5,9 +5,11 @@
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.scheduling.annotation.EnableScheduling;
 import springfox.documentation.oas.annotations.EnableOpenApi;
 
 @SpringBootApplication
+@EnableScheduling
 @EnableOpenApi
 public class VManageBootstrap extends LogManager {
 	private static String[] args;
diff --git a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
index 6d8f45d..f4e895f 100644
--- a/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
+++ b/src/main/java/com/genersoft/iot/vmp/common/VideoManagerConstants.java
@@ -8,6 +8,8 @@
  */
 public class VideoManagerConstants {
 	
+	public static final String WVP_SERVER_PREFIX = "VMP_wvp_server";
+
 	public static final String MEDIA_SERVER_PREFIX = "VMP_media_server";
 
 	public static final String MEDIA_STREAM_PREFIX = "VMP_media_stream";
diff --git a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
index c99c1cd..52292a5 100644
--- a/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
+++ b/src/main/java/com/genersoft/iot/vmp/conf/MediaConfig.java
@@ -58,7 +58,7 @@
     @Value("${media.rtp.port-range}")
     private String rtpPortRange;
 
-    @Value("${media.record-assist-port}")
+    @Value("${media.record-assist-port:0}")
     private Integer recordAssistPort;
 
     public String getIp() {
diff --git a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
index 5ea57c1..9e402e1 100644
--- a/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
+++ b/src/main/java/com/genersoft/iot/vmp/gb28181/session/VideoStreamSessionManager.java
@@ -48,4 +48,16 @@
 		ssrcMap.remove(deviceId + "_" + channelId);
 		streamIdMap.remove(deviceId + "_" + channelId);
 	}
+
+	public ConcurrentHashMap<String, ClientTransaction> getSessionMap() {
+		return sessionMap;
+	}
+
+	public ConcurrentHashMap<String, String> getSsrcMap() {
+		return ssrcMap;
+	}
+
+	public ConcurrentHashMap<String, String> getStreamIdMap() {
+		return streamIdMap;
+	}
 }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
index ab1d2dd..ed069f8 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRTPServerFactory.java
@@ -34,11 +34,13 @@
         if (currentStreams == null) {
             currentStreams = new HashMap<>();
             JSONObject jsonObject = zlmresTfulUtils.listRtpServer();
-            JSONArray data = jsonObject.getJSONArray("data");
-            if (data != null) {
-                for (int i = 0; i < data.size(); i++) {
-                    JSONObject dataItem = data.getJSONObject(i);
-                    currentStreams.put(dataItem.getString("stream_id"), dataItem.getInteger("port"));
+            if (jsonObject != null) {
+                JSONArray data = jsonObject.getJSONArray("data");
+                if (data != null) {
+                    for (int i = 0; i < data.size(); i++) {
+                        JSONObject dataItem = data.getJSONObject(i);
+                        currentStreams.put(dataItem.getString("stream_id"), dataItem.getInteger("port"));
+                    }
                 }
             }
         }
@@ -73,12 +75,12 @@
                     result= createRTPServer(streamId);
                     break;
                 default:
-                    logger.error("鍒涘缓RTP Server 澶辫触: " + jsonObject.getString("msg"));
+                    logger.error("鍒涘缓RTP Server 澶辫触 {}: " + jsonObject.getString("msg"), newPort);
                     break;
             }
         }else {
             //  妫�鏌LM鐘舵��
-            logger.error("鍒涘缓RTP Server 澶辫触: 璇锋鏌LM鏈嶅姟");
+            logger.error("鍒涘缓RTP Server 澶辫触 {}: 璇锋鏌LM鏈嶅姟", newPort);
         }
         return result;
     }
diff --git a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
index f9171c3..956db14 100644
--- a/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
+++ b/src/main/java/com/genersoft/iot/vmp/media/zlm/ZLMRunner.java
@@ -127,7 +127,7 @@
         if (responseJSON != null && responseJSON.getInteger("code") == 0) {
             logger.info("璁剧疆zlm鎴愬姛");
         }else {
-            logger.info("璁剧疆zlm澶辫触: " + responseJSON.getString("msg"));
+            logger.info("璁剧疆zlm澶辫触");
         }
     }
 
@@ -155,6 +155,9 @@
                 // 璁剧疆涓烘湭鍚敤
                 logger.info("鎭㈠娴佷唬鐞嗗け璐ワ紝璇锋鏌ユ祦鍦板潃鍚庨噸鏂板惎鐢�" + streamProxyDto.getApp() + "/" + streamProxyDto.getStream());
                 streamProxyService.stop(streamProxyDto.getApp(), streamProxyDto.getStream());
+            }else if (jsonObject.getInteger("code") != 0){ // TODO 灏嗛敊璇俊鎭瓨鍏ユ暟鎹簱锛� 鍓嶇灞曠ず
+                logger.info("鎭㈠娴佷唬鐞嗗け璐ワ細" + streamProxyDto.getApp() + "/" + streamProxyDto.getStream() + "[ " + JSONObject.toJSONString(jsonObject) + " ]");
+                streamProxyService.stop(streamProxyDto.getApp(), streamProxyDto.getStream());
             }
         }
     }
diff --git a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
index 535c790..172d980 100644
--- a/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
+++ b/src/main/java/com/genersoft/iot/vmp/service/impl/PlayServiceImpl.java
@@ -120,7 +120,6 @@
                         zlmresTfulUtils.getSnap(streamUrl, 15, 1, path, fileName);
                     }
                 }
-                System.out.println(path);
             } catch (FileNotFoundException e) {
                 e.printStackTrace();
             }
diff --git a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
index 0f35945..4297bb2 100644
--- a/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
+++ b/src/main/java/com/genersoft/iot/vmp/vmanager/gb28181/play/PlayController.java
@@ -1,12 +1,15 @@
 package com.genersoft.iot.vmp.vmanager.gb28181.play;
 
+import com.alibaba.fastjson.JSONArray;
 import com.genersoft.iot.vmp.common.StreamInfo;
+import com.genersoft.iot.vmp.gb28181.session.VideoStreamSessionManager;
 import com.genersoft.iot.vmp.media.zlm.ZLMServerConfig;
 import com.genersoft.iot.vmp.gb28181.bean.Device;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.DeferredResultHolder;
 import com.genersoft.iot.vmp.gb28181.transmit.callback.RequestMessage;
 import com.genersoft.iot.vmp.media.zlm.ZLMRESTfulUtils;
 import com.genersoft.iot.vmp.storager.IRedisCatchStorage;
+import com.genersoft.iot.vmp.vmanager.bean.WVPResult;
 import com.genersoft.iot.vmp.vmanager.gb28181.play.bean.PlayResult;
 import com.genersoft.iot.vmp.service.IMediaService;
 import com.genersoft.iot.vmp.service.IPlayService;
@@ -31,6 +34,8 @@
 import com.genersoft.iot.vmp.storager.IVideoManagerStorager;
 import org.springframework.web.context.request.async.DeferredResult;
 
+import java.util.Enumeration;
+import java.util.Map;
 import java.util.UUID;
 
 import javax.sip.message.Response;
@@ -45,6 +50,9 @@
 
 	@Autowired
 	private SIPCommander cmder;
+
+	@Autowired
+	private VideoStreamSessionManager streamSession;
 
 	@Autowired
 	private IVideoManagerStorager storager;
@@ -227,6 +235,20 @@
             logger.debug("璇煶骞挎挱API璋冪敤");
         }
         Device device = storager.queryVideoDevice(deviceId);
+		DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L);
+        if (device == null) {
+			resultHolder.put(DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId, result);
+			RequestMessage msg = new RequestMessage();
+			msg.setId(DeferredResultHolder.CALLBACK_CMD_BROADCAST + deviceId);
+			JSONObject json = new JSONObject();
+			json.put("DeviceID", deviceId);
+			json.put("CmdType", "Broadcast");
+			json.put("Result", "Failed");
+			json.put("Description", "Device 涓嶅瓨鍦�");
+			msg.setData(json);
+			resultHolder.invokeResult(msg);
+			return result;
+		}
 		cmder.audioBroadcastCmd(device, event -> {
 			Response response = event.getResponse();
 			RequestMessage msg = new RequestMessage();
@@ -239,7 +261,7 @@
 			msg.setData(json);
 			resultHolder.invokeResult(msg);
 		});
-        DeferredResult<ResponseEntity<String>> result = new DeferredResult<ResponseEntity<String>>(3 * 1000L);
+
 		result.onTimeout(() -> {
 			logger.warn(String.format("璇煶骞挎挱鎿嶄綔瓒呮椂, 璁惧鏈繑鍥炲簲绛旀寚浠�"));
 			RequestMessage msg = new RequestMessage();
@@ -256,5 +278,32 @@
 		return result;
 	}
 
+	@ApiOperation("鑾峰彇鎵�鏈夌殑ssrc")
+	@GetMapping("/ssrc")
+	public WVPResult<JSONObject> getSSRC() {
+		if (logger.isDebugEnabled()) {
+			logger.debug("鑾峰彇鎵�鏈夌殑ssrc");
+		}
+		JSONArray objects = new JSONArray();
+		for(Map.Entry<String, String> entry: streamSession.getSsrcMap().entrySet()) {
+			System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());
+			JSONObject jsonObject = new JSONObject();
+			String[] keyArray = entry.getKey().split("_");
+			jsonObject.put("deviceId", keyArray[0]);
+			jsonObject.put("channelId", keyArray[1]);
+			jsonObject.put("ssrc", entry.getValue());
+			jsonObject.put("streamId", streamSession.getStreamIdMap().get(entry.getKey()));
+			objects.add(jsonObject);
+		}
+		WVPResult<JSONObject> result = new WVPResult<>();
+		result.setCode(0);
+		result.setMsg("success");
+		JSONObject jsonObject = new JSONObject();
+		jsonObject.put("data", objects);
+		jsonObject.put("count", objects.size());
+		result.setData(jsonObject);
+		return result;
+	}
+
 }
 
diff --git a/web_src/index.html b/web_src/index.html
index 8879175..697e987 100644
--- a/web_src/index.html
+++ b/web_src/index.html
@@ -4,10 +4,11 @@
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width,initial-scale=1.0">
     <title>鍥芥爣28181</title>
-    <link rel="stylesheet" type="text/css" href="./static/css/font-awesome.min.css">
+    <link rel="stylesheet" type="text/css" href="./static/css/iconfont.css">
     <link rel="stylesheet" type="text/css" href="./static/css/login.css">
   </head>
   <body>
+    <script type="text/javascript" src="./static/js/jessibuca/index.js"></script>
     <script type="text/javascript" src="./static/js/EasyWasmPlayer.js"></script>
     <script type="text/javascript" src="./static/js/ZLMRTCClient.js"></script>
     <script type="text/javascript" src="//api.map.baidu.com/api?v=2.0&ak=rk73w8dv1rkE4UdZsataG68VarhYQzrx&s=1"></script>
diff --git a/web_src/package-lock.json b/web_src/package-lock.json
index b71b322..11c228f 100644
--- a/web_src/package-lock.json
+++ b/web_src/package-lock.json
@@ -1633,7 +1633,7 @@
       "dev": true,
       "requires": {
         "browserslist": "1.7.7",
-        "caniuse-db": "1.0.30001146",
+        "caniuse-db": "1.0.30001244",
         "lodash.memoize": "4.1.2",
         "lodash.uniq": "4.5.0"
       },
@@ -1644,16 +1644,16 @@
           "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
           "dev": true,
           "requires": {
-            "caniuse-db": "1.0.30001146",
+            "caniuse-db": "1.0.30001244",
             "electron-to-chromium": "1.3.742"
           }
         }
       }
     },
     "caniuse-db": {
-      "version": "1.0.30001146",
-      "resolved": "https://registry.npm.taobao.org/caniuse-db/download/caniuse-db-1.0.30001146.tgz?cache=0&sync_timestamp=1602133173904&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fcaniuse-db%2Fdownload%2Fcaniuse-db-1.0.30001146.tgz",
-      "integrity": "sha1-poOLhbXEFSLrDXsetgeHFsBQ1q4=",
+      "version": "1.0.30001244",
+      "resolved": "https://registry.nlark.com/caniuse-db/download/caniuse-db-1.0.30001244.tgz?cache=0&sync_timestamp=1626154539434&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcaniuse-db%2Fdownload%2Fcaniuse-db-1.0.30001244.tgz",
+      "integrity": "sha1-pt/zJHNkjfCwrg+Z2YeXrft89Fk=",
       "dev": true
     },
     "caniuse-lite": {
@@ -2241,7 +2241,7 @@
     },
     "css-loader": {
       "version": "0.28.11",
-      "resolved": "https://registry.npm.taobao.org/css-loader/download/css-loader-0.28.11.tgz",
+      "resolved": "https://registry.nlark.com/css-loader/download/css-loader-0.28.11.tgz?cache=0&sync_timestamp=1621865230592&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fcss-loader%2Fdownload%2Fcss-loader-0.28.11.tgz",
       "integrity": "sha1-w/mGSnAL4nEbtaJGKyOJsaOS2rc=",
       "dev": true,
       "requires": {
@@ -2426,7 +2426,7 @@
           "dev": true,
           "requires": {
             "browserslist": "1.7.7",
-            "caniuse-db": "1.0.30001146",
+            "caniuse-db": "1.0.30001244",
             "normalize-range": "0.1.2",
             "num2fraction": "1.2.2",
             "postcss": "5.2.18",
@@ -2439,7 +2439,7 @@
           "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
           "dev": true,
           "requires": {
-            "caniuse-db": "1.0.30001146",
+            "caniuse-db": "1.0.30001244",
             "electron-to-chromium": "1.3.742"
           }
         },
@@ -3548,6 +3548,7 @@
         "is-string": "1.0.6",
         "object-inspect": "1.10.3",
         "object-keys": "1.1.1",
+        "object.assign": "4.1.2",
         "string.prototype.trimend": "1.0.4",
         "string.prototype.trimstart": "1.0.4",
         "unbox-primitive": "1.0.1"
@@ -5463,9 +5464,9 @@
       }
     },
     "math-expression-evaluator": {
-      "version": "1.2.22",
-      "resolved": "https://registry.npm.taobao.org/math-expression-evaluator/download/math-expression-evaluator-1.2.22.tgz",
-      "integrity": "sha1-wU3LPYtNFQ5dzqnGjI2tgDCbDV4=",
+      "version": "1.3.8",
+      "resolved": "https://registry.nlark.com/math-expression-evaluator/download/math-expression-evaluator-1.3.8.tgz",
+      "integrity": "sha1-Mg2jsrwVEvT1D8MCCysc1cjp1Xc=",
       "dev": true
     },
     "md5.js": {
@@ -6159,6 +6160,18 @@
       "dev": true,
       "requires": {
         "isobject": "3.0.1"
+      }
+    },
+    "object.assign": {
+      "version": "4.1.2",
+      "resolved": "https://registry.nlark.com/object.assign/download/object.assign-4.1.2.tgz",
+      "integrity": "sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA=",
+      "dev": true,
+      "requires": {
+        "call-bind": "1.0.2",
+        "define-properties": "1.1.3",
+        "has-symbols": "1.0.2",
+        "object-keys": "1.1.1"
       }
     },
     "object.getownpropertydescriptors": {
@@ -7544,7 +7557,7 @@
           "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=",
           "dev": true,
           "requires": {
-            "caniuse-db": "1.0.30001146",
+            "caniuse-db": "1.0.30001244",
             "electron-to-chromium": "1.3.742"
           }
         },
@@ -9198,7 +9211,7 @@
       "dev": true,
       "requires": {
         "balanced-match": "0.4.2",
-        "math-expression-evaluator": "1.2.22",
+        "math-expression-evaluator": "1.3.8",
         "reduce-function-call": "1.0.3"
       },
       "dependencies": {
diff --git a/web_src/package.json b/web_src/package.json
index 280edc7..69d8b6a 100644
--- a/web_src/package.json
+++ b/web_src/package.json
@@ -36,7 +36,7 @@
     "babel-preset-stage-2": "^6.22.0",
     "chalk": "^2.0.1",
     "copy-webpack-plugin": "^4.6.0",
-    "css-loader": "^0.28.0",
+    "css-loader": "^0.28.11",
     "extract-text-webpack-plugin": "^3.0.0",
     "file-loader": "^1.1.4",
     "friendly-errors-webpack-plugin": "^1.6.1",
diff --git a/web_src/src/components/channelList.vue b/web_src/src/components/channelList.vue
index 548bd2c..3891ab5 100644
--- a/web_src/src/components/channelList.vue
+++ b/web_src/src/components/channelList.vue
@@ -154,7 +154,6 @@
         },
         currentChange: function (val) {
             var url = `/${this.$router.currentRoute.name}/${this.deviceId}/${this.parentChannelId}/${this.count}/${val}`
-            console.log(url)
             this.$router.push(url).then(() => {
                 this.initParam();
                 this.initData();
@@ -182,7 +181,6 @@
                         channelType: that.channelType
 					}
             }).then(function (res) {
-                    console.log(res);
                     that.total = res.data.total;
                     that.deviceChannelList = res.data.list;
                     // 闃叉鍑虹幇琛ㄦ牸閿欎綅
@@ -196,7 +194,6 @@
 
         //閫氱煡璁惧涓婁紶濯掍綋娴�
         sendDevicePush: function (itemData) {
-            console.log(itemData);
             let deviceId = this.deviceId;
             this.isLoging = true;
             let channelId = itemData.channelId;
@@ -232,13 +229,11 @@
             this.$refs.devicePlayer.openDialog("record", deviceId, channelId, {date: format})
         },
         stopDevicePush: function (itemData) {
-            console.log(itemData)
             var that = this;
             this.$axios({
                 method: 'get',
                 url: '/api/play/stop/' + this.deviceId + "/" + itemData.channelId
             }).then(function (res) {
-                console.log(JSON.stringify(res));
                 that.initData();
             }).catch(function (error) {
               if (error.response.status === 402) { // 宸茬粡鍋滄杩�
@@ -273,7 +268,6 @@
             })
         },
         changeSubchannel(itemData) {
-            console.log(this.$router.currentRoute)
             this.beforeUrl = this.$router.currentRoute.path;
 
             var url = `/${this.$router.currentRoute.name}/${this.$router.currentRoute.params.deviceId}/${itemData.channelId}/${this.$router.currentRoute.params.count}/1`
@@ -310,13 +304,11 @@
             });
         },
         search: function () {
-            console.log(this.searchSrt)
             this.currentPage = 1;
             this.total = 0;
             this.initData();
         },
         updateChannel: function (row) {
-            console.log(row)
             this.$axios({
                 method: 'post',
                 url: `/api/device/query/channel/update/${this.deviceId}`,
diff --git a/web_src/src/components/dialog/devicePlayer.vue b/web_src/src/components/dialog/devicePlayer.vue
index 1dfc461..9653833 100644
--- a/web_src/src/components/dialog/devicePlayer.vue
+++ b/web_src/src/components/dialog/devicePlayer.vue
@@ -151,7 +151,8 @@
 <script>
 // import player from '../dialog/rtcPlayer.vue'
 // import LivePlayer from '@liveqing/liveplayer'
-import player from '../dialog/easyPlayer.vue'
+// import player from '../dialog/easyPlayer.vue'
+import player from '../dialog/jessibuca.vue'
 export default {
     name: 'devicePlayer',
     props: {},
@@ -280,7 +281,8 @@
             console.log(12121212)
             console.log(baseZlmApi)
             // return `${baseZlmApi}/${streamInfo.app}/${streamInfo.streamId}.flv`;
-            return `http://${baseZlmApi}/${streamInfo.app}/${streamInfo.streamId}.flv`;
+            // return `http://${baseZlmApi}/${streamInfo.app}/${streamInfo.streamId}.flv`;
+            return streamInfo.ws_flv;
         },
         coverPlay: function () {
             var that = this;
diff --git a/web_src/src/components/dialog/jessibuca.vue b/web_src/src/components/dialog/jessibuca.vue
new file mode 100644
index 0000000..ff91cd1
--- /dev/null
+++ b/web_src/src/components/dialog/jessibuca.vue
@@ -0,0 +1,296 @@
+<template>
+  <div id="jessibuca" style="width: auto; height: auto">
+    <div id="container" ref="container" style="width: 100%; height: 10rem; background-color: #000" @dblclick="fullscreenSwich">
+      <div class="buttons-box" id="buttonsBox">
+        <div class="buttons-box-left">
+          <i v-if="!playing" class="iconfont icon-play jessibuca-btn" @click="playBtnClick"></i>
+          <i v-if="playing" class="iconfont icon-pause jessibuca-btn" @click="pause"></i>
+          <i class="iconfont icon-stop jessibuca-btn" @click="destroy"></i>
+          <i v-if="isNotMute" class="iconfont icon-audio-high jessibuca-btn" @click="jessibuca.mute()"></i>
+          <i v-if="!isNotMute" class="iconfont icon-audio-mute jessibuca-btn" @click="jessibuca.cancelMute()"></i>
+        </div>
+        <div class="buttons-box-right">
+          <span class="jessibuca-btn">{{kBps}} kb/s</span>
+<!--          <i class="iconfont icon-file-record1 jessibuca-btn"></i>-->
+<!--          <i class="iconfont icon-xiangqing2 jessibuca-btn" ></i>-->
+          <i class="iconfont icon-crop2 jessibuca-btn" @click="jessibuca.screenshot('鎴浘','png',0.5)"></i>
+          <i class="iconfont icon-shuaxin11 jessibuca-btn" @click="playBtnClick"></i>
+          <i v-if="!fullscreen" class="iconfont icon-weibiaoti10 jessibuca-btn" @click="fullscreenSwich"></i>
+          <i v-if="fullscreen" class="iconfont icon-weibiaoti11 jessibuca-btn" @click="fullscreenSwich"></i>
+        </div>
+    </div>
+
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+    name: 'jessibuca',
+    data() {
+        return {
+          jessibuca: null,
+          playing: false,
+          isNotMute: false,
+          quieting: false,
+          fullscreen: false,
+          loaded: false, // mute
+          speed: 0,
+          performance: "", // 宸ヤ綔鎯呭喌
+          kBps: 0,
+          btnDom: null,
+          videoInfo: null,
+          volume: 1,
+          rotate: 0,
+          vod: true, // 鐐规挱
+          forceNoOffscreen: false,
+        };
+    },
+    props: ['videoUrl', 'error', 'hasaudio', 'height'],
+    mounted () {
+      window.onerror = (msg) => {
+        // console.error(msg)
+      };
+      let paramUrl = decodeURIComponent(this.$route.params.url)
+       this.$nextTick(() =>{
+         let dom = document.getElementById("container");
+         dom.style.height = (9/16 ) * dom.clientWidth + "px"
+          if (typeof (this.videoUrl) == "undefined") {
+            this.videoUrl = paramUrl;
+          }
+         this.btnDom = document.getElementById("buttonsBox");
+          console.log("鍒濆鍖栨椂鐨勫湴鍧�涓�: " + this.videoUrl)
+         this.play(this.videoUrl)
+        })
+    },
+    watch:{
+        videoUrl(newData, oldData){
+            this.play(newData)
+        },
+        immediate:true
+    },
+    methods: {
+        create(){
+          let options =  {};
+          console.log(this.$refs.container)
+
+          this.jessibuca = new window.Jessibuca(Object.assign(
+            {
+              container: this.$refs.container,
+              videoBuffer: 0.5, // 鏈�澶х紦鍐叉椂闀匡紝鍗曚綅绉�
+              isResize: true,
+              decoder: "./static/js/jessibuca/index.js",
+              // text: "WVP-PRO",
+              // background: "bg.jpg",
+              loadingText: "鍔犺浇涓�",
+              hasAudio: this.hasAudio,
+              debug: false,
+              supportDblclickFullscreen: false, // 鏄惁鏀寔灞忓箷鐨勫弻鍑讳簨浠讹紝瑙﹀彂鍏ㄥ睆锛屽彇娑堝叏灞忎簨浠躲��
+              operateBtns: {
+                fullscreen: false,
+                screenshot: false,
+                play: false,
+                audio: false,
+              },
+              record: "record",
+              vod: this.vod,
+              forceNoOffscreen: this.forceNoOffscreen,
+              isNotMute: this.isNotMute,
+            },
+            options
+          ));
+
+          let _this = this;
+          this.jessibuca.on("load", function () {
+            console.log("on load init");
+          });
+
+          this.jessibuca.on("log", function (msg) {
+            console.log("on log", msg);
+          });
+          this.jessibuca.on("record", function (msg) {
+            console.log("on record:", msg);
+          });
+          this.jessibuca.on("pause", function () {
+            _this.playing = false;
+          });
+          this.jessibuca.on("play", function () {
+            _this.playing = true;
+          });
+          this.jessibuca.on("fullscreen", function (msg) {
+            console.log("on fullscreen", msg);
+            _this.fullscreen = msg
+          });
+
+          this.jessibuca.on("mute", function (msg) {
+            console.log("on mute", msg);
+            _this.isNotMute = !msg;
+          });
+          this.jessibuca.on("audioInfo", function (msg) {
+            // console.log("audioInfo", msg);
+          });
+
+          this.jessibuca.on("videoInfo", function (msg) {
+            this.videoInfo = msg;
+            // console.log("videoInfo", msg);
+
+          });
+
+          this.jessibuca.on("bps", function (bps) {
+            // console.log('bps', bps);
+
+          });
+          let _ts = 0;
+          this.jessibuca.on("timeUpdate", function (ts) {
+            // console.log('timeUpdate,old,new,timestamp', _ts, ts, ts - _ts);
+            _ts = ts;
+          });
+
+          this.jessibuca.on("videoInfo", function (info) {
+            console.log("videoInfo", info);
+          });
+
+          this.jessibuca.on("error", function (error) {
+            console.log("error", error);
+          });
+
+          this.jessibuca.on("timeout", function () {
+            console.log("timeout");
+          });
+
+          this.jessibuca.on('start', function () {
+            console.log('start');
+          })
+
+          this.jessibuca.on("performance", function (performance) {
+            let show = "鍗¢】";
+            if (performance === 2) {
+              show = "闈炲父娴佺晠";
+            } else if (performance === 1) {
+              show = "娴佺晠";
+            }
+            _this.performance = show;
+          });
+          this.jessibuca.on('buffer', function (buffer) {
+            // console.log('buffer', buffer);
+          })
+
+          this.jessibuca.on('stats', function (stats) {
+            // console.log('stats', stats);
+          })
+
+          this.jessibuca.on('kBps', function (kBps) {
+            _this.kBps = Math.round(kBps);
+          });
+
+          // 鏄剧ず鏃堕棿鎴� PTS
+          this.jessibuca.on('videoFrame', function () {
+
+          })
+
+          //
+          this.jessibuca.on('metadata', function () {
+
+          });
+        },
+        playBtnClick: function (event){
+          this.play(this.videoUrl)
+        },
+        play: function (url) {
+          console.log(url)
+            if (this.jessibuca) {
+              this.destroy();
+            }
+            this.create();
+            this.jessibuca.on("play", () => {
+              this.playing = true;
+              this.loaded = true;
+              this.quieting = this.jessibuca.quieting;
+            });
+            if (this.jessibuca.hasLoaded()) {
+              this.jessibuca.play(url);
+            } else {
+              this.jessibuca.on("load", () => {
+                console.log("load 鎾斁")
+                this.jessibuca.play(url);
+              });
+            }
+        },
+        pause: function () {
+          if (this.jessibuca) {
+            this.jessibuca.pause();
+          }
+          this.playing = false;
+          this.err = "";
+          this.performance = "";
+        },
+        destroy: function () {
+          if (this.jessibuca) {
+            this.jessibuca.destroy();
+          }
+          if (document.getElementById("buttonsBox") == null) {
+            document.getElementById("container").appendChild(this.btnDom)
+          }
+          this.jessibuca = null;
+          this.playing = false;
+          this.err = "";
+          this.performance = "";
+
+        },
+        eventcallbacK: function(type, message) {
+            // console.log("player 浜嬩欢鍥炶皟")
+            // console.log(type)
+            // console.log(message)
+        },
+        fullscreenSwich: function (){
+            let isFull = this.isFullscreen()
+            this.jessibuca.setFullscreen(!isFull)
+            this.fullscreen = !isFull;
+        },
+        isFullscreen: function (){
+          return document.fullscreenElement ||
+            document.msFullscreenElement  ||
+            document.mozFullScreenElement ||
+            document.webkitFullscreenElement || false;
+        }
+    },
+    destroyed() {
+      if (this.jessibuca) {
+        this.jessibuca.destroy();
+      }
+      this.playing = false;
+      this.loaded = false;
+      this.performance = "";
+    },
+}
+</script>
+
+<style>
+  .buttons-box{
+    width: 100%;
+    height: 28px;
+    background-color: rgba(43, 51, 63, 0.7);
+    position: absolute;
+    display: -webkit-box;
+    display: -ms-flexbox;
+    display: flex;
+    left: 0;
+    bottom: 0;
+    user-select: none;
+    z-index: 10;
+  }
+  .jessibuca-btn{
+    width: 20px;
+    color: rgb(255, 255, 255);
+    line-height: 27px;
+    margin: 0px 10px;
+    padding: 0px 2px;
+    cursor: pointer;
+    text-align: center;
+    font-size: 0.8rem !important;
+  }
+  .buttons-box-right {
+    position: absolute;
+    right: 0;
+  }
+</style>
diff --git a/web_src/src/router/index.js b/web_src/src/router/index.js
index 05ccaf7..4b0810d 100644
--- a/web_src/src/router/index.js
+++ b/web_src/src/router/index.js
@@ -15,7 +15,7 @@
 import sip from '../components/setting/Sip.vue'
 import media from '../components/setting/Media.vue'
 
-import wasmPlayer from '../components/dialog/easyPlayer.vue'
+import wasmPlayer from '../components/dialog/jessibuca.vue'
 import rtcPlayer from '../components/dialog/rtcPlayer.vue'
 
 const originalPush = VueRouter.prototype.push
diff --git a/web_src/static/css/font-awesome.min.css b/web_src/static/css/font-awesome.min.css
deleted file mode 100644
index 540440c..0000000
--- a/web_src/static/css/font-awesome.min.css
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- *  Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
- *  License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
- */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/web_src/static/css/iconfont.css b/web_src/static/css/iconfont.css
new file mode 100644
index 0000000..972cf6b
--- /dev/null
+++ b/web_src/static/css/iconfont.css
@@ -0,0 +1,1655 @@
+@font-face {
+  font-family: "iconfont"; /* Project id 1291092 */
+  src: url('iconfont.woff2?t=1626163621710') format('woff2'),
+       url('iconfont.woff?t=1626163621710') format('woff'),
+       url('iconfont.ttf?t=1626163621710') format('truetype');
+}
+
+.iconfont {
+  font-family: "iconfont" !important;
+  font-size: 16px;
+  font-style: normal;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-xiangqing2:before {
+  content: "\e798";
+}
+
+.icon-record:before {
+  content: "\e7a6";
+}
+
+.icon-audio-mute:before {
+  content: "\e792";
+}
+
+.icon-audio-high:before {
+  content: "\e793";
+}
+
+.icon-record1:before {
+  content: "\e7f8";
+}
+
+.icon-audio-line:before {
+  content: "\e794";
+}
+
+.icon-record2:before {
+  content: "\e795";
+}
+
+.icon-audio-fill:before {
+  content: "\e796";
+}
+
+.icon-PTZ:before {
+  content: "\e797";
+}
+
+.icon-camera1196054easyiconnet:before {
+  content: "\e791";
+}
+
+.icon-weibiaoti10:before {
+  content: "\e78f";
+}
+
+.icon-weibiaoti11:before {
+  content: "\e790";
+}
+
+.icon-page-next1:before {
+  content: "\e69c";
+}
+
+.icon-page-last1:before {
+  content: "\e69d";
+}
+
+.icon-ptz-down1:before {
+  content: "\e69e";
+}
+
+.icon-file-search1:before {
+  content: "\e69f";
+}
+
+.icon-page-first1:before {
+  content: "\e6a0";
+}
+
+.icon-fork1:before {
+  content: "\e6a1";
+}
+
+.icon-ptz-middle1:before {
+  content: "\e6a2";
+}
+
+.icon-ptz-upright1:before {
+  content: "\e6a3";
+}
+
+.icon-ptz-downleft1:before {
+  content: "\e6a4";
+}
+
+.icon-window-restore1:before {
+  content: "\e6a5";
+}
+
+.icon-plus1:before {
+  content: "\e6a6";
+}
+
+.icon-ptz-right1:before {
+  content: "\e6a7";
+}
+
+.icon-stop:before {
+  content: "\e6a8";
+}
+
+.icon-refresh1:before {
+  content: "\e6a9";
+}
+
+.icon-tool-polyline1:before {
+  content: "\e6aa";
+}
+
+.icon-tool-point1:before {
+  content: "\e6ab";
+}
+
+.icon-minus1:before {
+  content: "\e6ac";
+}
+
+.icon-ptz-wiper1:before {
+  content: "\e6ad";
+}
+
+.icon-tool-select1:before {
+  content: "\e6ae";
+}
+
+.icon-tool-polygon1:before {
+  content: "\e6af";
+}
+
+.icon-settings1:before {
+  content: "\e6b0";
+}
+
+.icon-search1:before {
+  content: "\e6b1";
+}
+
+.icon-ir-vis1:before {
+  content: "\e6b2";
+}
+
+.icon-ptz-light1:before {
+  content: "\e6b3";
+}
+
+.icon-ptz-up1:before {
+  content: "\e6b4";
+}
+
+.icon-ptz-upleft1:before {
+  content: "\e6b5";
+}
+
+.icon-temp-stream1:before {
+  content: "\e6b6";
+}
+
+.icon-tool-mouse1:before {
+  content: "\e6b7";
+}
+
+.icon-zhongyingwenyingwen-01:before {
+  content: "\e6b8";
+}
+
+.icon-zhongyingwenyingwen02-01:before {
+  content: "\e6b9";
+}
+
+.icon-crop2:before {
+  content: "\e6ba";
+}
+
+.icon-expander-down2:before {
+  content: "\e6bb";
+}
+
+.icon-window-restore2:before {
+  content: "\e6bc";
+}
+
+.icon-file-jpg2:before {
+  content: "\e6bd";
+}
+
+.icon-asterisk3:before {
+  content: "\e6be";
+}
+
+.icon-ffc2:before {
+  content: "\e6bf";
+}
+
+.icon-file-record2:before {
+  content: "\e6c0";
+}
+
+.icon-file-stream2:before {
+  content: "\e6c1";
+}
+
+.icon-fork2:before {
+  content: "\e6c2";
+}
+
+.icon-file-mp42:before {
+  content: "\e6c3";
+}
+
+.icon-ir-vis2:before {
+  content: "\e6c4";
+}
+
+.icon-file-search2:before {
+  content: "\e6c5";
+}
+
+.icon-pause:before {
+  content: "\e6c6";
+}
+
+.icon-play1:before {
+  content: "\e6c7";
+}
+
+.icon-page-previous2:before {
+  content: "\e6c8";
+}
+
+.icon-page-next2:before {
+  content: "\e6c9";
+}
+
+.icon-minus2:before {
+  content: "\e6ca";
+}
+
+.icon-page-last2:before {
+  content: "\e6cb";
+}
+
+.icon-page-first2:before {
+  content: "\e6cc";
+}
+
+.icon-ptz-downleft2:before {
+  content: "\e6cd";
+}
+
+.icon-ptz-downright2:before {
+  content: "\e6ce";
+}
+
+.icon-ptz-middle2:before {
+  content: "\e6cf";
+}
+
+.icon-ptz-down2:before {
+  content: "\e6d0";
+}
+
+.icon-plus2:before {
+  content: "\e6d1";
+}
+
+.icon-ptz-left2:before {
+  content: "\e6d2";
+}
+
+.icon-ptz-up2:before {
+  content: "\e6d3";
+}
+
+.icon-ptz-right2:before {
+  content: "\e6d4";
+}
+
+.icon-ptz-light2:before {
+  content: "\e6d5";
+}
+
+.icon-ptz-wiper2:before {
+  content: "\e6d6";
+}
+
+.icon-ptz-upright2:before {
+  content: "\e6d7";
+}
+
+.icon-search2:before {
+  content: "\e6d8";
+}
+
+.icon-refresh2:before {
+  content: "\e6d9";
+}
+
+.icon-ptz-upleft2:before {
+  content: "\e6da";
+}
+
+.icon-stop1:before {
+  content: "\e6db";
+}
+
+.icon-tool-mouse2:before {
+  content: "\e6dc";
+}
+
+.icon-settings2:before {
+  content: "\e6dd";
+}
+
+.icon-tool-polygon2:before {
+  content: "\e6de";
+}
+
+.icon-tool-point2:before {
+  content: "\e6df";
+}
+
+.icon-temp-stream2:before {
+  content: "\e6e0";
+}
+
+.icon-tool-polyline2:before {
+  content: "\e6e1";
+}
+
+.icon-window-maximize2:before {
+  content: "\e6e2";
+}
+
+.icon-window-minimize2:before {
+  content: "\e6e3";
+}
+
+.icon-tool-select2:before {
+  content: "\e6e4";
+}
+
+.icon-video-stream2:before {
+  content: "\e6e5";
+}
+
+.icon-bianji1:before {
+  content: "\e6e6";
+}
+
+.icon-caidanzhankai1:before {
+  content: "\e6e7";
+}
+
+.icon-cha11:before {
+  content: "\e6e8";
+}
+
+.icon-caidanshouqi1:before {
+  content: "\e6e9";
+}
+
+.icon-zhongyingwen2zhongwen1:before {
+  content: "\e6ea";
+}
+
+.icon-bofang011:before {
+  content: "\e6eb";
+}
+
+.icon-zuo:before {
+  content: "\e6ec";
+}
+
+.icon-baojing1:before {
+  content: "\e6ed";
+}
+
+.icon-fuxuankuang-true1:before {
+  content: "\e6ee";
+}
+
+.icon-bofang2:before {
+  content: "\e6ef";
+}
+
+.icon-baojingshezhi1:before {
+  content: "\e6f0";
+}
+
+.icon-jiahao2:before {
+  content: "\e6f1";
+}
+
+.icon-huifangxuanzhong1:before {
+  content: "\e6f2";
+}
+
+.icon-cewen1:before {
+  content: "\e6f3";
+}
+
+.icon-baojingjilu2:before {
+  content: "\e6f4";
+}
+
+.icon-danxuan1:before {
+  content: "\e6f5";
+}
+
+.icon-pingmufenge1:before {
+  content: "\e6f6";
+}
+
+.icon-luxiangguanli1:before {
+  content: "\e6f7";
+}
+
+.icon-goukuang:before {
+  content: "\e6f8";
+}
+
+.icon-shanchu11:before {
+  content: "\e6f9";
+}
+
+.icon-cha02:before {
+  content: "\e6fa";
+}
+
+.icon-huifang1:before {
+  content: "\e6fb";
+}
+
+.icon-rili1:before {
+  content: "\e6fc";
+}
+
+.icon-quanping1:before {
+  content: "\e6fd";
+}
+
+.icon-jianhao1:before {
+  content: "\e6fe";
+}
+
+.icon-shijian1:before {
+  content: "\e6ff";
+}
+
+.icon-shishiyulanxuanzhong1:before {
+  content: "\e700";
+}
+
+.icon-shouji1:before {
+  content: "\e701";
+}
+
+.icon-shouyexuanzhong1:before {
+  content: "\e702";
+}
+
+.icon-luxiang01:before {
+  content: "\e703";
+}
+
+.icon-shishiyulan:before {
+  content: "\e704";
+}
+
+.icon-quxiao:before {
+  content: "\e601";
+}
+
+.icon-sousuo1:before {
+  content: "\e705";
+}
+
+.icon-file-record:before {
+  content: "\e602";
+}
+
+.icon-shebeiguanli1:before {
+  content: "\e706";
+}
+
+.icon-play:before {
+  content: "\e603";
+}
+
+.icon-suo1:before {
+  content: "\e707";
+}
+
+.icon-file-stream:before {
+  content: "\e604";
+}
+
+.icon-tuichudenglu1:before {
+  content: "\e708";
+}
+
+.icon-ptz-middle:before {
+  content: "\e606";
+}
+
+.icon-wenhao1:before {
+  content: "\e709";
+}
+
+.icon-minus:before {
+  content: "\e607";
+}
+
+.icon-shezhixuanzhong:before {
+  content: "\e70a";
+}
+
+.icon-fork:before {
+  content: "\e608";
+}
+
+.icon-shezhiweixuanzhong1:before {
+  content: "\e70b";
+}
+
+.icon-ptz-up:before {
+  content: "\e609";
+}
+
+.icon-shuju2:before {
+  content: "\e70c";
+}
+
+.icon-file-jpg:before {
+  content: "\e60a";
+}
+
+.icon-xiazai011:before {
+  content: "\e70d";
+}
+
+.icon-ptz-left:before {
+  content: "\e60b";
+}
+
+.icon-xiala11:before {
+  content: "\e70e";
+}
+
+.icon-ptz-down:before {
+  content: "\e60c";
+}
+
+.icon-shuaxin:before {
+  content: "\e70f";
+}
+
+.icon-file-search:before {
+  content: "\e60d";
+}
+
+.icon-pingmufenge01:before {
+  content: "\e710";
+}
+
+.icon-crop:before {
+  content: "\e60e";
+}
+
+.icon-yonghu1:before {
+  content: "\e711";
+}
+
+.icon-asterisk:before {
+  content: "\e60f";
+}
+
+.icon-wenhao01:before {
+  content: "\e712";
+}
+
+.icon-expander-down:before {
+  content: "\e610";
+}
+
+.icon-you:before {
+  content: "\e713";
+}
+
+.icon-ptz-right:before {
+  content: "\e611";
+}
+
+.icon-shujuxuanzhong1:before {
+  content: "\e714";
+}
+
+.icon-ptz-wiper:before {
+  content: "\e612";
+}
+
+.icon-kuangxuan1:before {
+  content: "\e715";
+}
+
+.icon-ir-vis:before {
+  content: "\e613";
+}
+
+.icon-yonghuguanli1:before {
+  content: "\e716";
+}
+
+.icon-ptz-upleft:before {
+  content: "\e614";
+}
+
+.icon-zhongyingwenyingwen:before {
+  content: "\e717";
+}
+
+.icon-ptz-downright:before {
+  content: "\e615";
+}
+
+.icon-xiala2:before {
+  content: "\e718";
+}
+
+.icon-search:before {
+  content: "\e616";
+}
+
+.icon-luxiang:before {
+  content: "\e719";
+}
+
+.icon-ptz-upright:before {
+  content: "\e617";
+}
+
+.icon-zanting2:before {
+  content: "\e71a";
+}
+
+.icon-ptz-downleft:before {
+  content: "\e618";
+}
+
+.icon-kefu:before {
+  content: "\e71b";
+}
+
+.icon-tool-point:before {
+  content: "\e619";
+}
+
+.icon-jiqiren:before {
+  content: "\e71c";
+}
+
+.icon-ptz-light:before {
+  content: "\e61a";
+}
+
+.icon-huanliuzhan:before {
+  content: "\e71d";
+}
+
+.icon-tool-polyline:before {
+  content: "\e61b";
+}
+
+.icon-shouji2:before {
+  content: "\e71e";
+}
+
+.icon-file-mp4:before {
+  content: "\e61c";
+}
+
+.icon-cangku:before {
+  content: "\e71f";
+}
+
+.icon-window-maximize:before {
+  content: "\e61d";
+}
+
+.icon-shuaxin11:before {
+  content: "\e720";
+}
+
+.icon-page-next:before {
+  content: "\e61e";
+}
+
+.icon-weixiu:before {
+  content: "\e721";
+}
+
+.icon-ffc:before {
+  content: "\e61f";
+}
+
+.icon-biandianzhan:before {
+  content: "\e722";
+}
+
+.icon-tool-mouse:before {
+  content: "\e620";
+}
+
+.icon-youxiang:before {
+  content: "\e723";
+}
+
+.icon-settings:before {
+  content: "\e621";
+}
+
+.icon-qq:before {
+  content: "\e724";
+}
+
+.icon-page-last:before {
+  content: "\e622";
+}
+
+.icon-dianhua01:before {
+  content: "\e725";
+}
+
+.icon-window-restore:before {
+  content: "\e624";
+}
+
+.icon-fasongyoujian:before {
+  content: "\e726";
+}
+
+.icon-tool-select:before {
+  content: "\e625";
+}
+
+.icon-gaotieyunhangcopy:before {
+  content: "\e727";
+}
+
+.icon-video-stream:before {
+  content: "\e627";
+}
+
+.icon-dizhi:before {
+  content: "\e728";
+}
+
+.icon-page-first:before {
+  content: "\e628";
+}
+
+.icon-anfangbaojingmian:before {
+  content: "\e729";
+}
+
+.icon-page-previous:before {
+  content: "\e629";
+}
+
+.icon-piliangcaozuo1:before {
+  content: "\e72a";
+}
+
+.icon-refresh:before {
+  content: "\e62a";
+}
+
+.icon-qiyeguanli1:before {
+  content: "\e72b";
+}
+
+.icon-temp-stream:before {
+  content: "\e62b";
+}
+
+.icon-luxiangguanli2:before {
+  content: "\e72c";
+}
+
+.icon-tool-polygon:before {
+  content: "\e62c";
+}
+
+.icon-quanxianguanli1:before {
+  content: "\e72d";
+}
+
+.icon-window-minimize:before {
+  content: "\e62d";
+}
+
+.icon-shezhi1:before {
+  content: "\e72e";
+}
+
+.icon-plus:before {
+  content: "\e62e";
+}
+
+.icon-shishi1:before {
+  content: "\e72f";
+}
+
+.icon-qiyeguanli:before {
+  content: "\e62f";
+}
+
+.icon-shujuquanxian1:before {
+  content: "\e730";
+}
+
+.icon-quanxianguanli:before {
+  content: "\e630";
+}
+
+.icon-shishiyulanxuanzhong2:before {
+  content: "\e731";
+}
+
+.icon-shujuquanxian:before {
+  content: "\e631";
+}
+
+.icon-renzheng:before {
+  content: "\e732";
+}
+
+.icon--_baojinglianxiren:before {
+  content: "\e632";
+}
+
+.icon-shuju3:before {
+  content: "\e733";
+}
+
+.icon-yuechi:before {
+  content: "\e633";
+}
+
+.icon-shouye1:before {
+  content: "\e734";
+}
+
+.icon-xitongguanli:before {
+  content: "\e634";
+}
+
+.icon-zuzhi1:before {
+  content: "\e735";
+}
+
+.icon-zuzhi:before {
+  content: "\e635";
+}
+
+.icon-zuzhiguanli1:before {
+  content: "\e736";
+}
+
+.icon-renzheng6:before {
+  content: "\e636";
+}
+
+.icon-xitongguanli1:before {
+  content: "\e737";
+}
+
+.icon-yonghuguanli01:before {
+  content: "\e637";
+}
+
+.icon-yuechi1:before {
+  content: "\e738";
+}
+
+.icon-baojingmoban:before {
+  content: "\e638";
+}
+
+.icon-baojinglianxiren:before {
+  content: "\e739";
+}
+
+.icon-zuzhiguanli:before {
+  content: "\e639";
+}
+
+.icon-baojingjilu3:before {
+  content: "\e73a";
+}
+
+.icon-yonghuguanli:before {
+  content: "\e63a";
+}
+
+.icon-huifangxuanzhong2:before {
+  content: "\e73b";
+}
+
+.icon-bumenguanli:before {
+  content: "\e63b";
+}
+
+.icon-caiwu1:before {
+  content: "\e73c";
+}
+
+.icon-shishi:before {
+  content: "\e63c";
+}
+
+.icon-baojingguize1:before {
+  content: "\e73d";
+}
+
+.icon-baojing:before {
+  content: "\e63d";
+}
+
+.icon-bumenguanli1:before {
+  content: "\e73e";
+}
+
+.icon-shezhi:before {
+  content: "\e63e";
+}
+
+.icon-baojing2:before {
+  content: "\e73f";
+}
+
+.icon-huifangxuanzhong:before {
+  content: "\e63f";
+}
+
+.icon-yonghuguanli2:before {
+  content: "\e740";
+}
+
+.icon-luxiangguanli:before {
+  content: "\e640";
+}
+
+.icon-huifang2:before {
+  content: "\e741";
+}
+
+.icon-huifang:before {
+  content: "\e642";
+}
+
+.icon-baojingmoban1:before {
+  content: "\e742";
+}
+
+.icon-shouye:before {
+  content: "\e643";
+}
+
+.icon-dingdanxiangqing1:before {
+  content: "\e743";
+}
+
+.icon-shishiyulanxuanzhong:before {
+  content: "\e644";
+}
+
+.icon-fapiaoguanli1:before {
+  content: "\e744";
+}
+
+.icon-caiwu:before {
+  content: "\e645";
+}
+
+.icon-shiyonggaikuang1:before {
+  content: "\e745";
+}
+
+.icon-baojingjilu:before {
+  content: "\e646";
+}
+
+.icon-zengzhifuwu1:before {
+  content: "\e746";
+}
+
+.icon-baojingguize:before {
+  content: "\e647";
+}
+
+.icon-yiguanzhu:before {
+  content: "\e747";
+}
+
+.icon-shuju:before {
+  content: "\e648";
+}
+
+.icon-baojingtuisongshezhi1:before {
+  content: "\e748";
+}
+
+.icon-piliangcaozuo:before {
+  content: "\e649";
+}
+
+.icon-quxiao1:before {
+  content: "\e749";
+}
+
+.icon-suo:before {
+  content: "\e64a";
+}
+
+.icon-xiangqing1:before {
+  content: "\e74a";
+}
+
+.icon-yonghu:before {
+  content: "\e64b";
+}
+
+.icon-xufei1:before {
+  content: "\e74b";
+}
+
+.icon-shouji:before {
+  content: "\e64c";
+}
+
+.icon-zhifu1:before {
+  content: "\e74c";
+}
+
+.icon-tianjiadian:before {
+  content: "\e64d";
+}
+
+.icon-kuang:before {
+  content: "\e74d";
+}
+
+.icon-tianjiaxian:before {
+  content: "\e64e";
+}
+
+.icon-shouzhimingxi:before {
+  content: "\e74e";
+}
+
+.icon-tianjiaxuanqu:before {
+  content: "\e64f";
+}
+
+.icon-shouzhimingxi1:before {
+  content: "\e74f";
+}
+
+.icon-xuanzeduixiang:before {
+  content: "\e650";
+}
+
+.icon-daochu:before {
+  content: "\e750";
+}
+
+.icon-baojing01:before {
+  content: "\e651";
+}
+
+.icon-daochu1:before {
+  content: "\e751";
+}
+
+.icon-baojingjilu1:before {
+  content: "\e652";
+}
+
+.icon-daping:before {
+  content: "\e752";
+}
+
+.icon-baojingshezhi:before {
+  content: "\e653";
+}
+
+.icon-shaixuan:before {
+  content: "\e753";
+}
+
+.icon-cewen:before {
+  content: "\e654";
+}
+
+.icon-zhifu2:before {
+  content: "\e754";
+}
+
+.icon-tuichudenglu:before {
+  content: "\e655";
+}
+
+.icon-shaixuan1:before {
+  content: "\e755";
+}
+
+.icon-shezhiweixuanzhong:before {
+  content: "\e656";
+}
+
+.icon-zhifu3:before {
+  content: "\e756";
+}
+
+.icon-shezhixuanzhong1:before {
+  content: "\e657";
+}
+
+.icon-xia:before {
+  content: "\e757";
+}
+
+.icon-shouyexuanzhong:before {
+  content: "\e658";
+}
+
+.icon-xia1:before {
+  content: "\e758";
+}
+
+.icon-shujuxuanzhong:before {
+  content: "\e659";
+}
+
+.icon-yanzhengma:before {
+  content: "\e759";
+}
+
+.icon-shuju1:before {
+  content: "\e65a";
+}
+
+.icon-tongxunlu:before {
+  content: "\e75a";
+}
+
+.icon-bianji:before {
+  content: "\e65b";
+}
+
+.icon-yanzhengma1:before {
+  content: "\e75b";
+}
+
+.icon-rili:before {
+  content: "\e65c";
+}
+
+.icon-tongxunlu1:before {
+  content: "\e75c";
+}
+
+.icon-shanchu:before {
+  content: "\e65d";
+}
+
+.icon-yingyongbangding:before {
+  content: "\e75d";
+}
+
+.icon-jiahao:before {
+  content: "\e65e";
+}
+
+.icon-yingyongbangding1:before {
+  content: "\e75e";
+}
+
+.icon-wenhao:before {
+  content: "\e65f";
+}
+
+.icon-yingyongbangding2:before {
+  content: "\e75f";
+}
+
+.icon-zhongyingwen:before {
+  content: "\e660";
+}
+
+.icon-dapingzhanshi:before {
+  content: "\e760";
+}
+
+.icon-kuangxuan:before {
+  content: "\e661";
+}
+
+.icon-jiankong:before {
+  content: "\e761";
+}
+
+.icon-cha1:before {
+  content: "\e662";
+}
+
+.icon-touxiang:before {
+  content: "\e762";
+}
+
+.icon-bofang01:before {
+  content: "\e663";
+}
+
+.icon-lou:before {
+  content: "\e763";
+}
+
+.icon-caidanzhankai:before {
+  content: "\e664";
+}
+
+.icon-jiankong1:before {
+  content: "\e764";
+}
+
+.icon-caidanshouqi:before {
+  content: "\e665";
+}
+
+.icon-lou1:before {
+  content: "\e765";
+}
+
+.icon-danxuan:before {
+  content: "\e666";
+}
+
+.icon-dapingzhanshi1:before {
+  content: "\e766";
+}
+
+.icon-fuxuankuangxuanzhong:before {
+  content: "\e667";
+}
+
+.icon-touxiang1:before {
+  content: "\e767";
+}
+
+.icon-fuxuankuang-true:before {
+  content: "\e668";
+}
+
+.icon-shebei:before {
+  content: "\e768";
+}
+
+.icon-jianhao:before {
+  content: "\e669";
+}
+
+.icon-shebeii:before {
+  content: "\e769";
+}
+
+.icon-shanchu1:before {
+  content: "\e66a";
+}
+
+.icon-bianji11:before {
+  content: "\e76a";
+}
+
+.icon-shijian:before {
+  content: "\e66b";
+}
+
+.icon-jilu:before {
+  content: "\e76b";
+}
+
+.icon-jiahao1:before {
+  content: "\e66c";
+}
+
+.icon-yun:before {
+  content: "\e76c";
+}
+
+.icon-sousuo:before {
+  content: "\e66d";
+}
+
+.icon-baojing3:before {
+  content: "\e76d";
+}
+
+.icon-zhongyingwen2zhongwen:before {
+  content: "\e66e";
+}
+
+.icon-zhinengyangan:before {
+  content: "\e76e";
+}
+
+.icon-xiala:before {
+  content: "\e66f";
+}
+
+.icon-yongdiananquan:before {
+  content: "\e76f";
+}
+
+.icon-xiala1:before {
+  content: "\e670";
+}
+
+.icon-zhinengmensuo:before {
+  content: "\e770";
+}
+
+.icon-xiazai01:before {
+  content: "\e671";
+}
+
+.icon-xiaokongyujing:before {
+  content: "\e771";
+}
+
+.icon-pingmufenge02:before {
+  content: "\e672";
+}
+
+.icon-zhinengdianbiao:before {
+  content: "\e772";
+}
+
+.icon-shezhi01:before {
+  content: "\e673";
+}
+
+.icon-zhinengshuibiao:before {
+  content: "\e773";
+}
+
+.icon-zuixiaohuaxi:before {
+  content: "\e674";
+}
+
+.icon-shuiyajiance01:before {
+  content: "\e774";
+}
+
+.icon-zuidahuaxi:before {
+  content: "\e675";
+}
+
+.icon-zhinengzhaoming:before {
+  content: "\e775";
+}
+
+.icon-huifuxi:before {
+  content: "\e676";
+}
+
+.icon-zhinengmenjin:before {
+  content: "\e776";
+}
+
+.icon-guanbixi:before {
+  content: "\e677";
+}
+
+.icon-tingchechang:before {
+  content: "\e777";
+}
+
+.icon-baocunJPG:before {
+  content: "\e678";
+}
+
+.icon-xiala3:before {
+  content: "\e778";
+}
+
+.icon-quxian:before {
+  content: "\e679";
+}
+
+.icon-zhinengkongtiao:before {
+  content: "\e779";
+}
+
+.icon-tingzhiyulan:before {
+  content: "\e67a";
+}
+
+.icon-sousuo2:before {
+  content: "\e77a";
+}
+
+.icon-wenduliuluzhi:before {
+  content: "\e67b";
+}
+
+.icon-shang1:before {
+  content: "\e77b";
+}
+
+.icon-shuaxin1:before {
+  content: "\e67c";
+}
+
+.icon-1_jingdianchuwuweixuanzhong:before {
+  content: "\e77c";
+}
+
+.icon-shangjiantou:before {
+  content: "\e67d";
+}
+
+.icon-dianti:before {
+  content: "\e77d";
+}
+
+.icon-shang:before {
+  content: "\e67e";
+}
+
+.icon-zhuangtai:before {
+  content: "\e77e";
+}
+
+.icon-zixun:before {
+  content: "\e67f";
+}
+
+.icon-keshi:before {
+  content: "\e77f";
+}
+
+.icon-youxiang01:before {
+  content: "\e680";
+}
+
+.icon-chongzhijilu:before {
+  content: "\e780";
+}
+
+.icon-QQ:before {
+  content: "\e681";
+}
+
+.icon-jingshi:before {
+  content: "\e781";
+}
+
+.icon-dianhua:before {
+  content: "\e682";
+}
+
+.icon-bianji2:before {
+  content: "\e782";
+}
+
+.icon-pingmufenge:before {
+  content: "\e683";
+}
+
+.icon-fuzhi:before {
+  content: "\e783";
+}
+
+.icon-gou:before {
+  content: "\e684";
+}
+
+.icon-guanyu:before {
+  content: "\e784";
+}
+
+.icon-dingdanxiangqing:before {
+  content: "\e685";
+}
+
+.icon-shishiyulan-01:before {
+  content: "\e785";
+}
+
+.icon-shiyonggaikuang:before {
+  content: "\e686";
+}
+
+.icon-shujuchakan:before {
+  content: "\e786";
+}
+
+.icon-fapiaoguanli:before {
+  content: "\e687";
+}
+
+.icon-shanchu2:before {
+  content: "\e787";
+}
+
+.icon-xiangqing:before {
+  content: "\e688";
+}
+
+.icon-xitongpeizhi:before {
+  content: "\e788";
+}
+
+.icon-baojingtuisongshezhi:before {
+  content: "\e689";
+}
+
+.icon-tezhengwendu:before {
+  content: "\e789";
+}
+
+.icon-zhifu:before {
+  content: "\e68a";
+}
+
+.icon-quanzhenwendu:before {
+  content: "\e78a";
+}
+
+.icon-zengzhifuwu:before {
+  content: "\e68b";
+}
+
+.icon-fenxiang:before {
+  content: "\e78b";
+}
+
+.icon-xufei:before {
+  content: "\e68c";
+}
+
+.icon-fenxiang01:before {
+  content: "\e78c";
+}
+
+.icon-asterisk1:before {
+  content: "\e68d";
+}
+
+.icon-wenhao2:before {
+  content: "\e78d";
+}
+
+.icon-window-maximize1:before {
+  content: "\e68e";
+}
+
+.icon-dian:before {
+  content: "\e78e";
+}
+
+.icon-crop1:before {
+  content: "\e68f";
+}
+
+.icon-asterisk2:before {
+  content: "\e690";
+}
+
+.icon-file-record1:before {
+  content: "\e691";
+}
+
+.icon-ffc1:before {
+  content: "\e692";
+}
+
+.icon-file-mp41:before {
+  content: "\e693";
+}
+
+.icon-window-minimize1:before {
+  content: "\e694";
+}
+
+.icon-ptz-downright1:before {
+  content: "\e695";
+}
+
+.icon-video-stream1:before {
+  content: "\e696";
+}
+
+.icon-file-jpg1:before {
+  content: "\e697";
+}
+
+.icon-file-stream1:before {
+  content: "\e698";
+}
+
+.icon-page-previous1:before {
+  content: "\e699";
+}
+
+.icon-expander-down1:before {
+  content: "\e69a";
+}
+
+.icon-ptz-left1:before {
+  content: "\e69b";
+}
+
+.icon-yinpinwenjian1:before {
+  content: "\e623";
+}
+
+.icon-yinpinwenjian2:before {
+  content: "\e626";
+}
+
+.icon-xiazaiyinpinwenjian:before {
+  content: "\e605";
+}
+
+.icon-yinpinwenjian:before {
+  content: "\e641";
+}
+
diff --git a/web_src/static/css/iconfont.woff2 b/web_src/static/css/iconfont.woff2
new file mode 100644
index 0000000..c8d7e3d
--- /dev/null
+++ b/web_src/static/css/iconfont.woff2
Binary files differ
diff --git a/web_src/static/css/login.css b/web_src/static/css/login.css
deleted file mode 100755
index 1d236c1..0000000
--- a/web_src/static/css/login.css
+++ /dev/null
@@ -1,396 +0,0 @@
-
-
-
-
-/*//////////////////////////////////////////////////////////////////
-[ FONT ]*/
-
-@font-face {
-  font-family: Poppins-Regular;
-  src: url('../fonts/poppins/Poppins-Regular.ttf');
-}
-
-@font-face {
-  font-family: Poppins-Medium;
-  src: url('../fonts/poppins/Poppins-Medium.ttf');
-}
-
-@font-face {
-  font-family: Poppins-Bold;
-  src: url('../fonts/poppins/Poppins-Bold.ttf');
-}
-
-@font-face {
-  font-family: Poppins-SemiBold;
-  src: url('../fonts/poppins/Poppins-SemiBold.ttf');
-}
-
-.limiter {
-  width: 100%;
-  margin: 0 auto;
-  font-family: Poppins-Regular, sans-serif;
-
-}
-
-.container-login100 {
-  width: 100%;
-  min-height: 100vh;
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -moz-box;
-  display: -ms-flexbox;
-  display: flex;
-  flex-wrap: wrap;
-  justify-content: center;
-  align-items: center;
-  background: #f2f2f2;
-}
-
-.wrap-login100 {
-  background: #fff;
-  border-radius: 10px;
-  overflow: hidden;
-  padding: 77px 55px 33px 55px;
-
-  box-shadow: 0 5px 10px 0px rgba(0, 0, 0, 0.1);
-  -moz-box-shadow: 0 5px 10px 0px rgba(0, 0, 0, 0.1);
-  -webkit-box-shadow: 0 5px 10px 0px rgba(0, 0, 0, 0.1);
-  -o-box-shadow: 0 5px 10px 0px rgba(0, 0, 0, 0.1);
-  -ms-box-shadow: 0 5px 10px 0px rgba(0, 0, 0, 0.1);
-}
-
-
-/*------------------------------------------------------------------
-[ Form ]*/
-
-.login100-form {
-  width: 100%;
-}
-
-.login100-form-title {
-  display: block;
-  font-family: Poppins-Bold;
-  font-size: 30px;
-  color: #333333;
-  line-height: 1.2;
-  text-align: center;
-
-}
-.login100-form-title i {
-  font-size: 60px;
-}
-
-/*------------------------------------------------------------------
-[ Input ]*/
-
-.wrap-input100 {
-  width: 100%;
-  position: relative;
-  border-bottom: 2px solid #adadad;
-  margin-bottom: 37px;
-}
-
-.input100 {
-  font-family: Poppins-Regular;
-  font-size: 15px;
-  color: #555555;
-  line-height: 1.2;
-
-  display: block;
-  width: 100%;
-  height: 45px;
-  background: transparent;
-  padding: 0 5px;
-  outline: none;
-  border: none;
-}
-.input100::-webkit-input-placeholder { color: #adadad;}
-.input100:-moz-placeholder { color: #adadad;}
-.input100::-moz-placeholder { color: #adadad;}
-.input100:-ms-input-placeholder { color: #adadad;}
-
-/*---------------------------------------------*/
-.focus-input100 {
-  position: absolute;
-  display: block;
-  width: 100%;
-  height: 100%;
-  top: 0;
-  left: 0;
-  pointer-events: none;
-  color:transparent;
-}
-
-.focus-input100::before {
-  content: "";
-  display: block;
-  position: absolute;
-  bottom: -2px;
-  left: 0;
-  width: 0;
-  height: 2px;
-
-  -webkit-transition: all 0.4s;
-  -o-transition: all 0.4s;
-  -moz-transition: all 0.4s;
-  transition: all 0.4s;
-
-  background: #6a7dfe;
-  background: -webkit-linear-gradient(left, #21d4fd, #b721ff);
-  background: -o-linear-gradient(left, #21d4fd, #b721ff);
-  background: -moz-linear-gradient(left, #21d4fd, #b721ff);
-  background: linear-gradient(left, #21d4fd, #b721ff);
-}
-
-.focus-input100::after {
-  font-family: Poppins-Regular;
-  font-size: 15px;
-  color: #999999;
-  line-height: 1.2;
-
-  content: attr(data-placeholder);
-  display: block;
-  width: 100%;
-  position: absolute;
-  top: 16px;
-  left: 0px;
-  padding-left: 5px;
-
-  -webkit-transition: all 0.4s;
-  -o-transition: all 0.4s;
-  -moz-transition: all 0.4s;
-  transition: all 0.4s;
-}
-
-.input100:focus + .focus-input100::after {
-  top: -15px;
-}
-
-.input100:focus + .focus-input100::before {
-  width: 100%;
-}
-
-.has-val.input100 + .focus-input100::after {
-  top: -15px;
-}
-
-.has-val.input100 + .focus-input100::before {
-  width: 100%;
-}
-
-/*---------------------------------------------*/
-.btn-show-pass {
-  font-size: 15px;
-  color: #999999;
-
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -moz-box;
-  display: -ms-flexbox;
-  display: flex;
-  align-items: center;
-  position: absolute;
-  height: 100%;
-  top: 0;
-  right: 0;
-  padding-right: 5px;
-  cursor: pointer;
-  -webkit-transition: all 0.4s;
-  -o-transition: all 0.4s;
-  -moz-transition: all 0.4s;
-  transition: all 0.4s;
-}
-
-.btn-show-pass:hover {
-  color: #6a7dfe;
-  color: -webkit-linear-gradient(left, #21d4fd, #b721ff);
-  color: -o-linear-gradient(left, #21d4fd, #b721ff);
-  color: -moz-linear-gradient(left, #21d4fd, #b721ff);
-  color: linear-gradient(left, #21d4fd, #b721ff);
-}
-
-.btn-show-pass.active {
-  color: #6a7dfe;
-  color: -webkit-linear-gradient(left, #21d4fd, #b721ff);
-  color: -o-linear-gradient(left, #21d4fd, #b721ff);
-  color: -moz-linear-gradient(left, #21d4fd, #b721ff);
-  color: linear-gradient(left, #21d4fd, #b721ff);
-}
-
-
-
-/*------------------------------------------------------------------
-[ Button ]*/
-.container-login100-form-btn {
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -moz-box;
-  display: -ms-flexbox;
-  display: flex;
-  flex-wrap: wrap;
-  justify-content: center;
-  padding-top: 13px;
-}
-
-.wrap-login100-form-btn {
-  width: 100%;
-  display: block;
-  position: relative;
-  z-index: 1;
-  border-radius: 25px;
-  overflow: hidden;
-  margin: 0 auto;
-}
-
-.login100-form-bgbtn {
-  position: absolute;
-  z-index: -1;
-  width: 300%;
-  height: 100%;
-  background: #a64bf4;
-  background: -webkit-linear-gradient(right, #21d4fd, #b721ff, #21d4fd, #b721ff);
-  background: -o-linear-gradient(right, #21d4fd, #b721ff, #21d4fd, #b721ff);
-  background: -moz-linear-gradient(right, #21d4fd, #b721ff, #21d4fd, #b721ff);
-  background: linear-gradient(right, #21d4fd, #b721ff, #21d4fd, #b721ff);
-  top: 0;
-  left: -100%;
-
-  -webkit-transition: all 0.4s;
-  -o-transition: all 0.4s;
-  -moz-transition: all 0.4s;
-  transition: all 0.4s;
-}
-
-.login100-form-btn {
-  font-family: Poppins-Medium;
-  font-size: 15px;
-  color: #fff;
-  line-height: 1.2;
-  text-transform: uppercase;
-
-  display: -webkit-box;
-  display: -webkit-flex;
-  display: -moz-box;
-  display: -ms-flexbox;
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  padding: 0 20px;
-  width: 100%;
-  height: 50px;
-  outline: none !important;
-  border: none;
-  background: transparent;
-}
-
-.login100-form-btn:hover {
-  cursor: pointer;
-}
-
-.wrap-login100-form-btn:hover .login100-form-bgbtn {
-  left: 0;
-}
-
-
-/*------------------------------------------------------------------
-[ Responsive ]*/
-
-@media (max-width: 576px) {
-  .wrap-login100 {
-    padding: 77px 15px 33px 15px;
-  }
-}
-
-
-
-/*------------------------------------------------------------------
-[ Alert validate ]*/
-
-.validate-input {
-  position: relative;
-}
-
-.alert-validate::before {
-  content: attr(data-validate);
-  position: absolute;
-  max-width: 70%;
-  background-color: #fff;
-  border: 1px solid #c80000;
-  border-radius: 2px;
-  padding: 4px 25px 4px 10px;
-  top: 50%;
-  -webkit-transform: translateY(-50%);
-  -moz-transform: translateY(-50%);
-  -ms-transform: translateY(-50%);
-  -o-transform: translateY(-50%);
-  transform: translateY(-50%);
-  right: 0px;
-  pointer-events: none;
-
-  font-family: Poppins-Regular;
-  color: #c80000;
-  font-size: 13px;
-  line-height: 1.4;
-  text-align: left;
-
-  visibility: hidden;
-  opacity: 0;
-
-  -webkit-transition: opacity 0.4s;
-  -o-transition: opacity 0.4s;
-  -moz-transition: opacity 0.4s;
-  transition: opacity 0.4s;
-}
-
-.alert-validate::after {
-  content: "\f06a";
-  font-family: FontAwesome;
-  font-size: 16px;
-  color: #c80000;
-
-  display: block;
-  position: absolute;
-  background-color: #fff;
-  top: 50%;
-  -webkit-transform: translateY(-50%);
-  -moz-transform: translateY(-50%);
-  -ms-transform: translateY(-50%);
-  -o-transform: translateY(-50%);
-  transform: translateY(-50%);
-  right: 5px;
-}
-
-.alert-validate:hover:before {
-  visibility: visible;
-  opacity: 1;
-}
-
-@media (max-width: 992px) {
-  .alert-validate::before {
-    visibility: visible;
-    opacity: 1;
-  }
-}
-
-/** util **/
-.p-b-26 {padding-bottom: 26px;}
-.p-b-48 {padding-bottom: 48px;}
-.p-t-115 {padding-top: 115px;}
-
-/**font**/
-/* .zmdi {
-  display: inline-block;
-  font: normal normal normal 14px/1 'Material-Design-Iconic-Font';
-      font-size: 14px;
-  font-size: inherit;
-  text-rendering: auto;
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-}
-.zmdi-font::before {
-  content: '\f16a';
-}
-.login100-form-title i {
-  font-size: 60px;
-} */
-
diff --git a/web_src/static/js/jessibuca/ff.js b/web_src/static/js/jessibuca/ff.js
new file mode 100644
index 0000000..164128c
--- /dev/null
+++ b/web_src/static/js/jessibuca/ff.js
@@ -0,0 +1 @@
+var Module=typeof Module!=="undefined"?Module:{};var moduleOverrides={};var key;for(key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var arguments_=[];var thisProgram="./this.program";var quit_=function(status,toThrow){throw toThrow};var ENVIRONMENT_IS_WEB=false;var ENVIRONMENT_IS_WORKER=true;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_PTHREAD=Module["ENVIRONMENT_IS_PTHREAD"]||false;if(ENVIRONMENT_IS_PTHREAD){buffer=Module["buffer"]}var _scriptDir=typeof document!=="undefined"&&document.currentScript?document.currentScript.src:undefined;if(ENVIRONMENT_IS_WORKER){_scriptDir=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var STACK_ALIGN=16;function alignMemory(size,factor){if(!factor)factor=STACK_ALIGN;return Math.ceil(size/factor)*factor}function warnOnce(text){if(!warnOnce.shown)warnOnce.shown={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;err(text)}}var tempRet0=0;var setTempRet0=function(value){tempRet0=value};var Atomics_load=Atomics.load;var Atomics_store=Atomics.store;var Atomics_compareExchange=Atomics.compareExchange;var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var wasmModule;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var str="";while(!(idx>=endIdx)){var u0=heap[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heap[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heap[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heap[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}function UTF16ToString(ptr,maxBytesToRead){var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}function allocateUTF8(str){var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8Array(str,HEAP8,ret,size);return ret}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||67108864;if(ENVIRONMENT_IS_PTHREAD){wasmMemory=Module["wasmMemory"];buffer=Module["buffer"]}else{if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_MEMORY/65536,"maximum":INITIAL_MEMORY/65536,"shared":true});if(!(wasmMemory.buffer instanceof SharedArrayBuffer)){err("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag");if(ENVIRONMENT_IS_NODE){console.log("(on node you may need: --experimental-wasm-threads --experimental-wasm-bulk-memory and also use a recent version)")}throw Error("bad memory")}}}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;if(!ENVIRONMENT_IS_PTHREAD)__ATINIT__.push({func:function(){___wasm_call_ctors()}});if(ENVIRONMENT_IS_PTHREAD)runtimeInitialized=true;function preRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.init.initialized)FS.init();TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){if(ENVIRONMENT_IS_PTHREAD)return;FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){if(ENVIRONMENT_IS_PTHREAD)return;runtimeExited=true}function postRun(){if(ENVIRONMENT_IS_PTHREAD)return;if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){assert(!ENVIRONMENT_IS_PTHREAD,"addRunDependency cannot be used in a pthread worker");runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["preloadedImages"]={};Module["preloadedAudios"]={};function abort(what){if(Module["onAbort"]){Module["onAbort"](what)}if(ENVIRONMENT_IS_PTHREAD)console.error("Pthread aborting at "+(new Error).stack);what+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);throw e}function hasPrefix(str,prefix){return String.prototype.startsWith?str.startsWith(prefix):str.indexOf(prefix)===0}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return hasPrefix(filename,dataURIPrefix)}var wasmBinaryFile="ff.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmTable=Module["asm"]["da"];wasmModule=module;if(!ENVIRONMENT_IS_PTHREAD){removeRunDependency("wasm-instantiate")}}if(!ENVIRONMENT_IS_PTHREAD){addRunDependency("wasm-instantiate")}function receiveInstantiatedSource(output){receiveInstance(output["instance"],output["module"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiatedSource,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiatedSource)})})}else{return instantiateArrayBuffer(receiveInstantiatedSource)}}if(Module["instantiateWasm"]){try{var exports=Module["instantiateWasm"](info,receiveInstance);return exports}catch(e){err("Module.instantiateWasm callback failed with error: "+e);return false}}instantiateAsync();return{}}var tempDouble;var tempI64;var ASM_CONSTS={155132:function(){throw"Canceled!"},155395:function($0,$1){setTimeout(function(){__emscripten_do_dispatch_to_thread($0,$1)},0)}};function initPthreadsJS(){PThread.initRuntime()}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var ERRNO_CODES={EPERM:63,ENOENT:44,ESRCH:71,EINTR:27,EIO:29,ENXIO:60,E2BIG:1,ENOEXEC:45,EBADF:8,ECHILD:12,EAGAIN:6,EWOULDBLOCK:6,ENOMEM:48,EACCES:2,EFAULT:21,ENOTBLK:105,EBUSY:10,EEXIST:20,EXDEV:75,ENODEV:43,ENOTDIR:54,EISDIR:31,EINVAL:28,ENFILE:41,EMFILE:33,ENOTTY:59,ETXTBSY:74,EFBIG:22,ENOSPC:51,ESPIPE:70,EROFS:69,EMLINK:34,EPIPE:64,EDOM:18,ERANGE:68,ENOMSG:49,EIDRM:24,ECHRNG:106,EL2NSYNC:156,EL3HLT:107,EL3RST:108,ELNRNG:109,EUNATCH:110,ENOCSI:111,EL2HLT:112,EDEADLK:16,ENOLCK:46,EBADE:113,EBADR:114,EXFULL:115,ENOANO:104,EBADRQC:103,EBADSLT:102,EDEADLOCK:16,EBFONT:101,ENOSTR:100,ENODATA:116,ETIME:117,ENOSR:118,ENONET:119,ENOPKG:120,EREMOTE:121,ENOLINK:47,EADV:122,ESRMNT:123,ECOMM:124,EPROTO:65,EMULTIHOP:36,EDOTDOT:125,EBADMSG:9,ENOTUNIQ:126,EBADFD:127,EREMCHG:128,ELIBACC:129,ELIBBAD:130,ELIBSCN:131,ELIBMAX:132,ELIBEXEC:133,ENOSYS:52,ENOTEMPTY:55,ENAMETOOLONG:37,ELOOP:32,EOPNOTSUPP:138,EPFNOSUPPORT:139,ECONNRESET:15,ENOBUFS:42,EAFNOSUPPORT:5,EPROTOTYPE:67,ENOTSOCK:57,ENOPROTOOPT:50,ESHUTDOWN:140,ECONNREFUSED:14,EADDRINUSE:3,ECONNABORTED:13,ENETUNREACH:40,ENETDOWN:38,ETIMEDOUT:73,EHOSTDOWN:142,EHOSTUNREACH:23,EINPROGRESS:26,EALREADY:7,EDESTADDRREQ:17,EMSGSIZE:35,EPROTONOSUPPORT:66,ESOCKTNOSUPPORT:137,EADDRNOTAVAIL:4,ENETRESET:39,EISCONN:30,ENOTCONN:53,ETOOMANYREFS:141,EUSERS:136,EDQUOT:19,ESTALE:72,ENOTSUP:138,ENOMEDIUM:148,EILSEQ:25,EOVERFLOW:61,ECANCELED:11,ENOTRECOVERABLE:56,EOWNERDEAD:62,ESTRPIPE:135};function _emscripten_futex_wake(addr,count){if(addr<=0||addr>HEAP8.length||addr&3!=0||count<0)return-28;if(count==0)return 0;if(count>=2147483647)count=Infinity;var mainThreadWaitAddress=Atomics.load(HEAP32,__emscripten_main_thread_futex>>2);var mainThreadWoken=0;if(mainThreadWaitAddress==addr){var loadedAddr=Atomics.compareExchange(HEAP32,__emscripten_main_thread_futex>>2,mainThreadWaitAddress,0);if(loadedAddr==mainThreadWaitAddress){--count;mainThreadWoken=1;if(count<=0)return 1}}var ret=Atomics.notify(HEAP32,addr>>2,count);if(ret>=0)return ret+mainThreadWoken;throw"Atomics.notify returned an unexpected value "+ret}Module["_emscripten_futex_wake"]=_emscripten_futex_wake;function killThread(pthread_ptr){if(ENVIRONMENT_IS_PTHREAD)throw"Internal Error! killThread() can only ever be called from main application thread!";if(!pthread_ptr)throw"Internal Error! Null pthread_ptr in killThread!";HEAP32[pthread_ptr+12>>2]=0;var pthread=PThread.pthreads[pthread_ptr];pthread.worker.terminate();PThread.freeThreadData(pthread);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(pthread.worker),1);pthread.worker.pthread=undefined}function cancelThread(pthread_ptr){if(ENVIRONMENT_IS_PTHREAD)throw"Internal Error! cancelThread() can only ever be called from main application thread!";if(!pthread_ptr)throw"Internal Error! Null pthread_ptr in cancelThread!";var pthread=PThread.pthreads[pthread_ptr];pthread.worker.postMessage({"cmd":"cancel"})}function cleanupThread(pthread_ptr){if(ENVIRONMENT_IS_PTHREAD)throw"Internal Error! cleanupThread() can only ever be called from main application thread!";if(!pthread_ptr)throw"Internal Error! Null pthread_ptr in cleanupThread!";HEAP32[pthread_ptr+12>>2]=0;var pthread=PThread.pthreads[pthread_ptr];if(pthread){var worker=pthread.worker;PThread.returnWorkerToPool(worker)}}var PThread={unusedWorkers:[],runningWorkers:[],initMainThreadBlock:function(){},initRuntime:function(){var tb=_malloc(228);for(var i=0;i<228/4;++i)HEAPU32[tb/4+i]=0;HEAP32[tb+12>>2]=tb;var headPtr=tb+152;HEAP32[headPtr>>2]=headPtr;var tlsMemory=_malloc(512);for(var i=0;i<128;++i)HEAPU32[tlsMemory/4+i]=0;Atomics.store(HEAPU32,tb+100>>2,tlsMemory);Atomics.store(HEAPU32,tb+40>>2,tb);__emscripten_thread_init(tb,!ENVIRONMENT_IS_WORKER,1);_emscripten_register_main_browser_thread_id(tb)},initWorker:function(){},pthreads:{},threadExitHandlers:[],setThreadStatus:function(){},runExitHandlers:function(){while(PThread.threadExitHandlers.length>0){PThread.threadExitHandlers.pop()()}if(ENVIRONMENT_IS_PTHREAD&&_pthread_self())___pthread_tsd_run_dtors()},threadExit:function(exitCode){var tb=_pthread_self();if(tb){Atomics.store(HEAPU32,tb+4>>2,exitCode);Atomics.store(HEAPU32,tb+0>>2,1);Atomics.store(HEAPU32,tb+56>>2,1);Atomics.store(HEAPU32,tb+60>>2,0);PThread.runExitHandlers();_emscripten_futex_wake(tb+0,2147483647);__emscripten_thread_init(0,0,0);if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"exit"})}}},threadCancel:function(){PThread.runExitHandlers();var tb=_pthread_self();Atomics.store(HEAPU32,tb+4>>2,-1);Atomics.store(HEAPU32,tb+0>>2,1);_emscripten_futex_wake(tb+0,2147483647);__emscripten_thread_init(0,0,0);postMessage({"cmd":"cancelDone"})},terminateAllThreads:function(){for(var t in PThread.pthreads){var pthread=PThread.pthreads[t];if(pthread&&pthread.worker){PThread.returnWorkerToPool(pthread.worker)}}PThread.pthreads={};for(var i=0;i<PThread.unusedWorkers.length;++i){var worker=PThread.unusedWorkers[i];worker.terminate()}PThread.unusedWorkers=[];for(var i=0;i<PThread.runningWorkers.length;++i){var worker=PThread.runningWorkers[i];var pthread=worker.pthread;PThread.freeThreadData(pthread);worker.terminate()}PThread.runningWorkers=[]},freeThreadData:function(pthread){if(!pthread)return;if(pthread.threadInfoStruct){var tlsMemory=HEAP32[pthread.threadInfoStruct+100>>2];HEAP32[pthread.threadInfoStruct+100>>2]=0;_free(tlsMemory);_free(pthread.threadInfoStruct)}pthread.threadInfoStruct=0;if(pthread.allocatedOwnStack&&pthread.stackBase)_free(pthread.stackBase);pthread.stackBase=0;if(pthread.worker)pthread.worker.pthread=null},returnWorkerToPool:function(worker){PThread.runWithoutMainThreadQueuedCalls(function(){delete PThread.pthreads[worker.pthread.threadInfoStruct];PThread.unusedWorkers.push(worker);PThread.runningWorkers.splice(PThread.runningWorkers.indexOf(worker),1);PThread.freeThreadData(worker.pthread);worker.pthread=undefined})},runWithoutMainThreadQueuedCalls:function(func){HEAP32[__emscripten_allow_main_runtime_queued_calls>>2]=0;try{func()}finally{HEAP32[__emscripten_allow_main_runtime_queued_calls>>2]=1}},receiveObjectTransfer:function(data){},loadWasmModuleToWorker:function(worker,onFinishedLoading){worker.onmessage=function(e){var d=e["data"];var cmd=d["cmd"];if(worker.pthread)PThread.currentProxiedOperationCallerThread=worker.pthread.threadInfoStruct;if(d["targetThread"]&&d["targetThread"]!=_pthread_self()){var thread=PThread.pthreads[d.targetThread];if(thread){thread.worker.postMessage(e.data,d["transferList"])}else{console.error('Internal error! Worker sent a message "'+cmd+'" to target pthread '+d["targetThread"]+", but that thread no longer exists!")}PThread.currentProxiedOperationCallerThread=undefined;return}if(cmd==="processQueuedMainThreadWork"){_emscripten_main_thread_process_queued_calls()}else if(cmd==="spawnThread"){spawnThread(e.data)}else if(cmd==="cleanupThread"){cleanupThread(d["thread"])}else if(cmd==="killThread"){killThread(d["thread"])}else if(cmd==="cancelThread"){cancelThread(d["thread"])}else if(cmd==="loaded"){worker.loaded=true;if(onFinishedLoading)onFinishedLoading(worker);if(worker.runPthread){worker.runPthread();delete worker.runPthread}}else if(cmd==="print"){out("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="printErr"){err("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="alert"){alert("Thread "+d["threadId"]+": "+d["text"])}else if(cmd==="exit"){var detached=worker.pthread&&Atomics.load(HEAPU32,worker.pthread.threadInfoStruct+64>>2);if(detached){PThread.returnWorkerToPool(worker)}}else if(cmd==="exitProcess"){try{exit(d["returnCode"])}catch(e){if(e instanceof ExitStatus)return;throw e}}else if(cmd==="cancelDone"){PThread.returnWorkerToPool(worker)}else if(cmd==="objectTransfer"){PThread.receiveObjectTransfer(e.data)}else if(e.data.target==="setimmediate"){worker.postMessage(e.data)}else{err("worker sent an unknown command "+cmd)}PThread.currentProxiedOperationCallerThread=undefined};worker.onerror=function(e){err("pthread sent an error! "+e.filename+":"+e.lineno+": "+e.message)};worker.postMessage({"cmd":"load","urlOrBlob":Module["mainScriptUrlOrBlob"]||_scriptDir,"wasmMemory":wasmMemory,"wasmModule":wasmModule})},allocateUnusedWorker:function(){var pthreadMainJs=locateFile("ff.worker.js");PThread.unusedWorkers.push(new Worker(pthreadMainJs))},getNewWorker:function(){if(PThread.unusedWorkers.length==0){PThread.allocateUnusedWorker();PThread.loadWasmModuleToWorker(PThread.unusedWorkers[0])}if(PThread.unusedWorkers.length>0)return PThread.unusedWorkers.pop();else return null},busySpinWait:function(msecs){var t=performance.now()+msecs;while(performance.now()<t){}}};function establishStackSpace(stackTop,stackMax){_emscripten_stack_set_limits(stackTop,stackMax);stackRestore(stackTop)}Module["establishStackSpace"]=establishStackSpace;function getNoExitRuntime(){return noExitRuntime}Module["getNoExitRuntime"]=getNoExitRuntime;function invokeEntryPoint(ptr,arg){return wasmTable.get(ptr)(arg)}Module["invokeEntryPoint"]=invokeEntryPoint;function jsStackTrace(){var error=new Error;if(!error.stack){try{throw new Error}catch(e){error=e}if(!error.stack){return"(no stack trace available)"}}return error.stack.toString()}function ___assert_fail(condition,filename,line,func){abort("Assertion failed: "+UTF8ToString(condition)+", at: "+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])}var _emscripten_get_now;if(ENVIRONMENT_IS_PTHREAD){_emscripten_get_now=function(){return performance.now()-Module["__performance_now_clock_drift"]}}else _emscripten_get_now=function(){return performance.now()};function setErrNo(value){HEAP32[___errno_location()>>2]=value;return value}var PATH={splitPath:function(filename){var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:function(parts,allowAboveRoot){var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:function(path){var isAbsolute=path.charAt(0)==="/",trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:function(path){var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:function(path){if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},extname:function(path){return PATH.splitPath(path)[3]},join:function(){var paths=Array.prototype.slice.call(arguments,0);return PATH.normalize(paths.join("/"))},join2:function(l,r){return PATH.normalize(l+"/"+r)}};function getRandomDevice(){if(typeof crypto==="object"&&typeof crypto["getRandomValues"]==="function"){var randomBuffer=new Uint8Array(1);return function(){crypto.getRandomValues(randomBuffer);return randomBuffer[0]}}else return function(){abort("randomDevice")}}var PATH_FS={resolve:function(){var resolvedPath="",resolvedAbsolute=false;for(var i=arguments.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?arguments[i]:FS.cwd();if(typeof path!=="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=path.charAt(0)==="/"}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(function(p){return!!p}),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:function(from,to){from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start<arr.length;start++){if(arr[start]!=="")break}var end=arr.length-1;for(;end>=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i<length;i++){if(fromParts[i]!==toParts[i]){samePartsLength=i;break}}var outputParts=[];for(var i=samePartsLength;i<fromParts.length;i++){outputParts.push("..")}outputParts=outputParts.concat(toParts.slice(samePartsLength));return outputParts.join("/")}};var TTY={ttys:[],init:function(){},shutdown:function(){},register:function(dev,ops){TTY.ttys[dev]={input:[],output:[],ops:ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open:function(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close:function(stream){stream.tty.ops.flush(stream.tty)},flush:function(stream){stream.tty.ops.flush(stream.tty)},read:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=stream.tty.ops.get_char(stream.tty)}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.put_char){throw new FS.ErrnoError(60)}try{for(var i=0;i<length;i++){stream.tty.ops.put_char(stream.tty,buffer[offset+i])}}catch(e){throw new FS.ErrnoError(29)}if(length){stream.node.timestamp=Date.now()}return i}},default_tty_ops:{get_char:function(tty){if(!tty.input.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else if(typeof readline=="function"){result=readline();if(result!==null){result+="\n"}}if(!result){return null}tty.input=intArrayFromString(result,true)}return tty.input.shift()},put_char:function(tty,val){if(val===null||val===10){out(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}}},default_tty1_ops:{put_char:function(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},flush:function(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};function mmapAlloc(size){var alignedSize=alignMemory(size,16384);var ptr=_malloc(alignedSize);while(size<alignedSize)HEAP8[ptr+size++]=0;return ptr}var MEMFS={ops_table:null,mount:function(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode:function(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}if(!MEMFS.ops_table){MEMFS.ops_table={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}}}var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray:function(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage:function(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity<CAPACITY_DOUBLING_MAX?2:1.125)>>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr:function(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr:function(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup:function(parent,name){throw FS.genericErrors[44]},mknod:function(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename:function(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp;old_node.parent=new_dir},unlink:function(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir:function(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir:function(node){var entries=[".",".."];for(var key in node.contents){if(!node.contents.hasOwnProperty(key)){continue}entries.push(key)}return entries},symlink:function(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink:function(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read:function(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i<size;i++)buffer[offset+i]=contents[position+i]}return size},write:function(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.timestamp=Date.now();if(buffer.subarray&&(!node.contents||node.contents.subarray)){if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length;return length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length;return length}else if(position+length<=node.usedBytes){node.contents.set(buffer.subarray(offset,offset+length),position);return length}}MEMFS.expandFileStorage(node,position+length);if(node.contents.subarray&&buffer.subarray){node.contents.set(buffer.subarray(offset,offset+length),position)}else{for(var i=0;i<length;i++){node.contents[position+i]=buffer[offset+i]}}node.usedBytes=Math.max(node.usedBytes,position+length);return length},llseek:function(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},allocate:function(stream,offset,length){MEMFS.expandFileStorage(stream.node,offset+length);stream.node.usedBytes=Math.max(stream.node.usedBytes,offset+length)},mmap:function(stream,address,length,position,prot,flags){if(address!==0){throw new FS.ErrnoError(28)}if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===buffer){allocated=false;ptr=contents.byteOffset}else{if(position>0||position+length<contents.length){if(contents.subarray){contents=contents.subarray(position,position+length)}else{contents=Array.prototype.slice.call(contents,position,position+length)}}allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}HEAP8.set(contents,ptr)}return{ptr:ptr,allocated:allocated}},msync:function(stream,buffer,offset,length,mmapFlags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(mmapFlags&2){return 0}var bytesWritten=MEMFS.stream_ops.write(stream,buffer,0,length,offset,false);return 0}}};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(path,opts){path=PATH_FS.resolve(FS.cwd(),path);opts=opts||{};if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};for(var key in defaults){if(opts[key]===undefined){opts[key]=defaults[key]}}if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=PATH.normalizeArray(path.split("/").filter(function(p){return!!p}),false);var current=FS.root;var current_path="/";for(var i=0;i<parts.length;i++){var islast=i===parts.length-1;if(islast&&opts.parent){break}current=FS.lookupNode(current,parts[i]);current_path=PATH.join2(current_path,parts[i]);if(FS.isMountpoint(current)){if(!islast||islast&&opts.follow_mount){current=current.mounted.root}}if(!islast||opts.follow){var count=0;while(FS.isLink(current.mode)){var link=FS.readlink(current_path);current_path=PATH_FS.resolve(PATH.dirname(current_path),link);var lookup=FS.lookupPath(current_path,{recurse_count:opts.recurse_count});current=lookup.node;if(count++>40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath:function(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?mount+"/"+path:mount+path}path=path?node.name+"/"+path:node.name;node=node.parent}},hashName:function(parentid,name){var hash=0;for(var i=0;i<name.length;i++){hash=(hash<<5)-hash+name.charCodeAt(i)|0}return(parentid+hash>>>0)%FS.nameTable.length},hashAddNode:function(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode:function(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode:function(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode,parent)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode:function(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode:function(node){FS.hashRemoveNode(node)},isRoot:function(node){return node===node.parent},isMountpoint:function(node){return!!node.mounted},isFile:function(mode){return(mode&61440)===32768},isDir:function(mode){return(mode&61440)===16384},isLink:function(mode){return(mode&61440)===40960},isChrdev:function(mode){return(mode&61440)===8192},isBlkdev:function(mode){return(mode&61440)===24576},isFIFO:function(mode){return(mode&61440)===4096},isSocket:function(mode){return(mode&49152)===49152},flagModes:{"r":0,"r+":2,"w":577,"w+":578,"a":1089,"a+":1090},modeStringToFlags:function(str){var flags=FS.flagModes[str];if(typeof flags==="undefined"){throw new Error("Unknown file open mode: "+str)}return flags},flagsToPermissionString:function(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions:function(node,perms){if(FS.ignorePermissions){return 0}if(perms.indexOf("r")!==-1&&!(node.mode&292)){return 2}else if(perms.indexOf("w")!==-1&&!(node.mode&146)){return 2}else if(perms.indexOf("x")!==-1&&!(node.mode&73)){return 2}return 0},mayLookup:function(dir){var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate:function(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete:function(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen:function(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd:function(fd_start,fd_end){fd_start=fd_start||0;fd_end=fd_end||FS.MAX_OPEN_FDS;for(var fd=fd_start;fd<=fd_end;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStream:function(fd){return FS.streams[fd]},createStream:function(stream,fd_start,fd_end){if(!FS.FSStream){FS.FSStream=function(){};FS.FSStream.prototype={object:{get:function(){return this.node},set:function(val){this.node=val}},isRead:{get:function(){return(this.flags&2097155)!==1}},isWrite:{get:function(){return(this.flags&2097155)!==0}},isAppend:{get:function(){return this.flags&1024}}}}var newStream=new FS.FSStream;for(var p in stream){newStream[p]=stream[p]}stream=newStream;var fd=FS.nextfd(fd_start,fd_end);stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream:function(fd){FS.streams[fd]=null},chrdev_stream_ops:{open:function(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;if(stream.stream_ops.open){stream.stream_ops.open(stream)}},llseek:function(){throw new FS.ErrnoError(70)}},major:function(dev){return dev>>8},minor:function(dev){return dev&255},makedev:function(ma,mi){return ma<<8|mi},registerDevice:function(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:function(dev){return FS.devices[dev]},getMounts:function(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push.apply(check,m.mounts)}return mounts},syncfs:function(populate,callback){if(typeof populate==="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err("warning: "+FS.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work")}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(function(mount){if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount:function(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type:type,opts:opts,mountpoint:mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount:function(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(function(hash){var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.indexOf(current.mount)!==-1){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup:function(parent,name){return parent.node_ops.lookup(parent,name)},mknod:function(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create:function(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir:function(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree:function(path,mode){var dirs=path.split("/");var d="";for(var i=0;i<dirs.length;++i){if(!dirs[i])continue;d+="/"+dirs[i];try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev:function(path,mode,dev){if(typeof dev==="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink:function(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename:function(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}try{if(FS.trackingDelegate["willMovePath"]){FS.trackingDelegate["willMovePath"](old_path,new_path)}}catch(e){err("FS.trackingDelegate['willMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name)}catch(e){throw e}finally{FS.hashAddNode(old_node)}try{if(FS.trackingDelegate["onMovePath"])FS.trackingDelegate["onMovePath"](old_path,new_path)}catch(e){err("FS.trackingDelegate['onMovePath']('"+old_path+"', '"+new_path+"') threw an exception: "+e.message)}},rmdir:function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}},readdir:function(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node.node_ops.readdir){throw new FS.ErrnoError(54)}return node.node_ops.readdir(node)},unlink:function(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}try{if(FS.trackingDelegate["willDeletePath"]){FS.trackingDelegate["willDeletePath"](path)}}catch(e){err("FS.trackingDelegate['willDeletePath']('"+path+"') threw an exception: "+e.message)}parent.node_ops.unlink(parent,name);FS.destroyNode(node);try{if(FS.trackingDelegate["onDeletePath"])FS.trackingDelegate["onDeletePath"](path)}catch(e){err("FS.trackingDelegate['onDeletePath']('"+path+"') threw an exception: "+e.message)}},readlink:function(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return PATH_FS.resolve(FS.getPath(link.parent),link.node_ops.readlink(link))},stat:function(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;if(!node){throw new FS.ErrnoError(44)}if(!node.node_ops.getattr){throw new FS.ErrnoError(63)}return node.node_ops.getattr(node)},lstat:function(path){return FS.stat(path,true)},chmod:function(path,mode,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{mode:mode&4095|node.mode&~4095,timestamp:Date.now()})},lchmod:function(path,mode){FS.chmod(path,mode,true)},fchmod:function(fd,mode){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chmod(stream.node,mode)},chown:function(path,uid,gid,dontFollow){var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}node.node_ops.setattr(node,{timestamp:Date.now()})},lchown:function(path,uid,gid){FS.chown(path,uid,gid,true)},fchown:function(fd,uid,gid){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}FS.chown(stream.node,uid,gid)},truncate:function(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path==="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}if(!node.node_ops.setattr){throw new FS.ErrnoError(63)}if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}node.node_ops.setattr(node,{size:len,timestamp:Date.now()})},ftruncate:function(fd,len){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.truncate(stream.node,len)},utime:function(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;node.node_ops.setattr(node,{timestamp:Math.max(atime,mtime)})},open:function(path,flags,mode,fd_start,fd_end){if(path===""){throw new FS.ErrnoError(44)}flags=typeof flags==="string"?FS.modeStringToFlags(flags):flags;mode=typeof mode==="undefined"?438:mode;if(flags&64){mode=mode&4095|32768}else{mode=0}var node;if(typeof path==="object"){node=path}else{path=PATH.normalize(path);try{var lookup=FS.lookupPath(path,{follow:!(flags&131072)});node=lookup.node}catch(e){}}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else{node=FS.mknod(path,mode,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node:node,path:FS.getPath(node),flags:flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false},fd_start,fd_end);if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(Module["logReadFiles"]&&!(flags&1)){if(!FS.readFiles)FS.readFiles={};if(!(path in FS.readFiles)){FS.readFiles[path]=1;err("FS.trackingDelegate error on read file: "+path)}}try{if(FS.trackingDelegate["onOpenFile"]){var trackingFlags=0;if((flags&2097155)!==1){trackingFlags|=FS.tracking.openFlags.READ}if((flags&2097155)!==0){trackingFlags|=FS.tracking.openFlags.WRITE}FS.trackingDelegate["onOpenFile"](path,trackingFlags)}}catch(e){err("FS.trackingDelegate['onOpenFile']('"+path+"', flags) threw an exception: "+e.message)}return stream},close:function(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed:function(stream){return stream.fd===null},llseek:function(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read:function(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!=="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write:function(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!=="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;try{if(stream.path&&FS.trackingDelegate["onWriteToFile"])FS.trackingDelegate["onWriteToFile"](stream.path)}catch(e){err("FS.trackingDelegate['onWriteToFile']('"+stream.path+"') threw an exception: "+e.message)}return bytesWritten},allocate:function(stream,offset,length){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(offset<0||length<=0){throw new FS.ErrnoError(28)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(!FS.isFile(stream.node.mode)&&!FS.isDir(stream.node.mode)){throw new FS.ErrnoError(43)}if(!stream.stream_ops.allocate){throw new FS.ErrnoError(138)}stream.stream_ops.allocate(stream,offset,length)},mmap:function(stream,address,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}return stream.stream_ops.mmap(stream,address,length,position,prot,flags)},msync:function(stream,buffer,offset,length,mmapFlags){if(!stream||!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},munmap:function(stream){return 0},ioctl:function(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile:function(path,opts){opts=opts||{};opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){throw new Error('Invalid encoding type "'+opts.encoding+'"')}var ret;var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){ret=UTF8ArrayToString(buf,0)}else if(opts.encoding==="binary"){ret=buf}FS.close(stream);return ret},writeFile:function(path,data,opts){opts=opts||{};opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);if(typeof data==="string"){var buf=new Uint8Array(lengthBytesUTF8(data)+1);var actualNumBytes=stringToUTF8Array(data,buf,0,buf.length);FS.write(stream,buf,0,actualNumBytes,undefined,opts.canOwn)}else if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{throw new Error("Unsupported data type")}FS.close(stream)},cwd:function(){return FS.currentPath},chdir:function(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories:function(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices:function(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:function(){return 0},write:function(stream,buffer,offset,length,pos){return length}});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var random_device=getRandomDevice();FS.createDevice("/dev","random",random_device);FS.createDevice("/dev","urandom",random_device);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories:function(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount:function(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup:function(parent,name){var fd=+name;var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:function(){return stream.path}}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams:function(){if(Module["stdin"]){FS.createDevice("/dev","stdin",Module["stdin"])}else{FS.symlink("/dev/tty","/dev/stdin")}if(Module["stdout"]){FS.createDevice("/dev","stdout",null,Module["stdout"])}else{FS.symlink("/dev/tty","/dev/stdout")}if(Module["stderr"]){FS.createDevice("/dev","stderr",null,Module["stderr"])}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},ensureErrnoError:function(){if(FS.ErrnoError)return;FS.ErrnoError=function ErrnoError(errno,node){this.node=node;this.setErrno=function(errno){this.errno=errno};this.setErrno(errno);this.message="FS error"};FS.ErrnoError.prototype=new Error;FS.ErrnoError.prototype.constructor=FS.ErrnoError;[44].forEach(function(code){FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack="<generic error, no stack>"})},staticInit:function(){FS.ensureErrnoError();FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={"MEMFS":MEMFS}},init:function(input,output,error){FS.init.initialized=true;FS.ensureErrnoError();Module["stdin"]=input||Module["stdin"];Module["stdout"]=output||Module["stdout"];Module["stderr"]=error||Module["stderr"];FS.createStandardStreams()},quit:function(){FS.init.initialized=false;var fflush=Module["_fflush"];if(fflush)fflush(0);for(var i=0;i<FS.streams.length;i++){var stream=FS.streams[i];if(!stream){continue}FS.close(stream)}},getMode:function(canRead,canWrite){var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode},findObject:function(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(ret.exists){return ret.object}else{return null}},analyzePath:function(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath:function(parent,path,canRead,canWrite){parent=typeof parent==="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){}parent=current}return current},createFile:function(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile:function(parent,name,data,canRead,canWrite,canOwn){var path=name?PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name):parent;var mode=FS.getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){if(typeof data==="string"){var arr=new Array(data.length);for(var i=0,len=data.length;i<len;++i)arr[i]=data.charCodeAt(i);data=arr}FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}return node},createDevice:function(parent,name,input,output){var path=PATH.join2(typeof parent==="string"?parent:FS.getPath(parent),name);var mode=FS.getMode(!!input,!!output);if(!FS.createDevice.major)FS.createDevice.major=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open:function(stream){stream.seekable=false},close:function(stream){if(output&&output.buffer&&output.buffer.length){output(10)}},read:function(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;i<length;i++){var result;try{result=input()}catch(e){throw new FS.ErrnoError(29)}if(result===undefined&&bytesRead===0){throw new FS.ErrnoError(6)}if(result===null||result===undefined)break;bytesRead++;buffer[offset+i]=result}if(bytesRead){stream.node.timestamp=Date.now()}return bytesRead},write:function(stream,buffer,offset,length,pos){for(var i=0;i<length;i++){try{output(buffer[offset+i])}catch(e){throw new FS.ErrnoError(29)}}if(length){stream.node.timestamp=Date.now()}return i}});return FS.mkdev(path,mode,dev)},forceLoadFile:function(obj){if(obj.isDevice||obj.isFolder||obj.link||obj.contents)return true;if(typeof XMLHttpRequest!=="undefined"){throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.")}else if(read_){try{obj.contents=intArrayFromString(read_(obj.url),true);obj.usedBytes=obj.contents.length}catch(e){throw new FS.ErrnoError(29)}}else{throw new Error("Cannot load without read() or XMLHttpRequest.")}},createLazyFile:function(parent,name,url,canRead,canWrite){function LazyUint8Array(){this.lengthKnown=false;this.chunks=[]}LazyUint8Array.prototype.get=function LazyUint8Array_get(idx){if(idx>this.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]};LazyUint8Array.prototype.setDataGetter=function LazyUint8Array_setDataGetter(getter){this.getter=getter};LazyUint8Array.prototype.cacheLength=function LazyUint8Array_cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=function(from,to){if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);if(typeof Uint8Array!="undefined")xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}else{return intArrayFromString(xhr.responseText||"",true)}};var lazyArray=this;lazyArray.setDataGetter(function(chunkNum){var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]==="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]==="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true};if(typeof XMLHttpRequest!=="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;Object.defineProperties(lazyArray,{length:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._length}},chunkSize:{get:function(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}});var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url:url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(function(key){var fn=node.stream_ops[key];stream_ops[key]=function forceLoadLazyFile(){FS.forceLoadFile(node);return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){FS.forceLoadFile(node);var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i<size;i++){buffer[offset+i]=contents[position+i]}}else{for(var i=0;i<size;i++){buffer[offset+i]=contents.get(position+i)}}return size};node.stream_ops=stream_ops;return node},createPreloadedFile:function(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish){Browser.init();var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency("cp "+fullname);function processData(byteArray){function finish(byteArray){if(preFinish)preFinish();if(!dontCreateFile){FS.createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}if(onload)onload();removeRunDependency(dep)}var handled=false;Module["preloadPlugins"].forEach(function(plugin){if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,function(){if(onerror)onerror();removeRunDependency(dep)});handled=true}});if(!handled)finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){Browser.asyncLoad(url,function(byteArray){processData(byteArray)},onerror)}else{processData(url)}},indexedDB:function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},DB_NAME:function(){return"EM_FS_"+window.location.pathname},DB_VERSION:20,DB_STORE_NAME:"FILE_DATA",saveFilesToDB:function(paths,onload,onerror){onload=onload||function(){};onerror=onerror||function(){};var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=function openRequest_onupgradeneeded(){out("creating db");var db=openRequest.result;db.createObjectStore(FS.DB_STORE_NAME)};openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;var transaction=db.transaction([FS.DB_STORE_NAME],"readwrite");var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(function(path){var putRequest=files.put(FS.analyzePath(path).object.contents,path);putRequest.onsuccess=function putRequest_onsuccess(){ok++;if(ok+fail==total)finish()};putRequest.onerror=function putRequest_onerror(){fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror},loadFilesFromDB:function(paths,onload,onerror){onload=onload||function(){};onerror=onerror||function(){};var indexedDB=FS.indexedDB();try{var openRequest=indexedDB.open(FS.DB_NAME(),FS.DB_VERSION)}catch(e){return onerror(e)}openRequest.onupgradeneeded=onerror;openRequest.onsuccess=function openRequest_onsuccess(){var db=openRequest.result;try{var transaction=db.transaction([FS.DB_STORE_NAME],"readonly")}catch(e){onerror(e);return}var files=transaction.objectStore(FS.DB_STORE_NAME);var ok=0,fail=0,total=paths.length;function finish(){if(fail==0)onload();else onerror()}paths.forEach(function(path){var getRequest=files.get(path);getRequest.onsuccess=function getRequest_onsuccess(){if(FS.analyzePath(path).exists){FS.unlink(path)}FS.createDataFile(PATH.dirname(path),PATH.basename(path),getRequest.result,true,true,true);ok++;if(ok+fail==total)finish()};getRequest.onerror=function getRequest_onerror(){fail++;if(ok+fail==total)finish()}});transaction.onerror=onerror};openRequest.onerror=onerror}};var SYSCALLS={mappings:{},DEFAULT_POLLMASK:5,umask:511,calculateAt:function(dirfd,path,allowEmpty){if(path[0]==="/"){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=FS.getStream(dirfd);if(!dirstream)throw new FS.ErrnoError(8);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat:function(func,path,buf){try{var stat=func(path)}catch(e){if(e&&e.node&&PATH.normalize(path)!==PATH.normalize(FS.getPath(e.node))){return-54}throw e}HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=0;HEAP32[buf+8>>2]=stat.ino;HEAP32[buf+12>>2]=stat.mode;HEAP32[buf+16>>2]=stat.nlink;HEAP32[buf+20>>2]=stat.uid;HEAP32[buf+24>>2]=stat.gid;HEAP32[buf+28>>2]=stat.rdev;HEAP32[buf+32>>2]=0;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAP32[buf+48>>2]=4096;HEAP32[buf+52>>2]=stat.blocks;HEAP32[buf+56>>2]=stat.atime.getTime()/1e3|0;HEAP32[buf+60>>2]=0;HEAP32[buf+64>>2]=stat.mtime.getTime()/1e3|0;HEAP32[buf+68>>2]=0;HEAP32[buf+72>>2]=stat.ctime.getTime()/1e3|0;HEAP32[buf+76>>2]=0;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+80>>2]=tempI64[0],HEAP32[buf+84>>2]=tempI64[1];return 0},doMsync:function(addr,stream,len,flags,offset){var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},doMkdir:function(path,mode){path=PATH.normalize(path);if(path[path.length-1]==="/")path=path.substr(0,path.length-1);FS.mkdir(path,mode,0);return 0},doMknod:function(path,mode,dev){switch(mode&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}FS.mknod(path,mode,dev);return 0},doReadlink:function(path,buf,bufsize){if(bufsize<=0)return-28;var ret=FS.readlink(path);var len=Math.min(bufsize,lengthBytesUTF8(ret));var endChar=HEAP8[buf+len];stringToUTF8(ret,buf,bufsize+1);HEAP8[buf+len]=endChar;return len},doAccess:function(path,amode){if(amode&~7){return-28}var node;var lookup=FS.lookupPath(path,{follow:true});node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0},doDup:function(path,flags,suggestFD){var suggest=FS.getStream(suggestFD);if(suggest)FS.close(suggest);return FS.open(path,flags,0,suggestFD,suggestFD).fd},doReadv:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr<len)break}return ret},doWritev:function(stream,iov,iovcnt,offset){var ret=0;for(var i=0;i<iovcnt;i++){var ptr=HEAP32[iov+i*8>>2];var len=HEAP32[iov+(i*8+4)>>2];var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr}return ret},varargs:undefined,get:function(){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret},getStr:function(ptr){var ret=UTF8ToString(ptr);return ret},getStreamFromFD:function(fd){var stream=FS.getStream(fd);if(!stream)throw new FS.ErrnoError(8);return stream},get64:function(low,high){return low}};function ___sys_fcntl64(fd,cmd,varargs){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(1,1,fd,cmd,varargs);SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=SYSCALLS.get();if(arg<0){return-28}var newStream;newStream=FS.open(stream.path,stream.flags,0,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=SYSCALLS.get();stream.flags|=arg;return 0}case 12:{var arg=SYSCALLS.get();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:setErrNo(28);return-1;default:{return-28}}}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___sys_open(path,flags,varargs){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(2,1,path,flags,varargs);SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=varargs?SYSCALLS.get():0;var stream=FS.open(pathname,flags,mode);return stream.fd}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+'    "use strict";'+"    return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach(function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(function(cb){cb()})}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&&registeredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.indexOf("j")!=-1){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i<arguments.length;i++){argCache[i]=arguments[i]}return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.indexOf("j")!=-1){return getDynCaller(signature,rawFunction)}return wasmTable.get(rawFunction)}var fp=makeDynCaller();if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);var args=[rawConstructor];var destructors=[];whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){classType.registeredClass.constructor_body[argCount-1]=function constructor_body(){if(arguments.length!==argCount-1){throwBindingError(humanName+" called with "+arguments.length+" arguments, expected "+(argCount-1))}destructors.length=0;args.length=argCount;for(var i=1;i<argCount;++i){args[i]=argTypes[i]["toWireType"](destructors,arguments[i-1])}var ptr=invoker.apply(null,args);runDestructors(destructors);return argTypes[0]["fromWireType"](ptr)};return[]});return[]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!=="void";var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(isPureVirtual){classType.registeredClass.pureVirtualFunctions.push(methodName)}function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.instancePrototype;var method=proto[methodName];if(undefined===method||undefined===method.overloadTable&&method.className!==classType.name&&method.argCount===argCount-2){unboundTypesHandler.argCount=argCount-2;unboundTypesHandler.className=classType.name;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-2]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var memberFunction=craftInvokerFunction(humanName,argTypes,classType,rawInvoker,context);if(undefined===proto[methodName].overloadTable){memberFunction.argCount=argCount-2;proto[methodName]=memberFunction}else{proto[methodName].overloadTable[argCount-2]=memberFunction}return[]});return[]})}function validateThis(this_,classType,humanName){if(!(this_ instanceof Object)){throwBindingError(humanName+' with invalid "this": '+this_)}if(!(this_ instanceof classType.registeredClass.constructor)){throwBindingError(humanName+' incompatible with "this" of type '+this_.constructor.name)}if(!this_.$$.ptr){throwBindingError("cannot call emscripten binding method "+humanName+" on deleted object")}return upcastPointer(this_.$$.ptr,this_.$$.ptrType.registeredClass,classType.registeredClass)}function __embind_register_class_property(classType,fieldName,getterReturnType,getterSignature,getter,getterContext,setterArgumentType,setterSignature,setter,setterContext){fieldName=readLatin1String(fieldName);getter=embind__requireFunction(getterSignature,getter);whenDependentTypesAreResolved([],[classType],function(classType){classType=classType[0];var humanName=classType.name+"."+fieldName;var desc={get:function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])},enumerable:true,configurable:true};if(setter){desc.set=function(){throwUnboundTypeError("Cannot access "+humanName+" due to unbound types",[getterReturnType,setterArgumentType])}}else{desc.set=function(v){throwBindingError(humanName+" is a read-only property")}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);whenDependentTypesAreResolved([],setter?[getterReturnType,setterArgumentType]:[getterReturnType],function(types){var getterReturnType=types[0];var desc={get:function(){var ptr=validateThis(this,classType,humanName+" getter");return getterReturnType["fromWireType"](getter(getterContext,ptr))},enumerable:true};if(setter){setter=embind__requireFunction(setterSignature,setter);var setterArgumentType=types[1];desc.set=function(v){var ptr=validateThis(this,classType,humanName+" setter");var destructors=[];setter(setterContext,ptr,setterArgumentType["toWireType"](destructors,v));runDestructors(destructors)}}Object.defineProperty(classType.registeredClass.instancePrototype,fieldName,desc);return[]});return[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1}case null:{return 2}case true:{return 3}case false:{return 4}default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<<bitshift>>>bitshift}}var isUnsignedType=name.indexOf("unsigned")!=-1;registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}str=a.join("")}_free(value);return str},"toWireType":function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var getLength;var valueIsOfTypeString=typeof value==="string";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError("Cannot pass non-string to std::string")}if(stdStringIsUTF8&&valueIsOfTypeString){getLength=function(){return lengthBytesUTF8(value)}}else{getLength=function(){return value.length}}var length=getLength();var ptr=_malloc(4+length+1);HEAPU32[ptr>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+4+i]=value[i]}}}if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=function(){return HEAPU16};shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=function(){return HEAPU32};shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function __emscripten_notify_thread_queue(targetThreadId,mainThreadId){if(targetThreadId==mainThreadId){postMessage({"cmd":"processQueuedMainThreadWork"})}else if(ENVIRONMENT_IS_PTHREAD){postMessage({"targetThread":targetThreadId,"cmd":"processThreadQueue"})}else{var pthread=PThread.pthreads[targetThreadId];var worker=pthread&&pthread.worker;if(!worker){return}worker.postMessage({"cmd":"processThreadQueue"})}return 1}function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}var emval_symbols={};function getStringOrSymbol(address){var symbol=emval_symbols[address];if(symbol===undefined){return readLatin1String(address)}else{return symbol}}var emval_methodCallers=[];function __emval_call_void_method(caller,handle,methodName,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);caller(handle,methodName,null,args)}function __emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i<argCount;++i){a[i]=requireRegisteredType(HEAP32[(argTypes>>2)+i],"parameter "+i)}return a}function __emval_get_method_caller(argCount,argTypes){var types=__emval_lookupTypes(argCount,argTypes);var retType=types[0];var signatureName=retType.name+"_$"+types.slice(1).map(function(t){return t.name}).join("_")+"$";var params=["retType"];var args=[retType];var argsList="";for(var i=0;i<argCount-1;++i){argsList+=(i!==0?", ":"")+"arg"+i;params.push("argType"+i);args.push(types[1+i])}var functionName=makeLegalFunctionName("methodCaller_"+signatureName);var functionBody="return function "+functionName+"(handle, name, destructors, args) {\n";var offset=0;for(var i=0;i<argCount-1;++i){functionBody+="    var arg"+i+" = argType"+i+".readValueFromPointer(args"+(offset?"+"+offset:"")+");\n";offset+=types[i+1]["argPackAdvance"]}functionBody+="    var rv = handle[name]("+argsList+");\n";for(var i=0;i<argCount-1;++i){if(types[i+1]["deleteObject"]){functionBody+="    argType"+i+".deleteObject(arg"+i+");\n"}}if(!retType.isVoid){functionBody+="    return retType.toWireType(destructors, rv);\n"}functionBody+="};\n";params.push(functionBody);var invokerFunction=new_(Function,params).apply(null,args);return __emval_addMethodCaller(invokerFunction)}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}function _abort(){abort()}function _clock(){if(_clock.start===undefined)_clock.start=Date.now();return(Date.now()-_clock.start)*(1e6/1e3)|0}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function _emscripten_check_blocking_allowed(){if(ENVIRONMENT_IS_WORKER)return;warnOnce("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")}function _emscripten_conditional_set_current_thread_status(expectedStatus,newStatus){}function _emscripten_futex_wait(addr,val,timeout){if(addr<=0||addr>HEAP8.length||addr&3!=0)return-28;if(!ENVIRONMENT_IS_WEB){var ret=Atomics.wait(HEAP32,addr>>2,val,timeout);if(ret==="timed-out")return-73;if(ret==="not-equal")return-6;if(ret==="ok")return 0;throw"Atomics.wait returned an unexpected value "+ret}else{if(Atomics.load(HEAP32,addr>>2)!=val){return-6}var tNow=performance.now();var tEnd=tNow+timeout;var lastAddr=Atomics.exchange(HEAP32,__emscripten_main_thread_futex>>2,addr);while(1){tNow=performance.now();if(tNow>tEnd){lastAddr=Atomics.exchange(HEAP32,__emscripten_main_thread_futex>>2,0);return-73}lastAddr=Atomics.exchange(HEAP32,__emscripten_main_thread_futex>>2,0);if(lastAddr==0){break}_emscripten_main_thread_process_queued_calls();if(Atomics.load(HEAP32,addr>>2)!=val){return-6}lastAddr=Atomics.exchange(HEAP32,__emscripten_main_thread_futex>>2,addr)}return 0}}function reallyNegative(x){return x<0||x===0&&1/x===-Infinity}function convertI32PairToI53(lo,hi){return(lo>>>0)+hi*4294967296}function convertU32PairToI53(lo,hi){return(lo>>>0)+(hi>>>0)*4294967296}function reSign(value,bits){if(value<=0){return value}var half=bits<=32?Math.abs(1<<bits-1):Math.pow(2,bits-1);if(value>=half&&(bits<=32||value>half)){value=-2*half+value}return value}function unSign(value,bits){if(value>=0){return value}return bits<=32?2*Math.abs(1<<bits-1)+value:Math.pow(2,bits)+value}function formatString(format,varargs){var textIndex=format;var argIndex=varargs;function prepVararg(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){ptr+=4}}else{}return ptr}function getNextArg(type){var ret;argIndex=prepVararg(argIndex,type);if(type==="double"){ret=HEAPF64[argIndex>>3];argIndex+=8}else if(type=="i64"){ret=[HEAP32[argIndex>>2],HEAP32[argIndex+4>>2]];argIndex+=8}else{type="i32";ret=HEAP32[argIndex>>2];argIndex+=4}return ret}var ret=[];var curr,next,currArg;while(1){var startTextIndex=textIndex;curr=HEAP8[textIndex>>0];if(curr===0)break;next=HEAP8[textIndex+1>>0];if(curr==37){var flagAlwaysSigned=false;var flagLeftAlign=false;var flagAlternative=false;var flagZeroPad=false;var flagPadSign=false;flagsLoop:while(1){switch(next){case 43:flagAlwaysSigned=true;break;case 45:flagLeftAlign=true;break;case 35:flagAlternative=true;break;case 48:if(flagZeroPad){break flagsLoop}else{flagZeroPad=true;break}case 32:flagPadSign=true;break;default:break flagsLoop}textIndex++;next=HEAP8[textIndex+1>>0]}var width=0;if(next==42){width=getNextArg("i32");textIndex++;next=HEAP8[textIndex+1>>0]}else{while(next>=48&&next<=57){width=width*10+(next-48);textIndex++;next=HEAP8[textIndex+1>>0]}}var precisionSet=false,precision=-1;if(next==46){precision=0;precisionSet=true;textIndex++;next=HEAP8[textIndex+1>>0];if(next==42){precision=getNextArg("i32");textIndex++}else{while(1){var precisionChr=HEAP8[textIndex+1>>0];if(precisionChr<48||precisionChr>57)break;precision=precision*10+(precisionChr-48);textIndex++}}next=HEAP8[textIndex+1>>0]}if(precision<0){precision=6;precisionSet=false}var argSize;switch(String.fromCharCode(next)){case"h":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==104){textIndex++;argSize=1}else{argSize=2}break;case"l":var nextNext=HEAP8[textIndex+2>>0];if(nextNext==108){textIndex++;argSize=8}else{argSize=4}break;case"L":case"q":case"j":argSize=8;break;case"z":case"t":case"I":argSize=4;break;default:argSize=null}if(argSize)textIndex++;next=HEAP8[textIndex+1>>0];switch(String.fromCharCode(next)){case"d":case"i":case"u":case"o":case"x":case"X":case"p":{var signed=next==100||next==105;argSize=argSize||4;currArg=getNextArg("i"+argSize*8);var argText;if(argSize==8){currArg=next==117?convertU32PairToI53(currArg[0],currArg[1]):convertI32PairToI53(currArg[0],currArg[1])}if(argSize<=4){var limit=Math.pow(256,argSize)-1;currArg=(signed?reSign:unSign)(currArg&limit,argSize*8)}var currAbsArg=Math.abs(currArg);var prefix="";if(next==100||next==105){argText=reSign(currArg,8*argSize,1).toString(10)}else if(next==117){argText=unSign(currArg,8*argSize,1).toString(10);currArg=Math.abs(currArg)}else if(next==111){argText=(flagAlternative?"0":"")+currAbsArg.toString(8)}else if(next==120||next==88){prefix=flagAlternative&&currArg!=0?"0x":"";if(currArg<0){currArg=-currArg;argText=(currAbsArg-1).toString(16);var buffer=[];for(var i=0;i<argText.length;i++){buffer.push((15-parseInt(argText[i],16)).toString(16))}argText=buffer.join("");while(argText.length<argSize*2)argText="f"+argText}else{argText=currAbsArg.toString(16)}if(next==88){prefix=prefix.toUpperCase();argText=argText.toUpperCase()}}else if(next==112){if(currAbsArg===0){argText="(nil)"}else{prefix="0x";argText=currAbsArg.toString(16)}}if(precisionSet){while(argText.length<precision){argText="0"+argText}}if(currArg>=0){if(flagAlwaysSigned){prefix="+"+prefix}else if(flagPadSign){prefix=" "+prefix}}if(argText.charAt(0)=="-"){prefix="-"+prefix;argText=argText.substr(1)}while(prefix.length+argText.length<width){if(flagLeftAlign){argText+=" "}else{if(flagZeroPad){argText="0"+argText}else{prefix=" "+prefix}}}argText=prefix+argText;argText.split("").forEach(function(chr){ret.push(chr.charCodeAt(0))});break}case"f":case"F":case"e":case"E":case"g":case"G":{currArg=getNextArg("double");var argText;if(isNaN(currArg)){argText="nan";flagZeroPad=false}else if(!isFinite(currArg)){argText=(currArg<0?"-":"")+"inf";flagZeroPad=false}else{var isGeneral=false;var effectivePrecision=Math.min(precision,20);if(next==103||next==71){isGeneral=true;precision=precision||1;var exponent=parseInt(currArg.toExponential(effectivePrecision).split("e")[1],10);if(precision>exponent&&exponent>=-4){next=(next==103?"f":"F").charCodeAt(0);precision-=exponent+1}else{next=(next==103?"e":"E").charCodeAt(0);precision--}effectivePrecision=Math.min(precision,20)}if(next==101||next==69){argText=currArg.toExponential(effectivePrecision);if(/[eE][-+]\d$/.test(argText)){argText=argText.slice(0,-1)+"0"+argText.slice(-1)}}else if(next==102||next==70){argText=currArg.toFixed(effectivePrecision);if(currArg===0&&reallyNegative(currArg)){argText="-"+argText}}var parts=argText.split("e");if(isGeneral&&!flagAlternative){while(parts[0].length>1&&parts[0].indexOf(".")!=-1&&(parts[0].slice(-1)=="0"||parts[0].slice(-1)==".")){parts[0]=parts[0].slice(0,-1)}}else{if(flagAlternative&&argText.indexOf(".")==-1)parts[0]+=".";while(precision>effectivePrecision++)parts[0]+="0"}argText=parts[0]+(parts.length>1?"e"+parts[1]:"");if(next==69)argText=argText.toUpperCase();if(currArg>=0){if(flagAlwaysSigned){argText="+"+argText}else if(flagPadSign){argText=" "+argText}}}while(argText.length<width){if(flagLeftAlign){argText+=" "}else{if(flagZeroPad&&(argText[0]=="-"||argText[0]=="+")){argText=argText[0]+"0"+argText.slice(1)}else{argText=(flagZeroPad?"0":" ")+argText}}}if(next<97)argText=argText.toUpperCase();argText.split("").forEach(function(chr){ret.push(chr.charCodeAt(0))});break}case"s":{var arg=getNextArg("i8*");var argLength=arg?_strlen(arg):"(null)".length;if(precisionSet)argLength=Math.min(argLength,precision);if(!flagLeftAlign){while(argLength<width--){ret.push(32)}}if(arg){for(var i=0;i<argLength;i++){ret.push(HEAPU8[arg++>>0])}}else{ret=ret.concat(intArrayFromString("(null)".substr(0,argLength),true))}if(flagLeftAlign){while(argLength<width--){ret.push(32)}}break}case"c":{if(flagLeftAlign)ret.push(getNextArg("i8"));while(--width>0){ret.push(32)}if(!flagLeftAlign)ret.push(getNextArg("i8"));break}case"n":{var ptr=getNextArg("i32*");HEAP32[ptr>>2]=ret.length;break}case"%":{ret.push(curr);break}default:{for(var i=startTextIndex;i<textIndex+2;i++){ret.push(HEAP8[i>>0])}}}textIndex+=2}else{ret.push(curr);textIndex+=1}}return ret}function traverseStack(args){if(!args||!args.callee||!args.callee.name){return[null,"",""]}var funstr=args.callee.toString();var funcname=args.callee.name;var str="(";var first=true;for(var i in args){var a=args[i];if(!first){str+=", "}first=false;if(typeof a==="number"||typeof a==="string"){str+=a}else{str+="("+typeof a+")"}}str+=")";var caller=args.callee.caller;args=caller?caller.arguments:[];if(first)str="";return[args,funcname,str]}function _emscripten_get_callstack_js(flags){var callstack=jsStackTrace();var iThisFunc=callstack.lastIndexOf("_emscripten_log");var iThisFunc2=callstack.lastIndexOf("_emscripten_get_callstack");var iNextLine=callstack.indexOf("\n",Math.max(iThisFunc,iThisFunc2))+1;callstack=callstack.slice(iNextLine);if(flags&32){warnOnce("EM_LOG_DEMANGLE is deprecated; ignoring")}if(flags&8&&typeof emscripten_source_map==="undefined"){warnOnce('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with "--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js" linker flag to add source map loading to code.');flags^=8;flags|=16}var stack_args=null;if(flags&128){stack_args=traverseStack(arguments);while(stack_args[1].indexOf("_emscripten_")>=0)stack_args=traverseStack(stack_args[0])}var lines=callstack.split("\n");callstack="";var newFirefoxRe=new RegExp("\\s*(.*?)@(.*?):([0-9]+):([0-9]+)");var firefoxRe=new RegExp("\\s*(.*?)@(.*):(.*)(:(.*))?");var chromeRe=new RegExp("\\s*at (.*?) \\((.*):(.*):(.*)\\)");for(var l in lines){var line=lines[l];var symbolName="";var file="";var lineno=0;var column=0;var parts=chromeRe.exec(line);if(parts&&parts.length==5){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]}else{parts=newFirefoxRe.exec(line);if(!parts)parts=firefoxRe.exec(line);if(parts&&parts.length>=4){symbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]|0}else{callstack+=line+"\n";continue}}var haveSourceMap=false;if(flags&8){var orig=emscripten_source_map.originalPositionFor({line:lineno,column:column});haveSourceMap=orig&&orig.source;if(haveSourceMap){if(flags&64){orig.source=orig.source.substring(orig.source.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+="    at "+symbolName+" ("+orig.source+":"+orig.line+":"+orig.column+")\n"}}if(flags&16||!haveSourceMap){if(flags&64){file=file.substring(file.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=(haveSourceMap?"     = "+symbolName:"    at "+symbolName)+" ("+file+":"+lineno+":"+column+")\n"}if(flags&128&&stack_args[0]){if(stack_args[1]==symbolName&&stack_args[2].length>0){callstack=callstack.replace(/\s+$/,"");callstack+=" with values: "+stack_args[1]+stack_args[2]+"\n"}stack_args=traverseStack(stack_args[0])}}callstack=callstack.replace(/\s+$/,"");return callstack}function _emscripten_log_js(flags,str){if(flags&24){str=str.replace(/\s+$/,"");str+=(str.length>0?"\n":"")+_emscripten_get_callstack_js(flags)}if(flags&1){if(flags&4){console.error(str)}else if(flags&2){console.warn(str)}else if(flags&512){console.info(str)}else if(flags&256){console.debug(str)}else{console.log(str)}}else if(flags&6){err(str)}else{out(str)}}function _emscripten_log(flags,format,varargs){var result=formatString(format,varargs);var str=UTF8ArrayToString(result,0);_emscripten_log_js(flags,str)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_proxy_to_main_thread_js(index,sync){var numCallArgs=arguments.length-2;var stack=stackSave();var serializedNumCallArgs=numCallArgs;var args=stackAlloc(serializedNumCallArgs*8);var b=args>>3;for(var i=0;i<numCallArgs;i++){var arg=arguments[2+i];HEAPF64[b+i]=arg}var ret=_emscripten_run_in_main_runtime_thread_js(index,serializedNumCallArgs,args,sync);stackRestore(stack);return ret}var _emscripten_receive_on_main_thread_js_callArgs=[];var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){var double=ch<105;if(double&&buf&1)buf++;readAsmConstArgsArray.push(double?HEAPF64[buf++>>1]:HEAP32[buf]);++buf}return readAsmConstArgsArray}function _emscripten_receive_on_main_thread_js(index,numCallArgs,args){_emscripten_receive_on_main_thread_js_callArgs.length=numCallArgs;var b=args>>3;for(var i=0;i<numCallArgs;i++){_emscripten_receive_on_main_thread_js_callArgs[i]=HEAPF64[b+i]}var isEmAsmConst=index<0;var func=!isEmAsmConst?proxiedFunctionTable[index]:ASM_CONSTS[-index-1];return func.apply(null,_emscripten_receive_on_main_thread_js_callArgs)}function abortOnCannotGrowMemory(requestedSize){abort("OOM")}function _emscripten_resize_heap(requestedSize){abortOnCannotGrowMemory(requestedSize)}var JSEvents={inEventHandler:0,removeAllEventListeners:function(){for(var i=JSEvents.eventHandlers.length-1;i>=0;--i){JSEvents._removeHandler(i)}JSEvents.eventHandlers=[];JSEvents.deferredCalls=[]},registerRemoveEventListeners:function(){if(!JSEvents.removeEventListenersRegistered){__ATEXIT__.push(JSEvents.removeAllEventListeners);JSEvents.removeEventListenersRegistered=true}},deferredCalls:[],deferCall:function(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var i in JSEvents.deferredCalls){var call=JSEvents.deferredCalls[i];if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction:targetFunction,precedence:precedence,argsList:argsList});JSEvents.deferredCalls.sort(function(x,y){return x.precedence<y.precedence})},removeDeferredCalls:function(targetFunction){for(var i=0;i<JSEvents.deferredCalls.length;++i){if(JSEvents.deferredCalls[i].targetFunction==targetFunction){JSEvents.deferredCalls.splice(i,1);--i}}},canPerformEventHandlerRequests:function(){return JSEvents.inEventHandler&&JSEvents.currentEventHandler.allowsDeferredCalls},runDeferredCalls:function(){if(!JSEvents.canPerformEventHandlerRequests()){return}for(var i=0;i<JSEvents.deferredCalls.length;++i){var call=JSEvents.deferredCalls[i];JSEvents.deferredCalls.splice(i,1);--i;call.targetFunction.apply(null,call.argsList)}},eventHandlers:[],removeAllHandlersOnTarget:function(target,eventTypeString){for(var i=0;i<JSEvents.eventHandlers.length;++i){if(JSEvents.eventHandlers[i].target==target&&(!eventTypeString||eventTypeString==JSEvents.eventHandlers[i].eventTypeString)){JSEvents._removeHandler(i--)}}},_removeHandler:function(i){var h=JSEvents.eventHandlers[i];h.target.removeEventListener(h.eventTypeString,h.eventListenerFunc,h.useCapture);JSEvents.eventHandlers.splice(i,1)},registerOrRemoveHandler:function(eventHandler){var jsEventHandler=function jsEventHandler(event){++JSEvents.inEventHandler;JSEvents.currentEventHandler=eventHandler;JSEvents.runDeferredCalls();eventHandler.handlerFunc(event);JSEvents.runDeferredCalls();--JSEvents.inEventHandler};if(eventHandler.callbackfunc){eventHandler.eventListenerFunc=jsEventHandler;eventHandler.target.addEventListener(eventHandler.eventTypeString,jsEventHandler,eventHandler.useCapture);JSEvents.eventHandlers.push(eventHandler);JSEvents.registerRemoveEventListeners()}else{for(var i=0;i<JSEvents.eventHandlers.length;++i){if(JSEvents.eventHandlers[i].target==eventHandler.target&&JSEvents.eventHandlers[i].eventTypeString==eventHandler.eventTypeString){JSEvents._removeHandler(i--)}}}},queueEventHandlerOnThread_iiii:function(targetThread,eventHandlerFunc,eventTypeId,eventData,userData){var stackTop=stackSave();var varargs=stackAlloc(12);HEAP32[varargs>>2]=eventTypeId;HEAP32[varargs+4>>2]=eventData;HEAP32[varargs+8>>2]=userData;__emscripten_call_on_thread(0,targetThread,637534208,eventHandlerFunc,eventData,varargs);stackRestore(stackTop)},getTargetThreadForEventCallback:function(targetThread){switch(targetThread){case 1:return 0;case 2:return PThread.currentProxiedOperationCallerThread;default:return targetThread}},getNodeNameForTarget:function(target){if(!target)return"";if(target==window)return"#window";if(target==screen)return"#screen";return target&&target.nodeName?target.nodeName:""},fullscreenEnabled:function(){return document.fullscreenEnabled||document.webkitFullscreenEnabled}};function stringToNewUTF8(jsString){var length=lengthBytesUTF8(jsString)+1;var cString=_malloc(length);stringToUTF8(jsString,cString,length);return cString}function _emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height){var stackTop=stackSave();var varargs=stackAlloc(12);var targetCanvasPtr=0;if(targetCanvas){targetCanvasPtr=stringToNewUTF8(targetCanvas)}HEAP32[varargs>>2]=targetCanvasPtr;HEAP32[varargs+4>>2]=width;HEAP32[varargs+8>>2]=height;__emscripten_call_on_thread(0,targetThread,657457152,0,targetCanvasPtr,varargs);stackRestore(stackTop)}function _emscripten_set_offscreencanvas_size_on_target_thread(targetThread,targetCanvas,width,height){targetCanvas=targetCanvas?UTF8ToString(targetCanvas):"";_emscripten_set_offscreencanvas_size_on_target_thread_js(targetThread,targetCanvas,width,height)}function maybeCStringToJsString(cString){return cString>2?UTF8ToString(cString):cString}var specialHTMLTargets=[0,typeof document!=="undefined"?document:0,typeof window!=="undefined"?window:0];function findEventTarget(target){target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||(typeof document!=="undefined"?document.querySelector(target):undefined);return domElement}function findCanvasEventTarget(target){return findEventTarget(target)}function _emscripten_set_canvas_element_size_calling_thread(target,width,height){var canvas=findCanvasEventTarget(target);if(!canvas)return-4;if(canvas.canvasSharedPtr){HEAP32[canvas.canvasSharedPtr>>2]=width;HEAP32[canvas.canvasSharedPtr+4>>2]=height}if(canvas.offscreenCanvas||!canvas.controlTransferredOffscreen){if(canvas.offscreenCanvas)canvas=canvas.offscreenCanvas;var autoResizeViewport=false;if(canvas.GLctxObject&&canvas.GLctxObject.GLctx){var prevViewport=canvas.GLctxObject.GLctx.getParameter(2978);autoResizeViewport=prevViewport[0]===0&&prevViewport[1]===0&&prevViewport[2]===canvas.width&&prevViewport[3]===canvas.height}canvas.width=width;canvas.height=height;if(autoResizeViewport){canvas.GLctxObject.GLctx.viewport(0,0,width,height)}}else if(canvas.canvasSharedPtr){var targetThread=HEAP32[canvas.canvasSharedPtr+8>>2];_emscripten_set_offscreencanvas_size_on_target_thread(targetThread,target,width,height);return 1}else{return-4}return 0}function _emscripten_set_canvas_element_size_main_thread(target,width,height){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(3,1,target,width,height);return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}function _emscripten_set_canvas_element_size(target,width,height){var canvas=findCanvasEventTarget(target);if(canvas){return _emscripten_set_canvas_element_size_calling_thread(target,width,height)}else{return _emscripten_set_canvas_element_size_main_thread(target,width,height)}}function _emscripten_set_current_thread_status(newStatus){}function __webgl_enable_ANGLE_instanced_arrays(ctx){var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=function(index,divisor){ext["vertexAttribDivisorANGLE"](index,divisor)};ctx["drawArraysInstanced"]=function(mode,first,count,primcount){ext["drawArraysInstancedANGLE"](mode,first,count,primcount)};ctx["drawElementsInstanced"]=function(mode,count,type,indices,primcount){ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount)};return 1}}function __webgl_enable_OES_vertex_array_object(ctx){var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=function(){return ext["createVertexArrayOES"]()};ctx["deleteVertexArray"]=function(vao){ext["deleteVertexArrayOES"](vao)};ctx["bindVertexArray"]=function(vao){ext["bindVertexArrayOES"](vao)};ctx["isVertexArray"]=function(vao){return ext["isVertexArrayOES"](vao)};return 1}}function __webgl_enable_WEBGL_draw_buffers(ctx){var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=function(n,bufs){ext["drawBuffersWEBGL"](n,bufs)};return 1}}function __webgl_enable_WEBGL_multi_draw(ctx){return!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"))}var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],uniforms:[],shaders:[],vaos:[],contexts:{},offscreenCanvases:{},timerQueriesEXT:[],programInfos:{},stringCache:{},unpackAlignment:4,recordError:function recordError(errorCode){if(!GL.lastError){GL.lastError=errorCode}},getNewId:function(table){var ret=GL.counter++;for(var i=table.length;i<ret;i++){table[i]=null}return ret},getSource:function(shader,count,string,length){var source="";for(var i=0;i<count;++i){var len=length?HEAP32[length+i*4>>2]:-1;source+=UTF8ToString(HEAP32[string+i*4>>2],len<0?undefined:len)}return source},createContext:function(canvas,webGLContextAttributes){var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:function(ctx,webGLContextAttributes){var handle=_malloc(8);HEAP32[handle+4>>2]=_pthread_self();var context={handle:handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault==="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:function(contextHandle){GL.currentContext=GL.contexts[contextHandle];Module.ctx=GLctx=GL.currentContext&&GL.currentContext.GLctx;return!(contextHandle&&!GLctx)},getContext:function(contextHandle){return GL.contexts[contextHandle]},deleteContext:function(contextHandle){if(GL.currentContext===GL.contexts[contextHandle])GL.currentContext=null;if(typeof JSEvents==="object")JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas);if(GL.contexts[contextHandle]&&GL.contexts[contextHandle].GLctx.canvas)GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined;_free(GL.contexts[contextHandle].handle);GL.contexts[contextHandle]=null},initExtensions:function(context){if(!context)context=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;__webgl_enable_ANGLE_instanced_arrays(GLctx);__webgl_enable_OES_vertex_array_object(GLctx);__webgl_enable_WEBGL_draw_buffers(GLctx);GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query");__webgl_enable_WEBGL_multi_draw(GLctx);var exts=GLctx.getSupportedExtensions()||[];exts.forEach(function(ext){if(ext.indexOf("lose_context")<0&&ext.indexOf("debug")<0){GLctx.getExtension(ext)}})},populateUniformTable:function(program){var p=GL.programs[program];var ptable=GL.programInfos[program]={uniforms:{},maxUniformLength:0,maxAttributeLength:-1,maxUniformBlockNameLength:-1};var utable=ptable.uniforms;var numUniforms=GLctx.getProgramParameter(p,35718);for(var i=0;i<numUniforms;++i){var u=GLctx.getActiveUniform(p,i);var name=u.name;ptable.maxUniformLength=Math.max(ptable.maxUniformLength,name.length+1);if(name.slice(-1)=="]"){name=name.slice(0,name.lastIndexOf("["))}var loc=GLctx.getUniformLocation(p,name);if(loc){var id=GL.getNewId(GL.uniforms);utable[name]=[u.size,id];GL.uniforms[id]=loc;for(var j=1;j<u.size;++j){var n=name+"["+j+"]";loc=GLctx.getUniformLocation(p,n);id=GL.getNewId(GL.uniforms);GL.uniforms[id]=loc}}}}};var __emscripten_webgl_power_preferences=["default","low-power","high-performance"];function _emscripten_webgl_do_create_context(target,attributes){var a=attributes>>2;var powerPreference=HEAP32[a+(24>>2)];var contextAttributes={"alpha":!!HEAP32[a+(0>>2)],"depth":!!HEAP32[a+(4>>2)],"stencil":!!HEAP32[a+(8>>2)],"antialias":!!HEAP32[a+(12>>2)],"premultipliedAlpha":!!HEAP32[a+(16>>2)],"preserveDrawingBuffer":!!HEAP32[a+(20>>2)],"powerPreference":__emscripten_webgl_power_preferences[powerPreference],"failIfMajorPerformanceCaveat":!!HEAP32[a+(28>>2)],majorVersion:HEAP32[a+(32>>2)],minorVersion:HEAP32[a+(36>>2)],enableExtensionsByDefault:HEAP32[a+(40>>2)],explicitSwapControl:HEAP32[a+(44>>2)],proxyContextToMainThread:HEAP32[a+(48>>2)],renderViaOffscreenBackBuffer:HEAP32[a+(52>>2)]};var canvas=findCanvasEventTarget(target);if(!canvas){return 0}if(contextAttributes.explicitSwapControl){return 0}var contextHandle=GL.createContext(canvas,contextAttributes);return contextHandle}function _emscripten_webgl_create_context(a0,a1){return _emscripten_webgl_do_create_context(a0,a1)}var ENV={};function getExecutableName(){return thisProgram||"./this.program"}function getEnvStrings(){if(!getEnvStrings.strings){var lang=(typeof navigator==="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={"USER":"web_user","LOGNAME":"web_user","PATH":"/","PWD":"/","HOME":"/home/web_user","LANG":lang,"_":getExecutableName()};for(var x in ENV){env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(x+"="+env[x])}getEnvStrings.strings=strings}return getEnvStrings.strings}function _environ_get(__environ,environ_buf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(4,1,__environ,environ_buf);try{var bufSize=0;getEnvStrings().forEach(function(string,i){var ptr=environ_buf+bufSize;HEAP32[__environ+i*4>>2]=ptr;writeAsciiToMemory(string,ptr);bufSize+=string.length+1});return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _environ_sizes_get(penviron_count,penviron_buf_size){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(5,1,penviron_count,penviron_buf_size);try{var strings=getEnvStrings();HEAP32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(function(string){bufSize+=string.length+1});HEAP32[penviron_buf_size>>2]=bufSize;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_close(fd){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(6,1,fd);try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_fdstat_get(fd,pbuf){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(7,1,fd,pbuf);try{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4;HEAP8[pbuf>>0]=type;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_read(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(8,1,fd,iov,iovcnt,pnum);try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doReadv(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(9,1,fd,offset_low,offset_high,whence,newOffset);try{var stream=SYSCALLS.getStreamFromFD(fd);var HIGH_OFFSET=4294967296;var offset=offset_high*HIGH_OFFSET+(offset_low>>>0);var DOUBLE_LIMIT=9007199254740992;if(offset<=-DOUBLE_LIMIT||offset>=DOUBLE_LIMIT){return-61}FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?(Math.min(+Math.floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _fd_write(fd,iov,iovcnt,pnum){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(10,1,fd,iov,iovcnt,pnum);try{var stream=SYSCALLS.getStreamFromFD(fd);var num=SYSCALLS.doWritev(stream,iov,iovcnt);HEAP32[pnum>>2]=num;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return e.errno}}function _gettimeofday(ptr){var now=Date.now();HEAP32[ptr>>2]=now/1e3|0;HEAP32[ptr+4>>2]=now%1e3*1e3|0;return 0}function _tzset(){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(11,1);if(_tzset.called)return;_tzset.called=true;var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAP32[__get_timezone()>>2]=stdTimezoneOffset*60;HEAP32[__get_daylight()>>2]=Number(winterOffset!=summerOffset);function extractZone(date){var match=date.toTimeString().match(/\(([A-Za-z ]+)\)$/);return match?match[1]:"GMT"}var winterName=extractZone(winter);var summerName=extractZone(summer);var winterNamePtr=allocateUTF8(winterName);var summerNamePtr=allocateUTF8(summerName);if(summerOffset<winterOffset){HEAP32[__get_tzname()>>2]=winterNamePtr;HEAP32[__get_tzname()+4>>2]=summerNamePtr}else{HEAP32[__get_tzname()>>2]=summerNamePtr;HEAP32[__get_tzname()+4>>2]=winterNamePtr}}function _pthread_cleanup_pop(execute){var routine=PThread.threadExitHandlers.pop();if(execute)routine()}function _pthread_cleanup_push(routine,arg){PThread.threadExitHandlers.push(function(){wasmTable.get(routine)(arg)})}function spawnThread(threadParams){if(ENVIRONMENT_IS_PTHREAD)throw"Internal Error! spawnThread() can only ever be called from main application thread!";var worker=PThread.getNewWorker();if(worker.pthread!==undefined)throw"Internal error!";if(!threadParams.pthread_ptr)throw"Internal error, no pthread ptr!";PThread.runningWorkers.push(worker);var tlsMemory=_malloc(128*4);for(var i=0;i<128;++i){HEAP32[tlsMemory+i*4>>2]=0}var stackHigh=threadParams.stackBase+threadParams.stackSize;var pthread=PThread.pthreads[threadParams.pthread_ptr]={worker:worker,stackBase:threadParams.stackBase,stackSize:threadParams.stackSize,allocatedOwnStack:threadParams.allocatedOwnStack,threadInfoStruct:threadParams.pthread_ptr};var tis=pthread.threadInfoStruct>>2;Atomics.store(HEAPU32,tis+(64>>2),threadParams.detached);Atomics.store(HEAPU32,tis+(100>>2),tlsMemory);Atomics.store(HEAPU32,tis+(40>>2),pthread.threadInfoStruct);Atomics.store(HEAPU32,tis+(80>>2),threadParams.stackSize);Atomics.store(HEAPU32,tis+(76>>2),stackHigh);Atomics.store(HEAPU32,tis+(104>>2),threadParams.stackSize);Atomics.store(HEAPU32,tis+(104+8>>2),stackHigh);Atomics.store(HEAPU32,tis+(104+12>>2),threadParams.detached);var global_libc=_emscripten_get_global_libc();var global_locale=global_libc+40;Atomics.store(HEAPU32,tis+(172>>2),global_locale);worker.pthread=pthread;var msg={"cmd":"run","start_routine":threadParams.startRoutine,"arg":threadParams.arg,"threadInfoStruct":threadParams.pthread_ptr,"stackBase":threadParams.stackBase,"stackSize":threadParams.stackSize};worker.runPthread=function(){msg.time=performance.now();worker.postMessage(msg,threadParams.transferList)};if(worker.loaded){worker.runPthread();delete worker.runPthread}}function _pthread_create(pthread_ptr,attr,start_routine,arg){if(typeof SharedArrayBuffer==="undefined"){err("Current environment does not support SharedArrayBuffer, pthreads are not available!");return 6}if(!pthread_ptr){err("pthread_create called with a null thread pointer!");return 28}var transferList=[];var error=0;if(ENVIRONMENT_IS_PTHREAD&&(transferList.length===0||error)){return _emscripten_sync_run_in_main_thread_4(687865856,pthread_ptr,attr,start_routine,arg)}if(error)return error;var stackSize=0;var stackBase=0;var detached=0;if(attr&&attr!=-1){stackSize=HEAP32[attr>>2];stackSize+=81920;stackBase=HEAP32[attr+8>>2];detached=HEAP32[attr+12>>2]!==0}else{stackSize=2097152}var allocatedOwnStack=stackBase==0;if(allocatedOwnStack){stackBase=_memalign(16,stackSize)}else{stackBase-=stackSize;assert(stackBase>0)}var threadInfoStruct=_malloc(228);for(var i=0;i<228>>2;++i)HEAPU32[(threadInfoStruct>>2)+i]=0;HEAP32[pthread_ptr>>2]=threadInfoStruct;HEAP32[threadInfoStruct+12>>2]=threadInfoStruct;var headPtr=threadInfoStruct+152;HEAP32[headPtr>>2]=headPtr;var threadParams={stackBase:stackBase,stackSize:stackSize,allocatedOwnStack:allocatedOwnStack,detached:detached,startRoutine:start_routine,pthread_ptr:threadInfoStruct,arg:arg,transferList:transferList};if(ENVIRONMENT_IS_PTHREAD){threadParams.cmd="spawnThread";postMessage(threadParams,transferList)}else{spawnThread(threadParams)}return 0}function __pthread_testcancel_js(){if(!ENVIRONMENT_IS_PTHREAD)return;var tb=_pthread_self();if(!tb)return;var cancelDisabled=Atomics.load(HEAPU32,tb+56>>2);if(cancelDisabled)return;var canceled=Atomics.load(HEAPU32,tb+0>>2);if(canceled==2)throw"Canceled!"}function __emscripten_do_pthread_join(thread,status,block){if(!thread){err("pthread_join attempted on a null thread pointer!");return ERRNO_CODES.ESRCH}if(ENVIRONMENT_IS_PTHREAD&&_pthread_self()==thread){err("PThread "+thread+" is attempting to join to itself!");return ERRNO_CODES.EDEADLK}else if(!ENVIRONMENT_IS_PTHREAD&&_emscripten_main_browser_thread_id()==thread){err("Main thread "+thread+" is attempting to join to itself!");return ERRNO_CODES.EDEADLK}var self=HEAP32[thread+12>>2];if(self!==thread){err("pthread_join attempted on thread "+thread+", which does not point to a valid thread, or does not exist anymore!");return ERRNO_CODES.ESRCH}var detached=Atomics.load(HEAPU32,thread+64>>2);if(detached){err("Attempted to join thread "+thread+", which was already detached!");return ERRNO_CODES.EINVAL}if(block){_emscripten_check_blocking_allowed()}for(;;){var threadStatus=Atomics.load(HEAPU32,thread+0>>2);if(threadStatus==1){var threadExitCode=Atomics.load(HEAPU32,thread+4>>2);if(status)HEAP32[status>>2]=threadExitCode;Atomics.store(HEAPU32,thread+64>>2,1);if(!ENVIRONMENT_IS_PTHREAD)cleanupThread(thread);else postMessage({"cmd":"cleanupThread","thread":thread});return 0}if(!block){return ERRNO_CODES.EBUSY}__pthread_testcancel_js();if(!ENVIRONMENT_IS_PTHREAD)_emscripten_main_thread_process_queued_calls();_emscripten_futex_wait(thread+0,threadStatus,ENVIRONMENT_IS_PTHREAD?100:1)}}function _pthread_join(thread,status){return __emscripten_do_pthread_join(thread,status,true)}function _setTempRet0($i){setTempRet0($i|0)}function _sysconf(name){if(ENVIRONMENT_IS_PTHREAD)return _emscripten_proxy_to_main_thread_js(12,1,name);switch(name){case 30:return 16384;case 85:var maxHeapSize=HEAPU8.length;return maxHeapSize/16384;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:case 80:case 81:case 79:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}setErrNo(28);return-1}if(!ENVIRONMENT_IS_PTHREAD)PThread.initMainThreadBlock();var FSNode=function(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev};var readMode=292|73;var writeMode=146;Object.defineProperties(FSNode.prototype,{read:{get:function(){return(this.mode&readMode)===readMode},set:function(val){val?this.mode|=readMode:this.mode&=~readMode}},write:{get:function(){return(this.mode&writeMode)===writeMode},set:function(val){val?this.mode|=writeMode:this.mode&=~writeMode}},isFolder:{get:function(){return FS.isDir(this.mode)}},isDevice:{get:function(){return FS.isChrdev(this.mode)}}});FS.FSNode=FSNode;FS.staticInit();embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var GLctx;var proxiedFunctionTable=[null,___sys_fcntl64,___sys_open,_emscripten_set_canvas_element_size_main_thread,_environ_get,_environ_sizes_get,_fd_close,_fd_fdstat_get,_fd_read,_fd_seek,_fd_write,_tzset,_sysconf];function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var asmLibraryArg={"e":___assert_fail,"Q":___sys_fcntl64,"P":___sys_open,"V":__embind_register_bool,"y":__embind_register_class,"q":__embind_register_class_constructor,"m":__embind_register_class_function,"$":__embind_register_class_property,"U":__embind_register_emval,"w":__embind_register_float,"d":__embind_register_integer,"c":__embind_register_memory_view,"x":__embind_register_std_string,"o":__embind_register_std_wstring,"W":__embind_register_void,"I":__emscripten_notify_thread_queue,"J":__emval_as,"i":__emval_call_void_method,"z":__emval_decref,"h":__emval_get_method_caller,"_":__emval_incref,"C":__emval_run_destructors,"R":__emval_take_value,"b":_abort,"Y":_clock,"s":_emscripten_asm_const_int,"M":_emscripten_check_blocking_allowed,"t":_emscripten_conditional_set_current_thread_status,"g":_emscripten_futex_wait,"f":_emscripten_futex_wake,"k":_emscripten_get_now,"j":_emscripten_log,"D":_emscripten_memcpy_big,"F":_emscripten_receive_on_main_thread_js,"E":_emscripten_resize_heap,"G":_emscripten_set_canvas_element_size,"r":_emscripten_set_current_thread_status,"H":_emscripten_webgl_create_context,"N":_environ_get,"O":_environ_sizes_get,"v":_fd_close,"S":_fd_fdstat_get,"T":_fd_read,"A":_fd_seek,"u":_fd_write,"X":_gettimeofday,"B":initPthreadsJS,"a":wasmMemory,"K":_pthread_cleanup_pop,"L":_pthread_cleanup_push,"l":_pthread_create,"p":_pthread_join,"n":_setTempRet0,"Z":_sysconf};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["aa"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["ba"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["ca"]).apply(null,arguments)};var _strlen=Module["_strlen"]=function(){return(_strlen=Module["_strlen"]=Module["asm"]["ea"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["fa"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["ga"]).apply(null,arguments)};var ___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=function(){return(___embind_register_native_and_builtin_types=Module["___embind_register_native_and_builtin_types"]=Module["asm"]["ha"]).apply(null,arguments)};var _emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=function(){return(_emscripten_get_global_libc=Module["_emscripten_get_global_libc"]=Module["asm"]["ia"]).apply(null,arguments)};var __get_tzname=Module["__get_tzname"]=function(){return(__get_tzname=Module["__get_tzname"]=Module["asm"]["ja"]).apply(null,arguments)};var __get_daylight=Module["__get_daylight"]=function(){return(__get_daylight=Module["__get_daylight"]=Module["asm"]["ka"]).apply(null,arguments)};var __get_timezone=Module["__get_timezone"]=function(){return(__get_timezone=Module["__get_timezone"]=Module["asm"]["la"]).apply(null,arguments)};var _pthread_self=Module["_pthread_self"]=function(){return(_pthread_self=Module["_pthread_self"]=Module["asm"]["ma"]).apply(null,arguments)};var _emscripten_main_browser_thread_id=Module["_emscripten_main_browser_thread_id"]=function(){return(_emscripten_main_browser_thread_id=Module["_emscripten_main_browser_thread_id"]=Module["asm"]["na"]).apply(null,arguments)};var ___pthread_tsd_run_dtors=Module["___pthread_tsd_run_dtors"]=function(){return(___pthread_tsd_run_dtors=Module["___pthread_tsd_run_dtors"]=Module["asm"]["oa"]).apply(null,arguments)};var _emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=function(){return(_emscripten_main_thread_process_queued_calls=Module["_emscripten_main_thread_process_queued_calls"]=Module["asm"]["pa"]).apply(null,arguments)};var _emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=function(){return(_emscripten_current_thread_process_queued_calls=Module["_emscripten_current_thread_process_queued_calls"]=Module["asm"]["qa"]).apply(null,arguments)};var _emscripten_register_main_browser_thread_id=Module["_emscripten_register_main_browser_thread_id"]=function(){return(_emscripten_register_main_browser_thread_id=Module["_emscripten_register_main_browser_thread_id"]=Module["asm"]["ra"]).apply(null,arguments)};var __emscripten_do_dispatch_to_thread=Module["__emscripten_do_dispatch_to_thread"]=function(){return(__emscripten_do_dispatch_to_thread=Module["__emscripten_do_dispatch_to_thread"]=Module["asm"]["sa"]).apply(null,arguments)};var _emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=function(){return(_emscripten_sync_run_in_main_thread_4=Module["_emscripten_sync_run_in_main_thread_4"]=Module["asm"]["ta"]).apply(null,arguments)};var _emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=function(){return(_emscripten_run_in_main_runtime_thread_js=Module["_emscripten_run_in_main_runtime_thread_js"]=Module["asm"]["ua"]).apply(null,arguments)};var __emscripten_call_on_thread=Module["__emscripten_call_on_thread"]=function(){return(__emscripten_call_on_thread=Module["__emscripten_call_on_thread"]=Module["asm"]["va"]).apply(null,arguments)};var _emscripten_tls_init=Module["_emscripten_tls_init"]=function(){return(_emscripten_tls_init=Module["_emscripten_tls_init"]=Module["asm"]["wa"]).apply(null,arguments)};var __emscripten_thread_init=Module["__emscripten_thread_init"]=function(){return(__emscripten_thread_init=Module["__emscripten_thread_init"]=Module["asm"]["xa"]).apply(null,arguments)};var stackSave=Module["stackSave"]=function(){return(stackSave=Module["stackSave"]=Module["asm"]["ya"]).apply(null,arguments)};var stackRestore=Module["stackRestore"]=function(){return(stackRestore=Module["stackRestore"]=Module["asm"]["za"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["Aa"]).apply(null,arguments)};var _emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=function(){return(_emscripten_stack_set_limits=Module["_emscripten_stack_set_limits"]=Module["asm"]["Ba"]).apply(null,arguments)};var _memalign=Module["_memalign"]=function(){return(_memalign=Module["_memalign"]=Module["asm"]["Ca"]).apply(null,arguments)};var dynCall_ijiii=Module["dynCall_ijiii"]=function(){return(dynCall_ijiii=Module["dynCall_ijiii"]=Module["asm"]["Da"]).apply(null,arguments)};var dynCall_viiijj=Module["dynCall_viiijj"]=function(){return(dynCall_viiijj=Module["dynCall_viiijj"]=Module["asm"]["Ea"]).apply(null,arguments)};var dynCall_jij=Module["dynCall_jij"]=function(){return(dynCall_jij=Module["dynCall_jij"]=Module["asm"]["Fa"]).apply(null,arguments)};var dynCall_jii=Module["dynCall_jii"]=function(){return(dynCall_jii=Module["dynCall_jii"]=Module["asm"]["Ga"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["Ha"]).apply(null,arguments)};var _ff_h264_cabac_tables=Module["_ff_h264_cabac_tables"]=77706;var __emscripten_allow_main_runtime_queued_calls=Module["__emscripten_allow_main_runtime_queued_calls"]=241152;var __emscripten_main_thread_futex=Module["__emscripten_main_thread_futex"]=1178e3;Module["PThread"]=PThread;Module["PThread"]=PThread;Module["wasmMemory"]=wasmMemory;Module["ExitStatus"]=ExitStatus;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"loaded"});return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;function exit(status,implicit){if(implicit&&noExitRuntime&&status===0){return}if(!implicit){if(ENVIRONMENT_IS_PTHREAD){postMessage({"cmd":"exitProcess","returnCode":status});throw new ExitStatus(status)}else{}}if(noExitRuntime){}else{PThread.terminateAllThreads();EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status);ABORT=true}quit_(status,new ExitStatus(status))}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}if(ENVIRONMENT_IS_PTHREAD){noExitRuntime=false;PThread.initWorker()}run();module.exports=Module;
diff --git a/web_src/static/js/jessibuca/ff.wasm b/web_src/static/js/jessibuca/ff.wasm
new file mode 100755
index 0000000..837c704
--- /dev/null
+++ b/web_src/static/js/jessibuca/ff.wasm
Binary files differ
diff --git a/web_src/static/js/jessibuca/ff.worker.js b/web_src/static/js/jessibuca/ff.worker.js
new file mode 100644
index 0000000..8f909e3
--- /dev/null
+++ b/web_src/static/js/jessibuca/ff.worker.js
@@ -0,0 +1 @@
+var initializedJS=false;var Module={};function threadPrintErr(){var text=Array.prototype.slice.call(arguments).join(" ");console.error(text)}function threadAlert(){var text=Array.prototype.slice.call(arguments).join(" ");postMessage({cmd:"alert",text:text,threadId:Module["_pthread_self"]()})}var err=threadPrintErr;this.alert=threadAlert;Module["instantiateWasm"]=function(info,receiveInstance){var instance=new WebAssembly.Instance(Module["wasmModule"],info);Module["wasmModule"]=null;receiveInstance(instance);return instance.exports};function moduleLoaded(){}this.onmessage=function(e){try{if(e.data.cmd==="load"){Module["wasmModule"]=e.data.wasmModule;Module["wasmMemory"]=e.data.wasmMemory;Module["buffer"]=Module["wasmMemory"].buffer;Module["ENVIRONMENT_IS_PTHREAD"]=true;if(typeof e.data.urlOrBlob==="string"){importScripts(e.data.urlOrBlob)}else{var objectUrl=URL.createObjectURL(e.data.urlOrBlob);importScripts(objectUrl);URL.revokeObjectURL(objectUrl)}moduleLoaded()}else if(e.data.cmd==="objectTransfer"){Module["PThread"].receiveObjectTransfer(e.data)}else if(e.data.cmd==="run"){Module["__performance_now_clock_drift"]=performance.now()-e.data.time;Module["__emscripten_thread_init"](e.data.threadInfoStruct,0,0);var max=e.data.stackBase;var top=e.data.stackBase+e.data.stackSize;Module["establishStackSpace"](top,max);Module["_emscripten_tls_init"]();Module["PThread"].receiveObjectTransfer(e.data);Module["PThread"].setThreadStatus(Module["_pthread_self"](),1);if(!initializedJS){Module["___embind_register_native_and_builtin_types"]();initializedJS=true}try{var result=Module["invokeEntryPoint"](e.data.start_routine,e.data.arg);if(!Module["getNoExitRuntime"]())Module["PThread"].threadExit(result)}catch(ex){if(ex==="Canceled!"){Module["PThread"].threadCancel()}else if(ex!="unwind"){if(ex instanceof Module["ExitStatus"]){if(Module["getNoExitRuntime"]()){}else{Module["PThread"].threadExit(ex.status)}}else{Module["PThread"].threadExit(-2);throw ex}}}}else if(e.data.cmd==="cancel"){if(Module["_pthread_self"]()){Module["PThread"].threadCancel()}}else if(e.data.target==="setimmediate"){}else if(e.data.cmd==="processThreadQueue"){if(Module["_pthread_self"]()){Module["_emscripten_current_thread_process_queued_calls"]()}}else{err("worker.js received unknown command "+e.data.cmd);err(e.data)}}catch(ex){err("worker.js onmessage() captured an uncaught exception: "+ex);if(ex&&ex.stack)err(ex.stack);throw ex}};
diff --git a/web_src/static/js/jessibuca/index.js b/web_src/static/js/jessibuca/index.js
new file mode 100644
index 0000000..9d7bb47
--- /dev/null
+++ b/web_src/static/js/jessibuca/index.js
@@ -0,0 +1,4602 @@
+!function () {
+  function e(e) {
+    return e && e.__esModule ? e.default : e
+  }
+
+  function t(e, t, r) {
+    Object.defineProperty(e, t, {get: r, enumerable: !0})
+  }
+
+  var r, n, o = !1;
+
+  function a() {
+    return o || (o = !0, n = e => {
+      var t = ["attribute vec4 vertexPos;", "attribute vec4 texturePos;", "varying vec2 textureCoord;", "void main()", "{", "gl_Position = vertexPos;", "textureCoord = texturePos.xy;", "}"].join("\n"),
+        r = ["precision highp float;", "varying highp vec2 textureCoord;", "uniform sampler2D ySampler;", "uniform sampler2D uSampler;", "uniform sampler2D vSampler;", "const mat4 YUV2RGB = mat4", "(", "1.1643828125, 0, 1.59602734375, -.87078515625,", "1.1643828125, -.39176171875, -.81296875, .52959375,", "1.1643828125, 2.017234375, 0, -1.081390625,", "0, 0, 0, 1", ");", "void main(void) {", "highp float y = texture2D(ySampler,  textureCoord).r;", "highp float u = texture2D(uSampler,  textureCoord).r;", "highp float v = texture2D(vSampler,  textureCoord).r;", "gl_FragColor = vec4(y, u, v, 1) * YUV2RGB;", "}"].join("\n"),
+        n = e.createShader(e.VERTEX_SHADER);
+      e.shaderSource(n, t), e.compileShader(n), e.getShaderParameter(n, e.COMPILE_STATUS) || console.log("Vertex shader failed to compile: " + e.getShaderInfoLog(n));
+      var o = e.createShader(e.FRAGMENT_SHADER);
+      e.shaderSource(o, r), e.compileShader(o), e.getShaderParameter(o, e.COMPILE_STATUS) || console.log("Fragment shader failed to compile: " + e.getShaderInfoLog(o));
+      var a = e.createProgram();
+      e.attachShader(a, n), e.attachShader(a, o), e.linkProgram(a), e.getProgramParameter(a, e.LINK_STATUS) || console.log("Program failed to compile: " + e.getProgramInfoLog(a)), e.useProgram(a);
+      var i = e.createBuffer();
+      e.bindBuffer(e.ARRAY_BUFFER, i), e.bufferData(e.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), e.STATIC_DRAW);
+      var s = e.getAttribLocation(a, "vertexPos");
+      e.enableVertexAttribArray(s), e.vertexAttribPointer(s, 2, e.FLOAT, !1, 0, 0);
+      var u = e.createBuffer();
+      e.bindBuffer(e.ARRAY_BUFFER, u), e.bufferData(e.ARRAY_BUFFER, new Float32Array([1, 0, 0, 0, 1, 1, 0, 1]), e.STATIC_DRAW);
+      var c = e.getAttribLocation(a, "texturePos");
+
+      function l(t, r) {
+        var n = e.createTexture();
+        return e.bindTexture(e.TEXTURE_2D, n), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MAG_FILTER, e.LINEAR), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_MIN_FILTER, e.LINEAR), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_S, e.CLAMP_TO_EDGE), e.texParameteri(e.TEXTURE_2D, e.TEXTURE_WRAP_T, e.CLAMP_TO_EDGE), e.bindTexture(e.TEXTURE_2D, null), e.uniform1i(e.getUniformLocation(a, t), r), n
+      }
+
+      e.enableVertexAttribArray(c), e.vertexAttribPointer(c, 2, e.FLOAT, !1, 0, 0);
+      var d = l("ySampler", 0), f = l("uSampler", 1), p = l("vSampler", 2);
+      return function (t, r, n, o, a) {
+        e.viewport(0, 0, t, r), e.activeTexture(e.TEXTURE0), e.bindTexture(e.TEXTURE_2D, d), e.texImage2D(e.TEXTURE_2D, 0, e.LUMINANCE, t, r, 0, e.LUMINANCE, e.UNSIGNED_BYTE, n), e.activeTexture(e.TEXTURE1), e.bindTexture(e.TEXTURE_2D, f), e.texImage2D(e.TEXTURE_2D, 0, e.LUMINANCE, t / 2, r / 2, 0, e.LUMINANCE, e.UNSIGNED_BYTE, o), e.activeTexture(e.TEXTURE2), e.bindTexture(e.TEXTURE_2D, p), e.texImage2D(e.TEXTURE_2D, 0, e.LUMINANCE, t / 2, r / 2, 0, e.LUMINANCE, e.UNSIGNED_BYTE, a), e.drawArrays(e.TRIANGLE_STRIP, 0, 4)
+      }
+    }, t(r = {}, "default", (function () {
+      return n
+    }))), r
+  }
+
+  var i, s, u = !1;
+
+  function c() {
+    i = {}, a(), s = e => {
+      const t = document.createElement("canvas");
+      t.style.position = "absolute", t.style.top = 0, t.style.left = 0, e.$container.appendChild(t), e.$canvasElement = t, e.$container.style.overflow = "hidden", "absolute" !== e.$container.style.position && (e.$container.style.position = "relative");
+      if (!e._supportOffscreen()) {
+        const t = (() => {
+          const t = e.$canvasElement;
+          let r = null;
+          const n = ["webgl", "experimental-webgl", "moz-webgl", "webkit-3d"];
+          let o = 0;
+          for (; !r && o < n.length;) {
+            const a = n[o];
+            try {
+              let n = {preserveDrawingBuffer: !0};
+              e._opt.contextOptions && (n = Object.assign(n, e._opt.contextOptions)), r = t.getContext(a, n)
+            } catch (e) {
+              r = null
+            }
+            r && "function" == typeof r.getParameter || (r = null), ++o
+          }
+          return r
+        })();
+        e._contextGLRender = a().default(t), e._contextGL = t
+      }
+      e._destroyContextGL = () => {
+        e._contextGL && (e._contextGL = null), e._contextGLRender && (e._contextGLRender = null), e._bitmaprenderer && (e._bitmaprenderer = null)
+      }
+    }, t(i, "default", (function () {
+      return s
+    }))
+  }
+
+  function l() {
+    return u || (u = !0, c()), i
+  }
+
+  var d, f, p, h, m, A, g = !1;
+
+  function v() {
+    return g || (g = !0, f = {
+      videoBuffer: .5,
+      vod: !1,
+      isResize: !0,
+      isFullSize: !1,
+      debug: !1,
+      timeout: 30,
+      supportDblclickFullscreen: !1,
+      showBandwidth: !1,
+      keepScreenOn: !1,
+      isNotMute: !1,
+      hasAudio: !0,
+      operateBtns: {fullscreen: !1, screenshot: !1, play: !1, audio: !1},
+      loadingText: "",
+      background: "",
+      decoder: "index.js",
+      rotate: 0,
+      forceNoOffscreen: !1
+    }, t(d = {}, "DEFAULT_OPTIONS", (function () {
+      return f
+    })), p = {
+      init: "init",
+      initSize: "initSize",
+      render: "render",
+      playAudio: "playAudio",
+      print: "print",
+      printErr: "printErr",
+      initAudioPlanar: "initAudioPlanar",
+      kBps: "kBps"
+    }, t(d, "CMD_TYPE", (function () {
+      return p
+    })), h = {
+      close: "close",
+      play: "play",
+      setVideoBuffer: "setVideoBuffer",
+      init: "init"
+    }, t(d, "POST_MESSAGE", (function () {
+      return h
+    })), m = {
+      fullscreen: "fullscreen",
+      play: "play",
+      pause: "pause",
+      mute: "mute",
+      load: "load",
+      videoInfo: "videoInfo",
+      timeUpdate: "timeUpdate",
+      audioInfo: "audioInfo",
+      log: "log",
+      error: "error",
+      kBps: "kBps",
+      timeout: "timeout",
+      stats: "stats",
+      performance: "performance",
+      record: "record",
+      buffer: "buffer",
+      videoFrame: "videoFrame",
+      start: "start",
+      metadata: "metadata"
+    }, t(d, "EVEMTS", (function () {
+      return m
+    })), A = {empty: "empty", buffering: "buffering", full: "full"}, t(d, "BUFFER_STATUS", (function () {
+      return A
+    }))), d
+  }
+
+  var E, y = !1;
+
+  function w(e) {
+    e.resume();
+    const t = e.createBufferSource();
+    t.buffer = e.createBuffer(1, 1, 22050), t.connect(e.destination), t.noteOn ? t.noteOn(0) : t.start(0)
+  }
+
+  function _(e, t) {
+    e && (e.style.display = t ? "block" : "none")
+  }
+
+  function b(e = "") {
+    const t = e.split(","), r = atob(t[1]), n = t[0].replace("data:", "").replace(";base64", "");
+    let o = r.length, a = new Uint8Array(o);
+    for (; o--;) a[o] = r.charCodeAt(o);
+    return new File([a], "file", {type: n})
+  }
+
+  function k(e, t) {
+    const r = document.createElement("a");
+    r.download = t, r.href = URL.createObjectURL(e), r.click(), URL.revokeObjectURL(e)
+  }
+
+  function T(e) {
+    if (null == e || "" === e) return "0 KB/S";
+    let t = parseFloat(e);
+    return t = t.toFixed(2), t + "KB/S"
+  }
+
+  function D(e) {
+    let t = 0;
+    return e >= 24 ? t = 2 : e >= 15 && (t = 1), t
+  }
+
+  function S(e, t) {
+    Object.keys(t || {}).forEach((function (r) {
+      e.style[r] = t[r]
+    }))
+  }
+
+  function C() {
+    let e = document.fullscreenElement || window.webkitFullscreenElement || document.msFullscreenElement;
+    return void 0 === e && (e = !1), !!e
+  }
+
+  function O() {
+  }
+
+  function P() {
+    return (new Date).getTime()
+  }
+
+  function x(e) {
+    Object.keys(e || {}).forEach((t => {
+      "bgDom" !== t && _(e[t], !1)
+    }))
+  }
+
+  function B(e) {
+    _(e.pauseDom, !0), _(e.screenshotsDom, !0), _(e.fullscreenDom, !0), _(e.quietAudioDom, !0), _(e.textDom, !0), _(e.speedDom, !0), _(e.recordDom, !0), _(e.loadingDom, !1), _(e.playDom, !1), _(e.playBigDom, !1), _(e.bgDom, !1)
+  }
+
+  function M(e, t) {
+    let r = v().BUFFER_STATUS.buffering;
+    return 0 === e ? r = v().BUFFER_STATUS.empty : e >= t && (r = v().BUFFER_STATUS.full), r
+  }
+
+  function R() {
+    return y || (y = !0, E = {}, v(), t(E, "audioContextUnlock", (function () {
+      return w
+    })), t(E, "$domToggle", (function () {
+      return _
+    })), t(E, "dataURLToFile", (function () {
+      return b
+    })), t(E, "downloadImg", (function () {
+      return k
+    })), t(E, "bpsSize", (function () {
+      return T
+    })), t(E, "fpsStatus", (function () {
+      return D
+    })), t(E, "setStyle", (function () {
+      return S
+    })), t(E, "checkFull", (function () {
+      return C
+    })), t(E, "noop", (function () {
+      return O
+    })), t(E, "now", (function () {
+      return P
+    })), t(E, "$hideBtns", (function () {
+      return x
+    })), t(E, "$initBtns", (function () {
+      return B
+    })), t(E, "bufferStatus", (function () {
+      return M
+    }))), E
+  }
+
+  var L, I, F = !1;
+
+  function U() {
+    return F || (F = !0, L = {}, R(), I = e => {
+      e._audioContext = new (window.AudioContext || window.webkitAudioContext), e._gainNode = e._audioContext.createGain(), e._audioEnabled = t => {
+        t ? (R().audioContextUnlock(e._audioContext), e._audioEnabled = t => {
+          t ? e._audioContext.resume() : e._audioContext.suspend()
+        }, e._audioContext.resume()) : e._audioContext.suspend()
+      }, e._audioEnabled(!0), e._mute = () => {
+        e._audioEnabled(!1), e.quieting = !0
+      }, e._cancelMute = () => {
+        e._audioEnabled(!0), e.quieting = !1
+      }, e._audioResume = () => {
+        e._cancelMute()
+      }, e._initAudioPlanar = t => {
+        const r = e._audioContext;
+        if (!r) return !1;
+        let n = [];
+        const o = r.createScriptProcessor(1024, 0, 2);
+        o.onaudioprocess = function (e) {
+          if (n.length) {
+            const r = n.shift();
+            for (let n = 0; n < t.channels; n++) {
+              const t = r[n], o = e.outputBuffer.getChannelData(n);
+              for (let e = 0; e < 1024; e++) o[e] = t[e]
+            }
+          }
+        }, o.connect(e._gainNode), e._closeAudio = () => {
+          o.disconnect(e._gainNode), e._gainNode.disconnect(r.destination), delete e._closeAudio, n = []
+        }, e._gainNode.connect(r.destination), e._playAudio = e => n.push(e)
+      }, e._destroyAudioContext = () => {
+        e._audioContext.close(), e._audioContext = null, e._gainNode = null
+      }
+    }, t(L, "default", (function () {
+      return I
+    }))), L
+  }
+
+  var N, j, G = !1;
+
+  function z() {
+    return G || (G = !0, N = {}, R(), j = e => {
+      e._resize$2 = () => e.resize(), e._handleVisibilityChange$2 = () => e._handleVisibilityChange(), e._onfullscreenchange$2 = () => e._onfullscreenchange(), e._handleWakeLock$2 = () => e._handleWakeLock(), window.addEventListener("resize", e._resize$2), window.addEventListener("fullscreenchange", e._onfullscreenchange$2), document.addEventListener("visibilitychange", e._handleVisibilityChange$2), document.addEventListener("visibilitychange", e._handleWakeLock$2), window.addEventListener("fullscreenchange", e._handleWakeLock$2), e._opt.supportDblclickFullscreen && e.$canvasElement.addEventListener("dblclick", (() => {
+        e.fullscreen = !e.fullscreen
+      }), !1), e._removeEventListener = () => {
+        window.removeEventListener("resize", e._resize$2), window.removeEventListener("fullscreenchange", e._onfullscreenchange$2), document.removeEventListener("visibilitychange", e._handleWakeLock$2), document.removeEventListener("visibilitychange", e._handleVisibilityChange$2), window.removeEventListener("fullscreenchange", e._handleWakeLock$2)
+      }, e.$doms.playDom && e.$doms.playDom.addEventListener("click", (t => {
+        t.stopPropagation(), e._play()
+      }), !1), e.$doms.playBigDom && e.$doms.playBigDom.addEventListener("click", (t => {
+        t.stopPropagation(), e._play()
+      }), !1), e.$doms.pauseDom && e.$doms.pauseDom.addEventListener("click", (t => {
+        t.stopPropagation(), e._pause()
+      }), !1), e.$doms.screenshotsDom && e.$doms.screenshotsDom.addEventListener("click", (t => {
+        t.stopPropagation();
+        const r = e._opt.text + "" + R().now();
+        e._screenshot(r)
+      }), !1), e.$doms.fullscreenDom && e.$doms.fullscreenDom.addEventListener("click", (t => {
+        t.stopPropagation(), e.fullscreen = !0
+      }), !1), e.$doms.minScreenDom && e.$doms.minScreenDom.addEventListener("click", (t => {
+        t.stopPropagation(), e.fullscreen = !1
+      }), !1), e.$doms.recordDom && e.$doms.recordDom.addEventListener("click", (t => {
+        t.stopPropagation(), e.recording = !0
+      }), !1), e.$doms.recordingDom && e.$doms.recordingDom.addEventListener("click", (t => {
+        t.stopPropagation(), e.recording = !1
+      }), !1), e.$doms.quietAudioDom && e.$doms.quietAudioDom.addEventListener("click", (t => {
+        t.stopPropagation(), e._cancelMute()
+      }), !1), e.$doms.playAudioDom && e.$doms.playAudioDom.addEventListener("click", (t => {
+        t.stopPropagation(), e._mute()
+      }), !1), e._enableWakeLock()
+    }, t(N, "default", (function () {
+      return j
+    }))), N
+  }
+
+  var W, Y, H = !1;
+
+  function $() {
+    return H || (H = !0, W = {}, R(), z(), Y = e => {
+      e._showControl = () => {
+        let t = !1, r = !1;
+        return Object.keys(e._opt.operateBtns).forEach((t => {
+          e._opt.operateBtns[t] && (r = !0)
+        })), (e._opt.showBandwidth || e._opt.text || r) && (t = !0), t
+      };
+      const t = {}, r = document.createDocumentFragment(), n = document.createElement("div"),
+        o = document.createElement("div"), a = document.createElement("div"), i = document.createElement("div"),
+        s = document.createElement("div"), u = document.createElement("div"), c = document.createElement("div"),
+        l = document.createElement("div"), d = document.createElement("div"), f = document.createElement("div"),
+        p = document.createElement("div"), h = document.createElement("div"), m = document.createElement("div"),
+        A = document.createElement("div"), g = document.createElement("div"), v = document.createElement("div"),
+        E = document.createElement("div"), y = document.createElement("div");
+      m.innerText = e._opt.loadingText || "", i.innerText = e._opt.text || "", s.innerText = "", u.title = "鎾斁", l.title = "鏆傚仠", d.title = "鎴睆", f.title = "鍏ㄥ睆", p.title = "閫�鍑哄叏灞�", A.title = "闈欓煶", g.title = "鍙栨秷闈欓煶", v.title = "褰曞埗", E.title = "鍙栨秷褰曞埗";
+      let w = {position: "absolute", width: "100%", height: "100%"};
+      e._opt.background && (w = Object.assign({}, w, {
+        backgroundRepeat: "no-repeat",
+        backgroundPosition: "center",
+        backgroundSize: "100%",
+        backgroundImage: "url('" + e._opt.background + "')"
+      }));
+      const _ = {
+        position: "absolute",
+        width: "100%",
+        height: "100%",
+        textAlign: "center",
+        color: "#fff",
+        display: "none",
+        backgroundImage: "url('data:image/gif;base64,R0lGODlhgACAAKIAAP///93d3bu7u5mZmQAA/wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFBQAEACwCAAIAfAB8AAAD/0i63P4wygYqmDjrzbtflvWNZGliYXiubKuloivPLlzReD7al+7/Eh5wSFQIi8hHYBkwHUmD6CD5YTJLz49USuVYraRsZ7vtar7XnQ1Kjpoz6LRHvGlz35O4nEPP2O94EnpNc2sef1OBGIOFMId/inB6jSmPdpGScR19EoiYmZobnBCIiZ95k6KGGp6ni4wvqxilrqBfqo6skLW2YBmjDa28r6Eosp27w8Rov8ekycqoqUHODrTRvXsQwArC2NLF29UM19/LtxO5yJd4Au4CK7DUNxPebG4e7+8n8iv2WmQ66BtoYpo/dvfacBjIkITBE9DGlMvAsOIIZjIUAixliv9ixYZVtLUos5GjwI8gzc3iCGghypQqrbFsme8lwZgLZtIcYfNmTJ34WPTUZw5oRxdD9w0z6iOpO15MgTh1BTTJUKos39jE+o/KS64IFVmsFfYT0aU7capdy7at27dw48qdS7eu3bt480I02vUbX2F/JxYNDImw4GiGE/P9qbhxVpWOI/eFKtlNZbWXuzlmG1mv58+gQ4seTbq06dOoU6vGQZJy0FNlMcV+czhQ7SQmYd8eMhPs5BxVdfcGEtV3buDBXQ+fURxx8oM6MT9P+Fh6dOrH2zavc13u9JXVJb520Vp8dvC76wXMuN5Sepm/1WtkEZHDefnzR9Qvsd9+/wi8+en3X0ntYVcSdAE+UN4zs7ln24CaLagghIxBaGF8kFGoIYV+Ybghh841GIyI5ICIFoklJsigihmimJOLEbLYIYwxSgigiZ+8l2KB+Ml4oo/w8dijjcrouCORKwIpnJIjMnkkksalNeR4fuBIm5UEYImhIlsGCeWNNJphpJdSTlkml1jWeOY6TnaRpppUctcmFW9mGSaZceYopH9zkjnjUe59iR5pdapWaGqHopboaYua1qije67GJ6CuJAAAIfkEBQUABAAsCgACAFcAMAAAA/9Iutz+ML5Ag7w46z0r5WAoSp43nihXVmnrdusrv+s332dt4Tyo9yOBUJD6oQBIQGs4RBlHySSKyczVTtHoidocPUNZaZAr9F5FYbGI3PWdQWn1mi36buLKFJvojsHjLnshdhl4L4IqbxqGh4gahBJ4eY1kiX6LgDN7fBmQEJI4jhieD4yhdJ2KkZk8oiSqEaatqBekDLKztBG2CqBACq4wJRi4PZu1sA2+v8C6EJexrBAD1AOBzsLE0g/V1UvYR9sN3eR6lTLi4+TlY1wz6Qzr8u1t6FkY8vNzZTxaGfn6mAkEGFDgL4LrDDJDyE4hEIbdHB6ESE1iD4oVLfLAqPETIsOODwmCDJlv5MSGJklaS6khAQAh+QQFBQAEACwfAAIAVwAwAAAD/0i63P5LSAGrvTjrNuf+YKh1nWieIumhbFupkivPBEzR+GnnfLj3ooFwwPqdAshAazhEGUXJJIrJ1MGOUamJ2jQ9QVltkCv0XqFh5IncBX01afGYnDqD40u2z76JK/N0bnxweC5sRB9vF34zh4gjg4uMjXobihWTlJUZlw9+fzSHlpGYhTminKSepqebF50NmTyor6qxrLO0L7YLn0ALuhCwCrJAjrUqkrjGrsIkGMW/BMEPJcphLgDaABjUKNEh29vdgTLLIOLpF80s5xrp8ORVONgi8PcZ8zlRJvf40tL8/QPYQ+BAgjgMxkPIQ6E6hgkdjoNIQ+JEijMsasNY0RQix4gKP+YIKXKkwJIFF6JMudFEAgAh+QQFBQAEACw8AAIAQgBCAAAD/kg0PPowykmrna3dzXvNmSeOFqiRaGoyaTuujitv8Gx/661HtSv8gt2jlwIChYtc0XjcEUnMpu4pikpv1I71astytkGh9wJGJk3QrXlcKa+VWjeSPZHP4Rtw+I2OW81DeBZ2fCB+UYCBfWRqiQp0CnqOj4J1jZOQkpOUIYx/m4oxg5cuAaYBO4Qop6c6pKusrDevIrG2rkwptrupXB67vKAbwMHCFcTFxhLIt8oUzLHOE9Cy0hHUrdbX2KjaENzey9Dh08jkz8Tnx83q66bt8PHy8/T19vf4+fr6AP3+/wADAjQmsKDBf6AOKjS4aaHDgZMeSgTQcKLDhBYPEswoA1BBAgAh+QQFBQAEACxOAAoAMABXAAAD7Ei6vPOjyUkrhdDqfXHm4OZ9YSmNpKmiqVqykbuysgvX5o2HcLxzup8oKLQQix0UcqhcVo5ORi+aHFEn02sDeuWqBGCBkbYLh5/NmnldxajX7LbPBK+PH7K6narfO/t+SIBwfINmUYaHf4lghYyOhlqJWgqDlAuAlwyBmpVnnaChoqOkpaanqKmqKgGtrq+wsbA1srW2ry63urasu764Jr/CAb3Du7nGt7TJsqvOz9DR0tPU1TIA2ACl2dyi3N/aneDf4uPklObj6OngWuzt7u/d8fLY9PXr9eFX+vv8+PnYlUsXiqC3c6PmUUgAACH5BAUFAAQALE4AHwAwAFcAAAPpSLrc/m7IAau9bU7MO9GgJ0ZgOI5leoqpumKt+1axPJO1dtO5vuM9yi8TlAyBvSMxqES2mo8cFFKb8kzWqzDL7Xq/4LB4TC6bz1yBes1uu9uzt3zOXtHv8xN+Dx/x/wJ6gHt2g3Rxhm9oi4yNjo+QkZKTCgGWAWaXmmOanZhgnp2goaJdpKGmp55cqqusrZuvsJays6mzn1m4uRAAvgAvuBW/v8GwvcTFxqfIycA3zA/OytCl0tPPO7HD2GLYvt7dYd/ZX99j5+Pi6tPh6+bvXuTuzujxXens9fr7YPn+7egRI9PPHrgpCQAAIfkEBQUABAAsPAA8AEIAQgAAA/lIutz+UI1Jq7026h2x/xUncmD5jehjrlnqSmz8vrE8u7V5z/m5/8CgcEgsGo/IpHLJbDqf0Kh0ShBYBdTXdZsdbb/Yrgb8FUfIYLMDTVYz2G13FV6Wz+lX+x0fdvPzdn9WeoJGAYcBN39EiIiKeEONjTt0kZKHQGyWl4mZdREAoQAcnJhBXBqioqSlT6qqG6WmTK+rsa1NtaGsuEu6o7yXubojsrTEIsa+yMm9SL8osp3PzM2cStDRykfZ2tfUtS/bRd3ewtzV5pLo4eLjQuUp70Hx8t9E9eqO5Oku5/ztdkxi90qPg3x2EMpR6IahGocPCxp8AGtigwQAIfkEBQUABAAsHwBOAFcAMAAAA/9Iutz+MMo36pg4682J/V0ojs1nXmSqSqe5vrDXunEdzq2ta3i+/5DeCUh0CGnF5BGULC4tTeUTFQVONYAs4CfoCkZPjFar83rBx8l4XDObSUL1Ott2d1U4yZwcs5/xSBB7dBMBhgEYfncrTBGDW4WHhomKUY+QEZKSE4qLRY8YmoeUfkmXoaKInJ2fgxmpqqulQKCvqRqsP7WooriVO7u8mhu5NacasMTFMMHCm8qzzM2RvdDRK9PUwxzLKdnaz9y/Kt8SyR3dIuXmtyHpHMcd5+jvWK4i8/TXHff47SLjQvQLkU+fG29rUhQ06IkEG4X/Rryp4mwUxSgLL/7IqFETB8eONT6ChCFy5ItqJomES6kgAQAh+QQFBQAEACwKAE4AVwAwAAAD/0i63A4QuEmrvTi3yLX/4MeNUmieITmibEuppCu3sDrfYG3jPKbHveDktxIaF8TOcZmMLI9NyBPanFKJp4A2IBx4B5lkdqvtfb8+HYpMxp3Pl1qLvXW/vWkli16/3dFxTi58ZRcChwIYf3hWBIRchoiHiotWj5AVkpIXi4xLjxiaiJR/T5ehoomcnZ+EGamqq6VGoK+pGqxCtaiiuJVBu7yaHrk4pxqwxMUzwcKbyrPMzZG90NGDrh/JH8t72dq3IN1jfCHb3L/e5ebh4ukmxyDn6O8g08jt7tf26ybz+m/W9GNXzUQ9fm1Q/APoSWAhhfkMAmpEbRhFKwsvCsmosRIHx444PoKcIXKkjIImjTzjkQAAIfkEBQUABAAsAgA8AEIAQgAAA/VIBNz+8KlJq72Yxs1d/uDVjVxogmQqnaylvkArT7A63/V47/m2/8CgcEgsGo/IpHLJbDqf0Kh0Sj0FroGqDMvVmrjgrDcTBo8v5fCZki6vCW33Oq4+0832O/at3+f7fICBdzsChgJGeoWHhkV0P4yMRG1BkYeOeECWl5hXQ5uNIAOjA1KgiKKko1CnqBmqqk+nIbCkTq20taVNs7m1vKAnurtLvb6wTMbHsUq4wrrFwSzDzcrLtknW16tI2tvERt6pv0fi48jh5h/U6Zs77EXSN/BE8jP09ZFA+PmhP/xvJgAMSGBgQINvEK5ReIZhQ3QEMTBLAAAh+QQFBQAEACwCAB8AMABXAAAD50i6DA4syklre87qTbHn4OaNYSmNqKmiqVqyrcvBsazRpH3jmC7yD98OCBF2iEXjBKmsAJsWHDQKmw571l8my+16v+CweEwum8+hgHrNbrvbtrd8znbR73MVfg838f8BeoB7doN0cYZvaIuMjY6PkJGSk2gClgJml5pjmp2YYJ6dX6GeXaShWaeoVqqlU62ir7CXqbOWrLafsrNctjIDwAMWvC7BwRWtNsbGFKc+y8fNsTrQ0dK3QtXAYtrCYd3eYN3c49/a5NVj5eLn5u3s6e7x8NDo9fbL+Mzy9/T5+tvUzdN3Zp+GBAAh+QQJBQAEACwCAAIAfAB8AAAD/0i63P4wykmrvTjrzbv/YCiOZGmeaKqubOu+cCzPdArcQK2TOL7/nl4PSMwIfcUk5YhUOh3M5nNKiOaoWCuWqt1Ou16l9RpOgsvEMdocXbOZ7nQ7DjzTaeq7zq6P5fszfIASAYUBIYKDDoaGIImKC4ySH3OQEJKYHZWWi5iZG0ecEZ6eHEOio6SfqCaqpaytrpOwJLKztCO2jLi1uoW8Ir6/wCHCxMG2x7muysukzb230M6H09bX2Nna29zd3t/g4cAC5OXm5+jn3Ons7eba7vHt2fL16tj2+QL0+vXw/e7WAUwnrqDBgwgTKlzIsKHDh2gGSBwAccHEixAvaqTYcFCjRoYeNyoM6REhyZIHT4o0qPIjy5YTTcKUmHImx5cwE85cmJPnSYckK66sSAAj0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gwxZJAAA7')",
+        backgroundRepeat: "no-repeat",
+        backgroundPosition: "center",
+        backgroundSize: "40px 40px"
+      }, b = {
+        position: "absolute",
+        width: "100%",
+        height: "100%",
+        display: "none",
+        background: "rgba(0,0,0,0.4)",
+        backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwEAYAAAAHkiXEAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAByBJREFUeNrlXFlIVV0U3vsaaINmZoX0YAR6y8oGMkKLoMESSjBoUJEoIogoIggigoryIQoKGqi3Roh6TKGBIkNEe6hMgzTNKLPSUlMrNdvrf/juurlP5zpc7znb+r+X755pn7W+Pe+9zpVimIEUKVKJiUIKKWRqKs5OmwZOTBQkSFBUFK5HR+tPt7WBOzpwX3U1jquqwGVleK6iQkoppSQy7a8xEBERLVwIPnsWXF9PrqCxEXzxInjpUrDH47YO0h2hw8JwtG4deN8+8OzZA0vl7Vt/iZZCCtnUhPPt7fp9o0fjvpgYHHu9uD8+Hsdsh52hggTV1uLg2DHwpUvSIz3S093ttE4hB5qSxYuRAc+f910im5vBFy6As7LALORQ7RgzBullZIBPngQ3NPRt1+vXeH7NGtN69u8oERFFRIDPnQMrZe8YZ0huLhwMDzdjb1gYC4zj4uKAeaFIkbpxAwfWvse48FOngp89s7eeS1p2Nlg63vQF7Y8iRWrlSthZXR2wZhAR0dy55gwlIqI5c8AfPtgbeuUKHIqKMi3soP3z1UzwiRP2NbqtDbxsmXuGacK3tOgG/fwJ3rbNtIDO+J2ZiQzp6ND97uzE+RUrHDaAmxprif/+HQasXm1aKKcBPxcsADc1/VEjFClS8+eH7oXcuSpSpJ480V/Y0wPOyjItjNtgofWmiPHuHa7Hxg79RUT0e1Rjxb/X1ASnDw9vf/3S9bl1K/iEFSlSixbZdz7Xr5t2fLgBuuTn2xfUjRsHmVBYGNg6gWpo+FtHNU4DuowYAZ3Ky+11GzOm/4SIiGjDBvuczM52zAHua4iI6OpVcGEheO1a8PCdP/j9CNRyKFKk9u4doBDWCRXXBOcE0GekgVBUhPuSk00LPTAdCwp0+3n0GBER4AFenbQiJ8cdg7dvpwGB5xunT4PHjTMtuL0/qan29q9fH+AB62jnyxe31moGlwFWNDbCzq1bcez+snLffr14odtrMzrCBet6/Pnz7hoabAZY8fgxT5iGRwbs36/b19kJHjnS49+BEkIIMXmy/vjt26YdCA4pKdgHKC2Fo5cvh2xiFBTu3NGPw8Ox/5CW5tG3/hi8VffokRmDQwUeNOTlwc/KSmRIbq67djx9Cm5p+W2akEKmpfnaSt5zZdTXY8+0udmQcg5h0iQwD3MfPgRPn+7UG6GjUjiqrNSver0eVIWEBP85EiSIN7H/dSxZAuY1roMHHRt02OqamOhrgnoN46SQQn76ZFoad8Hj8kOH4D/PZJOSQvYKW11jYnxNkHWK3NFhWhKz8HrB9+7xaCU06fYKIiBBgiIjfRlgHTf/j+NlNMTFgceOHXJSJEgQ9wXCVyOk9AlvLfEDWDT6X+DAAXSiHz8OOSkppJCRkfrJ9vYR+NHaql8wNV42jVevUFJ37kQ8kHX8PlRMmOD/SYIEtbZ69IAkvsATs38dP36ADx8GJyc7IzyD+xbhqxE1Nb4a8PKlfiE+HsOxyEgYZI1A+9tRUADetQtNTF2dU29CJ84Twhkz9KtVVb4+oKxMvxAWxjM101KFBvX1qNmbNkHwNWucFl4HT/QmTvSfIkGCSks9HC2MsxxzyTekp5uWLjh0dYHz88FeL2ry5ctm7LHq2NMD7rXUg6rC0cKM9+/BfQS1hghDXg1VpEjdvasvLpqHf3VWs/P+/QA3Lltm75jz8T7BZQAvn9tscJgWXpEiNWuWvd2bNwcQwONbnq6p0R8oLnYnA7Zs6Vvw7m7Yd/z4gDe5DQH2Xrum29/SwoObfh7cts1egFWrnDU4Lg785g2Ytx4LC2H4zJmmhe3XD5+dsJsD1xhHjgwwgfBwPFBXpydQXe3uFqXzfU9o7ZUSXFRkX/IHMcENGKXgixY27fBwA8TZudO+5dixY4gJ37xpyQVfvEtmpmnHTQMFMiUFevBeL6OkZMg1GQlER4P5wwTGt29g65bmvw/4HShanD+5mjIlxC+cNw/cKxqYw7RDHZY9TOEXXpEiVVurC8+jtJUrnTNAkSK1fDle2NWlG9DeDs7IMC2UM35zU2Mt8Urhel6eywalp+vCMzhM++hRDlo1LeCg/dNGNdy5Wtt4LvEuCv+HodqHCu/e2Y8Cyss5aNW0sAPzh8fx1uEkgyMGHWxqgjM8NhYGWoNSraMnvm6+89aXDHjmap1AMUpKcD9/+D2MAYNzcsD9fRDNsZMcwsedfehiPJFeUhJ4925wWVnfdvFHiDt2gEM/MXT+rwp47UMKKeT27Ti7Zw+YA6UCgbdKKyr8cTVSSCEbG3Ge/5yDwWtD48fjfv6rAl7C6LUeb4uvX8FnzuD5U6ewjP35s9M6uQaUJP4Qgz8E4SbJ2sk5BV5jevAAvHmzqS9/hs0XJxBi1CgOWtVjVnlHKSEB16Oj/wgoE0L8LsFcM169AldV8Q4UjouKULKtNch9/AdsEf6XQYgIsAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wMS0xMlQxMTo1NjowNSswODowMGcMj/QAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDEtMTJUMTE6NTY6MDUrMDg6MDAWUTdIAAAASXRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl9wZHMzeWYxNGczYi9ib2Zhbmcuc3Zn11us5wAAAABJRU5ErkJggg==')",
+        backgroundRepeat: "no-repeat",
+        backgroundPosition: "center",
+        backgroundSize: "48px 48px",
+        cursor: "pointer"
+      }, k = {position: "absolute", top: 0, height: "100%", display: "flex", alignItems: "center"}, T = {
+        display: "none",
+        position: "relative",
+        fontSize: "13px",
+        color: "#fff",
+        lineHeight: "20px",
+        marginLeft: "5px",
+        marginRight: "5px",
+        userSelect: "none"
+      }, D = {
+        display: "none",
+        position: "relative",
+        width: "16px",
+        height: "16px",
+        marginLeft: "8px",
+        marginRight: "8px",
+        backgroundRepeat: "no-repeat",
+        backgroundPosition: "center",
+        backgroundSize: "100%",
+        cursor: "pointer"
+      };
+      R().setStyle(y, w), R().setStyle(n, {
+        height: "38px",
+        zIndex: 11,
+        position: "absolute",
+        left: 0,
+        bottom: 0,
+        width: "100%",
+        background: "rgba(0,0,0)"
+      }), R().setStyle(h, _), R().setStyle(c, b), R().setStyle(m, {
+        position: "absolute",
+        width: "100%",
+        top: "60%",
+        textAlign: "center"
+      }), R().setStyle(o, Object.assign({}, k, {left: 0})), R().setStyle(a, Object.assign({}, k, {right: 0})), R().setStyle(i, T), R().setStyle(s, T), R().setStyle(u, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAARVJREFUSMe9laEOglAUhs+5k9lJFpsJ5QWMJoNGbEY0mEy+gr6GNo0a3SiQCegMRILzGdw4hl+Cd27KxPuXb2zA/91z2YXoGRERkX4fvN3A2QxUiv4dFM3n8jZRBLbbVfd+ubJuF4xjiCyXkksueb1uSKCIZYGLBTEx8ekEoV7PkICeVgs8HiGyXoO2bUigCDM4HoPnM7bI8wwJ6Gk0sEXbLSay30Oo2TQkoGcwgFCSQMhxDAvoETEscDiQkJC4LjMz8+XyZ4HrFYWjEQqHQ1asWGWZfmdFAsVINxuw00HhbvfpydpvxWkKTqdYaRCUfUPJCdzv4Gr1uqfli0tOIAzByUT/iCrL6+84y3Bw+D6ui5Ou+jwA8FnIO++FACgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAEl0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvYm9mYW5nLnN2Z8fICi0AAAAASUVORK5CYII=')"})), R().setStyle(l, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAHVJREFUSMftkCESwCAMBEOnCtdXVMKHeC7oInkEeQJXkRoEZWraipxZc8lsQqQZBACAlIS1oqGhhTCdu3oyxyyMcdRf79c5J7SWDBky+z4173rbJvR+VF/e/qwKqIAKqMBDgZyFzAQCoZTpxq7HLDyOrw/9b07l3z4dDnI2IAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMIo/vCcAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDD7YgSbAAAASnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl9nZjcwMHM3YjNmdy96YW50aW5nLnN2ZxqNZJkAAAAASUVORK5CYII=')"})), R().setStyle(d, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAaxJREFUSMfNlLFOAkEQhmevAZMjR6OGRBJKsFBzdkYNpYSaWkopIOFRCBWh1ieA+ALGRgutjK0HzV2H5SX7W/zsmY3cnTEhcZovOzcz9+/s7Ir8d4OGht7fBwAgjvEri2OTl1ffSf0xAMBxRIkS1e3Se3+vcszEMe/6OqmT/aN2m1wsNu/o5YVsNHI7BgA4PCRfXzfXCwKy1RLbcXZG9nrkzc12jvT8nPU/PtatOThgAx8fuS4WyZ0de2e+T87n5OcnuVqRsxl5cpImQDnKUc7DA1fVqpimZCu+vCSjiNH9PlmpJNTQ0INBErfeafZRAakC6FWKfH9nwU7H/l6rGdqCOx3y7c3U+aOARsMMp+1vNskwTLjulB23XJL1epqA9OshIiKeJxAIoug7UyA4OuLi6Ynr52deu+NjOy4MSc9Ln8rMDpTLybBpaOjdXbJUIqdTm8a/t2fn/RSQewR24HicTLmGhnbdzcPquvYtGY3+PIR24UKBUXd35v6Sk4lN47+9NXm/FBAEedfGTjw9JYdDm76fm6+hoS8ujGAxT6L9Im7bTKeurvIEb92+AES1b6x283XSAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABJdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L2NhbWVyYS5zdmeyubWEAAAAAElFTkSuQmCC')"})), R().setStyle(f, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAALZJREFUSMftVbsORUAQVSj8DomChvh3lU5CoSVCQq2RObeYu8XG3deVoHCak81kds7Oaz3vxRcAAMwztOg6vX9d6/3XFQQC+b7iAoFhYE7Tvx9EIFAcy/ftO3MQGAQkCfM4MmeZWyajiLnvmYuCeduMAuSzvRBVYNluFHCssSgFp7Sq9ALKkjnPf9ubRtkDL27HNT3QtsY9cAjsNAVheHIKBOwD2wpxFHDbJpwmaHH2L1iWx+2BDy8RbXXtqbRBAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABTdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L3F1YW5waW5nenVpZGFodWEuc3ZnTBoI7AAAAABJRU5ErkJggg==')"})), R().setStyle(p, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAYJJREFUSMfdVbGKwkAQnQn+geAfWBixUTsVgp3YGKxSWflVNmIjARULwc5KO40ipNHWRgs/wGLniucKa+Jd5ODuuGle5u3szGRmd5bor4iIiMhuB3Sc+HXXBdp2/Lpta7v4dccRJUrUdhtNQIkSVa3C8HwG1uumg34f2OnEB+h0tF1Sv5b+YIsttpZLEhKSdhvscPi8IXFF74GJiYnHY7Cex8zMvFgkbInjmJnv98kqoO30vmhLtaRMB60WtEbDNDudgMUiKiQSzfjOMzFxoQAyCPSfw7/nQZ/PUYnpNGV6OR6BmYzJbzYIoBQCzGaRBDQvJCTdLnTLolg5HN5t6f8V1h/oUT4PrVKJWBotmEzQw+vV3J9Ow851P2/BaoX9Yfh0BrJZYKlk8uUyHOpDeLuBHwzMBJtN2PV6IPUhXK9Nf5cLMAxfluanrmGkRBggtRo03wfq66P/6CsJAnOg+f6rgfZI4BGYiYlHIx048eR6krcnq34kkj1GuVz8+jceo9+SD5A8yGh8CTq7AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABNdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L3p1aXhpYW9odWEuc3ZnoCFr0AAAAABJRU5ErkJggg==')"})), R().setStyle(A, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAR9JREFUSMfVlD0LglAYhe9VkwgNihpsjbYQf4JTS7+iuaGxpcGfJjS0NFRLk2NDi6MogafhJGRIX9yEzvJwrx/nvPd9VYh/F3LkyBuN2g3J1QoAgCQhPe/Hxq5Lo+0WlfJ9dYYAgGaTDAIyy/BUnwcwWJlhcLnZkN2ugIBAuy2kkEL2ep8F73S4kjfFcfn6cMj9KLodrWVBiXyf75tMyOOR+4MBOZ8XLXzorboA5UpnM/J0Ivd7+vX7xX2asqGpVKtFXi5sqWmypXefrfIWAACmU/JwKCoun8hu9zA0uk6u13wgirg+n7+bAcsibbt6SB3n9TQXPxwAwHJJpum7M6BcDDQa0SgMaw9QPkJNIxcLMo4ZcDz+eYDqQFLWbqxKV57EtW1WtMbmAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABKdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L2ppbmd5aW4uc3ZnIlMYaQAAAABJRU5ErkJggg==')"})), R().setStyle(g, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAU5JREFUSMftkzGKwlAURf9PULBQwULSCKK1bZAgNuoaFFyAC3AdZg0uQCwshWzAShEEO7Gy0soUCu9Occ3An5nMGCfdzGsO7+Xy3/03iVL/lbAAACiVIBCI77O37Vi9QCDZbEqLm03ycEBUAoHk818v7nYpul5Jz4tf8HBKYa1mcjwmbzd8rG8NFIsU7ffk8UjmcjE3XK+RtB4G2PT75GbDeblMttumfjSKMRCGLxsQCKTReE9KIJDJxDw/SmKxiOZWWh+ntrSlre2WXRAorbTSrZapip7X66kbMKtQUFBQCENznsmQ93vqBhh5r8fO85jAcsnIrcce1yV3uxgD8zl5uZgU+dGBVlrp6GbTKRPwffaDAek45Gz2/M0AAJ0OeTol+w0rFYrOZ3K1MhNJEjEAwHF4cBA8Z8B1zcXV6msv+JMR2yaHQ1LrXx/8Z+sNRxsWcwZeb6UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAEt0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvc2hlbmd5aW4uc3ZnFog1MQAAAABJRU5ErkJggg==')"})), R().setStyle(v, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAPRJREFUSMflVDEOwjAQO0e8gr2sZYVunREbD6ISfAgmkBjpC/hBEQ+AtTWD6QAI0gBlqRfLp+TiXC5n1nXgMUCS5HBoNBqj6IOMMFwuEpsNAABl6d3HihWrOJaBsuRPkGW+c929HAxuYefb6L+R0ZgkMrJYiItCnCT1sl5Y1jwXj0bNniJNJWqujfX7LyrwJh8AYDxWgulU0dPp20IFlxoODm61kpE4VnS9/puBXyPYgH7LbKY3PhwUnUw+NdC4CdW9+71UgyZspwIBB9No3O0klktxUahyx+Pz+lYG0Xzu84lXRqTqwRQAGAzns8R223gUdxZXGcAK5Hp0ClIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAE50RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvbHV6aGlzaGlwaW4uc3Zn5Zd7GQAAAABJRU5ErkJggg==')"})), R().setStyle(E, Object.assign({}, D, {backgroundImage: "url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAahJREFUSMdjYBjpgBFd4NZK+f+soQYG//T+yzFuUFUl2cApjEWM/758UZvysPDn3127GBkZGBgY/v4l6ICb9xTWsRbp6/9f9W8N44Jz5xgCGI4wfGFiIttrR/5n/3/U3KyR8rj8t0RdHS5lcAv+//yXzzhZTY1ii2FAmsGZocna+maD3GnWY62tNzbJBbDOffLkxie5eJYwa2uYMhaigzb2/zyGguPH/y9mTGKYYGlJUIMiYxDjHCen/4oMDAxznJzg4k8Z/jP+l5LCCAFCQP30Y5dfXVZWDI7/zzIs8PNjNGJ4/7/r+XNKA4rkoNZ4/lj0V9TmzUxJv0J+F+jrM3YyvPq/acsWujmA2oBkB9y4LifLxhoa+teAzYFtwtWr/8sZxBj9fHxo7oCbprJ72MqOHWNgZGBkYFy1isGGoZahTFSU0hAgOhcQnfph4P7/df9T9u1jPMn4nyHmxIn/bAzLGe7GxTHsZyj+f+zpUwYGBmmG6bQsiMr+L/v/rqlJY9Njm9889fW4lGEUxXCHwAomUgH3vxBG8c+f1WWf9P98sns3oaJ4FAAAbtWqHTT84QYAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6MzU6MjMrMDg6MDBLHbvEAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjM1OjIzKzA4OjAwOkADeAAAAE50RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fcTM1YTFhNHBtY2MvbHV6aGlzaGlwaW4uc3Zn6xlv1QAAAABJRU5ErkJggg==')"})), h.appendChild(m), e._opt.text && (o.appendChild(i), t.textDom = i), e._opt.showBandwidth && (o.appendChild(s), t.speedDom = s), e._opt.operateBtns.record && (a.appendChild(E), a.appendChild(v), t.recordingDom = E, t.recordDom = v), e._opt.operateBtns.screenshot && (a.appendChild(d), t.screenshotsDom = d), e._opt.operateBtns.play && (a.appendChild(u), a.appendChild(l), t.playDom = u, t.pauseDom = l), e._opt.operateBtns.audio && (a.appendChild(g), a.appendChild(A), t.playAudioDom = g, t.quietAudioDom = A), e._opt.operateBtns.fullscreen && (a.appendChild(f), a.appendChild(p), t.fullscreenDom = f, t.minScreenDom = p), n.appendChild(o), n.appendChild(a), r.appendChild(y), t.bgDom = y, r.appendChild(h), t.loadingDom = h, e._showControl() && r.appendChild(n), e._opt.operateBtns.play && (r.appendChild(c), t.playBigDom = c), e.$container.appendChild(r), e.$doms = t, e._removeContainerChild = () => {
+        for (; e.$container.firstChild;) e.$container.removeChild(e.$container.firstChild)
+      }, z().default(e), R().$hideBtns(e.$doms), e._opt.isNotMute || e._mute()
+    }, t(W, "default", (function () {
+      return Y
+    }))), W
+  }
+
+  var V, Q, X = !1;
+
+  function q() {
+    return X || (X = !0, V = {}, v(), R(), Q = e => {
+      const t = new Worker(e._opt.decoder);
+      t.onmessage = r => {
+        const n = r.data;
+        switch (n.cmd) {
+          case v().CMD_TYPE.init:
+            e.setBufferTime(e._opt.videoBuffer), t.postMessage({
+              cmd: v().POST_MESSAGE.init,
+              opt: JSON.stringify(e._opt),
+              sampleRate: e._audioContext.sampleRate
+            }), e._hasLoaded || (e._hasLoaded = !0, e.onLoad(), e._trigger(v().EVEMTS.load));
+            break;
+          case v().CMD_TYPE.initSize:
+            e.$canvasElement.width = n.w, e.$canvasElement.height = n.h, e.onInitSize(), e._resize(), e._trigger(v().EVEMTS.videoInfo, {
+              w: n.w,
+              h: n.h
+            }), e._trigger(v().EVEMTS.start), e._supportOffscreen() && (e._bitmaprenderer = e.$canvasElement.getContext("bitmaprenderer"));
+            break;
+          case v().CMD_TYPE.render:
+            e.loading && (e.loading = !1, e.playing = !0, e._clearCheckLoading()), e.playing && (e._supportOffscreen() ? e._bitmaprenderer.transferFromImageBitmap(n.buffer) : e._contextGLRender(e.$canvasElement.width, e.$canvasElement.height, n.output[0], n.output[1], n.output[2])), e._trigger(v().EVEMTS.timeUpdate, n.ts), e.onTimeUpdate(n.ts), e._updateStats({
+              buf: n.delay,
+              ts: n.ts
+            }), e._checkHeart();
+            break;
+          case v().CMD_TYPE.playAudio:
+            e.playing && !e.quieting && e._playAudio(n.buffer);
+            break;
+          case v().CMD_TYPE.print:
+            e.onLog(n.text), e._trigger(v().EVEMTS.log, n.text);
+            break;
+          case v().CMD_TYPE.printErr:
+            e.onLog(n.text), e._trigger(v().EVEMTS.log, n.text), e.onError(n.text), e._trigger(v().EVEMTS.error, n.text);
+            break;
+          case v().CMD_TYPE.initAudioPlanar:
+            e._initAudioPlanar(n), e._trigger(v().EVEMTS.audioInfo, {
+              numOfChannels: n.channels,
+              sampleRate: n.samplerate
+            });
+            break;
+          case v().CMD_TYPE.kBps:
+            e.playing && (e.$doms.speedDom && (e.$doms.speedDom.innerText = R().bpsSize(n.kBps)), e._trigger(v().EVEMTS.kBps, n.kBps));
+          default:
+            e[n.cmd] && e[n.cmd](n)
+        }
+      }, e._decoderWorker = t
+    }, t(V, "default", (function () {
+      return Q
+    }))), V
+  }
+
+  var Z, K, J = !1;
+
+  function ee() {
+    return J || (J = !0, Z = {}, R(), v(), K = e => {
+      e._loading = !0, e._recording = !1, e._playing = !1, e._audioPlaying = !1, e._quieting = !1, e._fullscreen = !1, e._stats = {
+        buf: 0,
+        fps: 0,
+        abps: "",
+        vbps: "",
+        ts: ""
+      }, e._hasLoaded = !1, e._playUrl = "", e._startBpsTime = "", e._bps = 0, e._checkHeartTimeout = null, e._wakeLock = null, e._contextGL = null, e._contextGLRender = null, e._checkLoadingTimeout = null, e._bitmaprenderer = null, e._isPlayingBeforePageHidden = !1, e._initCheckVariable = () => {
+        e._startBpsTime = "", e._bps = 0, e._clearCheckHeartTimeout(), e._clearCheckLoading()
+      }, e._clearCheckHeartTimeout = () => {
+        e._checkHeartTimeout && (clearTimeout(e._checkHeartTimeout), e._checkHeartTimeout = null)
+      }, e._startCheckHeartTimeout = () => {
+        e._checkHeartTimeout = setTimeout((function () {
+          e._trigger(v().EVEMTS.timeout), e.recording = !1, e.playing = !1, e._close()
+        }), 1e3 * e._opt.timeout)
+      }, e._clearCheckLoading = () => {
+        e._checkLoadingTimeout && (clearTimeout(e._checkLoadingTimeout), e._checkLoadingTimeout = null)
+      }, e._checkLoading = () => {
+        e._clearCheckLoading(), e._checkLoadingTimeout = setTimeout((() => {
+          e._trigger(v().EVEMTS.timeout), e.playing = !1, e._close(), R().$domToggle(e.$doms.loadingDom, !1)
+        }), 1e3 * e._opt.timeout)
+      }
+    }, t(Z, "default", (function () {
+      return K
+    }))), Z
+  }
+
+  var te, re, ne = !1;
+
+  function oe() {
+    return ne || (ne = !0, te = {}, R(), re = e => {
+      e.onPlay = R().noop, e.onPause = R().noop, e.onRecord = R().noop, e.onFullscreen = R().noop, e.onMute = R().noop, e.onLoad = R().noop, e.onLog = R().noop, e.onError = R().noop, e.onTimeUpdate = R().noop, e.onInitSize = R().noop
+    }, t(te, "default", (function () {
+      return re
+    }))), te
+  }
+
+  var ae, ie, se = !1;
+
+  function ue() {
+    return se || (se = !0, ie = e => {
+      e._on = (t, r) => {
+        let n, o, a;
+        if (!r) return e;
+        for (n = e.__events || (e.__events = {}), t = t.split(/\s+/); o = t.shift();) a = n[o] || (n[o] = []), a.push(r);
+        return e
+      }, e._off = () => {
+        let t;
+        return (t = e.__events) ? (delete e.__events, e) : e
+      }, e._trigger = (t, ...r) => {
+        function n(e, t) {
+          if (e) for (let r = 0, n = e.length; r < n; r += 1) e[r](...t)
+        }
+
+        let o, a, i;
+        if (!(o = e.__events)) return e;
+        for (t = t.split(/\s+/); a = t.shift();) (i = o[a]) && (i = i.slice()), n(i, r);
+        return e
+      }
+    }, t(ae = {}, "default", (function () {
+      return ie
+    }))), ae
+  }
+
+  var ce, le, de = !1;
+
+  function fe() {
+    return de || (de = !0, ce = {}, R(), v(), le = e => {
+      e._pause = () => {
+        e._close(), e.loading && R().$domToggle(e.$doms.loadingDom, !1), e.recording = !1, e.playing = !1
+      }, e._play = t => {
+        if (!e._playUrl && !t) return;
+        let r = !1;
+        t ? (e._playUrl && (e._close(), r = !0, e.clearView()), e.loading = !0, R().$domToggle(e.$doms.bgDom, !1), e._checkLoading(), e._playUrl = t) : e._playUrl && (e.loading ? (R().$hideBtns(e.$doms), R().$domToggle(e.$doms.fullscreenDom, !0), R().$domToggle(e.$doms.pauseDom, !0), R().$domToggle(e.$doms.loadingDom, !0), e._checkLoading()) : e.playing = !0), e._initCheckVariable(), r ? setTimeout((() => {
+          e._decoderWorker.postMessage({cmd: v().POST_MESSAGE.play, url: e._playUrl})
+        }), 300) : e._decoderWorker.postMessage({cmd: v().POST_MESSAGE.play, url: e._playUrl})
+      }, e._screenshot = (t, r, n) => {
+        t = t || R().now();
+        const o = {png: "image/png", jpeg: "image/jpeg", webp: "image/webp"};
+        let a = .92;
+        void 0 !== n && (a = Number(n));
+        const i = e.$canvasElement.toDataURL(o[r] || o.png, a);
+        R().downloadImg(R().dataURLToFile(i), t)
+      }, e._close = () => {
+        e._close$2(), e._clearView()
+      }, e._close$2 = () => {
+        e._opt.debug && console.log("_close$2-START"), e._closeAudio && e._closeAudio(), e._audioPlayBuffers = [], e._audioPlaying = !1, e._decoderWorker.postMessage({cmd: v().POST_MESSAGE.close}), delete e._playAudio, e._releaseWakeLock(), e._initCheckVariable(), e._opt.debug && console.log("_close$2-END")
+      }, e._releaseWakeLock = () => {
+        e._wakeLock && (e._wakeLock.release(), e._wakeLock = null)
+      }, e._clearView = () => {
+        e._contextGL && e._contextGL.clear(e._contextGL.COLOR_BUFFER_BIT)
+      }, e._resize = () => {
+        const t = e.$container.clientWidth;
+        let r = e.$container.clientHeight;
+        e._showControl() && (r -= 38);
+        const n = e.$canvasElement.width, o = e.$canvasElement.height, a = e._opt.rotate, i = t / n, s = r / o;
+        let u = i > s ? s : i;
+        e._opt.isResize || i !== s && (u = i + "," + s), e._opt.isFullResize && (u = i > s ? i : s);
+        let c = "scale(" + u + ")";
+        a && (c += " rotate(" + a + "deg)"), e.$canvasElement.style.transform = c, e.$canvasElement.style.left = (t - n) / 2 + "px", e.$canvasElement.style.top = (r - o) / 2 + "px"
+      }, e._enableWakeLock = () => {
+        e._opt.keepScreenOn && "wakeLock" in navigator && navigator.wakeLock.request("screen").then((t => {
+          e._wakeLock = t
+        }))
+      }, e._supportOffscreen = () => !e._opt.forceNoOffscreen && "function" == typeof e.$canvasElement.transferControlToOffscreen, e._checkHeart = () => {
+        e._clearCheckHeartTimeout(), e._startCheckHeartTimeout()
+      }, e._updateStats = t => {
+        t = t || {}, e._startBpsTime || (e._startBpsTime = R().now());
+        const r = R().now();
+        r - e._startBpsTime < 1e3 ? e._stats.fps += 1 : (e._stats.ts = t.ts, e._stats.buf = t.buf, e._trigger(v().EVEMTS.stats, e._stats), e._trigger(v().EVEMTS.performance, R().fpsStatus(e._stats.fps)), e._trigger(v().EVEMTS.buffer, R().bufferStatus(e._stats.buf, 1e3 * e._opt.videoBuffer)), e._stats.fps = 0, e._startBpsTime = r)
+      }, e._onfullscreenchange = () => {
+        (void 0).fullscreen = R().checkFull()
+      }, e._handleVisibilityChange = () => {
+        e._opt.debug && console.log(document.visibilityState, e._isPlayingBeforePageHidden), "visible" === document.visibilityState ? e._isPlayingBeforePageHidden && e._play() : (e._isPlayingBeforePageHidden = e.playing, e.playing && e._pause())
+      }, e._handleWakeLock = () => {
+        null !== e._wakeLock && "visible" === document.visibilityState && e._enableWakeLock()
+      }
+    }, t(ce, "default", (function () {
+      return le
+    }))), ce
+  }
+
+  var pe, he, me = !1;
+
+  function Ae() {
+    return me || (me = !0, pe = {}, ee(), oe(), ue(), fe(), he = e => {
+      ee().default(e), oe().default(e), ue().default(e), fe().default(e)
+    }, t(pe, "default", (function () {
+      return he
+    }))), pe
+  }
+
+  var ge, ve = !1;
+  var Ee, ye, we, _e, be, ke, Te, De, Se, Ce, Oe, Pe, xe, Be, Me, Re, Le, Ie, Fe, Ue, Ne, je, Ge, ze, We, Ye, He, $e,
+    Ve, Qe, Xe, qe, Ze, Ke, Je, et, tt, rt, nt, ot, at, it, st, ut, ct, lt, dt, ft, pt, ht, mt, At, gt, vt, Et, yt, wt,
+    _t, bt, kt, Tt, Dt, St, Ct, Ot, Pt, xt, Bt, Mt, Rt, Lt, It, Ft, Ut, Nt, jt, Gt, zt, Wt, Yt, Ht, $t, Vt, Qt, Xt, qt,
+    Zt, Kt, Jt, er, tr, rr, nr, or, ar, ir, sr, ur, cr, lr, dr, fr, pr, hr, mr, Ar, gr, vr, Er, yr, wr, _r, br, kr, Tr,
+    Dr = !1;
+
+  function Sr(e) {
+    return Ee.locateFile ? Ee.locateFile(e, Oe) : Oe + e
+  }
+
+  function Cr(e) {
+    Cr.shown || (Cr.shown = {}), Cr.shown[e] || (Cr.shown[e] = 1, Me(e))
+  }
+
+  function Or(e, t) {
+    e || Yr("Assertion failed: " + t)
+  }
+
+  function Pr(e, t, r) {
+    for (var n = t + r, o = ""; !(t >= n);) {
+      var a = e[t++];
+      if (!a) return o;
+      if (128 & a) {
+        var i = 63 & e[t++];
+        if (192 != (224 & a)) {
+          var s = 63 & e[t++];
+          if ((a = 224 == (240 & a) ? (15 & a) << 12 | i << 6 | s : (7 & a) << 18 | i << 12 | s << 6 | 63 & e[t++]) < 65536) o += String.fromCharCode(a); else {
+            var u = a - 65536;
+            o += String.fromCharCode(55296 | u >> 10, 56320 | 1023 & u)
+          }
+        } else o += String.fromCharCode((31 & a) << 6 | i)
+      } else o += String.fromCharCode(a)
+    }
+    return o
+  }
+
+  function xr(e, t) {
+    return e ? Pr(We, e, t) : ""
+  }
+
+  function Br(e, t, r, n) {
+    if (!(n > 0)) return 0;
+    for (var o = r, a = r + n - 1, i = 0; i < e.length; ++i) {
+      var s = e.charCodeAt(i);
+      if (s >= 55296 && s <= 57343) s = 65536 + ((1023 & s) << 10) | 1023 & e.charCodeAt(++i);
+      if (s <= 127) {
+        if (r >= a) break;
+        t[r++] = s
+      } else if (s <= 2047) {
+        if (r + 1 >= a) break;
+        t[r++] = 192 | s >> 6, t[r++] = 128 | 63 & s
+      } else if (s <= 65535) {
+        if (r + 2 >= a) break;
+        t[r++] = 224 | s >> 12, t[r++] = 128 | s >> 6 & 63, t[r++] = 128 | 63 & s
+      } else {
+        if (r + 3 >= a) break;
+        t[r++] = 240 | s >> 18, t[r++] = 128 | s >> 12 & 63, t[r++] = 128 | s >> 6 & 63, t[r++] = 128 | 63 & s
+      }
+    }
+    return t[r] = 0, r - o
+  }
+
+  function Mr(e, t, r) {
+    return Br(e, We, t, r)
+  }
+
+  function Rr(e) {
+    for (var t = 0, r = 0; r < e.length; ++r) {
+      var n = e.charCodeAt(r);
+      n >= 55296 && n <= 57343 && (n = 65536 + ((1023 & n) << 10) | 1023 & e.charCodeAt(++r)), n <= 127 ? ++t : t += n <= 2047 ? 2 : n <= 65535 ? 3 : 4
+    }
+    return t
+  }
+
+  function Lr(e, t) {
+    for (var r = "", n = 0; !(n >= t / 2); ++n) {
+      var o = Ye[e + 2 * n >> 1];
+      if (0 == o) break;
+      r += String.fromCharCode(o)
+    }
+    return r
+  }
+
+  function Ir(e, t, r) {
+    if (void 0 === r && (r = 2147483647), r < 2) return 0;
+    for (var n = t, o = (r -= 2) < 2 * e.length ? r / 2 : e.length, a = 0; a < o; ++a) {
+      var i = e.charCodeAt(a);
+      Ye[t >> 1] = i, t += 2
+    }
+    return Ye[t >> 1] = 0, t - n
+  }
+
+  function Fr(e) {
+    return 2 * e.length
+  }
+
+  function Ur(e, t) {
+    for (var r = 0, n = ""; !(r >= t / 4);) {
+      var o = $e[e + 4 * r >> 2];
+      if (0 == o) break;
+      if (++r, o >= 65536) {
+        var a = o - 65536;
+        n += String.fromCharCode(55296 | a >> 10, 56320 | 1023 & a)
+      } else n += String.fromCharCode(o)
+    }
+    return n
+  }
+
+  function Nr(e, t, r) {
+    if (void 0 === r && (r = 2147483647), r < 4) return 0;
+    for (var n = t, o = n + r - 4, a = 0; a < e.length; ++a) {
+      var i = e.charCodeAt(a);
+      if (i >= 55296 && i <= 57343) i = 65536 + ((1023 & i) << 10) | 1023 & e.charCodeAt(++a);
+      if ($e[t >> 2] = i, (t += 4) + 4 > o) break
+    }
+    return $e[t >> 2] = 0, t - n
+  }
+
+  function jr(e) {
+    for (var t = 0, r = 0; r < e.length; ++r) {
+      var n = e.charCodeAt(r);
+      n >= 55296 && n <= 57343 && ++r, t += 4
+    }
+    return t
+  }
+
+  function Gr(e) {
+    var t = Rr(e) + 1, r = Jt(t);
+    return r && Br(e, ze, r, t), r
+  }
+
+  function zr(e) {
+    Or(!Se, "addRunDependency cannot be used in a pthread worker"), nt++, Ee.monitorRunDependencies && Ee.monitorRunDependencies(nt)
+  }
+
+  function Wr(e) {
+    if (nt--, Ee.monitorRunDependencies && Ee.monitorRunDependencies(nt), 0 == nt && (null !== ot && (clearInterval(ot), ot = null), at)) {
+      var t = at;
+      at = null, t()
+    }
+  }
+
+  function Yr(e) {
+    throw Ee.onAbort && Ee.onAbort(e), Se && console.error("Pthread aborting at " + (new Error).stack), Me(e += ""), je = !0, 1, e = "abort(" + e + "). Build with -s ASSERTIONS=1 for more info.", new WebAssembly.RuntimeError(e)
+  }
+
+  function Hr(e) {
+    return t = e, r = it, String.prototype.startsWith ? t.startsWith(r) : 0 === t.indexOf(r);
+    var t, r
+  }
+
+  function $r(e) {
+    try {
+      if (e == st && Ie) return new Uint8Array(Ie);
+      if (xe) return xe(e);
+      throw"both async and sync fetching of the wasm failed"
+    } catch (e) {
+      Yr(e)
+    }
+  }
+
+  function Vr() {
+    var e = {a: qt};
+
+    function t(e, t) {
+      var r = e.exports;
+      Ee.asm = r, Ze = Ee.asm.da, Ne = t, Se || Wr()
+    }
+
+    function r(e) {
+      t(e.instance, e.module)
+    }
+
+    function n(t) {
+      return (Ie || !Te && !De || "function" != typeof fetch ? Promise.resolve().then((function () {
+        return $r(st)
+      })) : fetch(st, {credentials: "same-origin"}).then((function (e) {
+        if (!e.ok) throw"failed to load wasm binary file at '" + st + "'";
+        return e.arrayBuffer()
+      })).catch((function () {
+        return $r(st)
+      }))).then((function (t) {
+        return WebAssembly.instantiate(t, e)
+      })).then(t, (function (e) {
+        Me("failed to asynchronously prepare wasm: " + e), Yr(e)
+      }))
+    }
+
+    if (Se || zr(), Ee.instantiateWasm) try {
+      return Ee.instantiateWasm(e, t)
+    } catch (e) {
+      return Me("Module.instantiateWasm callback failed with error: " + e), !1
+    }
+    return Ie || "function" != typeof WebAssembly.instantiateStreaming || Hr(st) || "function" != typeof fetch ? n(r) : fetch(st, {credentials: "same-origin"}).then((function (t) {
+      return WebAssembly.instantiateStreaming(t, e).then(r, (function (e) {
+        return Me("wasm streaming compile failed: " + e), Me("falling back to ArrayBuffer instantiation"), n(r)
+      }))
+    })), {}
+  }
+
+  function Qr() {
+    ft.initRuntime()
+  }
+
+  function Xr(e) {
+    for (; e.length > 0;) {
+      var t = e.shift();
+      if ("function" != typeof t) {
+        var r = t.func;
+        "number" == typeof r ? void 0 === t.arg ? Ze.get(r)() : Ze.get(r)(t.arg) : r(void 0 === t.arg ? null : t.arg)
+      } else t(Ee)
+    }
+  }
+
+  function qr(e, t) {
+    if (e <= 0 || e > ze.length || !0 & e || t < 0) return -28;
+    if (0 == t) return 0;
+    t >= 2147483647 && (t = 1 / 0);
+    var r = Atomics.load($e, br >> 2), n = 0;
+    if (r == e && (Atomics.compareExchange($e, br >> 2, r, 0) == r && (n = 1, --t <= 0))) return 1;
+    var o = Atomics.notify($e, e >> 2, t);
+    if (o >= 0) return o + n;
+    throw"Atomics.notify returned an unexpected value " + o
+  }
+
+  function Zr(e) {
+    if (Se) throw"Internal Error! cleanupThread() can only ever be called from main application thread!";
+    if (!e) throw"Internal Error! Null pthread_ptr in cleanupThread!";
+    $e[e + 12 >> 2] = 0;
+    var t = ft.pthreads[e];
+    if (t) {
+      var r = t.worker;
+      ft.returnWorkerToPool(r)
+    }
+  }
+
+  function Kr(e, t) {
+    yr(e, t), vr(e)
+  }
+
+  function Jr() {
+    return Fe
+  }
+
+  function en(e, t) {
+    return Ze.get(e)(t)
+  }
+
+  function tn() {
+    var e = new Error;
+    if (!e.stack) {
+      try {
+        throw new Error
+      } catch (t) {
+        e = t
+      }
+      if (!e.stack) return "(no stack trace available)"
+    }
+    return e.stack.toString()
+  }
+
+  function rn(e, t, r, n) {
+    Yr("Assertion failed: " + xr(e) + ", at: " + [t ? xr(t) : "unknown filename", r, n ? xr(n) : "unknown function"])
+  }
+
+  function nn(e) {
+    return $e[tr() >> 2] = e, e
+  }
+
+  function on(e) {
+    for (var t = function (e, t) {
+      return t || (t = Re), Math.ceil(e / t) * t
+    }(e, 16384), r = Jt(t); e < t;) ze[r + e++] = 0;
+    return r
+  }
+
+  function an(e, t, r) {
+    if (Se) return zo(1, 1, e, t, r);
+    Et.varargs = r;
+    try {
+      var n = Et.getStreamFromFD(e);
+      switch (t) {
+        case 0:
+          return (o = Et.get()) < 0 ? -28 : vt.open(n.path, n.flags, 0, o).fd;
+        case 1:
+        case 2:
+          return 0;
+        case 3:
+          return n.flags;
+        case 4:
+          var o = Et.get();
+          return n.flags |= o, 0;
+        case 12:
+          o = Et.get();
+          return Ye[o + 0 >> 1] = 2, 0;
+        case 13:
+        case 14:
+          return 0;
+        case 16:
+        case 8:
+          return -28;
+        case 9:
+          return nn(28), -1;
+        default:
+          return -28
+      }
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), -e.errno
+    }
+  }
+
+  function sn(e, t, r) {
+    if (Se) return zo(2, 1, e, t, r);
+    Et.varargs = r;
+    try {
+      var n = Et.getStr(e), o = r ? Et.get() : 0;
+      return vt.open(n, t, o).fd
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), -e.errno
+    }
+  }
+
+  function un(e) {
+    switch (e) {
+      case 1:
+        return 0;
+      case 2:
+        return 1;
+      case 4:
+        return 2;
+      case 8:
+        return 3;
+      default:
+        throw new TypeError("Unknown type size: " + e)
+    }
+  }
+
+  function cn(e) {
+    for (var t = "", r = e; We[r];) t += yt[We[r++]];
+    return t
+  }
+
+  function ln(e) {
+    if (void 0 === e) return "_unknown";
+    var t = (e = e.replace(/[^a-zA-Z0-9_]/g, "$")).charCodeAt(0);
+    return t >= kt && t <= Tt ? "_" + e : e
+  }
+
+  function dn(e, t) {
+    return e = ln(e), new Function("body", "return function " + e + '() {\n    "use strict";    return body.apply(this, arguments);\n};\n')(t)
+  }
+
+  function fn(e, t) {
+    var r = dn(t, (function (e) {
+      this.name = t, this.message = e;
+      var r = new Error(e).stack;
+      void 0 !== r && (this.stack = this.toString() + "\n" + r.replace(/^Error(:[^\n]*)?\n/, ""))
+    }));
+    return r.prototype = Object.create(e.prototype), r.prototype.constructor = r, r.prototype.toString = function () {
+      return void 0 === this.message ? this.name : this.name + ": " + this.message
+    }, r
+  }
+
+  function pn(e) {
+    throw new Dt(e)
+  }
+
+  function hn(e) {
+    throw new St(e)
+  }
+
+  function mn(e, t, r) {
+    function n(t) {
+      var n = r(t);
+      n.length !== e.length && hn("Mismatched type converter count");
+      for (var o = 0; o < e.length; ++o) An(e[o], n[o])
+    }
+
+    e.forEach((function (e) {
+      bt[e] = t
+    }));
+    var o = new Array(t.length), a = [], i = 0;
+    t.forEach((function (e, t) {
+      _t.hasOwnProperty(e) ? o[t] = _t[e] : (a.push(e), wt.hasOwnProperty(e) || (wt[e] = []), wt[e].push((function () {
+        o[t] = _t[e], ++i === a.length && n(o)
+      })))
+    })), 0 === a.length && n(o)
+  }
+
+  function An(e, t, r) {
+    if (r = r || {}, !("argPackAdvance" in t)) throw new TypeError("registerType registeredInstance requires argPackAdvance");
+    var n = t.name;
+    if (e || pn('type "' + n + '" must have a positive integer typeid pointer'), _t.hasOwnProperty(e)) {
+      if (r.ignoreDuplicateRegistrations) return;
+      pn("Cannot register type '" + n + "' twice")
+    }
+    if (_t[e] = t, delete bt[e], wt.hasOwnProperty(e)) {
+      var o = wt[e];
+      delete wt[e], o.forEach((function (e) {
+        e()
+      }))
+    }
+  }
+
+  function gn(e, t, r, n, o) {
+    var a = un(r);
+    An(e, {
+      name: t = cn(t), fromWireType: function (e) {
+        return !!e
+      }, toWireType: function (e, t) {
+        return t ? n : o
+      }, argPackAdvance: 8, readValueFromPointer: function (e) {
+        var n;
+        if (1 === r) n = ze; else if (2 === r) n = Ye; else {
+          if (4 !== r) throw new TypeError("Unknown boolean type size: " + t);
+          n = $e
+        }
+        return this.fromWireType(n[e >> a])
+      }, destructorFunction: null
+    })
+  }
+
+  function vn(e) {
+    if (!(this instanceof Cn)) return !1;
+    if (!(e instanceof Cn)) return !1;
+    for (var t = this.$$.ptrType.registeredClass, r = this.$$.ptr, n = e.$$.ptrType.registeredClass, o = e.$$.ptr; t.baseClass;) r = t.upcast(r), t = t.baseClass;
+    for (; n.baseClass;) o = n.upcast(o), n = n.baseClass;
+    return t === n && r === o
+  }
+
+  function En(e) {
+    pn(e.$$.ptrType.registeredClass.name + " instance already deleted")
+  }
+
+  function yn(e) {
+  }
+
+  function wn(e) {
+    e.count.value -= 1, 0 === e.count.value && function (e) {
+      e.smartPtr ? e.smartPtrType.rawDestructor(e.smartPtr) : e.ptrType.registeredClass.rawDestructor(e.ptr)
+    }(e)
+  }
+
+  function _n(e) {
+    return "undefined" == typeof FinalizationGroup ? (_n = function (e) {
+      return e
+    }, e) : (Ct = new FinalizationGroup((function (e) {
+      for (var t = e.next(); !t.done; t = e.next()) {
+        var r = t.value;
+        r.ptr ? wn(r) : console.warn("object already deleted: " + r.ptr)
+      }
+    })), yn = function (e) {
+      Ct.unregister(e.$$)
+    }, (_n = function (e) {
+      return Ct.register(e, e.$$, e.$$), e
+    })(e))
+  }
+
+  function bn() {
+    if (this.$$.ptr || En(this), this.$$.preservePointerOnDelete) return this.$$.count.value += 1, this;
+    var e, t = _n(Object.create(Object.getPrototypeOf(this), {
+      $$: {
+        value: (e = this.$$, {
+          count: e.count,
+          deleteScheduled: e.deleteScheduled,
+          preservePointerOnDelete: e.preservePointerOnDelete,
+          ptr: e.ptr,
+          ptrType: e.ptrType,
+          smartPtr: e.smartPtr,
+          smartPtrType: e.smartPtrType
+        })
+      }
+    }));
+    return t.$$.count.value += 1, t.$$.deleteScheduled = !1, t
+  }
+
+  function kn() {
+    this.$$.ptr || En(this), this.$$.deleteScheduled && !this.$$.preservePointerOnDelete && pn("Object already scheduled for deletion"), yn(this), wn(this.$$), this.$$.preservePointerOnDelete || (this.$$.smartPtr = void 0, this.$$.ptr = void 0)
+  }
+
+  function Tn() {
+    return !this.$$.ptr
+  }
+
+  function Dn() {
+    for (; Pt.length;) {
+      var e = Pt.pop();
+      e.$$.deleteScheduled = !1, e.delete()
+    }
+  }
+
+  function Sn() {
+    return this.$$.ptr || En(this), this.$$.deleteScheduled && !this.$$.preservePointerOnDelete && pn("Object already scheduled for deletion"), Pt.push(this), 1 === Pt.length && Ot && Ot(Dn), this.$$.deleteScheduled = !0, this
+  }
+
+  function Cn() {
+  }
+
+  function On(e, t, r) {
+    if (void 0 === e[t].overloadTable) {
+      var n = e[t];
+      e[t] = function () {
+        return e[t].overloadTable.hasOwnProperty(arguments.length) || pn("Function '" + r + "' called with an invalid number of arguments (" + arguments.length + ") - expects one of (" + e[t].overloadTable + ")!"), e[t].overloadTable[arguments.length].apply(this, arguments)
+      }, e[t].overloadTable = [], e[t].overloadTable[n.argCount] = n
+    }
+  }
+
+  function Pn(e, t, r, n, o, a, i, s) {
+    this.name = e, this.constructor = t, this.instancePrototype = r, this.rawDestructor = n, this.baseClass = o, this.getActualType = a, this.upcast = i, this.downcast = s, this.pureVirtualFunctions = []
+  }
+
+  function xn(e, t, r) {
+    for (; t !== r;) t.upcast || pn("Expected null or instance of " + r.name + ", got an instance of " + t.name), e = t.upcast(e), t = t.baseClass;
+    return e
+  }
+
+  function Bn(e, t) {
+    if (null === t) return this.isReference && pn("null is not a valid " + this.name), 0;
+    t.$$ || pn('Cannot pass "' + lo(t) + '" as a ' + this.name), t.$$.ptr || pn("Cannot pass deleted object as a pointer of type " + this.name);
+    var r = t.$$.ptrType.registeredClass;
+    return xn(t.$$.ptr, r, this.registeredClass)
+  }
+
+  function Mn(e, t) {
+    var r;
+    if (null === t) return this.isReference && pn("null is not a valid " + this.name), this.isSmartPointer ? (r = this.rawConstructor(), null !== e && e.push(this.rawDestructor, r), r) : 0;
+    t.$$ || pn('Cannot pass "' + lo(t) + '" as a ' + this.name), t.$$.ptr || pn("Cannot pass deleted object as a pointer of type " + this.name), !this.isConst && t.$$.ptrType.isConst && pn("Cannot convert argument of type " + (t.$$.smartPtrType ? t.$$.smartPtrType.name : t.$$.ptrType.name) + " to parameter type " + this.name);
+    var n = t.$$.ptrType.registeredClass;
+    if (r = xn(t.$$.ptr, n, this.registeredClass), this.isSmartPointer) switch (void 0 === t.$$.smartPtr && pn("Passing raw pointer to smart pointer is illegal"), this.sharingPolicy) {
+      case 0:
+        t.$$.smartPtrType === this ? r = t.$$.smartPtr : pn("Cannot convert argument of type " + (t.$$.smartPtrType ? t.$$.smartPtrType.name : t.$$.ptrType.name) + " to parameter type " + this.name);
+        break;
+      case 1:
+        r = t.$$.smartPtr;
+        break;
+      case 2:
+        if (t.$$.smartPtrType === this) r = t.$$.smartPtr; else {
+          var o = t.clone();
+          r = this.rawShare(r, uo((function () {
+            o.delete()
+          }))), null !== e && e.push(this.rawDestructor, r)
+        }
+        break;
+      default:
+        pn("Unsupporting sharing policy")
+    }
+    return r
+  }
+
+  function Rn(e, t) {
+    if (null === t) return this.isReference && pn("null is not a valid " + this.name), 0;
+    t.$$ || pn('Cannot pass "' + lo(t) + '" as a ' + this.name), t.$$.ptr || pn("Cannot pass deleted object as a pointer of type " + this.name), t.$$.ptrType.isConst && pn("Cannot convert argument of type " + t.$$.ptrType.name + " to parameter type " + this.name);
+    var r = t.$$.ptrType.registeredClass;
+    return xn(t.$$.ptr, r, this.registeredClass)
+  }
+
+  function Ln(e) {
+    return this.fromWireType(Ve[e >> 2])
+  }
+
+  function In(e) {
+    return this.rawGetPointee && (e = this.rawGetPointee(e)), e
+  }
+
+  function Fn(e) {
+    this.rawDestructor && this.rawDestructor(e)
+  }
+
+  function Un(e) {
+    null !== e && e.delete()
+  }
+
+  function Nn(e, t, r) {
+    if (t === r) return e;
+    if (void 0 === r.baseClass) return null;
+    var n = Nn(e, t, r.baseClass);
+    return null === n ? null : r.downcast(n)
+  }
+
+  function jn() {
+    return Object.keys(Bt).length
+  }
+
+  function Gn() {
+    var e = [];
+    for (var t in Bt) Bt.hasOwnProperty(t) && e.push(Bt[t]);
+    return e
+  }
+
+  function zn(e) {
+    Ot = e, Pt.length && Ot && Ot(Dn)
+  }
+
+  function Wn(e, t) {
+    return t = function (e, t) {
+      for (void 0 === t && pn("ptr should not be undefined"); e.baseClass;) t = e.upcast(t), e = e.baseClass;
+      return t
+    }(e, t), Bt[t]
+  }
+
+  function Yn(e, t) {
+    return t.ptrType && t.ptr || hn("makeClassHandle requires ptr and ptrType"), !!t.smartPtrType !== !!t.smartPtr && hn("Both smartPtrType and smartPtr must be specified"), t.count = {value: 1}, _n(Object.create(e, {$$: {value: t}}))
+  }
+
+  function Hn(e) {
+    var t = this.getPointee(e);
+    if (!t) return this.destructor(e), null;
+    var r = Wn(this.registeredClass, t);
+    if (void 0 !== r) {
+      if (0 === r.$$.count.value) return r.$$.ptr = t, r.$$.smartPtr = e, r.clone();
+      var n = r.clone();
+      return this.destructor(e), n
+    }
+
+    function o() {
+      return this.isSmartPointer ? Yn(this.registeredClass.instancePrototype, {
+        ptrType: this.pointeeType,
+        ptr: t,
+        smartPtrType: this,
+        smartPtr: e
+      }) : Yn(this.registeredClass.instancePrototype, {ptrType: this, ptr: e})
+    }
+
+    var a, i = this.registeredClass.getActualType(t), s = xt[i];
+    if (!s) return o.call(this);
+    a = this.isConst ? s.constPointerType : s.pointerType;
+    var u = Nn(t, this.registeredClass, a.registeredClass);
+    return null === u ? o.call(this) : this.isSmartPointer ? Yn(a.registeredClass.instancePrototype, {
+      ptrType: a,
+      ptr: u,
+      smartPtrType: this,
+      smartPtr: e
+    }) : Yn(a.registeredClass.instancePrototype, {ptrType: a, ptr: u})
+  }
+
+  function $n(e, t, r, n, o, a, i, s, u, c, l) {
+    this.name = e, this.registeredClass = t, this.isReference = r, this.isConst = n, this.isSmartPointer = o, this.pointeeType = a, this.sharingPolicy = i, this.rawGetPointee = s, this.rawConstructor = u, this.rawShare = c, this.rawDestructor = l, o || void 0 !== t.baseClass ? this.toWireType = Mn : n ? (this.toWireType = Bn, this.destructorFunction = null) : (this.toWireType = Rn, this.destructorFunction = null)
+  }
+
+  function Vn(e, t, r) {
+    return -1 != e.indexOf("j") ? function (e, t, r) {
+      var n = Ee["dynCall_" + e];
+      return r && r.length ? n.apply(null, [t].concat(r)) : n.call(null, t)
+    }(e, t, r) : Ze.get(t).apply(null, r)
+  }
+
+  function Qn(e, t) {
+    var r, n, o, a = -1 != (e = cn(e)).indexOf("j") ? (r = e, n = t, o = [], function () {
+      o.length = arguments.length;
+      for (var e = 0; e < arguments.length; e++) o[e] = arguments[e];
+      return Vn(r, n, o)
+    }) : Ze.get(t);
+    return "function" != typeof a && pn("unknown function pointer with signature " + e + ": " + t), a
+  }
+
+  function Xn(e) {
+    var t = rr(e), r = cn(t);
+    return Kt(t), r
+  }
+
+  function qn(e, t) {
+    var r = [], n = {};
+    throw t.forEach((function e(t) {
+      n[t] || _t[t] || (bt[t] ? bt[t].forEach(e) : (r.push(t), n[t] = !0))
+    })), new Mt(e + ": " + r.map(Xn).join([", "]))
+  }
+
+  function Zn(e, t, r, n, o, a, i, s, u, c, l, d, f) {
+    l = cn(l), a = Qn(o, a), s && (s = Qn(i, s)), c && (c = Qn(u, c)), f = Qn(d, f);
+    var p = ln(l);
+    !function (e, t, r) {
+      Ee.hasOwnProperty(e) ? ((void 0 === r || void 0 !== Ee[e].overloadTable && void 0 !== Ee[e].overloadTable[r]) && pn("Cannot register public name '" + e + "' twice"), On(Ee, e, e), Ee.hasOwnProperty(r) && pn("Cannot register multiple overloads of a function with the same number of arguments (" + r + ")!"), Ee[e].overloadTable[r] = t) : (Ee[e] = t, void 0 !== r && (Ee[e].numArguments = r))
+    }(p, (function () {
+      qn("Cannot construct " + l + " due to unbound types", [n])
+    })), mn([e, t, r], n ? [n] : [], (function (t) {
+      var r, o;
+      t = t[0], o = n ? (r = t.registeredClass).instancePrototype : Cn.prototype;
+      var i = dn(p, (function () {
+        if (Object.getPrototypeOf(this) !== u) throw new Dt("Use 'new' to construct " + l);
+        if (void 0 === d.constructor_body) throw new Dt(l + " has no accessible constructor");
+        var e = d.constructor_body[arguments.length];
+        if (void 0 === e) throw new Dt("Tried to invoke ctor of " + l + " with invalid number of parameters (" + arguments.length + ") - expected (" + Object.keys(d.constructor_body).toString() + ") parameters instead!");
+        return e.apply(this, arguments)
+      })), u = Object.create(o, {constructor: {value: i}});
+      i.prototype = u;
+      var d = new Pn(l, i, u, f, r, a, s, c), h = new $n(l, d, !0, !1, !1), m = new $n(l + "*", d, !1, !1, !1),
+        A = new $n(l + " const*", d, !1, !0, !1);
+      return xt[e] = {pointerType: m, constPointerType: A}, function (e, t, r) {
+        Ee.hasOwnProperty(e) || hn("Replacing nonexistant public symbol"), void 0 !== Ee[e].overloadTable && void 0 !== r ? Ee[e].overloadTable[r] = t : (Ee[e] = t, Ee[e].argCount = r)
+      }(p, i), [h, m, A]
+    }))
+  }
+
+  function Kn(e, t) {
+    for (var r = [], n = 0; n < e; n++) r.push($e[(t >> 2) + n]);
+    return r
+  }
+
+  function Jn(e) {
+    for (; e.length;) {
+      var t = e.pop();
+      e.pop()(t)
+    }
+  }
+
+  function eo(e, t, r, n, o, a) {
+    Or(t > 0);
+    var i = Kn(t, r);
+    o = Qn(n, o);
+    var s = [a], u = [];
+    mn([], [e], (function (e) {
+      var r = "constructor " + (e = e[0]).name;
+      if (void 0 === e.registeredClass.constructor_body && (e.registeredClass.constructor_body = []), void 0 !== e.registeredClass.constructor_body[t - 1]) throw new Dt("Cannot register multiple constructors with identical number of parameters (" + (t - 1) + ") for class '" + e.name + "'! Overload resolution is currently only performed using the parameter count, not actual type info!");
+      return e.registeredClass.constructor_body[t - 1] = function () {
+        qn("Cannot construct " + e.name + " due to unbound types", i)
+      }, mn([], i, (function (n) {
+        return e.registeredClass.constructor_body[t - 1] = function () {
+          arguments.length !== t - 1 && pn(r + " called with " + arguments.length + " arguments, expected " + (t - 1)), u.length = 0, s.length = t;
+          for (var e = 1; e < t; ++e) s[e] = n[e].toWireType(u, arguments[e - 1]);
+          var a = o.apply(null, s);
+          return Jn(u), n[0].fromWireType(a)
+        }, []
+      })), []
+    }))
+  }
+
+  function to(e, t) {
+    if (!(e instanceof Function)) throw new TypeError("new_ called with constructor type " + typeof e + " which is not a function");
+    var r = dn(e.name || "unknownFunctionName", (function () {
+    }));
+    r.prototype = e.prototype;
+    var n = new r, o = e.apply(n, t);
+    return o instanceof Object ? o : n
+  }
+
+  function ro(e, t, r, n, o, a, i, s) {
+    var u = Kn(r, n);
+    t = cn(t), a = Qn(o, a), mn([], [e], (function (e) {
+      var n = (e = e[0]).name + "." + t;
+
+      function o() {
+        qn("Cannot call " + n + " due to unbound types", u)
+      }
+
+      s && e.registeredClass.pureVirtualFunctions.push(t);
+      var c = e.registeredClass.instancePrototype, l = c[t];
+      return void 0 === l || void 0 === l.overloadTable && l.className !== e.name && l.argCount === r - 2 ? (o.argCount = r - 2, o.className = e.name, c[t] = o) : (On(c, t, n), c[t].overloadTable[r - 2] = o), mn([], u, (function (o) {
+        var s = function (e, t, r, n, o) {
+          var a = t.length;
+          a < 2 && pn("argTypes array size mismatch! Must at least get return value and 'this' types!");
+          for (var i = null !== t[1] && null !== r, s = !1, u = 1; u < t.length; ++u) if (null !== t[u] && void 0 === t[u].destructorFunction) {
+            s = !0;
+            break
+          }
+          var c = "void" !== t[0].name, l = "", d = "";
+          for (u = 0; u < a - 2; ++u) l += (0 !== u ? ", " : "") + "arg" + u, d += (0 !== u ? ", " : "") + "arg" + u + "Wired";
+          var f = "return function " + ln(e) + "(" + l + ") {\nif (arguments.length !== " + (a - 2) + ") {\nthrowBindingError('function " + e + " called with ' + arguments.length + ' arguments, expected " + (a - 2) + " args!');\n}\n";
+          s && (f += "var destructors = [];\n");
+          var p = s ? "destructors" : "null",
+            h = ["throwBindingError", "invoker", "fn", "runDestructors", "retType", "classParam"],
+            m = [pn, n, o, Jn, t[0], t[1]];
+          for (i && (f += "var thisWired = classParam.toWireType(" + p + ", this);\n"), u = 0; u < a - 2; ++u) f += "var arg" + u + "Wired = argType" + u + ".toWireType(" + p + ", arg" + u + "); // " + t[u + 2].name + "\n", h.push("argType" + u), m.push(t[u + 2]);
+          if (i && (d = "thisWired" + (d.length > 0 ? ", " : "") + d), f += (c ? "var rv = " : "") + "invoker(fn" + (d.length > 0 ? ", " : "") + d + ");\n", s) f += "runDestructors(destructors);\n"; else for (u = i ? 1 : 2; u < t.length; ++u) {
+            var A = 1 === u ? "thisWired" : "arg" + (u - 2) + "Wired";
+            null !== t[u].destructorFunction && (f += A + "_dtor(" + A + "); // " + t[u].name + "\n", h.push(A + "_dtor"), m.push(t[u].destructorFunction))
+          }
+          return c && (f += "var ret = retType.fromWireType(rv);\nreturn ret;\n"), f += "}\n", h.push(f), to(Function, h).apply(null, m)
+        }(n, o, e, a, i);
+        return void 0 === c[t].overloadTable ? (s.argCount = r - 2, c[t] = s) : c[t].overloadTable[r - 2] = s, []
+      })), []
+    }))
+  }
+
+  function no(e, t, r) {
+    return e instanceof Object || pn(r + ' with invalid "this": ' + e), e instanceof t.registeredClass.constructor || pn(r + ' incompatible with "this" of type ' + e.constructor.name), e.$$.ptr || pn("cannot call emscripten binding method " + r + " on deleted object"), xn(e.$$.ptr, e.$$.ptrType.registeredClass, t.registeredClass)
+  }
+
+  function oo(e, t, r, n, o, a, i, s, u, c) {
+    t = cn(t), o = Qn(n, o), mn([], [e], (function (e) {
+      var n = (e = e[0]).name + "." + t, l = {
+        get: function () {
+          qn("Cannot access " + n + " due to unbound types", [r, i])
+        }, enumerable: !0, configurable: !0
+      };
+      return l.set = u ? function () {
+        qn("Cannot access " + n + " due to unbound types", [r, i])
+      } : function (e) {
+        pn(n + " is a read-only property")
+      }, Object.defineProperty(e.registeredClass.instancePrototype, t, l), mn([], u ? [r, i] : [r], (function (r) {
+        var i = r[0], l = {
+          get: function () {
+            var t = no(this, e, n + " getter");
+            return i.fromWireType(o(a, t))
+          }, enumerable: !0
+        };
+        if (u) {
+          u = Qn(s, u);
+          var d = r[1];
+          l.set = function (t) {
+            var r = no(this, e, n + " setter"), o = [];
+            u(c, r, d.toWireType(o, t)), Jn(o)
+          }
+        }
+        return Object.defineProperty(e.registeredClass.instancePrototype, t, l), []
+      })), []
+    }))
+  }
+
+  function ao(e) {
+    e > 4 && 0 == --Lt[e].refcount && (Lt[e] = void 0, Rt.push(e))
+  }
+
+  function io() {
+    for (var e = 0, t = 5; t < Lt.length; ++t) void 0 !== Lt[t] && ++e;
+    return e
+  }
+
+  function so() {
+    for (var e = 5; e < Lt.length; ++e) if (void 0 !== Lt[e]) return Lt[e];
+    return null
+  }
+
+  function uo(e) {
+    switch (e) {
+      case void 0:
+        return 1;
+      case null:
+        return 2;
+      case!0:
+        return 3;
+      case!1:
+        return 4;
+      default:
+        var t = Rt.length ? Rt.pop() : Lt.length;
+        return Lt[t] = {refcount: 1, value: e}, t
+    }
+  }
+
+  function co(e, t) {
+    An(e, {
+      name: t = cn(t), fromWireType: function (e) {
+        var t = Lt[e].value;
+        return ao(e), t
+      }, toWireType: function (e, t) {
+        return uo(t)
+      }, argPackAdvance: 8, readValueFromPointer: Ln, destructorFunction: null
+    })
+  }
+
+  function lo(e) {
+    if (null === e) return "null";
+    var t = typeof e;
+    return "object" === t || "array" === t || "function" === t ? e.toString() : "" + e
+  }
+
+  function fo(e, t) {
+    switch (t) {
+      case 2:
+        return function (e) {
+          return this.fromWireType(Qe[e >> 2])
+        };
+      case 3:
+        return function (e) {
+          return this.fromWireType(Xe[e >> 3])
+        };
+      default:
+        throw new TypeError("Unknown float type: " + e)
+    }
+  }
+
+  function po(e, t, r) {
+    var n = un(r);
+    An(e, {
+      name: t = cn(t), fromWireType: function (e) {
+        return e
+      }, toWireType: function (e, t) {
+        if ("number" != typeof t && "boolean" != typeof t) throw new TypeError('Cannot convert "' + lo(t) + '" to ' + this.name);
+        return t
+      }, argPackAdvance: 8, readValueFromPointer: fo(t, n), destructorFunction: null
+    })
+  }
+
+  function ho(e, t, r) {
+    switch (t) {
+      case 0:
+        return r ? function (e) {
+          return ze[e]
+        } : function (e) {
+          return We[e]
+        };
+      case 1:
+        return r ? function (e) {
+          return Ye[e >> 1]
+        } : function (e) {
+          return He[e >> 1]
+        };
+      case 2:
+        return r ? function (e) {
+          return $e[e >> 2]
+        } : function (e) {
+          return Ve[e >> 2]
+        };
+      default:
+        throw new TypeError("Unknown integer type: " + e)
+    }
+  }
+
+  function mo(e, t, r, n, o) {
+    t = cn(t), -1 === o && (o = 4294967295);
+    var a = un(r), i = function (e) {
+      return e
+    };
+    if (0 === n) {
+      var s = 32 - 8 * r;
+      i = function (e) {
+        return e << s >>> s
+      }
+    }
+    var u = -1 != t.indexOf("unsigned");
+    An(e, {
+      name: t, fromWireType: i, toWireType: function (e, r) {
+        if ("number" != typeof r && "boolean" != typeof r) throw new TypeError('Cannot convert "' + lo(r) + '" to ' + this.name);
+        if (r < n || r > o) throw new TypeError('Passing a number "' + lo(r) + '" from JS side to C/C++ side to an argument of type "' + t + '", which is outside the valid range [' + n + ", " + o + "]!");
+        return u ? r >>> 0 : 0 | r
+      }, argPackAdvance: 8, readValueFromPointer: ho(t, a, 0 !== n), destructorFunction: null
+    })
+  }
+
+  function Ao(e, t, r) {
+    var n = [Int8Array, Uint8Array, Int16Array, Uint16Array, Int32Array, Uint32Array, Float32Array, Float64Array][t];
+
+    function o(e) {
+      var t = Ve, r = t[e >>= 2], o = t[e + 1];
+      return new n(Ge, o, r)
+    }
+
+    An(e, {
+      name: r = cn(r),
+      fromWireType: o,
+      argPackAdvance: 8,
+      readValueFromPointer: o
+    }, {ignoreDuplicateRegistrations: !0})
+  }
+
+  function go(e, t) {
+    var r = "std::string" === (t = cn(t));
+    An(e, {
+      name: t, fromWireType: function (e) {
+        var t, n = Ve[e >> 2];
+        if (r) for (var o = e + 4, a = 0; a <= n; ++a) {
+          var i = e + 4 + a;
+          if (a == n || 0 == We[i]) {
+            var s = xr(o, i - o);
+            void 0 === t ? t = s : (t += String.fromCharCode(0), t += s), o = i + 1
+          }
+        } else {
+          var u = new Array(n);
+          for (a = 0; a < n; ++a) u[a] = String.fromCharCode(We[e + 4 + a]);
+          t = u.join("")
+        }
+        return Kt(e), t
+      }, toWireType: function (e, t) {
+        t instanceof ArrayBuffer && (t = new Uint8Array(t));
+        var n = "string" == typeof t;
+        n || t instanceof Uint8Array || t instanceof Uint8ClampedArray || t instanceof Int8Array || pn("Cannot pass non-string to std::string");
+        var o = (r && n ? function () {
+          return Rr(t)
+        } : function () {
+          return t.length
+        })(), a = Jt(4 + o + 1);
+        if (Ve[a >> 2] = o, r && n) Mr(t, a + 4, o + 1); else if (n) for (var i = 0; i < o; ++i) {
+          var s = t.charCodeAt(i);
+          s > 255 && (Kt(a), pn("String has UTF-16 code units that do not fit in 8 bits")), We[a + 4 + i] = s
+        } else for (i = 0; i < o; ++i) We[a + 4 + i] = t[i];
+        return null !== e && e.push(Kt, a), a
+      }, argPackAdvance: 8, readValueFromPointer: Ln, destructorFunction: function (e) {
+        Kt(e)
+      }
+    })
+  }
+
+  function vo(e, t, r) {
+    var n, o, a, i, s;
+    r = cn(r), 2 === t ? (n = Lr, o = Ir, i = Fr, a = function () {
+      return He
+    }, s = 1) : 4 === t && (n = Ur, o = Nr, i = jr, a = function () {
+      return Ve
+    }, s = 2), An(e, {
+      name: r, fromWireType: function (e) {
+        for (var r, o = Ve[e >> 2], i = a(), u = e + 4, c = 0; c <= o; ++c) {
+          var l = e + 4 + c * t;
+          if (c == o || 0 == i[l >> s]) {
+            var d = n(u, l - u);
+            void 0 === r ? r = d : (r += String.fromCharCode(0), r += d), u = l + t
+          }
+        }
+        return Kt(e), r
+      }, toWireType: function (e, n) {
+        "string" != typeof n && pn("Cannot pass non-string to C++ string type " + r);
+        var a = i(n), u = Jt(4 + a + t);
+        return Ve[u >> 2] = a >> s, o(n, u + 4, a + t), null !== e && e.push(Kt, u), u
+      }, argPackAdvance: 8, readValueFromPointer: Ln, destructorFunction: function (e) {
+        Kt(e)
+      }
+    })
+  }
+
+  function Eo(e, t) {
+    An(e, {
+      isVoid: !0, name: t = cn(t), argPackAdvance: 0, fromWireType: function () {
+      }, toWireType: function (e, t) {
+      }
+    })
+  }
+
+  function yo(e, t) {
+    if (e == t) postMessage({cmd: "processQueuedMainThreadWork"}); else if (Se) postMessage({
+      targetThread: e,
+      cmd: "processThreadQueue"
+    }); else {
+      var r = ft.pthreads[e], n = r && r.worker;
+      if (!n) return;
+      n.postMessage({cmd: "processThreadQueue"})
+    }
+    return 1
+  }
+
+  function wo(e) {
+    return e || pn("Cannot use deleted val. handle = " + e), Lt[e].value
+  }
+
+  function _o(e, t) {
+    var r = _t[e];
+    return void 0 === r && pn(t + " has unknown type " + Xn(e)), r
+  }
+
+  function bo(e, t, r) {
+    e = wo(e), t = _o(t, "emval::as");
+    var n = [], o = uo(n);
+    return $e[r >> 2] = o, t.toWireType(n, e)
+  }
+
+  function ko(e, t, r, n) {
+    var o, a;
+    (e = Ft[e])(t = wo(t), r = void 0 === (a = It[o = r]) ? cn(o) : a, null, n)
+  }
+
+  function To(e, t) {
+    for (var r = function (e, t) {
+      for (var r = new Array(e), n = 0; n < e; ++n) r[n] = _o($e[(t >> 2) + n], "parameter " + n);
+      return r
+    }(e, t), n = r[0], o = n.name + "_$" + r.slice(1).map((function (e) {
+      return e.name
+    })).join("_") + "$", a = ["retType"], i = [n], s = "", u = 0; u < e - 1; ++u) s += (0 !== u ? ", " : "") + "arg" + u, a.push("argType" + u), i.push(r[1 + u]);
+    var c = "return function " + ln("methodCaller_" + o) + "(handle, name, destructors, args) {\n", l = 0;
+    for (u = 0; u < e - 1; ++u) c += "    var arg" + u + " = argType" + u + ".readValueFromPointer(args" + (l ? "+" + l : "") + ");\n", l += r[u + 1].argPackAdvance;
+    c += "    var rv = handle[name](" + s + ");\n";
+    for (u = 0; u < e - 1; ++u) r[u + 1].deleteObject && (c += "    argType" + u + ".deleteObject(arg" + u + ");\n");
+    n.isVoid || (c += "    return retType.toWireType(destructors, rv);\n"), c += "};\n", a.push(c);
+    var d, f, p = to(Function, a).apply(null, i);
+    return d = p, f = Ft.length, Ft.push(d), f
+  }
+
+  function Do(e) {
+    e > 4 && (Lt[e].refcount += 1)
+  }
+
+  function So(e) {
+    Jn(Lt[e].value), ao(e)
+  }
+
+  function Co(e, t) {
+    return uo((e = _o(e, "_emval_take_value")).readValueFromPointer(t))
+  }
+
+  function Oo() {
+    Yr()
+  }
+
+  function Po() {
+    return void 0 === Po.start && (Po.start = Date.now()), 1e3 * (Date.now() - Po.start) | 0
+  }
+
+  function xo(e, t, r) {
+    var n = function (e, t) {
+      var r;
+      Nt.length = 0, t >>= 2;
+      for (; r = We[e++];) {
+        var n = r < 105;
+        n && 1 & t && t++, Nt.push(n ? Xe[t++ >> 1] : $e[t]), ++t
+      }
+      return Nt
+    }(t, r);
+    return lt[e].apply(null, n)
+  }
+
+  function Bo() {
+    De || Cr("Blocking on the main thread is very dangerous, see https://emscripten.org/docs/porting/pthreads.html#blocking-on-the-main-browser-thread")
+  }
+
+  function Mo(e, t) {
+  }
+
+  function Ro(e, t, r) {
+    if (e <= 0 || e > ze.length || !0 & e) return -28;
+    if (Te) {
+      if (Atomics.load($e, e >> 2) != t) return -6;
+      var n = performance.now(), o = n + r;
+      for (Atomics.exchange($e, br >> 2, e); ;) {
+        if ((n = performance.now()) > o) return Atomics.exchange($e, br >> 2, 0), -73;
+        if (0 == Atomics.exchange($e, br >> 2, 0)) break;
+        if (lr(), Atomics.load($e, e >> 2) != t) return -6;
+        Atomics.exchange($e, br >> 2, e)
+      }
+      return 0
+    }
+    var a = Atomics.wait($e, e >> 2, t, r);
+    if ("timed-out" === a) return -73;
+    if ("not-equal" === a) return -6;
+    if ("ok" === a) return 0;
+    throw"Atomics.wait returned an unexpected value " + a
+  }
+
+  function Lo(e, t) {
+    return (e >>> 0) + 4294967296 * t
+  }
+
+  function Io(e, t) {
+    if (e <= 0) return e;
+    var r = t <= 32 ? Math.abs(1 << t - 1) : Math.pow(2, t - 1);
+    return e >= r && (t <= 32 || e > r) && (e = -2 * r + e), e
+  }
+
+  function Fo(e, t) {
+    return e >= 0 ? e : t <= 32 ? 2 * Math.abs(1 << t - 1) + e : Math.pow(2, t) + e
+  }
+
+  function Uo(e) {
+    if (!e || !e.callee || !e.callee.name) return [null, "", ""];
+    e.callee.toString();
+    var t = e.callee.name, r = "(", n = !0;
+    for (var o in e) {
+      var a = e[o];
+      n || (r += ", "), n = !1, r += "number" == typeof a || "string" == typeof a ? a : "(" + typeof a + ")"
+    }
+    r += ")";
+    var i = e.callee.caller;
+    return n && (r = ""), [e = i ? i.arguments : [], t, r]
+  }
+
+  function No(e, t) {
+    24 & e && (t = t.replace(/\s+$/, ""), t += (t.length > 0 ? "\n" : "") + function (e) {
+      var t = tn(), r = t.lastIndexOf("_emscripten_log"), n = t.lastIndexOf("_emscripten_get_callstack"),
+        o = t.indexOf("\n", Math.max(r, n)) + 1;
+      t = t.slice(o), 32 & e && Cr("EM_LOG_DEMANGLE is deprecated; ignoring"), 8 & e && "undefined" == typeof emscripten_source_map && (Cr('Source map information is not available, emscripten_log with EM_LOG_C_STACK will be ignored. Build with "--pre-js $EMSCRIPTEN/src/emscripten-source-map.min.js" linker flag to add source map loading to code.'), e ^= 8, e |= 16);
+      var a = null;
+      if (128 & e) for (a = Uo(arguments); a[1].indexOf("_emscripten_") >= 0;) a = Uo(a[0]);
+      var i = t.split("\n");
+      t = "";
+      var s = new RegExp("\\s*(.*?)@(.*?):([0-9]+):([0-9]+)"), u = new RegExp("\\s*(.*?)@(.*):(.*)(:(.*))?"),
+        c = new RegExp("\\s*at (.*?) \\((.*):(.*):(.*)\\)");
+      for (var l in i) {
+        var d = i[l], f = "", p = "", h = 0, m = 0, A = c.exec(d);
+        if (A && 5 == A.length) f = A[1], p = A[2], h = A[3], m = A[4]; else {
+          if ((A = s.exec(d)) || (A = u.exec(d)), !(A && A.length >= 4)) {
+            t += d + "\n";
+            continue
+          }
+          f = A[1], p = A[2], h = A[3], m = 0 | A[4]
+        }
+        var g = !1;
+        if (8 & e) {
+          var v = emscripten_source_map.originalPositionFor({line: h, column: m});
+          (g = v && v.source) && (64 & e && (v.source = v.source.substring(v.source.replace(/\\/g, "/").lastIndexOf("/") + 1)), t += "    at " + f + " (" + v.source + ":" + v.line + ":" + v.column + ")\n")
+        }
+        (16 & e || !g) && (64 & e && (p = p.substring(p.replace(/\\/g, "/").lastIndexOf("/") + 1)), t += (g ? "     = " + f : "    at " + f) + " (" + p + ":" + h + ":" + m + ")\n"), 128 & e && a[0] && (a[1] == f && a[2].length > 0 && (t = t.replace(/\s+$/, ""), t += " with values: " + a[1] + a[2] + "\n"), a = Uo(a[0]))
+      }
+      return t.replace(/\s+$/, "")
+    }(e)), 1 & e ? 4 & e ? console.error(t) : 2 & e ? console.warn(t) : 512 & e ? console.info(t) : 256 & e ? console.debug(t) : console.log(t) : 6 & e ? Me(t) : Be(t)
+  }
+
+  function jo(e, t, r) {
+    No(e, Pr(function (e, t) {
+      var r = e, n = t;
+
+      function o(e) {
+        var t;
+        return n = function (e, t) {
+          return "double" !== t && "i64" !== t || 7 & e && (e += 4), e
+        }(n, e), "double" === e ? (t = Xe[n >> 3], n += 8) : "i64" == e ? (t = [$e[n >> 2], $e[n + 4 >> 2]], n += 8) : (e = "i32", t = $e[n >> 2], n += 4), t
+      }
+
+      for (var a, i, s, u, c = []; ;) {
+        var l = r;
+        if (0 === (a = ze[r >> 0])) break;
+        if (i = ze[r + 1 >> 0], 37 == a) {
+          var d = !1, f = !1, p = !1, h = !1, m = !1;
+          e:for (; ;) {
+            switch (i) {
+              case 43:
+                d = !0;
+                break;
+              case 45:
+                f = !0;
+                break;
+              case 35:
+                p = !0;
+                break;
+              case 48:
+                if (h) break e;
+                h = !0;
+                break;
+              case 32:
+                m = !0;
+                break;
+              default:
+                break e
+            }
+            r++, i = ze[r + 1 >> 0]
+          }
+          var A = 0;
+          if (42 == i) A = o("i32"), r++, i = ze[r + 1 >> 0]; else for (; i >= 48 && i <= 57;) A = 10 * A + (i - 48), r++, i = ze[r + 1 >> 0];
+          var g, v = !1, E = -1;
+          if (46 == i) {
+            if (E = 0, v = !0, r++, 42 == (i = ze[r + 1 >> 0])) E = o("i32"), r++; else for (; ;) {
+              var y = ze[r + 1 >> 0];
+              if (y < 48 || y > 57) break;
+              E = 10 * E + (y - 48), r++
+            }
+            i = ze[r + 1 >> 0]
+          }
+          switch (E < 0 && (E = 6, v = !1), String.fromCharCode(i)) {
+            case"h":
+              104 == ze[r + 2 >> 0] ? (r++, g = 1) : g = 2;
+              break;
+            case"l":
+              108 == ze[r + 2 >> 0] ? (r++, g = 8) : g = 4;
+              break;
+            case"L":
+            case"q":
+            case"j":
+              g = 8;
+              break;
+            case"z":
+            case"t":
+            case"I":
+              g = 4;
+              break;
+            default:
+              g = null
+          }
+          switch (g && r++, i = ze[r + 1 >> 0], String.fromCharCode(i)) {
+            case"d":
+            case"i":
+            case"u":
+            case"o":
+            case"x":
+            case"X":
+            case"p":
+              var w = 100 == i || 105 == i;
+              s = o("i" + 8 * (g = g || 4)), 8 == g && (s = 117 == i ? (s[0] >>> 0) + 4294967296 * (s[1] >>> 0) : Lo(s[0], s[1])), g <= 4 && (s = (w ? Io : Fo)(s & Math.pow(256, g) - 1, 8 * g));
+              var _ = Math.abs(s), b = "";
+              if (100 == i || 105 == i) D = Io(s, 8 * g).toString(10); else if (117 == i) D = Fo(s, 8 * g).toString(10), s = Math.abs(s); else if (111 == i) D = (p ? "0" : "") + _.toString(8); else if (120 == i || 88 == i) {
+                if (b = p && 0 != s ? "0x" : "", s < 0) {
+                  s = -s, D = (_ - 1).toString(16);
+                  for (var k = [], T = 0; T < D.length; T++) k.push((15 - parseInt(D[T], 16)).toString(16));
+                  for (D = k.join(""); D.length < 2 * g;) D = "f" + D
+                } else D = _.toString(16);
+                88 == i && (b = b.toUpperCase(), D = D.toUpperCase())
+              } else 112 == i && (0 === _ ? D = "(nil)" : (b = "0x", D = _.toString(16)));
+              if (v) for (; D.length < E;) D = "0" + D;
+              for (s >= 0 && (d ? b = "+" + b : m && (b = " " + b)), "-" == D.charAt(0) && (b = "-" + b, D = D.substr(1)); b.length + D.length < A;) f ? D += " " : h ? D = "0" + D : b = " " + b;
+              (D = b + D).split("").forEach((function (e) {
+                c.push(e.charCodeAt(0))
+              }));
+              break;
+            case"f":
+            case"F":
+            case"e":
+            case"E":
+            case"g":
+            case"G":
+              var D;
+              if (s = o("double"), isNaN(s)) D = "nan", h = !1; else if (isFinite(s)) {
+                var S = !1, C = Math.min(E, 20);
+                if (103 == i || 71 == i) {
+                  S = !0, E = E || 1;
+                  var O = parseInt(s.toExponential(C).split("e")[1], 10);
+                  E > O && O >= -4 ? (i = (103 == i ? "f" : "F").charCodeAt(0), E -= O + 1) : (i = (103 == i ? "e" : "E").charCodeAt(0), E--), C = Math.min(E, 20)
+                }
+                101 == i || 69 == i ? (D = s.toExponential(C), /[eE][-+]\d$/.test(D) && (D = D.slice(0, -1) + "0" + D.slice(-1))) : 102 != i && 70 != i || (D = s.toFixed(C), 0 === s && ((u = s) < 0 || 0 === u && 1 / u == -1 / 0) && (D = "-" + D));
+                var P = D.split("e");
+                if (S && !p) for (; P[0].length > 1 && -1 != P[0].indexOf(".") && ("0" == P[0].slice(-1) || "." == P[0].slice(-1));) P[0] = P[0].slice(0, -1); else for (p && -1 == D.indexOf(".") && (P[0] += "."); E > C++;) P[0] += "0";
+                D = P[0] + (P.length > 1 ? "e" + P[1] : ""), 69 == i && (D = D.toUpperCase()), s >= 0 && (d ? D = "+" + D : m && (D = " " + D))
+              } else D = (s < 0 ? "-" : "") + "inf", h = !1;
+              for (; D.length < A;) f ? D += " " : D = !h || "-" != D[0] && "+" != D[0] ? (h ? "0" : " ") + D : D[0] + "0" + D.slice(1);
+              i < 97 && (D = D.toUpperCase()), D.split("").forEach((function (e) {
+                c.push(e.charCodeAt(0))
+              }));
+              break;
+            case"s":
+              var x = o("i8*"), B = x ? er(x) : "(null)".length;
+              if (v && (B = Math.min(B, E)), !f) for (; B < A--;) c.push(32);
+              if (x) for (T = 0; T < B; T++) c.push(We[x++ >> 0]); else c = c.concat(ga("(null)".substr(0, B), !0));
+              if (f) for (; B < A--;) c.push(32);
+              break;
+            case"c":
+              for (f && c.push(o("i8")); --A > 0;) c.push(32);
+              f || c.push(o("i8"));
+              break;
+            case"n":
+              var M = o("i32*");
+              $e[M >> 2] = c.length;
+              break;
+            case"%":
+              c.push(a);
+              break;
+            default:
+              for (T = l; T < r + 2; T++) c.push(ze[T >> 0])
+          }
+          r += 2
+        } else c.push(a), r += 1
+      }
+      return c
+    }(t, r), 0))
+  }
+
+  function Go(e, t, r) {
+    We.copyWithin(e, t, t + r)
+  }
+
+  function zo(e, t) {
+    for (var r = arguments.length - 2, n = gr(), o = r, a = Er(8 * o), i = a >> 3, s = 0; s < r; s++) {
+      var u = arguments[2 + s];
+      Xe[i + s] = u
+    }
+    var c = hr(e, o, a, t);
+    return vr(n), c
+  }
+
+  function Wo(e, t, r) {
+    Ut.length = t;
+    for (var n = r >> 3, o = 0; o < t; o++) Ut[o] = Xe[n + o];
+    return (e < 0 ? lt[-e - 1] : Xt[e]).apply(null, Ut)
+  }
+
+  function Yo(e) {
+    Yr("OOM")
+  }
+
+  function Ho(e, t, r, n) {
+    var o, a, i, s = gr(), u = Er(12), c = 0;
+    t && (a = Rr(o = t) + 1, i = Jt(a), Mr(o, i, a), c = i), $e[u >> 2] = c, $e[u + 4 >> 2] = r, $e[u + 8 >> 2] = n, mr(0, e, 657457152, 0, c, u), vr(s)
+  }
+
+  function $o(e) {
+    var t;
+    return e = (t = e) > 2 ? xr(t) : t, Gt[e] || ("undefined" != typeof document ? document.querySelector(e) : void 0)
+  }
+
+  function Vo(e) {
+    return $o(e)
+  }
+
+  function Qo(e, t, r) {
+    var n = Vo(e);
+    if (!n) return -4;
+    if (n.canvasSharedPtr && ($e[n.canvasSharedPtr >> 2] = t, $e[n.canvasSharedPtr + 4 >> 2] = r), !n.offscreenCanvas && n.controlTransferredOffscreen) return n.canvasSharedPtr ? (function (e, t, r, n) {
+      Ho(e, t = t ? xr(t) : "", r, n)
+    }($e[n.canvasSharedPtr + 8 >> 2], e, t, r), 1) : -4;
+    n.offscreenCanvas && (n = n.offscreenCanvas);
+    var o = !1;
+    if (n.GLctxObject && n.GLctxObject.GLctx) {
+      var a = n.GLctxObject.GLctx.getParameter(2978);
+      o = 0 === a[0] && 0 === a[1] && a[2] === n.width && a[3] === n.height
+    }
+    return n.width = t, n.height = r, o && n.GLctxObject.GLctx.viewport(0, 0, t, r), 0
+  }
+
+  function Xo(e, t, r) {
+    return Se ? zo(3, 1, e, t, r) : Qo(e, t, r)
+  }
+
+  function qo(e, t, r) {
+    return Vo(e) ? Qo(e, t, r) : Xo(e, t, r)
+  }
+
+  function Zo(e) {
+  }
+
+  function Ko(e, t) {
+    return r = e, o = $e[(n = t >> 2) + 6], a = {
+      alpha: !!$e[n + 0],
+      depth: !!$e[n + 1],
+      stencil: !!$e[n + 2],
+      antialias: !!$e[n + 3],
+      premultipliedAlpha: !!$e[n + 4],
+      preserveDrawingBuffer: !!$e[n + 5],
+      powerPreference: Wt[o],
+      failIfMajorPerformanceCaveat: !!$e[n + 7],
+      majorVersion: $e[n + 8],
+      minorVersion: $e[n + 9],
+      enableExtensionsByDefault: $e[n + 10],
+      explicitSwapControl: $e[n + 11],
+      proxyContextToMainThread: $e[n + 12],
+      renderViaOffscreenBackBuffer: $e[n + 13]
+    }, (i = Vo(r)) ? a.explicitSwapControl ? 0 : zt.createContext(i, a) : 0;
+    var r, n, o, a, i
+  }
+
+  function Jo() {
+    if (!Jo.strings) {
+      var e = {
+        USER: "web_user",
+        LOGNAME: "web_user",
+        PATH: "/",
+        PWD: "/",
+        HOME: "/home/web_user",
+        LANG: ("object" == typeof navigator && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8",
+        _: be || "./this.program"
+      };
+      for (var t in Yt) e[t] = Yt[t];
+      var r = [];
+      for (var t in e) r.push(t + "=" + e[t]);
+      Jo.strings = r
+    }
+    return Jo.strings
+  }
+
+  function ea(e, t) {
+    if (Se) return zo(4, 1, e, t);
+    try {
+      var r = 0;
+      return Jo().forEach((function (n, o) {
+        var a = t + r;
+        $e[e + 4 * o >> 2] = a, function (e, t, r) {
+          for (var n = 0; n < e.length; ++n) ze[t++ >> 0] = e.charCodeAt(n);
+          r || (ze[t >> 0] = 0)
+        }(n, a), r += n.length + 1
+      })), 0
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), e.errno
+    }
+  }
+
+  function ta(e, t) {
+    if (Se) return zo(5, 1, e, t);
+    try {
+      var r = Jo();
+      $e[e >> 2] = r.length;
+      var n = 0;
+      return r.forEach((function (e) {
+        n += e.length + 1
+      })), $e[t >> 2] = n, 0
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), e.errno
+    }
+  }
+
+  function ra(e) {
+    if (Se) return zo(6, 1, e);
+    try {
+      var t = Et.getStreamFromFD(e);
+      return vt.close(t), 0
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), e.errno
+    }
+  }
+
+  function na(e, t) {
+    if (Se) return zo(7, 1, e, t);
+    try {
+      var r = Et.getStreamFromFD(e), n = r.tty ? 2 : vt.isDir(r.mode) ? 3 : vt.isLink(r.mode) ? 7 : 4;
+      return ze[t >> 0] = n, 0
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), e.errno
+    }
+  }
+
+  function oa(e, t, r, n) {
+    if (Se) return zo(8, 1, e, t, r, n);
+    try {
+      var o = Et.getStreamFromFD(e), a = Et.doReadv(o, t, r);
+      return $e[n >> 2] = a, 0
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), e.errno
+    }
+  }
+
+  function aa(e, t, r, n, o) {
+    if (Se) return zo(9, 1, e, t, r, n, o);
+    try {
+      var a = Et.getStreamFromFD(e), i = 4294967296 * r + (t >>> 0), s = 9007199254740992;
+      return i <= -s || i >= s ? -61 : (vt.llseek(a, i, n), ct = [a.position >>> 0, (ut = a.position, +Math.abs(ut) >= 1 ? ut > 0 ? (0 | Math.min(+Math.floor(ut / 4294967296), 4294967295)) >>> 0 : ~~+Math.ceil((ut - +(~~ut >>> 0)) / 4294967296) >>> 0 : 0)], $e[o >> 2] = ct[0], $e[o + 4 >> 2] = ct[1], a.getdents && 0 === i && 0 === n && (a.getdents = null), 0)
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), e.errno
+    }
+  }
+
+  function ia(e, t, r, n) {
+    if (Se) return zo(10, 1, e, t, r, n);
+    try {
+      var o = Et.getStreamFromFD(e), a = Et.doWritev(o, t, r);
+      return $e[n >> 2] = a, 0
+    } catch (e) {
+      return void 0 !== vt && e instanceof vt.ErrnoError || Yr(e), e.errno
+    }
+  }
+
+  function sa(e) {
+    var t = Date.now();
+    return $e[e >> 2] = t / 1e3 | 0, $e[e + 4 >> 2] = t % 1e3 * 1e3 | 0, 0
+  }
+
+  function ua() {
+    if (Se) return zo(11, 1);
+    if (!ua.called) {
+      ua.called = !0;
+      var e = (new Date).getFullYear(), t = new Date(e, 0, 1), r = new Date(e, 6, 1), n = t.getTimezoneOffset(),
+        o = r.getTimezoneOffset(), a = Math.max(n, o);
+      $e[ir() >> 2] = 60 * a, $e[ar() >> 2] = Number(n != o);
+      var i = l(t), s = l(r), u = Gr(i), c = Gr(s);
+      o < n ? ($e[or() >> 2] = u, $e[or() + 4 >> 2] = c) : ($e[or() >> 2] = c, $e[or() + 4 >> 2] = u)
+    }
+
+    function l(e) {
+      var t = e.toTimeString().match(/\(([A-Za-z ]+)\)$/);
+      return t ? t[1] : "GMT"
+    }
+  }
+
+  function ca(e) {
+    var t = ft.threadExitHandlers.pop();
+    e && t()
+  }
+
+  function la(e, t) {
+    ft.threadExitHandlers.push((function () {
+      Ze.get(e)(t)
+    }))
+  }
+
+  function da(e) {
+    if (Se) throw"Internal Error! spawnThread() can only ever be called from main application thread!";
+    var t = ft.getNewWorker();
+    if (void 0 !== t.pthread) throw"Internal error!";
+    if (!e.pthread_ptr) throw"Internal error, no pthread ptr!";
+    ft.runningWorkers.push(t);
+    for (var r = Jt(512), n = 0; n < 128; ++n) $e[r + 4 * n >> 2] = 0;
+    var o = e.stackBase + e.stackSize, a = ft.pthreads[e.pthread_ptr] = {
+      worker: t,
+      stackBase: e.stackBase,
+      stackSize: e.stackSize,
+      allocatedOwnStack: e.allocatedOwnStack,
+      threadInfoStruct: e.pthread_ptr
+    }, i = a.threadInfoStruct >> 2;
+    Atomics.store(Ve, i + 16, e.detached), Atomics.store(Ve, i + 25, r), Atomics.store(Ve, i + 10, a.threadInfoStruct), Atomics.store(Ve, i + 20, e.stackSize), Atomics.store(Ve, i + 19, o), Atomics.store(Ve, i + 26, e.stackSize), Atomics.store(Ve, i + 28, o), Atomics.store(Ve, i + 29, e.detached);
+    var s = nr() + 40;
+    Atomics.store(Ve, i + 43, s), t.pthread = a;
+    var u = {
+      cmd: "run",
+      start_routine: e.startRoutine,
+      arg: e.arg,
+      threadInfoStruct: e.pthread_ptr,
+      stackBase: e.stackBase,
+      stackSize: e.stackSize
+    };
+    t.runPthread = function () {
+      u.time = performance.now(), t.postMessage(u, e.transferList)
+    }, t.loaded && (t.runPthread(), delete t.runPthread)
+  }
+
+  function fa(e, t, r, n) {
+    if ("undefined" == typeof SharedArrayBuffer) return Me("Current environment does not support SharedArrayBuffer, pthreads are not available!"), 6;
+    if (!e) return Me("pthread_create called with a null thread pointer!"), 28;
+    var o = [];
+    if (Se && 0 === o.length) return pr(687865856, e, t, r, n);
+    var a = 0, i = 0, s = 0;
+    t && -1 != t ? (a = $e[t >> 2], a += 81920, i = $e[t + 8 >> 2], s = 0 !== $e[t + 12 >> 2]) : a = 2097152;
+    var u = 0 == i;
+    u ? i = wr(16, a) : Or((i -= a) > 0);
+    for (var c = Jt(228), l = 0; l < 57; ++l) Ve[(c >> 2) + l] = 0;
+    $e[e >> 2] = c, $e[c + 12 >> 2] = c;
+    var d = c + 152;
+    $e[d >> 2] = d;
+    var f = {
+      stackBase: i,
+      stackSize: a,
+      allocatedOwnStack: u,
+      detached: s,
+      startRoutine: r,
+      pthread_ptr: c,
+      arg: n,
+      transferList: o
+    };
+    return Se ? (f.cmd = "spawnThread", postMessage(f, o)) : da(f), 0
+  }
+
+  function pa() {
+    if (Se) {
+      var e = sr();
+      if (e) if (!Atomics.load(Ve, e + 56 >> 2)) if (2 == Atomics.load(Ve, e + 0 >> 2)) throw"Canceled!"
+    }
+  }
+
+  function ha(e, t) {
+    return function (e, t, r) {
+      if (!e) return Me("pthread_join attempted on a null thread pointer!"), dt.ESRCH;
+      if (Se && sr() == e) return Me("PThread " + e + " is attempting to join to itself!"), dt.EDEADLK;
+      if (!Se && ur() == e) return Me("Main thread " + e + " is attempting to join to itself!"), dt.EDEADLK;
+      if ($e[e + 12 >> 2] !== e) return Me("pthread_join attempted on thread " + e + ", which does not point to a valid thread, or does not exist anymore!"), dt.ESRCH;
+      if (Atomics.load(Ve, e + 64 >> 2)) return Me("Attempted to join thread " + e + ", which was already detached!"), dt.EINVAL;
+      for (r && Bo(); ;) {
+        var n = Atomics.load(Ve, e + 0 >> 2);
+        if (1 == n) {
+          var o = Atomics.load(Ve, e + 4 >> 2);
+          return t && ($e[t >> 2] = o), Atomics.store(Ve, e + 64 >> 2, 1), Se ? postMessage({
+            cmd: "cleanupThread",
+            thread: e
+          }) : Zr(e), 0
+        }
+        if (!r) return dt.EBUSY;
+        pa(), Se || lr(), Ro(e + 0, n, Se ? 100 : 1)
+      }
+    }(e, t, !0)
+  }
+
+  function ma(e) {
+    Le(0 | e)
+  }
+
+  function Aa(e) {
+    if (Se) return zo(12, 1, e);
+    switch (e) {
+      case 30:
+        return 16384;
+      case 85:
+        return We.length / 16384;
+      case 132:
+      case 133:
+      case 12:
+      case 137:
+      case 138:
+      case 15:
+      case 235:
+      case 16:
+      case 17:
+      case 18:
+      case 19:
+      case 20:
+      case 149:
+      case 13:
+      case 10:
+      case 236:
+      case 153:
+      case 9:
+      case 21:
+      case 22:
+      case 159:
+      case 154:
+      case 14:
+      case 77:
+      case 78:
+      case 139:
+      case 82:
+      case 68:
+      case 67:
+      case 164:
+      case 11:
+      case 29:
+      case 47:
+      case 48:
+      case 95:
+      case 52:
+      case 51:
+      case 46:
+        return 200809;
+      case 27:
+      case 246:
+      case 127:
+      case 128:
+      case 23:
+      case 24:
+      case 160:
+      case 161:
+      case 181:
+      case 182:
+      case 242:
+      case 183:
+      case 184:
+      case 243:
+      case 244:
+      case 245:
+      case 165:
+      case 178:
+      case 179:
+      case 49:
+      case 50:
+      case 168:
+      case 169:
+      case 175:
+      case 170:
+      case 171:
+      case 172:
+      case 97:
+      case 76:
+      case 32:
+      case 173:
+      case 35:
+      case 80:
+      case 81:
+      case 79:
+        return -1;
+      case 176:
+      case 177:
+      case 7:
+      case 155:
+      case 8:
+      case 157:
+      case 125:
+      case 126:
+      case 92:
+      case 93:
+      case 129:
+      case 130:
+      case 131:
+      case 94:
+      case 91:
+        return 1;
+      case 74:
+      case 60:
+      case 69:
+      case 70:
+      case 4:
+        return 1024;
+      case 31:
+      case 42:
+      case 72:
+        return 32;
+      case 87:
+      case 26:
+      case 33:
+        return 2147483647;
+      case 34:
+      case 1:
+        return 47839;
+      case 38:
+      case 36:
+        return 99;
+      case 43:
+      case 37:
+        return 2048;
+      case 0:
+        return 2097152;
+      case 3:
+        return 65536;
+      case 28:
+        return 32768;
+      case 44:
+        return 32767;
+      case 75:
+        return 16384;
+      case 39:
+        return 1e3;
+      case 89:
+        return 700;
+      case 71:
+        return 256;
+      case 40:
+        return 255;
+      case 2:
+        return 100;
+      case 180:
+        return 64;
+      case 25:
+        return 20;
+      case 5:
+        return 16;
+      case 6:
+        return 6;
+      case 73:
+        return 4;
+      case 84:
+        return "object" == typeof navigator && navigator.hardwareConcurrency || 1
+    }
+    return nn(28), -1
+  }
+
+  function ga(e, t, r) {
+    var n = r > 0 ? r : Rr(e) + 1, o = new Array(n), a = Br(e, o, 0, o.length);
+    return t && (o.length = a), o
+  }
+
+  function va(e) {
+    this.name = "ExitStatus", this.message = "Program terminated with exit(" + e + ")", this.status = e
+  }
+
+  function Ea(e) {
+    function t() {
+      kr || (kr = !0, Ee.calledRun = !0, je || (!0, Ee.noFSInit || vt.init.initialized || vt.init(), At.init(), Xr(Je), Se || (vt.ignorePermissions = !1, Xr(et)), Ee.onRuntimeInitialized && Ee.onRuntimeInitialized(), function () {
+        if (!Se) {
+          if (Ee.postRun) for ("function" == typeof Ee.postRun && (Ee.postRun = [Ee.postRun]); Ee.postRun.length;) e = Ee.postRun.shift(), rt.unshift(e);
+          var e;
+          Xr(rt)
+        }
+      }()))
+    }
+
+    e = e || _e, nt > 0 || (Se ? postMessage({cmd: "loaded"}) : (!function () {
+      if (!Se) {
+        if (Ee.preRun) for ("function" == typeof Ee.preRun && (Ee.preRun = [Ee.preRun]); Ee.preRun.length;) e = Ee.preRun.shift(), Ke.unshift(e);
+        var e;
+        Xr(Ke)
+      }
+    }(), nt > 0 || (Ee.setStatus ? (Ee.setStatus("Running..."), setTimeout((function () {
+      setTimeout((function () {
+        Ee.setStatus("")
+      }), 1), t()
+    }), 1)) : t())))
+  }
+
+  function ya(e, t) {
+    if (!t || !Fe || 0 !== e) {
+      if (!t && Se) throw postMessage({cmd: "exitProcess", returnCode: e}), new va(e);
+      Fe || (ft.terminateAllThreads(), e, Se || !0, Ee.onExit && Ee.onExit(e), je = !0), ke(e, new va(e))
+    }
+  }
+
+  function wa() {
+    for (we in {}, ye = {}, Ee = void 0 !== Ee ? Ee : {}) Ee.hasOwnProperty(we) && (ye[we] = Ee[we]);
+    for (we in _e = [], be = "./this.program", ke = function (e, t) {
+      throw t
+    }, Te = !1, De = !0, !1, (Se = Ee.ENVIRONMENT_IS_PTHREAD || !1) && (Ge = Ee.buffer), Ce = "undefined" != typeof document && document.currentScript ? document.currentScript.src : void 0, De && (Ce = self.location.href), Oe = "", (Te || De) && (De ? Oe = self.location.href : "undefined" != typeof document && document.currentScript && (Oe = document.currentScript.src), Oe = 0 !== Oe.indexOf("blob:") ? Oe.substr(0, Oe.lastIndexOf("/") + 1) : "", Pe = function (e) {
+      var t = new XMLHttpRequest;
+      return t.open("GET", e, !1), t.send(null), t.responseText
+    }, De && (xe = function (e) {
+      var t = new XMLHttpRequest;
+      return t.open("GET", e, !1), t.responseType = "arraybuffer", t.send(null), new Uint8Array(t.response)
+    }), function (e, t, r) {
+      var n = new XMLHttpRequest;
+      n.open("GET", e, !0), n.responseType = "arraybuffer", n.onload = function () {
+        200 == n.status || 0 == n.status && n.response ? t(n.response) : r()
+      }, n.onerror = r, n.send(null)
+    }, function (e) {
+      document.title = e
+    }), Be = Ee.print || console.log.bind(console), Me = Ee.printErr || console.warn.bind(console), ye) ye.hasOwnProperty(we) && (Ee[we] = ye[we]);
+    if (ye = null, Ee.arguments && (_e = Ee.arguments), Ee.thisProgram && (be = Ee.thisProgram), Ee.quit && (ke = Ee.quit), Re = 16, 0, Le = function (e) {
+      e
+    }, Atomics.load, Atomics.store, Atomics.compareExchange, Ee.wasmBinary && (Ie = Ee.wasmBinary), Fe = Ee.noExitRuntime || !0, "object" != typeof WebAssembly && Yr("no native wasm support detected"), je = !1, qe = Ee.INITIAL_MEMORY || 67108864, Se) Ue = Ee.wasmMemory, Ge = Ee.buffer; else if (Ee.wasmMemory) Ue = Ee.wasmMemory; else if (!((Ue = new WebAssembly.Memory({
+      initial: qe / 65536,
+      maximum: qe / 65536,
+      shared: !0
+    })).buffer instanceof SharedArrayBuffer)) throw Me("requested a shared WebAssembly.Memory but the returned buffer is not a SharedArrayBuffer, indicating that while the browser has SharedArrayBuffer it does not have WebAssembly threads support - you may need to set a flag"), Error("bad memory");
+    var t;
+    if (Ue && (Ge = Ue.buffer), qe = Ge.byteLength, Ge = t = Ge, Ee.HEAP8 = ze = new Int8Array(t), Ee.HEAP16 = Ye = new Int16Array(t), Ee.HEAP32 = $e = new Int32Array(t), Ee.HEAPU8 = We = new Uint8Array(t), Ee.HEAPU16 = He = new Uint16Array(t), Ee.HEAPU32 = Ve = new Uint32Array(t), Ee.HEAPF32 = Qe = new Float32Array(t), Ee.HEAPF64 = Xe = new Float64Array(t), Ke = [], Je = [], et = [], tt = [], rt = [], !1, !1, Se || Je.push({
+      func: function () {
+        Zt()
+      }
+    }), Se && !0, nt = 0, ot = null, at = null, Ee.preloadedImages = {}, Ee.preloadedAudios = {}, it = "data:application/octet-stream;base64,", Hr(st = "ff.wasm") || (st = Sr(st)), lt = {
+      155132: function () {
+        throw"Canceled!"
+      }, 155395: function (e, t) {
+        setTimeout((function () {
+          fr(e, t)
+        }), 0)
+      }
+    }, dt = {
+      EPERM: 63,
+      ENOENT: 44,
+      ESRCH: 71,
+      EINTR: 27,
+      EIO: 29,
+      ENXIO: 60,
+      E2BIG: 1,
+      ENOEXEC: 45,
+      EBADF: 8,
+      ECHILD: 12,
+      EAGAIN: 6,
+      EWOULDBLOCK: 6,
+      ENOMEM: 48,
+      EACCES: 2,
+      EFAULT: 21,
+      ENOTBLK: 105,
+      EBUSY: 10,
+      EEXIST: 20,
+      EXDEV: 75,
+      ENODEV: 43,
+      ENOTDIR: 54,
+      EISDIR: 31,
+      EINVAL: 28,
+      ENFILE: 41,
+      EMFILE: 33,
+      ENOTTY: 59,
+      ETXTBSY: 74,
+      EFBIG: 22,
+      ENOSPC: 51,
+      ESPIPE: 70,
+      EROFS: 69,
+      EMLINK: 34,
+      EPIPE: 64,
+      EDOM: 18,
+      ERANGE: 68,
+      ENOMSG: 49,
+      EIDRM: 24,
+      ECHRNG: 106,
+      EL2NSYNC: 156,
+      EL3HLT: 107,
+      EL3RST: 108,
+      ELNRNG: 109,
+      EUNATCH: 110,
+      ENOCSI: 111,
+      EL2HLT: 112,
+      EDEADLK: 16,
+      ENOLCK: 46,
+      EBADE: 113,
+      EBADR: 114,
+      EXFULL: 115,
+      ENOANO: 104,
+      EBADRQC: 103,
+      EBADSLT: 102,
+      EDEADLOCK: 16,
+      EBFONT: 101,
+      ENOSTR: 100,
+      ENODATA: 116,
+      ETIME: 117,
+      ENOSR: 118,
+      ENONET: 119,
+      ENOPKG: 120,
+      EREMOTE: 121,
+      ENOLINK: 47,
+      EADV: 122,
+      ESRMNT: 123,
+      ECOMM: 124,
+      EPROTO: 65,
+      EMULTIHOP: 36,
+      EDOTDOT: 125,
+      EBADMSG: 9,
+      ENOTUNIQ: 126,
+      EBADFD: 127,
+      EREMCHG: 128,
+      ELIBACC: 129,
+      ELIBBAD: 130,
+      ELIBSCN: 131,
+      ELIBMAX: 132,
+      ELIBEXEC: 133,
+      ENOSYS: 52,
+      ENOTEMPTY: 55,
+      ENAMETOOLONG: 37,
+      ELOOP: 32,
+      EOPNOTSUPP: 138,
+      EPFNOSUPPORT: 139,
+      ECONNRESET: 15,
+      ENOBUFS: 42,
+      EAFNOSUPPORT: 5,
+      EPROTOTYPE: 67,
+      ENOTSOCK: 57,
+      ENOPROTOOPT: 50,
+      ESHUTDOWN: 140,
+      ECONNREFUSED: 14,
+      EADDRINUSE: 3,
+      ECONNABORTED: 13,
+      ENETUNREACH: 40,
+      ENETDOWN: 38,
+      ETIMEDOUT: 73,
+      EHOSTDOWN: 142,
+      EHOSTUNREACH: 23,
+      EINPROGRESS: 26,
+      EALREADY: 7,
+      EDESTADDRREQ: 17,
+      EMSGSIZE: 35,
+      EPROTONOSUPPORT: 66,
+      ESOCKTNOSUPPORT: 137,
+      EADDRNOTAVAIL: 4,
+      ENETRESET: 39,
+      EISCONN: 30,
+      ENOTCONN: 53,
+      ETOOMANYREFS: 141,
+      EUSERS: 136,
+      EDQUOT: 19,
+      ESTALE: 72,
+      ENOTSUP: 138,
+      ENOMEDIUM: 148,
+      EILSEQ: 25,
+      EOVERFLOW: 61,
+      ECANCELED: 11,
+      ENOTRECOVERABLE: 56,
+      EOWNERDEAD: 62,
+      ESTRPIPE: 135
+    }, Ee._emscripten_futex_wake = qr, ft = {
+      unusedWorkers: [], runningWorkers: [], initMainThreadBlock: function () {
+      }, initRuntime: function () {
+        for (var e = Jt(228), t = 0; t < 57; ++t) Ve[e / 4 + t] = 0;
+        $e[e + 12 >> 2] = e;
+        var r = e + 152;
+        $e[r >> 2] = r;
+        var n = Jt(512);
+        for (t = 0; t < 128; ++t) Ve[n / 4 + t] = 0;
+        Atomics.store(Ve, e + 100 >> 2, n), Atomics.store(Ve, e + 40 >> 2, e), Ar(e, !De, 1), dr(e)
+      }, initWorker: function () {
+      }, pthreads: {}, threadExitHandlers: [], setThreadStatus: function () {
+      }, runExitHandlers: function () {
+        for (; ft.threadExitHandlers.length > 0;) ft.threadExitHandlers.pop()();
+        Se && sr() && cr()
+      }, threadExit: function (e) {
+        var t = sr();
+        t && (Atomics.store(Ve, t + 4 >> 2, e), Atomics.store(Ve, t + 0 >> 2, 1), Atomics.store(Ve, t + 56 >> 2, 1), Atomics.store(Ve, t + 60 >> 2, 0), ft.runExitHandlers(), qr(t + 0, 2147483647), Ar(0, 0, 0), Se && postMessage({cmd: "exit"}))
+      }, threadCancel: function () {
+        ft.runExitHandlers();
+        var e = sr();
+        Atomics.store(Ve, e + 4 >> 2, -1), Atomics.store(Ve, e + 0 >> 2, 1), qr(e + 0, 2147483647), Ar(0, 0, 0), postMessage({cmd: "cancelDone"})
+      }, terminateAllThreads: function () {
+        for (var e in ft.pthreads) {
+          (n = ft.pthreads[e]) && n.worker && ft.returnWorkerToPool(n.worker)
+        }
+        ft.pthreads = {};
+        for (var t = 0; t < ft.unusedWorkers.length; ++t) {
+          (r = ft.unusedWorkers[t]).terminate()
+        }
+        ft.unusedWorkers = [];
+        for (t = 0; t < ft.runningWorkers.length; ++t) {
+          var r, n = (r = ft.runningWorkers[t]).pthread;
+          ft.freeThreadData(n), r.terminate()
+        }
+        ft.runningWorkers = []
+      }, freeThreadData: function (e) {
+        if (e) {
+          if (e.threadInfoStruct) {
+            var t = $e[e.threadInfoStruct + 100 >> 2];
+            $e[e.threadInfoStruct + 100 >> 2] = 0, Kt(t), Kt(e.threadInfoStruct)
+          }
+          e.threadInfoStruct = 0, e.allocatedOwnStack && e.stackBase && Kt(e.stackBase), e.stackBase = 0, e.worker && (e.worker.pthread = null)
+        }
+      }, returnWorkerToPool: function (e) {
+        ft.runWithoutMainThreadQueuedCalls((function () {
+          delete ft.pthreads[e.pthread.threadInfoStruct], ft.unusedWorkers.push(e), ft.runningWorkers.splice(ft.runningWorkers.indexOf(e), 1), ft.freeThreadData(e.pthread), e.pthread = void 0
+        }))
+      }, runWithoutMainThreadQueuedCalls: function (e) {
+        $e[_r >> 2] = 0;
+        try {
+          e()
+        } finally {
+          $e[_r >> 2] = 1
+        }
+      }, receiveObjectTransfer: function (e) {
+      }, loadWasmModuleToWorker: function (e, t) {
+        e.onmessage = function (r) {
+          var n = r.data, o = n.cmd;
+          if (e.pthread && (ft.currentProxiedOperationCallerThread = e.pthread.threadInfoStruct), n.targetThread && n.targetThread != sr()) {
+            var a = ft.pthreads[n.targetThread];
+            return a ? a.worker.postMessage(r.data, n.transferList) : console.error('Internal error! Worker sent a message "' + o + '" to target pthread ' + n.targetThread + ", but that thread no longer exists!"), void (ft.currentProxiedOperationCallerThread = void 0)
+          }
+          if ("processQueuedMainThreadWork" === o) lr(); else if ("spawnThread" === o) da(r.data); else if ("cleanupThread" === o) Zr(n.thread); else if ("killThread" === o) !function (e) {
+            if (Se) throw"Internal Error! killThread() can only ever be called from main application thread!";
+            if (!e) throw"Internal Error! Null pthread_ptr in killThread!";
+            $e[e + 12 >> 2] = 0;
+            var t = ft.pthreads[e];
+            t.worker.terminate(), ft.freeThreadData(t), ft.runningWorkers.splice(ft.runningWorkers.indexOf(t.worker), 1), t.worker.pthread = void 0
+          }(n.thread); else if ("cancelThread" === o) !function (e) {
+            if (Se) throw"Internal Error! cancelThread() can only ever be called from main application thread!";
+            if (!e) throw"Internal Error! Null pthread_ptr in cancelThread!";
+            ft.pthreads[e].worker.postMessage({cmd: "cancel"})
+          }(n.thread); else if ("loaded" === o) e.loaded = !0, t && t(e), e.runPthread && (e.runPthread(), delete e.runPthread); else if ("print" === o) Be("Thread " + n.threadId + ": " + n.text); else if ("printErr" === o) Me("Thread " + n.threadId + ": " + n.text); else if ("alert" === o) alert("Thread " + n.threadId + ": " + n.text); else if ("exit" === o) {
+            e.pthread && Atomics.load(Ve, e.pthread.threadInfoStruct + 64 >> 2) && ft.returnWorkerToPool(e)
+          } else if ("exitProcess" === o) try {
+            ya(n.returnCode)
+          } catch (r) {
+            if (r instanceof va) return;
+            throw r
+          } else "cancelDone" === o ? ft.returnWorkerToPool(e) : "objectTransfer" === o ? ft.receiveObjectTransfer(r.data) : "setimmediate" === r.data.target ? e.postMessage(r.data) : Me("worker sent an unknown command " + o);
+          ft.currentProxiedOperationCallerThread = void 0
+        }, e.onerror = function (e) {
+          Me("pthread sent an error! " + e.filename + ":" + e.lineno + ": " + e.message)
+        }, e.postMessage({cmd: "load", urlOrBlob: Ee.mainScriptUrlOrBlob || Ce, wasmMemory: Ue, wasmModule: Ne})
+      }, allocateUnusedWorker: function () {
+        var e = Sr("ff.worker.js");
+        ft.unusedWorkers.push(new Worker(e))
+      }, getNewWorker: function () {
+        return 0 == ft.unusedWorkers.length && (ft.allocateUnusedWorker(), ft.loadWasmModuleToWorker(ft.unusedWorkers[0])), ft.unusedWorkers.length > 0 ? ft.unusedWorkers.pop() : null
+      }, busySpinWait: function (e) {
+        for (var t = performance.now() + e; performance.now() < t;) ;
+      }
+    }, Ee.establishStackSpace = Kr, Ee.getNoExitRuntime = Jr, Ee.invokeEntryPoint = en, pt = Se ? function () {
+      return performance.now() - Ee.__performance_now_clock_drift
+    } : function () {
+      return performance.now()
+    }, ht = {
+      splitPath: function (e) {
+        return /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(e).slice(1)
+      }, normalizeArray: function (e, t) {
+        for (var r = 0, n = e.length - 1; n >= 0; n--) {
+          var o = e[n];
+          "." === o ? e.splice(n, 1) : ".." === o ? (e.splice(n, 1), r++) : r && (e.splice(n, 1), r--)
+        }
+        if (t) for (; r; r--) e.unshift("..");
+        return e
+      }, normalize: function (e) {
+        var t = "/" === e.charAt(0), r = "/" === e.substr(-1);
+        return (e = ht.normalizeArray(e.split("/").filter((function (e) {
+          return !!e
+        })), !t).join("/")) || t || (e = "."), e && r && (e += "/"), (t ? "/" : "") + e
+      }, dirname: function (e) {
+        var t = ht.splitPath(e), r = t[0], n = t[1];
+        return r || n ? (n && (n = n.substr(0, n.length - 1)), r + n) : "."
+      }, basename: function (e) {
+        if ("/" === e) return "/";
+        var t = (e = (e = ht.normalize(e)).replace(/\/$/, "")).lastIndexOf("/");
+        return -1 === t ? e : e.substr(t + 1)
+      }, extname: function (e) {
+        return ht.splitPath(e)[3]
+      }, join: function () {
+        var e = Array.prototype.slice.call(arguments, 0);
+        return ht.normalize(e.join("/"))
+      }, join2: function (e, t) {
+        return ht.normalize(e + "/" + t)
+      }
+    }, mt = {
+      resolve: function () {
+        for (var e = "", t = !1, r = arguments.length - 1; r >= -1 && !t; r--) {
+          var n = r >= 0 ? arguments[r] : vt.cwd();
+          if ("string" != typeof n) throw new TypeError("Arguments to path.resolve must be strings");
+          if (!n) return "";
+          e = n + "/" + e, t = "/" === n.charAt(0)
+        }
+        return (t ? "/" : "") + (e = ht.normalizeArray(e.split("/").filter((function (e) {
+          return !!e
+        })), !t).join("/")) || "."
+      }, relative: function (e, t) {
+        function r(e) {
+          for (var t = 0; t < e.length && "" === e[t]; t++) ;
+          for (var r = e.length - 1; r >= 0 && "" === e[r]; r--) ;
+          return t > r ? [] : e.slice(t, r - t + 1)
+        }
+
+        e = mt.resolve(e).substr(1), t = mt.resolve(t).substr(1);
+        for (var n = r(e.split("/")), o = r(t.split("/")), a = Math.min(n.length, o.length), i = a, s = 0; s < a; s++) if (n[s] !== o[s]) {
+          i = s;
+          break
+        }
+        var u = [];
+        for (s = i; s < n.length; s++) u.push("..");
+        return (u = u.concat(o.slice(i))).join("/")
+      }
+    }, At = {
+      ttys: [], init: function () {
+      }, shutdown: function () {
+      }, register: function (e, t) {
+        At.ttys[e] = {input: [], output: [], ops: t}, vt.registerDevice(e, At.stream_ops)
+      }, stream_ops: {
+        open: function (e) {
+          var t = At.ttys[e.node.rdev];
+          if (!t) throw new vt.ErrnoError(43);
+          e.tty = t, e.seekable = !1
+        }, close: function (e) {
+          e.tty.ops.flush(e.tty)
+        }, flush: function (e) {
+          e.tty.ops.flush(e.tty)
+        }, read: function (e, t, r, n, o) {
+          if (!e.tty || !e.tty.ops.get_char) throw new vt.ErrnoError(60);
+          for (var a = 0, i = 0; i < n; i++) {
+            var s;
+            try {
+              s = e.tty.ops.get_char(e.tty)
+            } catch (e) {
+              throw new vt.ErrnoError(29)
+            }
+            if (void 0 === s && 0 === a) throw new vt.ErrnoError(6);
+            if (null == s) break;
+            a++, t[r + i] = s
+          }
+          return a && (e.node.timestamp = Date.now()), a
+        }, write: function (e, t, r, n, o) {
+          if (!e.tty || !e.tty.ops.put_char) throw new vt.ErrnoError(60);
+          try {
+            for (var a = 0; a < n; a++) e.tty.ops.put_char(e.tty, t[r + a])
+          } catch (e) {
+            throw new vt.ErrnoError(29)
+          }
+          return n && (e.node.timestamp = Date.now()), a
+        }
+      }, default_tty_ops: {
+        get_char: function (e) {
+          if (!e.input.length) {
+            var t = null;
+            if ("undefined" != typeof window && "function" == typeof window.prompt ? null !== (t = window.prompt("Input: ")) && (t += "\n") : "function" == typeof readline && null !== (t = readline()) && (t += "\n"), !t) return null;
+            e.input = ga(t, !0)
+          }
+          return e.input.shift()
+        }, put_char: function (e, t) {
+          null === t || 10 === t ? (Be(Pr(e.output, 0)), e.output = []) : 0 != t && e.output.push(t)
+        }, flush: function (e) {
+          e.output && e.output.length > 0 && (Be(Pr(e.output, 0)), e.output = [])
+        }
+      }, default_tty1_ops: {
+        put_char: function (e, t) {
+          null === t || 10 === t ? (Me(Pr(e.output, 0)), e.output = []) : 0 != t && e.output.push(t)
+        }, flush: function (e) {
+          e.output && e.output.length > 0 && (Me(Pr(e.output, 0)), e.output = [])
+        }
+      }
+    }, gt = {
+      ops_table: null, mount: function (e) {
+        return gt.createNode(null, "/", 16895, 0)
+      }, createNode: function (e, t, r, n) {
+        if (vt.isBlkdev(r) || vt.isFIFO(r)) throw new vt.ErrnoError(63);
+        gt.ops_table || (gt.ops_table = {
+          dir: {
+            node: {
+              getattr: gt.node_ops.getattr,
+              setattr: gt.node_ops.setattr,
+              lookup: gt.node_ops.lookup,
+              mknod: gt.node_ops.mknod,
+              rename: gt.node_ops.rename,
+              unlink: gt.node_ops.unlink,
+              rmdir: gt.node_ops.rmdir,
+              readdir: gt.node_ops.readdir,
+              symlink: gt.node_ops.symlink
+            }, stream: {llseek: gt.stream_ops.llseek}
+          },
+          file: {
+            node: {getattr: gt.node_ops.getattr, setattr: gt.node_ops.setattr},
+            stream: {
+              llseek: gt.stream_ops.llseek,
+              read: gt.stream_ops.read,
+              write: gt.stream_ops.write,
+              allocate: gt.stream_ops.allocate,
+              mmap: gt.stream_ops.mmap,
+              msync: gt.stream_ops.msync
+            }
+          },
+          link: {
+            node: {getattr: gt.node_ops.getattr, setattr: gt.node_ops.setattr, readlink: gt.node_ops.readlink},
+            stream: {}
+          },
+          chrdev: {node: {getattr: gt.node_ops.getattr, setattr: gt.node_ops.setattr}, stream: vt.chrdev_stream_ops}
+        });
+        var o = vt.createNode(e, t, r, n);
+        return vt.isDir(o.mode) ? (o.node_ops = gt.ops_table.dir.node, o.stream_ops = gt.ops_table.dir.stream, o.contents = {}) : vt.isFile(o.mode) ? (o.node_ops = gt.ops_table.file.node, o.stream_ops = gt.ops_table.file.stream, o.usedBytes = 0, o.contents = null) : vt.isLink(o.mode) ? (o.node_ops = gt.ops_table.link.node, o.stream_ops = gt.ops_table.link.stream) : vt.isChrdev(o.mode) && (o.node_ops = gt.ops_table.chrdev.node, o.stream_ops = gt.ops_table.chrdev.stream), o.timestamp = Date.now(), e && (e.contents[t] = o, e.timestamp = o.timestamp), o
+      }, getFileDataAsTypedArray: function (e) {
+        return e.contents ? e.contents.subarray ? e.contents.subarray(0, e.usedBytes) : new Uint8Array(e.contents) : new Uint8Array(0)
+      }, expandFileStorage: function (e, t) {
+        var r = e.contents ? e.contents.length : 0;
+        if (!(r >= t)) {
+          t = Math.max(t, r * (r < 1048576 ? 2 : 1.125) >>> 0), 0 != r && (t = Math.max(t, 256));
+          var n = e.contents;
+          e.contents = new Uint8Array(t), e.usedBytes > 0 && e.contents.set(n.subarray(0, e.usedBytes), 0)
+        }
+      }, resizeFileStorage: function (e, t) {
+        if (e.usedBytes != t) if (0 == t) e.contents = null, e.usedBytes = 0; else {
+          var r = e.contents;
+          e.contents = new Uint8Array(t), r && e.contents.set(r.subarray(0, Math.min(t, e.usedBytes))), e.usedBytes = t
+        }
+      }, node_ops: {
+        getattr: function (e) {
+          var t = {};
+          return t.dev = vt.isChrdev(e.mode) ? e.id : 1, t.ino = e.id, t.mode = e.mode, t.nlink = 1, t.uid = 0, t.gid = 0, t.rdev = e.rdev, vt.isDir(e.mode) ? t.size = 4096 : vt.isFile(e.mode) ? t.size = e.usedBytes : vt.isLink(e.mode) ? t.size = e.link.length : t.size = 0, t.atime = new Date(e.timestamp), t.mtime = new Date(e.timestamp), t.ctime = new Date(e.timestamp), t.blksize = 4096, t.blocks = Math.ceil(t.size / t.blksize), t
+        }, setattr: function (e, t) {
+          void 0 !== t.mode && (e.mode = t.mode), void 0 !== t.timestamp && (e.timestamp = t.timestamp), void 0 !== t.size && gt.resizeFileStorage(e, t.size)
+        }, lookup: function (e, t) {
+          throw vt.genericErrors[44]
+        }, mknod: function (e, t, r, n) {
+          return gt.createNode(e, t, r, n)
+        }, rename: function (e, t, r) {
+          if (vt.isDir(e.mode)) {
+            var n;
+            try {
+              n = vt.lookupNode(t, r)
+            } catch (e) {
+            }
+            if (n) for (var o in n.contents) throw new vt.ErrnoError(55)
+          }
+          delete e.parent.contents[e.name], e.parent.timestamp = Date.now(), e.name = r, t.contents[r] = e, t.timestamp = e.parent.timestamp, e.parent = t
+        }, unlink: function (e, t) {
+          delete e.contents[t], e.timestamp = Date.now()
+        }, rmdir: function (e, t) {
+          var r = vt.lookupNode(e, t);
+          for (var n in r.contents) throw new vt.ErrnoError(55);
+          delete e.contents[t], e.timestamp = Date.now()
+        }, readdir: function (e) {
+          var t = [".", ".."];
+          for (var r in e.contents) e.contents.hasOwnProperty(r) && t.push(r);
+          return t
+        }, symlink: function (e, t, r) {
+          var n = gt.createNode(e, t, 41471, 0);
+          return n.link = r, n
+        }, readlink: function (e) {
+          if (!vt.isLink(e.mode)) throw new vt.ErrnoError(28);
+          return e.link
+        }
+      }, stream_ops: {
+        read: function (e, t, r, n, o) {
+          var a = e.node.contents;
+          if (o >= e.node.usedBytes) return 0;
+          var i = Math.min(e.node.usedBytes - o, n);
+          if (i > 8 && a.subarray) t.set(a.subarray(o, o + i), r); else for (var s = 0; s < i; s++) t[r + s] = a[o + s];
+          return i
+        }, write: function (e, t, r, n, o, a) {
+          if (!n) return 0;
+          var i = e.node;
+          if (i.timestamp = Date.now(), t.subarray && (!i.contents || i.contents.subarray)) {
+            if (a) return i.contents = t.subarray(r, r + n), i.usedBytes = n, n;
+            if (0 === i.usedBytes && 0 === o) return i.contents = t.slice(r, r + n), i.usedBytes = n, n;
+            if (o + n <= i.usedBytes) return i.contents.set(t.subarray(r, r + n), o), n
+          }
+          if (gt.expandFileStorage(i, o + n), i.contents.subarray && t.subarray) i.contents.set(t.subarray(r, r + n), o); else for (var s = 0; s < n; s++) i.contents[o + s] = t[r + s];
+          return i.usedBytes = Math.max(i.usedBytes, o + n), n
+        }, llseek: function (e, t, r) {
+          var n = t;
+          if (1 === r ? n += e.position : 2 === r && vt.isFile(e.node.mode) && (n += e.node.usedBytes), n < 0) throw new vt.ErrnoError(28);
+          return n
+        }, allocate: function (e, t, r) {
+          gt.expandFileStorage(e.node, t + r), e.node.usedBytes = Math.max(e.node.usedBytes, t + r)
+        }, mmap: function (e, t, r, n, o, a) {
+          if (0 !== t) throw new vt.ErrnoError(28);
+          if (!vt.isFile(e.node.mode)) throw new vt.ErrnoError(43);
+          var i, s, u = e.node.contents;
+          if (2 & a || u.buffer !== Ge) {
+            if ((n > 0 || n + r < u.length) && (u = u.subarray ? u.subarray(n, n + r) : Array.prototype.slice.call(u, n, n + r)), s = !0, !(i = on(r))) throw new vt.ErrnoError(48);
+            ze.set(u, i)
+          } else s = !1, i = u.byteOffset;
+          return {ptr: i, allocated: s}
+        }, msync: function (e, t, r, n, o) {
+          if (!vt.isFile(e.node.mode)) throw new vt.ErrnoError(43);
+          if (2 & o) return 0;
+          gt.stream_ops.write(e, t, 0, n, r, !1);
+          return 0
+        }
+      }
+    }, vt = {
+      root: null,
+      mounts: [],
+      devices: {},
+      streams: [],
+      nextInode: 1,
+      nameTable: null,
+      currentPath: "/",
+      initialized: !1,
+      ignorePermissions: !0,
+      trackingDelegate: {},
+      tracking: {openFlags: {READ: 1, WRITE: 2}},
+      ErrnoError: null,
+      genericErrors: {},
+      filesystems: null,
+      syncFSRequests: 0,
+      lookupPath: function (e, t) {
+        if (t = t || {}, !(e = mt.resolve(vt.cwd(), e))) return {path: "", node: null};
+        var r = {follow_mount: !0, recurse_count: 0};
+        for (var n in r) void 0 === t[n] && (t[n] = r[n]);
+        if (t.recurse_count > 8) throw new vt.ErrnoError(32);
+        for (var o = ht.normalizeArray(e.split("/").filter((function (e) {
+          return !!e
+        })), !1), a = vt.root, i = "/", s = 0; s < o.length; s++) {
+          var u = s === o.length - 1;
+          if (u && t.parent) break;
+          if (a = vt.lookupNode(a, o[s]), i = ht.join2(i, o[s]), vt.isMountpoint(a) && (!u || u && t.follow_mount) && (a = a.mounted.root), !u || t.follow) for (var c = 0; vt.isLink(a.mode);) {
+            var l = vt.readlink(i);
+            if (i = mt.resolve(ht.dirname(i), l), a = vt.lookupPath(i, {recurse_count: t.recurse_count}).node, c++ > 40) throw new vt.ErrnoError(32)
+          }
+        }
+        return {path: i, node: a}
+      },
+      getPath: function (e) {
+        for (var t; ;) {
+          if (vt.isRoot(e)) {
+            var r = e.mount.mountpoint;
+            return t ? "/" !== r[r.length - 1] ? r + "/" + t : r + t : r
+          }
+          t = t ? e.name + "/" + t : e.name, e = e.parent
+        }
+      },
+      hashName: function (e, t) {
+        for (var r = 0, n = 0; n < t.length; n++) r = (r << 5) - r + t.charCodeAt(n) | 0;
+        return (e + r >>> 0) % vt.nameTable.length
+      },
+      hashAddNode: function (e) {
+        var t = vt.hashName(e.parent.id, e.name);
+        e.name_next = vt.nameTable[t], vt.nameTable[t] = e
+      },
+      hashRemoveNode: function (e) {
+        var t = vt.hashName(e.parent.id, e.name);
+        if (vt.nameTable[t] === e) vt.nameTable[t] = e.name_next; else for (var r = vt.nameTable[t]; r;) {
+          if (r.name_next === e) {
+            r.name_next = e.name_next;
+            break
+          }
+          r = r.name_next
+        }
+      },
+      lookupNode: function (e, t) {
+        var r = vt.mayLookup(e);
+        if (r) throw new vt.ErrnoError(r, e);
+        for (var n = vt.hashName(e.id, t), o = vt.nameTable[n]; o; o = o.name_next) {
+          var a = o.name;
+          if (o.parent.id === e.id && a === t) return o
+        }
+        return vt.lookup(e, t)
+      },
+      createNode: function (e, t, r, n) {
+        var o = new vt.FSNode(e, t, r, n);
+        return vt.hashAddNode(o), o
+      },
+      destroyNode: function (e) {
+        vt.hashRemoveNode(e)
+      },
+      isRoot: function (e) {
+        return e === e.parent
+      },
+      isMountpoint: function (e) {
+        return !!e.mounted
+      },
+      isFile: function (e) {
+        return 32768 == (61440 & e)
+      },
+      isDir: function (e) {
+        return 16384 == (61440 & e)
+      },
+      isLink: function (e) {
+        return 40960 == (61440 & e)
+      },
+      isChrdev: function (e) {
+        return 8192 == (61440 & e)
+      },
+      isBlkdev: function (e) {
+        return 24576 == (61440 & e)
+      },
+      isFIFO: function (e) {
+        return 4096 == (61440 & e)
+      },
+      isSocket: function (e) {
+        return 49152 == (49152 & e)
+      },
+      flagModes: {r: 0, "r+": 2, w: 577, "w+": 578, a: 1089, "a+": 1090},
+      modeStringToFlags: function (e) {
+        var t = vt.flagModes[e];
+        if (void 0 === t) throw new Error("Unknown file open mode: " + e);
+        return t
+      },
+      flagsToPermissionString: function (e) {
+        var t = ["r", "w", "rw"][3 & e];
+        return 512 & e && (t += "w"), t
+      },
+      nodePermissions: function (e, t) {
+        return vt.ignorePermissions || (-1 === t.indexOf("r") || 292 & e.mode) && (-1 === t.indexOf("w") || 146 & e.mode) && (-1 === t.indexOf("x") || 73 & e.mode) ? 0 : 2
+      },
+      mayLookup: function (e) {
+        var t = vt.nodePermissions(e, "x");
+        return t || (e.node_ops.lookup ? 0 : 2)
+      },
+      mayCreate: function (e, t) {
+        try {
+          vt.lookupNode(e, t);
+          return 20
+        } catch (e) {
+        }
+        return vt.nodePermissions(e, "wx")
+      },
+      mayDelete: function (e, t, r) {
+        var n;
+        try {
+          n = vt.lookupNode(e, t)
+        } catch (e) {
+          return e.errno
+        }
+        var o = vt.nodePermissions(e, "wx");
+        if (o) return o;
+        if (r) {
+          if (!vt.isDir(n.mode)) return 54;
+          if (vt.isRoot(n) || vt.getPath(n) === vt.cwd()) return 10
+        } else if (vt.isDir(n.mode)) return 31;
+        return 0
+      },
+      mayOpen: function (e, t) {
+        return e ? vt.isLink(e.mode) ? 32 : vt.isDir(e.mode) && ("r" !== vt.flagsToPermissionString(t) || 512 & t) ? 31 : vt.nodePermissions(e, vt.flagsToPermissionString(t)) : 44
+      },
+      MAX_OPEN_FDS: 4096,
+      nextfd: function (e, t) {
+        e = e || 0, t = t || vt.MAX_OPEN_FDS;
+        for (var r = e; r <= t; r++) if (!vt.streams[r]) return r;
+        throw new vt.ErrnoError(33)
+      },
+      getStream: function (e) {
+        return vt.streams[e]
+      },
+      createStream: function (e, t, r) {
+        vt.FSStream || (vt.FSStream = function () {
+        }, vt.FSStream.prototype = {
+          object: {
+            get: function () {
+              return this.node
+            }, set: function (e) {
+              this.node = e
+            }
+          }, isRead: {
+            get: function () {
+              return 1 != (2097155 & this.flags)
+            }
+          }, isWrite: {
+            get: function () {
+              return 0 != (2097155 & this.flags)
+            }
+          }, isAppend: {
+            get: function () {
+              return 1024 & this.flags
+            }
+          }
+        });
+        var n = new vt.FSStream;
+        for (var o in e) n[o] = e[o];
+        e = n;
+        var a = vt.nextfd(t, r);
+        return e.fd = a, vt.streams[a] = e, e
+      },
+      closeStream: function (e) {
+        vt.streams[e] = null
+      },
+      chrdev_stream_ops: {
+        open: function (e) {
+          var t = vt.getDevice(e.node.rdev);
+          e.stream_ops = t.stream_ops, e.stream_ops.open && e.stream_ops.open(e)
+        }, llseek: function () {
+          throw new vt.ErrnoError(70)
+        }
+      },
+      major: function (e) {
+        return e >> 8
+      },
+      minor: function (e) {
+        return 255 & e
+      },
+      makedev: function (e, t) {
+        return e << 8 | t
+      },
+      registerDevice: function (e, t) {
+        vt.devices[e] = {stream_ops: t}
+      },
+      getDevice: function (e) {
+        return vt.devices[e]
+      },
+      getMounts: function (e) {
+        for (var t = [], r = [e]; r.length;) {
+          var n = r.pop();
+          t.push(n), r.push.apply(r, n.mounts)
+        }
+        return t
+      },
+      syncfs: function (e, t) {
+        "function" == typeof e && (t = e, e = !1), vt.syncFSRequests++, vt.syncFSRequests > 1 && Me("warning: " + vt.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work");
+        var r = vt.getMounts(vt.root.mount), n = 0;
+
+        function o(e) {
+          return vt.syncFSRequests--, t(e)
+        }
+
+        function a(e) {
+          if (e) return a.errored ? void 0 : (a.errored = !0, o(e));
+          ++n >= r.length && o(null)
+        }
+
+        r.forEach((function (t) {
+          if (!t.type.syncfs) return a(null);
+          t.type.syncfs(t, e, a)
+        }))
+      },
+      mount: function (e, t, r) {
+        var n, o = "/" === r, a = !r;
+        if (o && vt.root) throw new vt.ErrnoError(10);
+        if (!o && !a) {
+          var i = vt.lookupPath(r, {follow_mount: !1});
+          if (r = i.path, n = i.node, vt.isMountpoint(n)) throw new vt.ErrnoError(10);
+          if (!vt.isDir(n.mode)) throw new vt.ErrnoError(54)
+        }
+        var s = {type: e, opts: t, mountpoint: r, mounts: []}, u = e.mount(s);
+        return u.mount = s, s.root = u, o ? vt.root = u : n && (n.mounted = s, n.mount && n.mount.mounts.push(s)), u
+      },
+      unmount: function (e) {
+        var t = vt.lookupPath(e, {follow_mount: !1});
+        if (!vt.isMountpoint(t.node)) throw new vt.ErrnoError(28);
+        var r = t.node, n = r.mounted, o = vt.getMounts(n);
+        Object.keys(vt.nameTable).forEach((function (e) {
+          for (var t = vt.nameTable[e]; t;) {
+            var r = t.name_next;
+            -1 !== o.indexOf(t.mount) && vt.destroyNode(t), t = r
+          }
+        })), r.mounted = null;
+        var a = r.mount.mounts.indexOf(n);
+        r.mount.mounts.splice(a, 1)
+      },
+      lookup: function (e, t) {
+        return e.node_ops.lookup(e, t)
+      },
+      mknod: function (e, t, r) {
+        var n = vt.lookupPath(e, {parent: !0}).node, o = ht.basename(e);
+        if (!o || "." === o || ".." === o) throw new vt.ErrnoError(28);
+        var a = vt.mayCreate(n, o);
+        if (a) throw new vt.ErrnoError(a);
+        if (!n.node_ops.mknod) throw new vt.ErrnoError(63);
+        return n.node_ops.mknod(n, o, t, r)
+      },
+      create: function (e, t) {
+        return t = void 0 !== t ? t : 438, t &= 4095, t |= 32768, vt.mknod(e, t, 0)
+      },
+      mkdir: function (e, t) {
+        return t = void 0 !== t ? t : 511, t &= 1023, t |= 16384, vt.mknod(e, t, 0)
+      },
+      mkdirTree: function (e, t) {
+        for (var r = e.split("/"), n = "", o = 0; o < r.length; ++o) if (r[o]) {
+          n += "/" + r[o];
+          try {
+            vt.mkdir(n, t)
+          } catch (e) {
+            if (20 != e.errno) throw e
+          }
+        }
+      },
+      mkdev: function (e, t, r) {
+        return void 0 === r && (r = t, t = 438), t |= 8192, vt.mknod(e, t, r)
+      },
+      symlink: function (e, t) {
+        if (!mt.resolve(e)) throw new vt.ErrnoError(44);
+        var r = vt.lookupPath(t, {parent: !0}).node;
+        if (!r) throw new vt.ErrnoError(44);
+        var n = ht.basename(t), o = vt.mayCreate(r, n);
+        if (o) throw new vt.ErrnoError(o);
+        if (!r.node_ops.symlink) throw new vt.ErrnoError(63);
+        return r.node_ops.symlink(r, n, e)
+      },
+      rename: function (e, t) {
+        var r, n, o = ht.dirname(e), a = ht.dirname(t), i = ht.basename(e), s = ht.basename(t);
+        if (r = vt.lookupPath(e, {parent: !0}).node, n = vt.lookupPath(t, {parent: !0}).node, !r || !n) throw new vt.ErrnoError(44);
+        if (r.mount !== n.mount) throw new vt.ErrnoError(75);
+        var u, c = vt.lookupNode(r, i), l = mt.relative(e, a);
+        if ("." !== l.charAt(0)) throw new vt.ErrnoError(28);
+        if ("." !== (l = mt.relative(t, o)).charAt(0)) throw new vt.ErrnoError(55);
+        try {
+          u = vt.lookupNode(n, s)
+        } catch (e) {
+        }
+        if (c !== u) {
+          var d = vt.isDir(c.mode), f = vt.mayDelete(r, i, d);
+          if (f) throw new vt.ErrnoError(f);
+          if (f = u ? vt.mayDelete(n, s, d) : vt.mayCreate(n, s)) throw new vt.ErrnoError(f);
+          if (!r.node_ops.rename) throw new vt.ErrnoError(63);
+          if (vt.isMountpoint(c) || u && vt.isMountpoint(u)) throw new vt.ErrnoError(10);
+          if (n !== r && (f = vt.nodePermissions(r, "w"))) throw new vt.ErrnoError(f);
+          try {
+            vt.trackingDelegate.willMovePath && vt.trackingDelegate.willMovePath(e, t)
+          } catch (r) {
+            Me("FS.trackingDelegate['willMovePath']('" + e + "', '" + t + "') threw an exception: " + r.message)
+          }
+          vt.hashRemoveNode(c);
+          try {
+            r.node_ops.rename(c, n, s)
+          } catch (e) {
+            throw e
+          } finally {
+            vt.hashAddNode(c)
+          }
+          try {
+            vt.trackingDelegate.onMovePath && vt.trackingDelegate.onMovePath(e, t)
+          } catch (r) {
+            Me("FS.trackingDelegate['onMovePath']('" + e + "', '" + t + "') threw an exception: " + r.message)
+          }
+        }
+      },
+      rmdir: function (e) {
+        var t = vt.lookupPath(e, {parent: !0}).node, r = ht.basename(e), n = vt.lookupNode(t, r),
+          o = vt.mayDelete(t, r, !0);
+        if (o) throw new vt.ErrnoError(o);
+        if (!t.node_ops.rmdir) throw new vt.ErrnoError(63);
+        if (vt.isMountpoint(n)) throw new vt.ErrnoError(10);
+        try {
+          vt.trackingDelegate.willDeletePath && vt.trackingDelegate.willDeletePath(e)
+        } catch (t) {
+          Me("FS.trackingDelegate['willDeletePath']('" + e + "') threw an exception: " + t.message)
+        }
+        t.node_ops.rmdir(t, r), vt.destroyNode(n);
+        try {
+          vt.trackingDelegate.onDeletePath && vt.trackingDelegate.onDeletePath(e)
+        } catch (t) {
+          Me("FS.trackingDelegate['onDeletePath']('" + e + "') threw an exception: " + t.message)
+        }
+      },
+      readdir: function (e) {
+        var t = vt.lookupPath(e, {follow: !0}).node;
+        if (!t.node_ops.readdir) throw new vt.ErrnoError(54);
+        return t.node_ops.readdir(t)
+      },
+      unlink: function (e) {
+        var t = vt.lookupPath(e, {parent: !0}).node, r = ht.basename(e), n = vt.lookupNode(t, r),
+          o = vt.mayDelete(t, r, !1);
+        if (o) throw new vt.ErrnoError(o);
+        if (!t.node_ops.unlink) throw new vt.ErrnoError(63);
+        if (vt.isMountpoint(n)) throw new vt.ErrnoError(10);
+        try {
+          vt.trackingDelegate.willDeletePath && vt.trackingDelegate.willDeletePath(e)
+        } catch (t) {
+          Me("FS.trackingDelegate['willDeletePath']('" + e + "') threw an exception: " + t.message)
+        }
+        t.node_ops.unlink(t, r), vt.destroyNode(n);
+        try {
+          vt.trackingDelegate.onDeletePath && vt.trackingDelegate.onDeletePath(e)
+        } catch (t) {
+          Me("FS.trackingDelegate['onDeletePath']('" + e + "') threw an exception: " + t.message)
+        }
+      },
+      readlink: function (e) {
+        var t = vt.lookupPath(e).node;
+        if (!t) throw new vt.ErrnoError(44);
+        if (!t.node_ops.readlink) throw new vt.ErrnoError(28);
+        return mt.resolve(vt.getPath(t.parent), t.node_ops.readlink(t))
+      },
+      stat: function (e, t) {
+        var r = vt.lookupPath(e, {follow: !t}).node;
+        if (!r) throw new vt.ErrnoError(44);
+        if (!r.node_ops.getattr) throw new vt.ErrnoError(63);
+        return r.node_ops.getattr(r)
+      },
+      lstat: function (e) {
+        return vt.stat(e, !0)
+      },
+      chmod: function (e, t, r) {
+        var n;
+        "string" == typeof e ? n = vt.lookupPath(e, {follow: !r}).node : n = e;
+        if (!n.node_ops.setattr) throw new vt.ErrnoError(63);
+        n.node_ops.setattr(n, {mode: 4095 & t | -4096 & n.mode, timestamp: Date.now()})
+      },
+      lchmod: function (e, t) {
+        vt.chmod(e, t, !0)
+      },
+      fchmod: function (e, t) {
+        var r = vt.getStream(e);
+        if (!r) throw new vt.ErrnoError(8);
+        vt.chmod(r.node, t)
+      },
+      chown: function (e, t, r, n) {
+        var o;
+        "string" == typeof e ? o = vt.lookupPath(e, {follow: !n}).node : o = e;
+        if (!o.node_ops.setattr) throw new vt.ErrnoError(63);
+        o.node_ops.setattr(o, {timestamp: Date.now()})
+      },
+      lchown: function (e, t, r) {
+        vt.chown(e, t, r, !0)
+      },
+      fchown: function (e, t, r) {
+        var n = vt.getStream(e);
+        if (!n) throw new vt.ErrnoError(8);
+        vt.chown(n.node, t, r)
+      },
+      truncate: function (e, t) {
+        if (t < 0) throw new vt.ErrnoError(28);
+        var r;
+        "string" == typeof e ? r = vt.lookupPath(e, {follow: !0}).node : r = e;
+        if (!r.node_ops.setattr) throw new vt.ErrnoError(63);
+        if (vt.isDir(r.mode)) throw new vt.ErrnoError(31);
+        if (!vt.isFile(r.mode)) throw new vt.ErrnoError(28);
+        var n = vt.nodePermissions(r, "w");
+        if (n) throw new vt.ErrnoError(n);
+        r.node_ops.setattr(r, {size: t, timestamp: Date.now()})
+      },
+      ftruncate: function (e, t) {
+        var r = vt.getStream(e);
+        if (!r) throw new vt.ErrnoError(8);
+        if (0 == (2097155 & r.flags)) throw new vt.ErrnoError(28);
+        vt.truncate(r.node, t)
+      },
+      utime: function (e, t, r) {
+        var n = vt.lookupPath(e, {follow: !0}).node;
+        n.node_ops.setattr(n, {timestamp: Math.max(t, r)})
+      },
+      open: function (e, t, r, n, o) {
+        if ("" === e) throw new vt.ErrnoError(44);
+        var a;
+        if (r = void 0 === r ? 438 : r, r = 64 & (t = "string" == typeof t ? vt.modeStringToFlags(t) : t) ? 4095 & r | 32768 : 0, "object" == typeof e) a = e; else {
+          e = ht.normalize(e);
+          try {
+            a = vt.lookupPath(e, {follow: !(131072 & t)}).node
+          } catch (e) {
+          }
+        }
+        var i = !1;
+        if (64 & t) if (a) {
+          if (128 & t) throw new vt.ErrnoError(20)
+        } else a = vt.mknod(e, r, 0), i = !0;
+        if (!a) throw new vt.ErrnoError(44);
+        if (vt.isChrdev(a.mode) && (t &= -513), 65536 & t && !vt.isDir(a.mode)) throw new vt.ErrnoError(54);
+        if (!i) {
+          var s = vt.mayOpen(a, t);
+          if (s) throw new vt.ErrnoError(s)
+        }
+        512 & t && vt.truncate(a, 0), t &= -131713;
+        var u = vt.createStream({
+          node: a,
+          path: vt.getPath(a),
+          flags: t,
+          seekable: !0,
+          position: 0,
+          stream_ops: a.stream_ops,
+          ungotten: [],
+          error: !1
+        }, n, o);
+        u.stream_ops.open && u.stream_ops.open(u), !Ee.logReadFiles || 1 & t || (vt.readFiles || (vt.readFiles = {}), e in vt.readFiles || (vt.readFiles[e] = 1, Me("FS.trackingDelegate error on read file: " + e)));
+        try {
+          if (vt.trackingDelegate.onOpenFile) {
+            var c = 0;
+            1 != (2097155 & t) && (c |= vt.tracking.openFlags.READ), 0 != (2097155 & t) && (c |= vt.tracking.openFlags.WRITE), vt.trackingDelegate.onOpenFile(e, c)
+          }
+        } catch (t) {
+          Me("FS.trackingDelegate['onOpenFile']('" + e + "', flags) threw an exception: " + t.message)
+        }
+        return u
+      },
+      close: function (e) {
+        if (vt.isClosed(e)) throw new vt.ErrnoError(8);
+        e.getdents && (e.getdents = null);
+        try {
+          e.stream_ops.close && e.stream_ops.close(e)
+        } catch (e) {
+          throw e
+        } finally {
+          vt.closeStream(e.fd)
+        }
+        e.fd = null
+      },
+      isClosed: function (e) {
+        return null === e.fd
+      },
+      llseek: function (e, t, r) {
+        if (vt.isClosed(e)) throw new vt.ErrnoError(8);
+        if (!e.seekable || !e.stream_ops.llseek) throw new vt.ErrnoError(70);
+        if (0 != r && 1 != r && 2 != r) throw new vt.ErrnoError(28);
+        return e.position = e.stream_ops.llseek(e, t, r), e.ungotten = [], e.position
+      },
+      read: function (e, t, r, n, o) {
+        if (n < 0 || o < 0) throw new vt.ErrnoError(28);
+        if (vt.isClosed(e)) throw new vt.ErrnoError(8);
+        if (1 == (2097155 & e.flags)) throw new vt.ErrnoError(8);
+        if (vt.isDir(e.node.mode)) throw new vt.ErrnoError(31);
+        if (!e.stream_ops.read) throw new vt.ErrnoError(28);
+        var a = void 0 !== o;
+        if (a) {
+          if (!e.seekable) throw new vt.ErrnoError(70)
+        } else o = e.position;
+        var i = e.stream_ops.read(e, t, r, n, o);
+        return a || (e.position += i), i
+      },
+      write: function (e, t, r, n, o, a) {
+        if (n < 0 || o < 0) throw new vt.ErrnoError(28);
+        if (vt.isClosed(e)) throw new vt.ErrnoError(8);
+        if (0 == (2097155 & e.flags)) throw new vt.ErrnoError(8);
+        if (vt.isDir(e.node.mode)) throw new vt.ErrnoError(31);
+        if (!e.stream_ops.write) throw new vt.ErrnoError(28);
+        e.seekable && 1024 & e.flags && vt.llseek(e, 0, 2);
+        var i = void 0 !== o;
+        if (i) {
+          if (!e.seekable) throw new vt.ErrnoError(70)
+        } else o = e.position;
+        var s = e.stream_ops.write(e, t, r, n, o, a);
+        i || (e.position += s);
+        try {
+          e.path && vt.trackingDelegate.onWriteToFile && vt.trackingDelegate.onWriteToFile(e.path)
+        } catch (t) {
+          Me("FS.trackingDelegate['onWriteToFile']('" + e.path + "') threw an exception: " + t.message)
+        }
+        return s
+      },
+      allocate: function (e, t, r) {
+        if (vt.isClosed(e)) throw new vt.ErrnoError(8);
+        if (t < 0 || r <= 0) throw new vt.ErrnoError(28);
+        if (0 == (2097155 & e.flags)) throw new vt.ErrnoError(8);
+        if (!vt.isFile(e.node.mode) && !vt.isDir(e.node.mode)) throw new vt.ErrnoError(43);
+        if (!e.stream_ops.allocate) throw new vt.ErrnoError(138);
+        e.stream_ops.allocate(e, t, r)
+      },
+      mmap: function (e, t, r, n, o, a) {
+        if (0 != (2 & o) && 0 == (2 & a) && 2 != (2097155 & e.flags)) throw new vt.ErrnoError(2);
+        if (1 == (2097155 & e.flags)) throw new vt.ErrnoError(2);
+        if (!e.stream_ops.mmap) throw new vt.ErrnoError(43);
+        return e.stream_ops.mmap(e, t, r, n, o, a)
+      },
+      msync: function (e, t, r, n, o) {
+        return e && e.stream_ops.msync ? e.stream_ops.msync(e, t, r, n, o) : 0
+      },
+      munmap: function (e) {
+        return 0
+      },
+      ioctl: function (e, t, r) {
+        if (!e.stream_ops.ioctl) throw new vt.ErrnoError(59);
+        return e.stream_ops.ioctl(e, t, r)
+      },
+      readFile: function (e, t) {
+        if ((t = t || {}).flags = t.flags || 0, t.encoding = t.encoding || "binary", "utf8" !== t.encoding && "binary" !== t.encoding) throw new Error('Invalid encoding type "' + t.encoding + '"');
+        var r, n = vt.open(e, t.flags), o = vt.stat(e).size, a = new Uint8Array(o);
+        return vt.read(n, a, 0, o, 0), "utf8" === t.encoding ? r = Pr(a, 0) : "binary" === t.encoding && (r = a), vt.close(n), r
+      },
+      writeFile: function (e, t, r) {
+        (r = r || {}).flags = r.flags || 577;
+        var n = vt.open(e, r.flags, r.mode);
+        if ("string" == typeof t) {
+          var o = new Uint8Array(Rr(t) + 1), a = Br(t, o, 0, o.length);
+          vt.write(n, o, 0, a, void 0, r.canOwn)
+        } else {
+          if (!ArrayBuffer.isView(t)) throw new Error("Unsupported data type");
+          vt.write(n, t, 0, t.byteLength, void 0, r.canOwn)
+        }
+        vt.close(n)
+      },
+      cwd: function () {
+        return vt.currentPath
+      },
+      chdir: function (e) {
+        var t = vt.lookupPath(e, {follow: !0});
+        if (null === t.node) throw new vt.ErrnoError(44);
+        if (!vt.isDir(t.node.mode)) throw new vt.ErrnoError(54);
+        var r = vt.nodePermissions(t.node, "x");
+        if (r) throw new vt.ErrnoError(r);
+        vt.currentPath = t.path
+      },
+      createDefaultDirectories: function () {
+        vt.mkdir("/tmp"), vt.mkdir("/home"), vt.mkdir("/home/web_user")
+      },
+      createDefaultDevices: function () {
+        vt.mkdir("/dev"), vt.registerDevice(vt.makedev(1, 3), {
+          read: function () {
+            return 0
+          }, write: function (e, t, r, n, o) {
+            return n
+          }
+        }), vt.mkdev("/dev/null", vt.makedev(1, 3)), At.register(vt.makedev(5, 0), At.default_tty_ops), At.register(vt.makedev(6, 0), At.default_tty1_ops), vt.mkdev("/dev/tty", vt.makedev(5, 0)), vt.mkdev("/dev/tty1", vt.makedev(6, 0));
+        var e = function () {
+          if ("object" == typeof crypto && "function" == typeof crypto.getRandomValues) {
+            var e = new Uint8Array(1);
+            return function () {
+              return crypto.getRandomValues(e), e[0]
+            }
+          }
+          return function () {
+            Yr("randomDevice")
+          }
+        }();
+        vt.createDevice("/dev", "random", e), vt.createDevice("/dev", "urandom", e), vt.mkdir("/dev/shm"), vt.mkdir("/dev/shm/tmp")
+      },
+      createSpecialDirectories: function () {
+        vt.mkdir("/proc");
+        var e = vt.mkdir("/proc/self");
+        vt.mkdir("/proc/self/fd"), vt.mount({
+          mount: function () {
+            var t = vt.createNode(e, "fd", 16895, 73);
+            return t.node_ops = {
+              lookup: function (e, t) {
+                var r = +t, n = vt.getStream(r);
+                if (!n) throw new vt.ErrnoError(8);
+                var o = {
+                  parent: null, mount: {mountpoint: "fake"}, node_ops: {
+                    readlink: function () {
+                      return n.path
+                    }
+                  }
+                };
+                return o.parent = o, o
+              }
+            }, t
+          }
+        }, {}, "/proc/self/fd")
+      },
+      createStandardStreams: function () {
+        Ee.stdin ? vt.createDevice("/dev", "stdin", Ee.stdin) : vt.symlink("/dev/tty", "/dev/stdin"), Ee.stdout ? vt.createDevice("/dev", "stdout", null, Ee.stdout) : vt.symlink("/dev/tty", "/dev/stdout"), Ee.stderr ? vt.createDevice("/dev", "stderr", null, Ee.stderr) : vt.symlink("/dev/tty1", "/dev/stderr");
+        vt.open("/dev/stdin", 0), vt.open("/dev/stdout", 1), vt.open("/dev/stderr", 1)
+      },
+      ensureErrnoError: function () {
+        vt.ErrnoError || (vt.ErrnoError = function (e, t) {
+          this.node = t, this.setErrno = function (e) {
+            this.errno = e
+          }, this.setErrno(e), this.message = "FS error"
+        }, vt.ErrnoError.prototype = new Error, vt.ErrnoError.prototype.constructor = vt.ErrnoError, [44].forEach((function (e) {
+          vt.genericErrors[e] = new vt.ErrnoError(e), vt.genericErrors[e].stack = "<generic error, no stack>"
+        })))
+      },
+      staticInit: function () {
+        vt.ensureErrnoError(), vt.nameTable = new Array(4096), vt.mount(gt, {}, "/"), vt.createDefaultDirectories(), vt.createDefaultDevices(), vt.createSpecialDirectories(), vt.filesystems = {MEMFS: gt}
+      },
+      init: function (e, t, r) {
+        vt.init.initialized = !0, vt.ensureErrnoError(), Ee.stdin = e || Ee.stdin, Ee.stdout = t || Ee.stdout, Ee.stderr = r || Ee.stderr, vt.createStandardStreams()
+      },
+      quit: function () {
+        vt.init.initialized = !1;
+        var e = Ee._fflush;
+        e && e(0);
+        for (var t = 0; t < vt.streams.length; t++) {
+          var r = vt.streams[t];
+          r && vt.close(r)
+        }
+      },
+      getMode: function (e, t) {
+        var r = 0;
+        return e && (r |= 365), t && (r |= 146), r
+      },
+      findObject: function (e, t) {
+        var r = vt.analyzePath(e, t);
+        return r.exists ? r.object : null
+      },
+      analyzePath: function (e, t) {
+        try {
+          e = (n = vt.lookupPath(e, {follow: !t})).path
+        } catch (e) {
+        }
+        var r = {
+          isRoot: !1,
+          exists: !1,
+          error: 0,
+          name: null,
+          path: null,
+          object: null,
+          parentExists: !1,
+          parentPath: null,
+          parentObject: null
+        };
+        try {
+          var n = vt.lookupPath(e, {parent: !0});
+          r.parentExists = !0, r.parentPath = n.path, r.parentObject = n.node, r.name = ht.basename(e), n = vt.lookupPath(e, {follow: !t}), r.exists = !0, r.path = n.path, r.object = n.node, r.name = n.node.name, r.isRoot = "/" === n.path
+        } catch (e) {
+          r.error = e.errno
+        }
+        return r
+      },
+      createPath: function (e, t, r, n) {
+        e = "string" == typeof e ? e : vt.getPath(e);
+        for (var o = t.split("/").reverse(); o.length;) {
+          var a = o.pop();
+          if (a) {
+            var i = ht.join2(e, a);
+            try {
+              vt.mkdir(i)
+            } catch (e) {
+            }
+            e = i
+          }
+        }
+        return i
+      },
+      createFile: function (e, t, r, n, o) {
+        var a = ht.join2("string" == typeof e ? e : vt.getPath(e), t), i = vt.getMode(n, o);
+        return vt.create(a, i)
+      },
+      createDataFile: function (e, t, r, n, o, a) {
+        var i = t ? ht.join2("string" == typeof e ? e : vt.getPath(e), t) : e, s = vt.getMode(n, o),
+          u = vt.create(i, s);
+        if (r) {
+          if ("string" == typeof r) {
+            for (var c = new Array(r.length), l = 0, d = r.length; l < d; ++l) c[l] = r.charCodeAt(l);
+            r = c
+          }
+          vt.chmod(u, 146 | s);
+          var f = vt.open(u, 577);
+          vt.write(f, r, 0, r.length, 0, a), vt.close(f), vt.chmod(u, s)
+        }
+        return u
+      },
+      createDevice: function (e, t, r, n) {
+        var o = ht.join2("string" == typeof e ? e : vt.getPath(e), t), a = vt.getMode(!!r, !!n);
+        vt.createDevice.major || (vt.createDevice.major = 64);
+        var i = vt.makedev(vt.createDevice.major++, 0);
+        return vt.registerDevice(i, {
+          open: function (e) {
+            e.seekable = !1
+          }, close: function (e) {
+            n && n.buffer && n.buffer.length && n(10)
+          }, read: function (e, t, n, o, a) {
+            for (var i = 0, s = 0; s < o; s++) {
+              var u;
+              try {
+                u = r()
+              } catch (e) {
+                throw new vt.ErrnoError(29)
+              }
+              if (void 0 === u && 0 === i) throw new vt.ErrnoError(6);
+              if (null == u) break;
+              i++, t[n + s] = u
+            }
+            return i && (e.node.timestamp = Date.now()), i
+          }, write: function (e, t, r, o, a) {
+            for (var i = 0; i < o; i++) try {
+              n(t[r + i])
+            } catch (e) {
+              throw new vt.ErrnoError(29)
+            }
+            return o && (e.node.timestamp = Date.now()), i
+          }
+        }), vt.mkdev(o, a, i)
+      },
+      forceLoadFile: function (e) {
+        if (e.isDevice || e.isFolder || e.link || e.contents) return !0;
+        if ("undefined" != typeof XMLHttpRequest) throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.");
+        if (!Pe) throw new Error("Cannot load without read() or XMLHttpRequest.");
+        try {
+          e.contents = ga(Pe(e.url), !0), e.usedBytes = e.contents.length
+        } catch (e) {
+          throw new vt.ErrnoError(29)
+        }
+      },
+      createLazyFile: function (e, t, r, n, o) {
+        function a() {
+          this.lengthKnown = !1, this.chunks = []
+        }
+
+        if (a.prototype.get = function (e) {
+          if (!(e > this.length - 1 || e < 0)) {
+            var t = e % this.chunkSize, r = e / this.chunkSize | 0;
+            return this.getter(r)[t]
+          }
+        }, a.prototype.setDataGetter = function (e) {
+          this.getter = e
+        }, a.prototype.cacheLength = function () {
+          var e = new XMLHttpRequest;
+          if (e.open("HEAD", r, !1), e.send(null), !(e.status >= 200 && e.status < 300 || 304 === e.status)) throw new Error("Couldn't load " + r + ". Status: " + e.status);
+          var t, n = Number(e.getResponseHeader("Content-length")),
+            o = (t = e.getResponseHeader("Accept-Ranges")) && "bytes" === t,
+            a = (t = e.getResponseHeader("Content-Encoding")) && "gzip" === t, i = 1048576;
+          o || (i = n);
+          var s = this;
+          s.setDataGetter((function (e) {
+            var t = e * i, o = (e + 1) * i - 1;
+            if (o = Math.min(o, n - 1), void 0 === s.chunks[e] && (s.chunks[e] = function (e, t) {
+              if (e > t) throw new Error("invalid range (" + e + ", " + t + ") or no bytes requested!");
+              if (t > n - 1) throw new Error("only " + n + " bytes available! programmer error!");
+              var o = new XMLHttpRequest;
+              if (o.open("GET", r, !1), n !== i && o.setRequestHeader("Range", "bytes=" + e + "-" + t), "undefined" != typeof Uint8Array && (o.responseType = "arraybuffer"), o.overrideMimeType && o.overrideMimeType("text/plain; charset=x-user-defined"), o.send(null), !(o.status >= 200 && o.status < 300 || 304 === o.status)) throw new Error("Couldn't load " + r + ". Status: " + o.status);
+              return void 0 !== o.response ? new Uint8Array(o.response || []) : ga(o.responseText || "", !0)
+            }(t, o)), void 0 === s.chunks[e]) throw new Error("doXHR failed!");
+            return s.chunks[e]
+          })), !a && n || (i = n = 1, n = this.getter(0).length, i = n, Be("LazyFiles on gzip forces download of the whole file when length is accessed")), this._length = n, this._chunkSize = i, this.lengthKnown = !0
+        }, "undefined" != typeof XMLHttpRequest) {
+          if (!De) throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";
+          var i = new a;
+          Object.defineProperties(i, {
+            length: {
+              get: function () {
+                return this.lengthKnown || this.cacheLength(), this._length
+              }
+            }, chunkSize: {
+              get: function () {
+                return this.lengthKnown || this.cacheLength(), this._chunkSize
+              }
+            }
+          });
+          var s = {isDevice: !1, contents: i}
+        } else s = {isDevice: !1, url: r};
+        var u = vt.createFile(e, t, s, n, o);
+        s.contents ? u.contents = s.contents : s.url && (u.contents = null, u.url = s.url), Object.defineProperties(u, {
+          usedBytes: {
+            get: function () {
+              return this.contents.length
+            }
+          }
+        });
+        var c = {};
+        return Object.keys(u.stream_ops).forEach((function (e) {
+          var t = u.stream_ops[e];
+          c[e] = function () {
+            return vt.forceLoadFile(u), t.apply(null, arguments)
+          }
+        })), c.read = function (e, t, r, n, o) {
+          vt.forceLoadFile(u);
+          var a = e.node.contents;
+          if (o >= a.length) return 0;
+          var i = Math.min(a.length - o, n);
+          if (a.slice) for (var s = 0; s < i; s++) t[r + s] = a[o + s]; else for (s = 0; s < i; s++) t[r + s] = a.get(o + s);
+          return i
+        }, u.stream_ops = c, u
+      },
+      createPreloadedFile: function (e, t, r, n, o, a, i, s, u, c) {
+        Browser.init();
+        var l = t ? mt.resolve(ht.join2(e, t)) : e;
+
+        function d(r) {
+          function d(r) {
+            c && c(), s || vt.createDataFile(e, t, r, n, o, u), a && a(), Wr()
+          }
+
+          var f = !1;
+          Ee.preloadPlugins.forEach((function (e) {
+            f || e.canHandle(l) && (e.handle(r, l, d, (function () {
+              i && i(), Wr()
+            })), f = !0)
+          })), f || d(r)
+        }
+
+        zr(), "string" == typeof r ? Browser.asyncLoad(r, (function (e) {
+          d(e)
+        }), i) : d(r)
+      },
+      indexedDB: function () {
+        return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB
+      },
+      DB_NAME: function () {
+        return "EM_FS_" + window.location.pathname
+      },
+      DB_VERSION: 20,
+      DB_STORE_NAME: "FILE_DATA",
+      saveFilesToDB: function (e, t, r) {
+        t = t || function () {
+        }, r = r || function () {
+        };
+        var n = vt.indexedDB();
+        try {
+          var o = n.open(vt.DB_NAME(), vt.DB_VERSION)
+        } catch (e) {
+          return r(e)
+        }
+        o.onupgradeneeded = function () {
+          Be("creating db"), o.result.createObjectStore(vt.DB_STORE_NAME)
+        }, o.onsuccess = function () {
+          var n = o.result.transaction([vt.DB_STORE_NAME], "readwrite"), a = n.objectStore(vt.DB_STORE_NAME), i = 0,
+            s = 0, u = e.length;
+
+          function c() {
+            0 == s ? t() : r()
+          }
+
+          e.forEach((function (e) {
+            var t = a.put(vt.analyzePath(e).object.contents, e);
+            t.onsuccess = function () {
+              ++i + s == u && c()
+            }, t.onerror = function () {
+              s++, i + s == u && c()
+            }
+          })), n.onerror = r
+        }, o.onerror = r
+      },
+      loadFilesFromDB: function (e, t, r) {
+        t = t || function () {
+        }, r = r || function () {
+        };
+        var n = vt.indexedDB();
+        try {
+          var o = n.open(vt.DB_NAME(), vt.DB_VERSION)
+        } catch (e) {
+          return r(e)
+        }
+        o.onupgradeneeded = r, o.onsuccess = function () {
+          var n = o.result;
+          try {
+            var a = n.transaction([vt.DB_STORE_NAME], "readonly")
+          } catch (e) {
+            return void r(e)
+          }
+          var i = a.objectStore(vt.DB_STORE_NAME), s = 0, u = 0, c = e.length;
+
+          function l() {
+            0 == u ? t() : r()
+          }
+
+          e.forEach((function (e) {
+            var t = i.get(e);
+            t.onsuccess = function () {
+              vt.analyzePath(e).exists && vt.unlink(e), vt.createDataFile(ht.dirname(e), ht.basename(e), t.result, !0, !0, !0), ++s + u == c && l()
+            }, t.onerror = function () {
+              u++, s + u == c && l()
+            }
+          })), a.onerror = r
+        }, o.onerror = r
+      }
+    }, Et = {
+      mappings: {}, DEFAULT_POLLMASK: 5, umask: 511, calculateAt: function (e, t, r) {
+        if ("/" === t[0]) return t;
+        var n;
+        if (-100 === e) n = vt.cwd(); else {
+          var o = vt.getStream(e);
+          if (!o) throw new vt.ErrnoError(8);
+          n = o.path
+        }
+        if (0 == t.length) {
+          if (!r) throw new vt.ErrnoError(44);
+          return n
+        }
+        return ht.join2(n, t)
+      }, doStat: function (e, t, r) {
+        try {
+          var n = e(t)
+        } catch (e) {
+          if (e && e.node && ht.normalize(t) !== ht.normalize(vt.getPath(e.node))) return -54;
+          throw e
+        }
+        return $e[r >> 2] = n.dev, $e[r + 4 >> 2] = 0, $e[r + 8 >> 2] = n.ino, $e[r + 12 >> 2] = n.mode, $e[r + 16 >> 2] = n.nlink, $e[r + 20 >> 2] = n.uid, $e[r + 24 >> 2] = n.gid, $e[r + 28 >> 2] = n.rdev, $e[r + 32 >> 2] = 0, ct = [n.size >>> 0, (ut = n.size, +Math.abs(ut) >= 1 ? ut > 0 ? (0 | Math.min(+Math.floor(ut / 4294967296), 4294967295)) >>> 0 : ~~+Math.ceil((ut - +(~~ut >>> 0)) / 4294967296) >>> 0 : 0)], $e[r + 40 >> 2] = ct[0], $e[r + 44 >> 2] = ct[1], $e[r + 48 >> 2] = 4096, $e[r + 52 >> 2] = n.blocks, $e[r + 56 >> 2] = n.atime.getTime() / 1e3 | 0, $e[r + 60 >> 2] = 0, $e[r + 64 >> 2] = n.mtime.getTime() / 1e3 | 0, $e[r + 68 >> 2] = 0, $e[r + 72 >> 2] = n.ctime.getTime() / 1e3 | 0, $e[r + 76 >> 2] = 0, ct = [n.ino >>> 0, (ut = n.ino, +Math.abs(ut) >= 1 ? ut > 0 ? (0 | Math.min(+Math.floor(ut / 4294967296), 4294967295)) >>> 0 : ~~+Math.ceil((ut - +(~~ut >>> 0)) / 4294967296) >>> 0 : 0)], $e[r + 80 >> 2] = ct[0], $e[r + 84 >> 2] = ct[1], 0
+      }, doMsync: function (e, t, r, n, o) {
+        var a = We.slice(e, e + r);
+        vt.msync(t, a, o, r, n)
+      }, doMkdir: function (e, t) {
+        return "/" === (e = ht.normalize(e))[e.length - 1] && (e = e.substr(0, e.length - 1)), vt.mkdir(e, t, 0), 0
+      }, doMknod: function (e, t, r) {
+        switch (61440 & t) {
+          case 32768:
+          case 8192:
+          case 24576:
+          case 4096:
+          case 49152:
+            break;
+          default:
+            return -28
+        }
+        return vt.mknod(e, t, r), 0
+      }, doReadlink: function (e, t, r) {
+        if (r <= 0) return -28;
+        var n = vt.readlink(e), o = Math.min(r, Rr(n)), a = ze[t + o];
+        return Mr(n, t, r + 1), ze[t + o] = a, o
+      }, doAccess: function (e, t) {
+        if (-8 & t) return -28;
+        var r;
+        if (!(r = vt.lookupPath(e, {follow: !0}).node)) return -44;
+        var n = "";
+        return 4 & t && (n += "r"), 2 & t && (n += "w"), 1 & t && (n += "x"), n && vt.nodePermissions(r, n) ? -2 : 0
+      }, doDup: function (e, t, r) {
+        var n = vt.getStream(r);
+        return n && vt.close(n), vt.open(e, t, 0, r, r).fd
+      }, doReadv: function (e, t, r, n) {
+        for (var o = 0, a = 0; a < r; a++) {
+          var i = $e[t + 8 * a >> 2], s = $e[t + (8 * a + 4) >> 2], u = vt.read(e, ze, i, s, n);
+          if (u < 0) return -1;
+          if (o += u, u < s) break
+        }
+        return o
+      }, doWritev: function (e, t, r, n) {
+        for (var o = 0, a = 0; a < r; a++) {
+          var i = $e[t + 8 * a >> 2], s = $e[t + (8 * a + 4) >> 2], u = vt.write(e, ze, i, s, n);
+          if (u < 0) return -1;
+          o += u
+        }
+        return o
+      }, varargs: void 0, get: function () {
+        return Et.varargs += 4, $e[Et.varargs - 4 >> 2]
+      }, getStr: function (e) {
+        return xr(e)
+      }, getStreamFromFD: function (e) {
+        var t = vt.getStream(e);
+        if (!t) throw new vt.ErrnoError(8);
+        return t
+      }, get64: function (e, t) {
+        return e
+      }
+    }, yt = void 0, wt = {}, _t = {}, bt = {}, kt = 48, Tt = 57, Dt = void 0, St = void 0, Ct = !1, Ot = void 0, Pt = [], xt = {}, Bt = {}, Mt = void 0, Rt = [], Lt = [{}, {value: void 0}, {value: null}, {value: !0}, {value: !1}], It = {}, Ft = [], Ut = [], Nt = [], jt = {
+      inEventHandler: 0, removeAllEventListeners: function () {
+        for (var e = jt.eventHandlers.length - 1; e >= 0; --e) jt._removeHandler(e);
+        jt.eventHandlers = [], jt.deferredCalls = []
+      }, registerRemoveEventListeners: function () {
+        jt.removeEventListenersRegistered || (tt.push(jt.removeAllEventListeners), jt.removeEventListenersRegistered = !0)
+      }, deferredCalls: [], deferCall: function (e, t, r) {
+        function n(e, t) {
+          if (e.length != t.length) return !1;
+          for (var r in e) if (e[r] != t[r]) return !1;
+          return !0
+        }
+
+        for (var o in jt.deferredCalls) {
+          var a = jt.deferredCalls[o];
+          if (a.targetFunction == e && n(a.argsList, r)) return
+        }
+        jt.deferredCalls.push({targetFunction: e, precedence: t, argsList: r}), jt.deferredCalls.sort((function (e, t) {
+          return e.precedence < t.precedence
+        }))
+      }, removeDeferredCalls: function (e) {
+        for (var t = 0; t < jt.deferredCalls.length; ++t) jt.deferredCalls[t].targetFunction == e && (jt.deferredCalls.splice(t, 1), --t)
+      }, canPerformEventHandlerRequests: function () {
+        return jt.inEventHandler && jt.currentEventHandler.allowsDeferredCalls
+      }, runDeferredCalls: function () {
+        if (jt.canPerformEventHandlerRequests()) for (var e = 0; e < jt.deferredCalls.length; ++e) {
+          var t = jt.deferredCalls[e];
+          jt.deferredCalls.splice(e, 1), --e, t.targetFunction.apply(null, t.argsList)
+        }
+      }, eventHandlers: [], removeAllHandlersOnTarget: function (e, t) {
+        for (var r = 0; r < jt.eventHandlers.length; ++r) jt.eventHandlers[r].target != e || t && t != jt.eventHandlers[r].eventTypeString || jt._removeHandler(r--)
+      }, _removeHandler: function (e) {
+        var t = jt.eventHandlers[e];
+        t.target.removeEventListener(t.eventTypeString, t.eventListenerFunc, t.useCapture), jt.eventHandlers.splice(e, 1)
+      }, registerOrRemoveHandler: function (e) {
+        var t = function (t) {
+          ++jt.inEventHandler, jt.currentEventHandler = e, jt.runDeferredCalls(), e.handlerFunc(t), jt.runDeferredCalls(), --jt.inEventHandler
+        };
+        if (e.callbackfunc) e.eventListenerFunc = t, e.target.addEventListener(e.eventTypeString, t, e.useCapture), jt.eventHandlers.push(e), jt.registerRemoveEventListeners(); else for (var r = 0; r < jt.eventHandlers.length; ++r) jt.eventHandlers[r].target == e.target && jt.eventHandlers[r].eventTypeString == e.eventTypeString && jt._removeHandler(r--)
+      }, queueEventHandlerOnThread_iiii: function (e, t, r, n, o) {
+        var a = gr(), i = Er(12);
+        $e[i >> 2] = r, $e[i + 4 >> 2] = n, $e[i + 8 >> 2] = o, mr(0, e, 637534208, t, n, i), vr(a)
+      }, getTargetThreadForEventCallback: function (e) {
+        switch (e) {
+          case 1:
+            return 0;
+          case 2:
+            return ft.currentProxiedOperationCallerThread;
+          default:
+            return e
+        }
+      }, getNodeNameForTarget: function (e) {
+        return e ? e == window ? "#window" : e == screen ? "#screen" : e && e.nodeName ? e.nodeName : "" : ""
+      }, fullscreenEnabled: function () {
+        return document.fullscreenEnabled || document.webkitFullscreenEnabled
+      }
+    }, Gt = [0, "undefined" != typeof document ? document : 0, "undefined" != typeof window ? window : 0], zt = {
+      counter: 1,
+      buffers: [],
+      programs: [],
+      framebuffers: [],
+      renderbuffers: [],
+      textures: [],
+      uniforms: [],
+      shaders: [],
+      vaos: [],
+      contexts: {},
+      offscreenCanvases: {},
+      timerQueriesEXT: [],
+      programInfos: {},
+      stringCache: {},
+      unpackAlignment: 4,
+      recordError: function (e) {
+        zt.lastError || (zt.lastError = e)
+      },
+      getNewId: function (e) {
+        for (var t = zt.counter++, r = e.length; r < t; r++) e[r] = null;
+        return t
+      },
+      getSource: function (e, t, r, n) {
+        for (var o = "", a = 0; a < t; ++a) {
+          var i = n ? $e[n + 4 * a >> 2] : -1;
+          o += xr($e[r + 4 * a >> 2], i < 0 ? void 0 : i)
+        }
+        return o
+      },
+      createContext: function (e, t) {
+        var r = e.getContext("webgl", t);
+        return r ? zt.registerContext(r, t) : 0
+      },
+      registerContext: function (e, t) {
+        var r = Jt(8);
+        $e[r + 4 >> 2] = sr();
+        var n = {handle: r, attributes: t, version: t.majorVersion, GLctx: e};
+        return e.canvas && (e.canvas.GLctxObject = n), zt.contexts[r] = n, (void 0 === t.enableExtensionsByDefault || t.enableExtensionsByDefault) && zt.initExtensions(n), r
+      },
+      makeContextCurrent: function (e) {
+        return zt.currentContext = zt.contexts[e], Ee.ctx = Qt = zt.currentContext && zt.currentContext.GLctx, !(e && !Qt)
+      },
+      getContext: function (e) {
+        return zt.contexts[e]
+      },
+      deleteContext: function (e) {
+        zt.currentContext === zt.contexts[e] && (zt.currentContext = null), "object" == typeof jt && jt.removeAllHandlersOnTarget(zt.contexts[e].GLctx.canvas), zt.contexts[e] && zt.contexts[e].GLctx.canvas && (zt.contexts[e].GLctx.canvas.GLctxObject = void 0), Kt(zt.contexts[e].handle), zt.contexts[e] = null
+      },
+      initExtensions: function (e) {
+        if (e || (e = zt.currentContext), !e.initExtensionsDone) {
+          e.initExtensionsDone = !0;
+          var t, r = e.GLctx;
+          !function (e) {
+            var t = e.getExtension("ANGLE_instanced_arrays");
+            if (t) e.vertexAttribDivisor = function (e, r) {
+              t.vertexAttribDivisorANGLE(e, r)
+            }, e.drawArraysInstanced = function (e, r, n, o) {
+              t.drawArraysInstancedANGLE(e, r, n, o)
+            }, e.drawElementsInstanced = function (e, r, n, o, a) {
+              t.drawElementsInstancedANGLE(e, r, n, o, a)
+            }
+          }(r), function (e) {
+            var t = e.getExtension("OES_vertex_array_object");
+            if (t) e.createVertexArray = function () {
+              return t.createVertexArrayOES()
+            }, e.deleteVertexArray = function (e) {
+              t.deleteVertexArrayOES(e)
+            }, e.bindVertexArray = function (e) {
+              t.bindVertexArrayOES(e)
+            }, e.isVertexArray = function (e) {
+              return t.isVertexArrayOES(e)
+            }
+          }(r), function (e) {
+            var t = e.getExtension("WEBGL_draw_buffers");
+            if (t) e.drawBuffers = function (e, r) {
+              t.drawBuffersWEBGL(e, r)
+            }
+          }(r), r.disjointTimerQueryExt = r.getExtension("EXT_disjoint_timer_query"), (t = r).multiDrawWebgl = t.getExtension("WEBGL_multi_draw"), (r.getSupportedExtensions() || []).forEach((function (e) {
+            e.indexOf("lose_context") < 0 && e.indexOf("debug") < 0 && r.getExtension(e)
+          }))
+        }
+      },
+      populateUniformTable: function (e) {
+        for (var t = zt.programs[e], r = zt.programInfos[e] = {
+          uniforms: {},
+          maxUniformLength: 0,
+          maxAttributeLength: -1,
+          maxUniformBlockNameLength: -1
+        }, n = r.uniforms, o = Qt.getProgramParameter(t, 35718), a = 0; a < o; ++a) {
+          var i = Qt.getActiveUniform(t, a), s = i.name;
+          r.maxUniformLength = Math.max(r.maxUniformLength, s.length + 1), "]" == s.slice(-1) && (s = s.slice(0, s.lastIndexOf("[")));
+          var u = Qt.getUniformLocation(t, s);
+          if (u) {
+            var c = zt.getNewId(zt.uniforms);
+            n[s] = [i.size, c], zt.uniforms[c] = u;
+            for (var l = 1; l < i.size; ++l) {
+              var d = s + "[" + l + "]";
+              u = Qt.getUniformLocation(t, d), c = zt.getNewId(zt.uniforms), zt.uniforms[c] = u
+            }
+          }
+        }
+      }
+    }, Wt = ["default", "low-power", "high-performance"], Yt = {}, Se || ft.initMainThreadBlock(), Ht = function (e, t, r, n) {
+      e || (e = this), this.parent = e, this.mount = e.mount, this.mounted = null, this.id = vt.nextInode++, this.name = t, this.mode = r, this.node_ops = {}, this.stream_ops = {}, this.rdev = n
+    }, $t = 365, Vt = 146, Object.defineProperties(Ht.prototype, {
+      read: {
+        get: function () {
+          return (this.mode & $t) === $t
+        }, set: function (e) {
+          e ? this.mode |= $t : this.mode &= -366
+        }
+      }, write: {
+        get: function () {
+          return (this.mode & Vt) === Vt
+        }, set: function (e) {
+          e ? this.mode |= Vt : this.mode &= -147
+        }
+      }, isFolder: {
+        get: function () {
+          return vt.isDir(this.mode)
+        }
+      }, isDevice: {
+        get: function () {
+          return vt.isChrdev(this.mode)
+        }
+      }
+    }), vt.FSNode = Ht, vt.staticInit(), function () {
+      for (var e = new Array(256), t = 0; t < 256; ++t) e[t] = String.fromCharCode(t);
+      yt = e
+    }(), Dt = Ee.BindingError = fn(Error, "BindingError"), St = Ee.InternalError = fn(Error, "InternalError"), Cn.prototype.isAliasOf = vn, Cn.prototype.clone = bn, Cn.prototype.delete = kn, Cn.prototype.isDeleted = Tn, Cn.prototype.deleteLater = Sn, $n.prototype.getPointee = In, $n.prototype.destructor = Fn, $n.prototype.argPackAdvance = 8, $n.prototype.readValueFromPointer = Ln, $n.prototype.deleteObject = Un, $n.prototype.fromWireType = Hn, Ee.getInheritedInstanceCount = jn, Ee.getLiveInheritedInstances = Gn, Ee.flushPendingDeletes = Dn, Ee.setDelayFunction = zn, Mt = Ee.UnboundTypeError = fn(Error, "UnboundTypeError"), Ee.count_emval_handles = io, Ee.get_first_emval = so, Xt = [null, an, sn, Xo, ea, ta, ra, na, oa, aa, ia, ua, Aa], qt = {
+      e: rn,
+      Q: an,
+      P: sn,
+      V: gn,
+      y: Zn,
+      q: eo,
+      m: ro,
+      $: oo,
+      U: co,
+      w: po,
+      d: mo,
+      c: Ao,
+      x: go,
+      o: vo,
+      W: Eo,
+      I: yo,
+      J: bo,
+      i: ko,
+      z: ao,
+      h: To,
+      _: Do,
+      C: So,
+      R: Co,
+      b: Oo,
+      Y: Po,
+      s: xo,
+      M: Bo,
+      t: Mo,
+      g: Ro,
+      f: qr,
+      k: pt,
+      j: jo,
+      D: Go,
+      F: Wo,
+      E: Yo,
+      G: qo,
+      r: Zo,
+      H: Ko,
+      N: ea,
+      O: ta,
+      v: ra,
+      S: na,
+      T: oa,
+      A: aa,
+      u: ia,
+      X: sa,
+      B: Qr,
+      a: Ue,
+      K: ca,
+      L: la,
+      l: fa,
+      p: ha,
+      n: ma,
+      Z: Aa
+    }, Vr(), Zt = Ee.___wasm_call_ctors = function () {
+      return (Zt = Ee.___wasm_call_ctors = Ee.asm.aa).apply(null, arguments)
+    }, Kt = Ee._free = function () {
+      return (Kt = Ee._free = Ee.asm.ba).apply(null, arguments)
+    }, Jt = Ee._malloc = function () {
+      return (Jt = Ee._malloc = Ee.asm.ca).apply(null, arguments)
+    }, er = Ee._strlen = function () {
+      return (er = Ee._strlen = Ee.asm.ea).apply(null, arguments)
+    },tr = Ee.___errno_location = function () {
+      return (tr = Ee.___errno_location = Ee.asm.fa).apply(null, arguments)
+    },rr = Ee.___getTypeName = function () {
+      return (rr = Ee.___getTypeName = Ee.asm.ga).apply(null, arguments)
+    },Ee.___embind_register_native_and_builtin_types = function () {
+      return (Ee.___embind_register_native_and_builtin_types = Ee.asm.ha).apply(null, arguments)
+    },nr = Ee._emscripten_get_global_libc = function () {
+      return (nr = Ee._emscripten_get_global_libc = Ee.asm.ia).apply(null, arguments)
+    },or = Ee.__get_tzname = function () {
+      return (or = Ee.__get_tzname = Ee.asm.ja).apply(null, arguments)
+    },ar = Ee.__get_daylight = function () {
+      return (ar = Ee.__get_daylight = Ee.asm.ka).apply(null, arguments)
+    },ir = Ee.__get_timezone = function () {
+      return (ir = Ee.__get_timezone = Ee.asm.la).apply(null, arguments)
+    },sr = Ee._pthread_self = function () {
+      return (sr = Ee._pthread_self = Ee.asm.ma).apply(null, arguments)
+    },ur = Ee._emscripten_main_browser_thread_id = function () {
+      return (ur = Ee._emscripten_main_browser_thread_id = Ee.asm.na).apply(null, arguments)
+    },cr = Ee.___pthread_tsd_run_dtors = function () {
+      return (cr = Ee.___pthread_tsd_run_dtors = Ee.asm.oa).apply(null, arguments)
+    },lr = Ee._emscripten_main_thread_process_queued_calls = function () {
+      return (lr = Ee._emscripten_main_thread_process_queued_calls = Ee.asm.pa).apply(null, arguments)
+    },Ee._emscripten_current_thread_process_queued_calls = function () {
+      return (Ee._emscripten_current_thread_process_queued_calls = Ee.asm.qa).apply(null, arguments)
+    },dr = Ee._emscripten_register_main_browser_thread_id = function () {
+      return (dr = Ee._emscripten_register_main_browser_thread_id = Ee.asm.ra).apply(null, arguments)
+    },fr = Ee.__emscripten_do_dispatch_to_thread = function () {
+      return (fr = Ee.__emscripten_do_dispatch_to_thread = Ee.asm.sa).apply(null, arguments)
+    },pr = Ee._emscripten_sync_run_in_main_thread_4 = function () {
+      return (pr = Ee._emscripten_sync_run_in_main_thread_4 = Ee.asm.ta).apply(null, arguments)
+    },hr = Ee._emscripten_run_in_main_runtime_thread_js = function () {
+      return (hr = Ee._emscripten_run_in_main_runtime_thread_js = Ee.asm.ua).apply(null, arguments)
+    },mr = Ee.__emscripten_call_on_thread = function () {
+      return (mr = Ee.__emscripten_call_on_thread = Ee.asm.va).apply(null, arguments)
+    },Ee._emscripten_tls_init = function () {
+      return (Ee._emscripten_tls_init = Ee.asm.wa).apply(null, arguments)
+    },Ar = Ee.__emscripten_thread_init = function () {
+      return (Ar = Ee.__emscripten_thread_init = Ee.asm.xa).apply(null, arguments)
+    },gr = Ee.stackSave = function () {
+      return (gr = Ee.stackSave = Ee.asm.ya).apply(null, arguments)
+    },vr = Ee.stackRestore = function () {
+      return (vr = Ee.stackRestore = Ee.asm.za).apply(null, arguments)
+    },Er = Ee.stackAlloc = function () {
+      return (Er = Ee.stackAlloc = Ee.asm.Aa).apply(null, arguments)
+    },yr = Ee._emscripten_stack_set_limits = function () {
+      return (yr = Ee._emscripten_stack_set_limits = Ee.asm.Ba).apply(null, arguments)
+    },wr = Ee._memalign = function () {
+      return (wr = Ee._memalign = Ee.asm.Ca).apply(null, arguments)
+    },Ee.dynCall_ijiii = function () {
+      return (Ee.dynCall_ijiii = Ee.asm.Da).apply(null, arguments)
+    },Ee.dynCall_viiijj = function () {
+      return (Ee.dynCall_viiijj = Ee.asm.Ea).apply(null, arguments)
+    },Ee.dynCall_jij = function () {
+      return (Ee.dynCall_jij = Ee.asm.Fa).apply(null, arguments)
+    },Ee.dynCall_jii = function () {
+      return (Ee.dynCall_jii = Ee.asm.Ga).apply(null, arguments)
+    },Ee.dynCall_jiji = function () {
+      return (Ee.dynCall_jiji = Ee.asm.Ha).apply(null, arguments)
+    },Ee._ff_h264_cabac_tables = 77706,_r = Ee.__emscripten_allow_main_runtime_queued_calls = 241152,br = Ee.__emscripten_main_thread_futex = 1178e3,Ee.PThread = ft,Ee.PThread = ft,Ee.wasmMemory = Ue,Ee.ExitStatus = va,at = function e() {
+      kr || Ea(), kr || (at = e)
+    },Ee.run = Ea,Ee.preInit) for ("function" == typeof Ee.preInit && (Ee.preInit = [Ee.preInit]); Ee.preInit.length > 0;) Ee.preInit.pop()();
+    Se && (Fe = !1, ft.initWorker()), Ea(), Tr = e(Ee)
+  }
+
+  var _a = !1;
+
+  function ba(e) {
+    let t = e.next(), r = null;
+    return n => {
+      var o = new Uint8Array(n);
+      if (r) {
+        var a = new Uint8Array(r.length + o.length);
+        a.set(r), a.set(o, r.length), o = a, r = null
+      }
+      for (; o.length >= t.value;) {
+        var i = o.slice(t.value);
+        t = e.next(o.slice(0, t.value)), o = i
+      }
+      o.length > 0 && (r = o)
+    }
+  }
+
+  function ka() {
+    ({}), Dr || (Dr = !0, wa()), a(), (() => {
+      try {
+        if ("object" == typeof WebAssembly && "function" == typeof WebAssembly.instantiate) {
+          const e = new WebAssembly.Module(Uint8Array.of(0, 97, 115, 109, 1, 0, 0, 0));
+          if (e instanceof WebAssembly.Module) return new WebAssembly.Instance(e) instanceof WebAssembly.Instance
+        }
+      } catch (e) {
+      }
+      return !1
+    })(), Date.now || (Date.now = function () {
+      return (new Date).getTime()
+    }), Tr.print = function (e) {
+      postMessage({cmd: "print", text: e})
+    }, Tr.printErr = function (e) {
+      postMessage({cmd: "printErr", text: e})
+    }, Tr.postRun = function () {
+      var e = [], t = {
+        _firstCheckpoint: 0, _lastCheckpoint: 0, _intervalBytes: 0, _lastSecondBytes: 0, addBytes: function (e) {
+          0 === t._firstCheckpoint ? (t._firstCheckpoint = Date.now(), t._lastCheckpoint = t._firstCheckpoint, t._intervalBytes += e) : Date.now() - t._lastCheckpoint < 1e3 ? t._intervalBytes += e : (t._lastSecondBytes = t._intervalBytes, t._intervalBytes = e, t._lastCheckpoint = Date.now())
+        }, reset: function () {
+          t._firstCheckpoint = t._lastCheckpoint = 0, t._intervalBytes = 0, t._lastSecondBytes = 0
+        }, getCurrentKBps: function () {
+          t.addBytes(0);
+          var e = (Date.now() - t._lastCheckpoint) / 1e3;
+          return 0 == e && (e = 1), t._intervalBytes / e / 1024
+        }, getLastSecondKBps: function () {
+          return t.addBytes(0), 0 !== t._lastSecondBytes ? t._lastSecondBytes / 1024 : Date.now() - t._lastCheckpoint >= 500 ? t.getCurrentKBps() : 0
+        }
+      }, r = {
+        opt: {}, initAudioPlanar: function (e, t) {
+          postMessage({cmd: "initAudioPlanar", samplerate: t, channels: e});
+          var r = [], n = [], o = 0;
+          this.playAudioPlanar = function (t, a) {
+            for (var i = a, s = [], u = 0, c = 0; c < 2; c++) {
+              var l = Tr.HEAPU32[(t >> 2) + c] >> 2;
+              s[c] = Tr.HEAPF32.subarray(l, l + i)
+            }
+            if (o) {
+              if (!(i >= (a = 1024 - o))) return o += i, r[0] = Float32Array.of(...r[0], ...s[0]), void (2 == e && (r[1] = Float32Array.of(...r[1], ...s[1])));
+              n[0] = Float32Array.of(...r[0], ...s[0].subarray(0, a)), 2 == e && (n[1] = Float32Array.of(...r[1], ...s[1].subarray(0, a))), postMessage({
+                cmd: "playAudio",
+                buffer: n
+              }, n.map((e => e.buffer))), u = a, i -= a
+            }
+            for (o = i; o >= 1024; o -= 1024) n[0] = s[0].slice(u, u += 1024), 2 == e && (n[1] = s[1].slice(u - 1024, u)), postMessage({
+              cmd: "playAudio",
+              buffer: n
+            }, n.map((e => e.buffer)));
+            o && (r[0] = s[0].slice(u), 2 == e && (r[1] = s[1].slice(u)))
+          }
+        }, inputFlv: function* () {
+          yield 9;
+          for (var t = new ArrayBuffer(4), r = new Uint8Array(t), a = new Uint32Array(t); ;) {
+            r[3] = 0;
+            var i = yield 15, s = i[4];
+            r[0] = i[7], r[1] = i[6], r[2] = i[5];
+            var u = a[0];
+            r[0] = i[10], r[1] = i[9], r[2] = i[8];
+            var c = a[0];
+            16777215 === c && (r[3] = i[11], c = a[0]);
+            var l = yield u;
+            switch (s) {
+              case 8:
+                this.opt.hasAudio && e.push({ts: c, payload: l, decoder: n, type: 0});
+                break;
+              case 9:
+                e.push({ts: c, payload: l, decoder: o, type: l[0] >> 4})
+            }
+          }
+        }, play: function (r) {
+          this.opt.debug && console.log("Jessibuca play", r), this.getDelay = function (e) {
+            return e ? (this.firstTimestamp = e, this.startTimestamp = Date.now(), this.getDelay = function (e) {
+              return this.delay = Date.now() - this.startTimestamp - (e - this.firstTimestamp), this.delay
+            }, -1) : -1
+          };
+          var i = this.opt.vod ? () => {
+            if (e.length) {
+              var t = e[0];
+              if (-1 === this.getDelay(t.ts)) e.shift(), this.ts = t.ts, t.decoder.decode(t.payload); else for (; e.length && (t = e[0], this.getDelay(t.ts) > this.videoBuffer);) e.shift(), this.ts = t.ts, t.decoder.decode(t.payload)
+            }
+          } : () => {
+            if (e.length) if (this.dropping) 1 == (t = e.shift()).type ? (this.dropping = !1, this.ts = t.ts, t.decoder.decode(t.payload)) : 0 == t.type && (this.ts = t.ts, t.decoder.decode(t.payload)); else {
+              var t = e[0];
+              if (-1 === this.getDelay(t.ts)) e.shift(), this.ts = t.ts, t.decoder.decode(t.payload); else if (this.delay > this.videoBuffer + 1e3) this.dropping = !0; else for (; e.length && (t = e[0], this.getDelay(t.ts) > this.videoBuffer);) e.shift(), this.ts = t.ts, t.decoder.decode(t.payload)
+            }
+          };
+          if (this.stopId = setInterval(i, 10), this.speedSamplerId = setInterval((() => {
+            postMessage({cmd: "kBps", kBps: t.getLastSecondKBps()})
+          }), 1e3), 0 == r.indexOf("http")) {
+            this.flvMode = !0;
+            var s = this, u = new AbortController;
+            fetch(r, {signal: u.signal}).then((function (e) {
+              var r = e.body.getReader(), n = s.inputFlv(), o = ba(n), a = function () {
+                r.read().then((({done: e, value: r}) => {
+                  e ? n.return(null) : (t.addBytes(r.byteLength), o(r), a())
+                })).catch((function (e) {
+                  n.return(null), s.opt.debug && console.error(e), -1 === e.toString().indexOf("The user aborted a request") && postMessage({
+                    cmd: "printErr",
+                    text: e.toString()
+                  })
+                }))
+              };
+              a()
+            })).catch((e => {
+              postMessage({cmd: "printErr", text: e.message})
+            })), this._close = function () {
+              u.abort()
+            }
+          } else {
+            if (this.flvMode = -1 != r.indexOf(".flv"), this.ws = new WebSocket(r), this.ws.binaryType = "arraybuffer", this.flvMode) {
+              let e = this.inputFlv();
+              var c = ba(e);
+              this.ws.onmessage = e => {
+                t.addBytes(e.data.byteLength), c(e.data)
+              }, this.ws.onerror = t => {
+                e.return(null), postMessage({cmd: "printErr", text: t.toString()})
+              }
+            } else this.ws.onmessage = r => {
+              t.addBytes(r.data.byteLength);
+              var a = new DataView(r.data);
+              switch (a.getUint8(0)) {
+                case 1:
+                  this.opt.hasAudio && e.push({
+                    ts: a.getUint32(1, !1),
+                    payload: new Uint8Array(r.data, 5),
+                    decoder: n,
+                    type: 0
+                  });
+                  break;
+                case 2:
+                  e.push({
+                    ts: a.getUint32(1, !1),
+                    payload: new Uint8Array(r.data, 5),
+                    decoder: o,
+                    type: a.getUint8(5) >> 4
+                  })
+              }
+            }, this.ws.onerror = e => {
+              postMessage({cmd: "printErr", text: e.toString()})
+            };
+            this._close = function () {
+              this.ws.close(), this.ws = null
+            }
+          }
+          this.setVideoSize = function (e, t) {
+            postMessage({cmd: "initSize", w: e, h: t});
+            var r = e * t, n = r >> 2;
+            if (this.opt.forceNoOffscreen || "undefined" == typeof OffscreenCanvas) this.draw = function (e, t, o, a) {
+              var i = [Tr.HEAPU8.subarray(t, t + r), Tr.HEAPU8.subarray(o, o + n), Tr.HEAPU8.subarray(a, a + n)].map((e => Uint8Array.from(e)));
+              postMessage({
+                cmd: "render",
+                compositionTime: e,
+                delay: this.delay,
+                ts: this.ts,
+                output: i
+              }, i.map((e => e.buffer)))
+            }; else {
+              var o = new OffscreenCanvas(e, t), i = o.getContext("webgl"), s = a().default(i);
+              this.draw = function (a, i, u, c) {
+                s(e, t, Tr.HEAPU8.subarray(i, i + r), Tr.HEAPU8.subarray(u, u + n), Tr.HEAPU8.subarray(c, c + n));
+                let l = o.transferToImageBitmap();
+                postMessage({cmd: "render", compositionTime: a, delay: this.delay, ts: this.ts, buffer: l}, [l])
+              }
+            }
+          }
+        }, close: function () {
+          this._close && (this.opt.debug && console.log("worker close"), this._close(), clearInterval(this.stopId), this.stopId = null, clearInterval(this.speedSamplerId), this.speedSamplerId = null, t.reset(), this.ws = null, n.clear(), o.clear(), this.firstTimestamp = 0, this.startTimestamp = 0, this.delay = 0, this.ts = 0, this.flvMode = !1, e = [], delete this.playAudioPlanar, delete this.draw, delete this.getDelay)
+        }
+      }, n = new Tr.AudioDecoder(r), o = new Tr.VideoDecoder(r);
+      postMessage({cmd: "init"}), self.onmessage = function (e) {
+        var t = e.data;
+        switch (t.cmd) {
+          case"init":
+            r.opt = JSON.parse(t.opt), n.sample_rate = t.sampleRate;
+            break;
+          case"getProp":
+            postMessage({cmd: "getProp", value: r[t.prop]});
+            break;
+          case"setProp":
+            r[t.prop] = t.value;
+            break;
+          case"play":
+            r.play(t.url);
+            break;
+          case"setVideoBuffer":
+            r.videoBuffer = 1e3 * t.time | 0;
+            break;
+          case"close":
+            r.close()
+        }
+      }
+    }
+  }
+
+  "undefined" == typeof importScripts ? ve || (ve = !0, {}, l(), U(), $(), q(), Ae(), v(), R(), ge = class {
+    constructor(e) {
+      if (this._opt = Object.assign(v().DEFAULT_OPTIONS, e), this.$container = e.container, "string" == typeof e.container && (this.$container = document.querySelector(e.container)), !this.$container) throw new Error("Jessibuca need container option");
+      delete this._opt.container, this._opt.debug && console.log("options", this._opt), Ae().default(this), l().default(this), U().default(this), q().default(this), $().default(this)
+    }
+
+    set fullscreen(e) {
+      e ? (R().checkFull() || this.$container.requestFullscreen(), R().$domToggle(this.$doms.minScreenDom, !0), R().$domToggle(this.$doms.fullscreenDom, !1)) : (R().checkFull() && document.exitFullscreen(), R().$domToggle(this.$doms.minScreenDom, !1), R().$domToggle(this.$doms.fullscreenDom, !0)), this._fullscreen !== e && (this.onFullscreen(e), this._trigger(v().EVEMTS.fullscreen, e)), this._fullscreen = e
+    }
+
+    get fullscreen() {
+      return this._fullscreen
+    }
+
+    set playing(e) {
+      e ? (R().$domToggle(this.$doms.playBigDom, !1), R().$domToggle(this.$doms.playDom, !1), R().$domToggle(this.$doms.pauseDom, !0), R().$domToggle(this.$doms.screenshotsDom, !0), R().$domToggle(this.$doms.recordDom, !0), this._quieting ? (R().$domToggle(this.$doms.quietAudioDom, !0), R().$domToggle(this.$doms.playAudioDom, !1)) : (R().$domToggle(this.$doms.quietAudioDom, !1), R().$domToggle(this.$doms.playAudioDom, !0))) : (this.$doms.speedDom && (this.$doms.speedDom.innerText = ""), this._playUrl && (R().$domToggle(this.$doms.playDom, !0), R().$domToggle(this.$doms.playBigDom, !0), R().$domToggle(this.$doms.pauseDom, !1)), R().$domToggle(this.$doms.recordDom, !1), R().$domToggle(this.$doms.recordingDom, !1), R().$domToggle(this.$doms.screenshotsDom, !1), R().$domToggle(this.$doms.quietAudioDom, !1), R().$domToggle(this.$doms.playAudioDom, !1)), this._playing !== e && (e ? (this.onPlay(), this._trigger(v().EVEMTS.play)) : (this.onPause(), this._trigger(v().EVEMTS.pause))), this._playing = e
+    }
+
+    get playing() {
+      return this._playing
+    }
+
+    set quieting(e) {
+      e ? (R().$domToggle(this.$doms.quietAudioDom, !0), R().$domToggle(this.$doms.playAudioDom, !1)) : (R().$domToggle(this.$doms.quietAudioDom, !1), R().$domToggle(this.$doms.playAudioDom, !0)), this._quieting !== e && (this.onMute(e), this._trigger(v().EVEMTS.mute, e)), this._quieting = e
+    }
+
+    get quieting() {
+      return this._quieting
+    }
+
+    set loading(e) {
+      e ? (R().$hideBtns(this.$doms), R().$domToggle(this.$doms.fullscreenDom, !0), R().$domToggle(this.$doms.pauseDom, !0), R().$domToggle(this.$doms.loadingDom, !0)) : R().$initBtns(this.$doms), this._loading = e
+    }
+
+    get loading() {
+      return this._loading
+    }
+
+    set recording(e) {
+      e ? (R().$domToggle(this.$doms.recordDom, !1), R().$domToggle(this.$doms.recordingDom, !0)) : (R().$domToggle(this.$doms.recordDom, !0), R().$domToggle(this.$doms.recordingDom, !1)), this._recording !== e && (this.onRecord(e), this._trigger(v().EVEMTS.record, e), this._recording = e)
+    }
+
+    get recording() {
+      return this._recording
+    }
+
+    setDebug(e) {
+      this._opt.isDebug = !!e
+    }
+
+    setTimeout(e) {
+      this._opt.timeout = Number(e)
+    }
+
+    setVod(e) {
+      this._opt.vod = !!e
+    }
+
+    setNoOffscreen(e) {
+      this._opt.forceNoOffscreen = !!e
+    }
+
+    setScaleMode(e) {
+      0 === (e = Number(e)) ? (this._opt.isFullResize = !1, this._opt.isResize = !1) : 1 === e ? (this._opt.isFullResize = !1, this._opt.isResize = !0) : 2 === e && (this._opt.isFullResize = !0), this._resize()
+    }
+
+    mute() {
+      this._mute()
+    }
+
+    cancelMute() {
+      this._cancelMute()
+    }
+
+    audioResume() {
+      this._cancelMute()
+    }
+
+    pause() {
+      this._pause()
+    }
+
+    play(e) {
+      this._play(e)
+    }
+
+    close() {
+      this._close()
+    }
+
+    destroy() {
+      this._close(), this._destroyAudioContext(), this._destroyContextGL(), this._decoderWorker.terminate(), this._removeEventListener(), this._initCheckVariable(), this._off(), this._removeContainerChild()
+    }
+
+    clearView() {
+      this._clearView()
+    }
+
+    resize() {
+      this._resize()
+    }
+
+    setBufferTime(e) {
+      e = Number(e), this._decoderWorker.postMessage({cmd: v().POST_MESSAGE.setVideoBuffer, time: e})
+    }
+
+    setRotate(e) {
+      e = parseInt(e, 10), this._opt.rotate !== e && -1 !== [0, 90, 270].indexOf(e) && (this._opt.rotate = e, this.resize())
+    }
+
+    setVolume(e) {
+      if (this._gainNode) {
+        if (e = parseFloat(e), isNaN(e)) return;
+        this._gainNode.gain.setValueAtTime(e, this._audioContext.currentTime)
+      }
+    }
+
+    setKeepScreenOn() {
+      this._opt.keepScreenOn = !0
+    }
+
+    setFullscreen(e) {
+      const t = !!e;
+      this.fullscreen !== t && (this.fullscreen = t)
+    }
+
+    hasLoaded() {
+      return this._hasLoaded
+    }
+
+    screenshot(e, t, r) {
+      this._screenshot(e, t, r)
+    }
+
+    on(e, t) {
+      this._on(e, t)
+    }
+  }, window.Jessibuca = ge) : _a || (_a = !0, ka())
+}();
diff --git a/web_src/static/js/jessibuca/logo.png b/web_src/static/js/jessibuca/logo.png
new file mode 100644
index 0000000..751de2a
--- /dev/null
+++ b/web_src/static/js/jessibuca/logo.png
Binary files differ

--
Gitblit v1.8.0