diff --git a/public/admin.html b/public/admin.html index 4acb9d1a6..3f920f5e0 100755 --- a/public/admin.html +++ b/public/admin.html @@ -72,6 +72,7 @@ + diff --git a/public/components/property/parkingAreaControlCarInout/parkingAreaControlCarInout.html b/public/components/property/parkingAreaControlCarInout/parkingAreaControlCarInout.html new file mode 100644 index 000000000..720d7225c --- /dev/null +++ b/public/components/property/parkingAreaControlCarInout/parkingAreaControlCarInout.html @@ -0,0 +1,10 @@ +
+
+
+ +
+
+ +
+
+
\ No newline at end of file diff --git a/public/components/property/parkingAreaControlCarInout/parkingAreaControlCarInout.js b/public/components/property/parkingAreaControlCarInout/parkingAreaControlCarInout.js new file mode 100644 index 000000000..6a7df8d0d --- /dev/null +++ b/public/components/property/parkingAreaControlCarInout/parkingAreaControlCarInout.js @@ -0,0 +1,23 @@ +/** + 入驻小区 + **/ + (function (vc) { + vc.extends({ + data: { + parkingAreaControlCarInoutInfo: { + inImg:'/img/carInout.jpg', + outImg:'/img/carInout.jpg' + + } + }, + _initMethod: function () { + + }, + _initEvent: function () { + + }, + methods: { + + } + }); +})(window.vc); \ No newline at end of file diff --git a/public/components/property/parkingAreaControlCarInouts/parkingAreaControlCarInouts.html b/public/components/property/parkingAreaControlCarInouts/parkingAreaControlCarInouts.html new file mode 100644 index 000000000..71a406240 --- /dev/null +++ b/public/components/property/parkingAreaControlCarInouts/parkingAreaControlCarInouts.html @@ -0,0 +1,39 @@ +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
进出场编号车辆状态车辆类型车牌号进场时间出场时间停车时间(小时)收费金额
{{carIn.inoutId}}{{carIn.stateName}}{{carIn.carNum}}{{carIn.carNum}}{{carIn.inTime}}{{carIn.outTime}}{{carIn.inHours}}小时{{carIn.inMin}}分{{carIn.outTime}}{{carIn.amount}}
+
    +
    + + +
    \ No newline at end of file diff --git a/public/components/property/parkingAreaControlCarInouts/parkingAreaControlCarInouts.js b/public/components/property/parkingAreaControlCarInouts/parkingAreaControlCarInouts.js new file mode 100644 index 000000000..d44ffed74 --- /dev/null +++ b/public/components/property/parkingAreaControlCarInouts/parkingAreaControlCarInouts.js @@ -0,0 +1,22 @@ +/** + 入驻小区 + **/ +(function (vc) { + vc.extends({ + data: { + parkingAreaControlCarInoutsInfo: { + carIns: [] + + } + }, + _initMethod: function () { + + }, + _initEvent: function () { + + }, + methods: { + + } + }); +})(window.vc); \ No newline at end of file diff --git a/public/components/property/parkingAreaControlCustomCarInout/parkingAreaControlCustomCarInout.html b/public/components/property/parkingAreaControlCustomCarInout/parkingAreaControlCustomCarInout.html new file mode 100644 index 000000000..99cc0bec8 --- /dev/null +++ b/public/components/property/parkingAreaControlCustomCarInout/parkingAreaControlCustomCarInout.html @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/public/components/property/parkingAreaControlCustomCarInout/parkingAreaControlCustomCarInout.js b/public/components/property/parkingAreaControlCustomCarInout/parkingAreaControlCustomCarInout.js new file mode 100644 index 000000000..af69b0630 --- /dev/null +++ b/public/components/property/parkingAreaControlCustomCarInout/parkingAreaControlCustomCarInout.js @@ -0,0 +1,77 @@ +(function (vc, vm) { + + vc.extends({ + data: { + parkingAreaControlCustomCarInoutInfo: { + carNum: '', + amount: '', + remark: '', + type: '1101', + payCharge: '' + } + }, + _initMethod: function () { + + }, + _initEvent: function () { + vc.on('parkingAreaControlCustomCarInout', 'open', function (_params) { + vc.component.refreshParkingAreaControlCustomCarInoutInfo(); + $('#parkingAreaControlCustomCarInoutModel').modal('show'); + // = _params; + vc.copyObject(_params, vc.component.parkingAreaControlCustomCarInoutInfo); + vc.component.parkingAreaControlCustomCarInoutInfo.communityId = vc.getCurrentCommunity().communityId; + }); + }, + methods: { + parkingAreaControlCustomCarInoutValidate: function () { + return vc.validate.validate({ + parkingAreaControlCustomCarInoutInfo: vc.component.parkingAreaControlCustomCarInoutInfo + }, { + 'parkingAreaControlCustomCarInoutInfo.carNum': [ + { + limit: "required", + param: "", + errInfo: "车牌号不能为空" + } + ] + }); + }, + parkingAreaControlCustomCarInout: function () { + if (!vc.component.parkingAreaControlCustomCarInoutValidate()) { + vc.toast(vc.validate.errInfo); + return; + } + vc.http.apiPost( + '/machine.customCarInOutCmd', + JSON.stringify(vc.component.parkingAreaControlCustomCarInoutInfo), + { + emulateJSON: true + }, + function (json, res) { + //vm.menus = vm.refreshMenuActive(JSON.parse(json),0); + let _data = JSON.parse(json); + if (_data.code != 0) { + vc.toast(_data.msg); + } else { + vc.toast(_data.msg); + } + }, + function (errInfo, error) { + console.log('请求失败处理'); + + vc.toast(errInfo); + }); + }, + refreshParkingAreaControlCustomCarInoutInfo: function () { + vc.component.parkingAreaControlCustomCarInoutInfo = { + carNum: '', + amount: '', + remark: '', + type: '1101', + payCharge: '' + } + } + } + }); + +})(window.vc, window.vc.component); \ No newline at end of file diff --git a/public/components/property/parkingAreaControlFee/parkingAreaControlFee.html b/public/components/property/parkingAreaControlFee/parkingAreaControlFee.html new file mode 100644 index 000000000..164049827 --- /dev/null +++ b/public/components/property/parkingAreaControlFee/parkingAreaControlFee.html @@ -0,0 +1,59 @@ +
    +
    +
    +
    +
    +
    +

    收费信息

    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    +
    +
    \ No newline at end of file diff --git a/public/components/property/parkingAreaControlFee/parkingAreaControlFee.js b/public/components/property/parkingAreaControlFee/parkingAreaControlFee.js new file mode 100644 index 000000000..678ce6f04 --- /dev/null +++ b/public/components/property/parkingAreaControlFee/parkingAreaControlFee.js @@ -0,0 +1,34 @@ +/** + 入驻小区 + **/ +(function (vc) { + vc.extends({ + data: { + parkingAreaControlFeeInfo: { + carNum: "", + time: "", + payCharge: 0.0, + pay: 0.0, + remark: "", + open: "", + openMsg: "", + } + }, + _initMethod: function () { + + }, + _initEvent: function () { + + }, + methods: { + saveTempFeeInfo: function () { + vc.emit('parkingAreaControlCustomCarInout', 'open', { + type: "1102", //1101 手动入场 1102 手动出场 + carNum: $that.parkingAreaControlFeeInfo.carNum, + amount: $that.parkingAreaControlFeeInfo.pay, + payCharge: $that.parkingAreaControlFeeInfo.payCharge, + }) + } + } + }); +})(window.vc); \ No newline at end of file diff --git a/public/components/property/parkingAreaControlInCar/parkingAreaControlInCar.html b/public/components/property/parkingAreaControlInCar/parkingAreaControlInCar.html new file mode 100644 index 000000000..99e806732 --- /dev/null +++ b/public/components/property/parkingAreaControlInCar/parkingAreaControlInCar.html @@ -0,0 +1,32 @@ +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    进出场ID车辆状态车牌号进场时间在场时间(小时)
    {{carIn.inoutId}}{{carIn.stateName}}{{carIn.carNum}}{{carIn.inTime}}{{carIn.inHours}}小时{{carIn.inMin}}分
    +
      +
      + + +
      \ No newline at end of file diff --git a/public/components/property/parkingAreaControlInCar/parkingAreaControlInCar.js b/public/components/property/parkingAreaControlInCar/parkingAreaControlInCar.js new file mode 100644 index 000000000..4a328ae5b --- /dev/null +++ b/public/components/property/parkingAreaControlInCar/parkingAreaControlInCar.js @@ -0,0 +1,22 @@ +/** + 入驻小区 + **/ +(function (vc) { + vc.extends({ + data: { + parkingAreaControlInCarInfo: { + carIns: [] + + } + }, + _initMethod: function () { + + }, + _initEvent: function () { + + }, + methods: { + + } + }); +})(window.vc); \ No newline at end of file diff --git a/public/components/property/parkingAreaControlVideo/parkingAreaControlVideo.html b/public/components/property/parkingAreaControlVideo/parkingAreaControlVideo.html new file mode 100644 index 000000000..63ea99752 --- /dev/null +++ b/public/components/property/parkingAreaControlVideo/parkingAreaControlVideo.html @@ -0,0 +1,80 @@ +
      +
      +
      +
      +
      +
      + +
      + +
      +
      +
      +
      + +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      + +
      +
      +
      +
      +
      +
      + + +
      +
      +
      +
      +
      +
      +
      +
      +
      + +
      +
      +
      +
      + +
      +
      +
      + + +
      \ No newline at end of file diff --git a/public/components/property/parkingAreaControlVideo/parkingAreaControlVideo.js b/public/components/property/parkingAreaControlVideo/parkingAreaControlVideo.js new file mode 100644 index 000000000..7dfbfcde0 --- /dev/null +++ b/public/components/property/parkingAreaControlVideo/parkingAreaControlVideo.js @@ -0,0 +1,216 @@ +/** + 入驻小区 + **/ +(function (vc) { + vc.extends({ + data: { + parkingAreaControlVideoInfo: { + paId: '', + inMachineId: '', + outMachineId: '', + inMachines: [], + outMachines: [] + + } + }, + _initMethod: function () { + + }, + _initEvent: function () { + vc.on('parkingAreaControlVideo', 'notify', function (param) { + if (param.hasOwnProperty('paId')) { + $that.parkingAreaControlVideoInfo.paId = param.paId; + $that._listMachines(); + } + }) + }, + methods: { + _listMachines: function () { + let param = { + params: { + locationObjId: $that.parkingAreaControlVideoInfo.paId, + page: 1, + row: 100, + machineTypeCd: '9996', + communityId: vc.getCurrentCommunity().communityId + } + } + //发送get请求 + vc.http.get('machineManage', + 'list', + param, + function (json, res) { + let _machineManageInfo = JSON.parse(json); + let _machines = _machineManageInfo.machines; + _machines.forEach(item => { + if (item.direction == '3306') { + $that.parkingAreaControlVideoInfo.inMachines.push(item); + } else { + $that.parkingAreaControlVideoInfo.outMachines.push(item); + } + }); + + }, function (errInfo, error) { + console.log('请求失败处理'); + } + ); + }, + _swatchVedio: function () { + //创建一个socket实例 + let wsUrl = ""; + let _enterMachineId = $that.parkingAreaControlVideoInfo.inMachineId; + $that.parkingAreaControlVideoInfo.inMachines.forEach((item) => { + if (item.machineId == _enterMachineId) { + wsUrl = item.machineIp; + if (item.machineVersion.indexOf('300') > -1) { + wsUrl += "/ws.flv" + } else { + wsUrl += "/ws" + } + } + }); + + wsUrl = wsUrl.replace(':8131', ':9080'); + let _protocol = window.location.protocol; + if (_protocol.startsWith('https')) { + wsUrl = + "wss://" + wsUrl; + } else { + wsUrl = + "ws://" + wsUrl; + } + let image = document.getElementById("receiver1"); + if (wsUrl.endsWith(".flv")) { + image = document.getElementById("receiver1Div"); + let jessibuca = new Jessibuca({ + container: image, + videoBuffer: 0.2, + isResize: false, + }); + jessibuca.onLoad = function () { + this.play(wsUrl); + }; + return; + } + let receiver_socket = new WebSocket(wsUrl); + // 监听消息 + receiver_socket.onmessage = function (data) { + let reader = new FileReader(); + reader.onload = function (evt) { + if (evt.target.readyState == FileReader.DONE) { + let url = evt.target.result; + image.src = "data:image/png;" + url; + } + }; + reader.readAsDataURL(data.data); + }; + }, + _swatchOutVedio: function () { + //创建一个socket实例 + let wsUrl = ""; + let _outMachineId = $that.parkingAreaControlVideoInfo.outMachineId; + let paId = ""; + $that.parkingAreaControlVideoInfo.outMachines.forEach((item) => { + if (item.machineId == _outMachineId) { + wsUrl = item.machineIp; + paId = item.locationObjId; + if (item.machineVersion.indexOf('300') > -1) { + wsUrl += "/ws.flv" + } else { + wsUrl += "/ws" + } + } + }); + wsUrl = wsUrl.replace(':8131', ':9080') + let _protocol = window.location.protocol; + if (_protocol.startsWith('https')) { + wsUrl = + "wss://" + wsUrl; + } else { + wsUrl = + "ws://" + wsUrl; + } + + let image = document.getElementById("receiver2"); + if (wsUrl.endsWith(".flv")) { + image = document.getElementById("receiver2Div"); + let jessibuca = new Jessibuca({ + container: image, + videoBuffer: 0.2, + isResize: false, + }); + jessibuca.onLoad = function () { + this.play(wsUrl); + }; + return; + } + let receiver_socket = new WebSocket(wsUrl); + // 监听消息 + receiver_socket.onmessage = function (data) { + //image.src = 'data:image/png;' + data.data; + let reader = new FileReader(); + reader.onload = function (evt) { + if (evt.target.readyState == FileReader.DONE) { + let url = evt.target.result; + image.src = "data:image/png;" + url; + } + }; + reader.readAsDataURL(data.data); + }; + }, + _openDoor: function (_inOut) { + let _machines = []; + let _machineId = ""; + if (_inOut == 'in') { + _machines = $that.parkingAreaControlVideoInfo.inMachines; + _machineId = $that.parkingAreaControlVideoInfo.inMachineId; + } else { + _machines = $that.parkingAreaControlVideoInfo.outMachines; + _machineId = $that.parkingAreaControlVideoInfo.outMachineId; + } + + if (_machines.length == 0) { + vc.toast('请先选择设备'); + return; + } + let _machineCode = ''; + _machines.forEach(item => { + if (item.machineId == _machineId) { + _machineCode = item.machineCode; + } + }) + let _data = { + "machineCode": _machineCode, + "stateName": "开门", + "state": "1500", + "url": "/machine/openDoor", + "userRole": "staff", + "communityId": vc.getCurrentCommunity().communityId + }; + vc.http.apiPost('/machine/openDoor', + JSON.stringify(_data), + { + emulateJSON: true + }, + function (json, res) { + let _data = JSON.parse(json); + if (_data.code != 0) { + vc.toast(_data.msg); + } else { + vc.toast('已请求设备'); + } + }, + function (errInfo, error) { + console.log('请求失败处理'); + vc.toast(json); + }); + }, + customCarIn: function (_type) { + vc.emit('parkingAreaControlCustomCarInout', 'open', { + type: _type + }) + } + + } + }); +})(window.vc); \ No newline at end of file diff --git a/public/css/vc-ui.css b/public/css/vc-ui.css index cfebedcd2..e9baa4ece 100755 --- a/public/css/vc-ui.css +++ b/public/css/vc-ui.css @@ -2025,6 +2025,13 @@ a:hover { height:2px; background: -webkit-linear-gradient(left, #fff -4%,#1ab394 50%,#fff 100%); } + +.vc-line-y{ + width:2px; + height:100%; + background: -webkit-linear-gradient(top, #fff -4%,#1ab394 50%,#fff 100%); +} + .vc-table-border{ border: 1px solid #000000; } diff --git a/public/ff.js b/public/ff.js new file mode 100644 index 000000000..7335e2af2 --- /dev/null +++ b/public/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=false;var ENVIRONMENT_IS_NODE=false;var ENVIRONMENT_IS_SHELL=false;ENVIRONMENT_IS_WEB=typeof window==="object";ENVIRONMENT_IS_WORKER=typeof importScripts==="function";ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var read_,readAsync,readBinary,setWindowTitle;var nodeFS;var nodePath;if(ENVIRONMENT_IS_NODE){if(ENVIRONMENT_IS_WORKER){scriptDirectory=require("path").dirname(scriptDirectory)+"/"}else{scriptDirectory=__dirname+"/"}read_=function shell_read(filename,binary){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);return nodeFS["readFileSync"](filename,binary?null:"utf8")};readBinary=function readBinary(filename){var ret=read_(filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status){process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_SHELL){if(typeof read!="undefined"){read_=function shell_read(f){return read(f)}}readBinary=function readBinary(f){var data;if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){arguments_=scriptArgs}else if(typeof arguments!="undefined"){arguments_=arguments}if(typeof quit==="function"){quit_=function(status){quit(status)}}if(typeof print!=="undefined"){if(typeof console==="undefined")console={};console.log=print;console.warn=console.error=typeof printErr!=="undefined"?printErr:print}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(document.currentScript){scriptDirectory=document.currentScript.src}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function shell_read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function readBinary(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function readAsync(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){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"];function dynamicAlloc(size){var ret=HEAP32[DYNAMICTOP_PTR>>2];var end=ret+size+15&-16;HEAP32[DYNAMICTOP_PTR>>2]=end;return ret}function getNativeTypeSize(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return 4}else if(type[0]==="i"){var bits=Number(type.substr(1));assert(bits%8===0,"getNativeTypeSize invalid bits "+bits+", type "+type);return bits/8}else{return 0}}}}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 wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime;if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(typeof WebAssembly!=="object"){err("no native wasm support detected")}function setValue(ptr,value,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":HEAP8[ptr>>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=1?tempDouble>0?(Math_min(+Math_floor(tempDouble/4294967296),4294967295)|0)>>>0:~~+Math_ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}var wasmMemory;var wasmTable=new WebAssembly.Table({"initial":1552,"maximum":1552+0,"element":"anyfunc"});var ABORT=false;var EXITSTATUS=0;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var ALLOC_NONE=3;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,stackAlloc,dynamicAlloc][allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var stop;ptr=ret;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i=endIdx))++endPtr;if(endPtr-idx>16&&u8Array.subarray&&UTF8Decoder){return UTF8Decoder.decode(u8Array.subarray(idx,endPtr))}else{var str="";while(idx>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[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=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}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr){var endPtr=ptr;var idx=endPtr>>1;while(HEAP16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}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=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=55296&&codeUnit<=57343)++i;len+=4}return len}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var WASM_PAGE_SIZE=65536;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 DYNAMIC_BASE=8706896,DYNAMICTOP_PTR=3463856;var INITIAL_INITIAL_MEMORY=Module["INITIAL_MEMORY"]||67108864;if(Module["wasmMemory"]){wasmMemory=Module["wasmMemory"]}else{wasmMemory=new WebAssembly.Memory({"initial":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE,"maximum":INITIAL_INITIAL_MEMORY/WASM_PAGE_SIZE})}if(wasmMemory){buffer=wasmMemory.buffer}INITIAL_INITIAL_MEMORY=buffer.byteLength;updateGlobalBufferAndViews(buffer);HEAP32[DYNAMICTOP_PTR>>2]=DYNAMIC_BASE;function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Module["dynCall_v"](func)}else{Module["dynCall_vi"](func,callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){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(){FS.ignorePermissions=false;callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){runtimeExited=true}function postRun(){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)}function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}var Math_abs=Math.abs;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_min=Math.min;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){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)}what+="";out(what);err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";throw new WebAssembly.RuntimeError(what)}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return String.prototype.startsWith?filename.startsWith(dataURIPrefix):filename.indexOf(dataURIPrefix)===0}var wasmBinaryFile="ff.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(){try{if(wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(wasmBinaryFile)}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)&&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()})}return new Promise(function(resolve,reject){resolve(getBinary())})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiatedSource(output){receiveInstance(output["instance"])}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"){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");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;__ATINIT__.push({func:function(){___wasm_call_ctors()}});function demangle(func){return func}function demangleAll(text){var regex=/\b_Z[\w\d_]+/g;return text.replace(regex,function(x){var y=demangle(x);return x===y?x:y+" ["+x+"]"})}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){var js=jsStackTrace();if(Module["extraStackTrace"])js+="\n"+Module["extraStackTrace"]();return demangleAll(js)}function ___cxa_allocate_exception(size){return _malloc(size)}var ___exception_infos={};var ___exception_last=0;function __ZSt18uncaught_exceptionv(){return __ZSt18uncaught_exceptionv.uncaught_exceptions>0}function ___cxa_throw(ptr,type,destructor){___exception_infos[ptr]={ptr:ptr,adjusted:[ptr],type:type,destructor:destructor,refcount:0,caught:false,rethrown:false};___exception_last=ptr;if(!("uncaught_exception"in __ZSt18uncaught_exceptionv)){__ZSt18uncaught_exceptionv.uncaught_exceptions=1}else{__ZSt18uncaught_exceptionv.uncaught_exceptions++}throw ptr}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___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"/";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)}};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=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;i0){result=buf.slice(0,bytesRead).toString("utf-8")}else{result=null}}else 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=[]}}}};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}return node},getFileDataAsRegularArray:function(node){if(node.contents&&node.contents.subarray){var arr=[];for(var i=0;i=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity0)node.contents.set(oldContents.subarray(0,node.usedBytes),0);return},resizeFileStorage:function(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0;return}if(!node.contents||node.contents.subarray){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;return}if(!node.contents)node.contents=[];if(node.contents.length>newSize)node.contents.length=newSize;else while(node.contents.length=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;i0||position+length8){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;i40){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>>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,"rs":1052672,"r+":2,"w":577,"wx":705,"xw":705,"w+":578,"wx+":706,"xw+":706,"a":1089,"ax":1217,"xa":1217,"a+":1090,"ax+":1218,"xa+":1218},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;ithis.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(){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}return fn.apply(null,arguments)}});stream_ops.read=function stream_ops_read(stream,buffer,offset,length,position){if(!FS.forceLoadFile(node)){throw new FS.ErrnoError(29)}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>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>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>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 ___syscall221(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 ___syscall3(fd,buf,count){try{var stream=SYSCALLS.getStreamFromFD(fd);return FS.read(stream,HEAP8,buf,count)}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall5(path,flags,varargs){SYSCALLS.varargs=varargs;try{var pathname=SYSCALLS.getStr(path);var mode=SYSCALLS.get();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}}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)}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function count_emval_handles(){var count=0;for(var i=5;i>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")}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}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 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&®isteredClass.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 embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(dynCall){var args=[];for(var i=1;i0?", ":"")+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>2)+i])}return array}function __embind_register_class_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,fn){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;function unboundTypesHandler(){throwUnboundTypeError("Cannot call "+humanName+" due to unbound types",rawArgTypes)}var proto=classType.registeredClass.constructor;if(undefined===proto[methodName]){unboundTypesHandler.argCount=argCount-1;proto[methodName]=unboundTypesHandler}else{ensureOverloadTable(proto,methodName,humanName);proto[methodName].overloadTable[argCount-1]=unboundTypesHandler}whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));var func=craftInvokerFunction(humanName,invokerArgsArray,null,rawInvoker,fn);if(undefined===proto[methodName].overloadTable){func.argCount=argCount-1;proto[methodName]=func}else{proto[methodName].overloadTable[argCount-1]=func}return[]});return[]})}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[]})}function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(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}}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(valuemaxRange){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 endChar=HEAPU8[value+4+length];var endCharSwap=0;if(endChar!=0){endCharSwap=endChar;HEAPU8[value+4+length]=0}var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(HEAPU8[currentBytePtr]==0){var stringSegment=UTF8ToString(decodeStartPtr);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}if(endCharSwap!=0){HEAPU8[value+4+length]=endCharSwap}}else{var a=new Array(length);for(var i=0;i>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i255){_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>2];var HEAP=getHeap();var str;var endChar=HEAP[value+4+length*charSize>>shift];var endCharSwap=0;if(endChar!=0){endCharSwap=endChar;HEAP[value+4+length*charSize>>shift]=0}var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(HEAP[currentBytePtr>>shift]==0){var stringSegment=decodeString(decodeStartPtr);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}if(endCharSwap!=0){HEAP[value+4+length*charSize>>shift]=endCharSwap}_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 __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)}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i>2)+i],"parameter "+i)}return a}function __emval_call(handle,argCount,argTypes,argv){handle=requireHandle(handle);var types=__emval_lookupTypes(argCount,argTypes);var args=new Array(argCount);for(var i=0;i>2]=__emval_register(destructors);return destructors}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_method(caller,handle,methodName,destructorsRef,args){caller=emval_methodCallers[caller];handle=requireHandle(handle);methodName=getStringOrSymbol(methodName);return caller(handle,methodName,__emval_allocateDestructors(destructorsRef),args)}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_get_global(){if(typeof globalThis==="object"){return globalThis}return function(){return Function}()("return this")()}function __emval_get_global(name){if(name===0){return __emval_register(emval_get_global())}else{name=getStringOrSymbol(name);return __emval_register(emval_get_global()[name])}}function __emval_addMethodCaller(caller){var id=emval_methodCallers.length;emval_methodCallers.push(caller);return id}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;i4){emval_handle_array[handle].refcount+=1}}function craftEmvalAllocator(argCount){var argsList="";for(var i=0;i> 2) + "+i+'], "parameter '+i+'");\n'+"var arg"+i+" = argType"+i+".readValueFromPointer(args);\n"+"args += argType"+i+"['argPackAdvance'];\n"}functionBody+="var obj = new constructor("+argsList+");\n"+"return __emval_register(obj);\n"+"}\n";return new Function("requireRegisteredType","Module","__emval_register",functionBody)(requireRegisteredType,Module,__emval_register)}var emval_newers={};function __emval_new(handle,argCount,argTypes,args){handle=requireHandle(handle);var newer=emval_newers[argCount];if(!newer){newer=craftEmvalAllocator(argCount);emval_newers[argCount]=newer}return newer(handle,argTypes,args)}function __emval_new_cstring(v){return __emval_register(getStringOrSymbol(v))}function __emval_new_object(){return __emval_register({})}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function __emval_set_property(handle,key,value){handle=requireHandle(handle);key=requireHandle(key);value=requireHandle(value);handle[key]=value}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 __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 __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=0){if(flagAlwaysSigned){prefix="+"+prefix}else if(flagPadSign){prefix=" "+prefix}}if(argText.charAt(0)=="-"){prefix="-"+prefix;argText=argText.substr(1)}while(prefix.length+argText.lengthexponent&&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>0])}}else{ret=ret.concat(intArrayFromString("(null)".substr(0,argLength),true))}if(flagLeftAlign){while(argLength0){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>0])}}}textIndex+=2}else{ret.push(curr);textIndex+=1}}return ret}function __emscripten_traverse_stack(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&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=__emscripten_traverse_stack(arguments);while(stack_args[1].indexOf("_emscripten_")>=0)stack_args=__emscripten_traverse_stack(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 jsSymbolName="";var file="";var lineno=0;var column=0;var parts=chromeRe.exec(line);if(parts&&parts.length==5){jsSymbolName=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){jsSymbolName=parts[1];file=parts[2];lineno=parts[3];column=parts[4]|0}else{callstack+=line+"\n";continue}}var cSymbolName=flags&32?demangle(jsSymbolName):jsSymbolName;if(!cSymbolName){cSymbolName=jsSymbolName}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 "+cSymbolName+" ("+orig.source+":"+orig.line+":"+orig.column+")\n"}}if(flags&16||!haveSourceMap){if(flags&64){file=file.substring(file.replace(/\\/g,"/").lastIndexOf("/")+1)}callstack+=(haveSourceMap?" = "+jsSymbolName:" at "+cSymbolName)+" ("+file+":"+lineno+":"+column+")\n"}if(flags&128&&stack_args[0]){if(stack_args[1]==jsSymbolName&&stack_args[2].length>0){callstack=callstack.replace(/\s+$/,"");callstack+=" with values: "+stack_args[1]+stack_args[2]+"\n"}stack_args=__emscripten_traverse_stack(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,varargs){var format=HEAP32[varargs>>2];varargs+=4;var str="";if(format){var result=__formatString(format,varargs);for(var i=0;i>0]=type;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){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){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}var ___tm_timezone=(stringToUTF8("GMT",3463920,4),3463920);function _init(){function arrayBufferCopy(src,dst,dstByteOffset,numBytes){var i;var dst32Offset=dstByteOffset/4;var tail=numBytes%4;var src32=new Uint32Array(src.buffer,0,(numBytes-tail)/4);var dst32=new Uint32Array(dst.buffer);for(i=0;i3)return;reconnectCount++;console.warn("ws reconnect after "+(reconnectTime/1e3>>0)+" second");_this.reconnectId=setTimeout(function(){console.log("ws reconnecting :",reconnectCount);reconnectTime*=2;setWebsocket.call(_this)},reconnectTime)};this.ws.onerror=function(){console.warn("ws error")}}setWebsocket.call(this)},fetch:function(url){var _this=this;this.controller=new AbortController;var signal=this.controller.signal;fetch(url,{signal:signal}).then(function(res){var reader=res.body.getReader();_this.fetchNext=function(){reader.read().then(({done:done,value:value})=>_this.onFetchData({done:done,data:value}))};_this.fetchNext()}).catch(console.error)},close:function(){clearTimeout(this.reconnectId);if(!this.isPlaying)return;console.log("close Jessibuca");this.isPlaying=false;if(this.ws){this.ws.onmessage=null;this.ws.onclose=null;this.ws.onerror=null;this.ws.close();this.ws=null}if(this.controller)this.controller.abort();this.$close();delete this.timespan},initAudio:function(frameCount,samplerate,channels,outputPtr){var allFrameCount=frameCount*channels;var resampled=samplerate<22050;var audioOutputArray=HEAP16.subarray(outputPtr,outputPtr+allFrameCount);postMessage({cmd:"initAudio",frameCount:frameCount,samplerate:samplerate,channels:channels});this.playAudio=function(){postMessage({cmd:"playAudio",buffer:audioOutputArray})}},playAudio(data,len){var buffer=HEAPU8.subarray(data,data+len);this.audioCache.push(buffer.buffer.slice(buffer.byteOffset,buffer.byteOffset+buffer.length));if(this.audioCache.length>=this.audioBuffer){postMessage({cmd:"playAudio",buffer:this.audioCache},this.audioCache);this.audioCache.length=0}},initAudioPlanar(channels,samplerate){this.buffersA=[];for(var i=0;i>2)+i]>>2;var float32=HEAPF32.subarray(fp,fp+frameCount);var buffer=this.buffersA[i];if(buffer.length){buffer=buffer.pop();for(var j=0;j=this.audioBuffer){postMessage({cmd:"playAudio",buffer:this.audioCache},this.audioCache.flatMap(outputArray=>outputArray.map(x=>x.buffer)));this.audioCache.length=0}},setBuffer:function(outputArray){for(var i=0;i<3;i++){var buffer=this.buffers[i];if(buffer.length){buffer=buffer.pop();arrayBufferCopy(outputArray,buffer,0,buffer.byteLength)}else{buffer=Uint8Array.from(outputArray[i])}outputArray[i]=buffer}},setVideoSize:function(w,h,dataPtr){postMessage({cmd:"initSize",w:w,h:h});this.buffers=[[],[],[]];var size=w*h;if(this.isWebGL){this.draw=function(compositionTime){var y=HEAPU32[dataPtr];var u=HEAPU32[dataPtr+1];var v=HEAPU32[dataPtr+2];var outputArray=[HEAPU8.subarray(y,y+size),HEAPU8.subarray(u,u+(size>>2)),HEAPU8.subarray(v,v+(size>>2))];this.setBuffer(outputArray);postMessage({cmd:"render",output:outputArray,compositionTime:compositionTime},[outputArray[0].buffer,outputArray[1].buffer,outputArray[2].buffer])}}else{var outputArray=HEAPU8.subarray(dataPtr,dataPtr+(w*h<<2));var output={cmd:"render",buffer:outputArray};this.draw=function(){postMessage(output)}}}});var decoder=new Module.Jessibuca;self.onmessage=function(event){var msg=event.data;switch(msg.cmd){case"play":decoder.isWebGL=msg.isWebGL;decoder.play(msg.url);break;case"setBuffer":decoder.buffers[0].push(msg.buffer[0]);decoder.buffers[1].push(msg.buffer[1]);decoder.buffers[2].push(msg.buffer[2]);break;case"setBufferA":decoder.buffersA.forEach((array,i)=>array.push(msg.buffers[i]));break;case"setVideoBuffer":decoder.videoBuffer=msg.time*1e3|0;break;case"close":decoder.close();break}}}function _round(d){d=+d;return d>=+0?+Math_floor(d+ +.5):+Math_ceil(d-+.5)}function _setTempRet0($i){setTempRet0($i|0)}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();init_emval();PureVirtualError=Module["PureVirtualError"]=extendError(Error,"PureVirtualError");embind_init_charCodes();init_embind();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");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={"R":___cxa_allocate_exception,"Q":___cxa_throw,"M":___syscall221,"J":___syscall3,"L":___syscall5,"P":__embind_create_inheriting_constructor,"F":__embind_register_bool,"z":__embind_register_class,"v":__embind_register_class_class_function,"o":__embind_register_class_function,"n":__embind_register_class_property,"E":__embind_register_emval,"u":__embind_register_float,"h":__embind_register_integer,"f":__embind_register_memory_view,"w":__embind_register_std_string,"r":__embind_register_std_wstring,"G":__embind_register_void,"k":__emval_as,"s":__emval_call,"S":__emval_call_method,"g":__emval_call_void_method,"b":__emval_decref,"q":__emval_get_global,"e":__emval_get_method_caller,"m":__emval_get_property,"l":__emval_incref,"U":__emval_new,"d":__emval_new_cstring,"T":__emval_new_object,"i":__emval_run_destructors,"p":__emval_set_property,"j":__emval_take_value,"a":_abort,"t":_clock,"c":_emscripten_log,"C":_emscripten_memcpy_big,"D":_emscripten_resize_heap,"H":_environ_get,"I":_environ_sizes_get,"y":_fd_close,"K":_fd_fdstat_get,"A":_fd_seek,"x":_fd_write,"N":_gettimeofday,"V":_init,"memory":wasmMemory,"O":_round,"B":_setTempRet0,"table":wasmTable};var asm=createWasm();Module["asm"]=asm;var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["W"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["X"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["Y"]).apply(null,arguments)};var _main=Module["_main"]=function(){return(_main=Module["_main"]=Module["asm"]["Z"]).apply(null,arguments)};var ___errno_location=Module["___errno_location"]=function(){return(___errno_location=Module["___errno_location"]=Module["asm"]["_"]).apply(null,arguments)};var _strlen=Module["_strlen"]=function(){return(_strlen=Module["_strlen"]=Module["asm"]["$"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["aa"]).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"]["ba"]).apply(null,arguments)};var stackAlloc=Module["stackAlloc"]=function(){return(stackAlloc=Module["stackAlloc"]=Module["asm"]["ca"]).apply(null,arguments)};var dynCall_ii=Module["dynCall_ii"]=function(){return(dynCall_ii=Module["dynCall_ii"]=Module["asm"]["da"]).apply(null,arguments)};var dynCall_vi=Module["dynCall_vi"]=function(){return(dynCall_vi=Module["dynCall_vi"]=Module["asm"]["ea"]).apply(null,arguments)};var dynCall_vii=Module["dynCall_vii"]=function(){return(dynCall_vii=Module["dynCall_vii"]=Module["asm"]["fa"]).apply(null,arguments)};var dynCall_viii=Module["dynCall_viii"]=function(){return(dynCall_viii=Module["dynCall_viii"]=Module["asm"]["ga"]).apply(null,arguments)};var dynCall_iii=Module["dynCall_iii"]=function(){return(dynCall_iii=Module["dynCall_iii"]=Module["asm"]["ha"]).apply(null,arguments)};var dynCall_iiii=Module["dynCall_iiii"]=function(){return(dynCall_iiii=Module["dynCall_iiii"]=Module["asm"]["ia"]).apply(null,arguments)};var dynCall_v=Module["dynCall_v"]=function(){return(dynCall_v=Module["dynCall_v"]=Module["asm"]["ja"]).apply(null,arguments)};var dynCall_dd=Module["dynCall_dd"]=function(){return(dynCall_dd=Module["dynCall_dd"]=Module["asm"]["ka"]).apply(null,arguments)};var dynCall_viiii=Module["dynCall_viiii"]=function(){return(dynCall_viiii=Module["dynCall_viiii"]=Module["asm"]["la"]).apply(null,arguments)};var dynCall_viifi=Module["dynCall_viifi"]=function(){return(dynCall_viifi=Module["dynCall_viifi"]=Module["asm"]["ma"]).apply(null,arguments)};var dynCall_fiii=Module["dynCall_fiii"]=function(){return(dynCall_fiii=Module["dynCall_fiii"]=Module["asm"]["na"]).apply(null,arguments)};var dynCall_viiiii=Module["dynCall_viiiii"]=function(){return(dynCall_viiiii=Module["dynCall_viiiii"]=Module["asm"]["oa"]).apply(null,arguments)};var dynCall_viidi=Module["dynCall_viidi"]=function(){return(dynCall_viidi=Module["dynCall_viidi"]=Module["asm"]["pa"]).apply(null,arguments)};var dynCall_viiiiii=Module["dynCall_viiiiii"]=function(){return(dynCall_viiiiii=Module["dynCall_viiiiii"]=Module["asm"]["qa"]).apply(null,arguments)};var dynCall_viiiiiifi=Module["dynCall_viiiiiifi"]=function(){return(dynCall_viiiiiifi=Module["dynCall_viiiiiifi"]=Module["asm"]["ra"]).apply(null,arguments)};var dynCall_iiiiiii=Module["dynCall_iiiiiii"]=function(){return(dynCall_iiiiiii=Module["dynCall_iiiiiii"]=Module["asm"]["sa"]).apply(null,arguments)};var dynCall_iiiiii=Module["dynCall_iiiiii"]=function(){return(dynCall_iiiiii=Module["dynCall_iiiiii"]=Module["asm"]["ta"]).apply(null,arguments)};var dynCall_ijiii=Module["dynCall_ijiii"]=function(){return(dynCall_ijiii=Module["dynCall_ijiii"]=Module["asm"]["ua"]).apply(null,arguments)};var dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=function(){return(dynCall_viiiiiiiii=Module["dynCall_viiiiiiiii"]=Module["asm"]["va"]).apply(null,arguments)};var dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=function(){return(dynCall_viiiiiiii=Module["dynCall_viiiiiiii"]=Module["asm"]["wa"]).apply(null,arguments)};var dynCall_viiiifii=Module["dynCall_viiiifii"]=function(){return(dynCall_viiiifii=Module["dynCall_viiiifii"]=Module["asm"]["xa"]).apply(null,arguments)};var dynCall_fii=Module["dynCall_fii"]=function(){return(dynCall_fii=Module["dynCall_fii"]=Module["asm"]["ya"]).apply(null,arguments)};var dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=function(){return(dynCall_viiiiiiiiii=Module["dynCall_viiiiiiiiii"]=Module["asm"]["za"]).apply(null,arguments)};var dynCall_iiiii=Module["dynCall_iiiii"]=function(){return(dynCall_iiiii=Module["dynCall_iiiii"]=Module["asm"]["Aa"]).apply(null,arguments)};var dynCall_jiji=Module["dynCall_jiji"]=function(){return(dynCall_jiji=Module["dynCall_jiji"]=Module["asm"]["Ba"]).apply(null,arguments)};var dynCall_iidiiii=Module["dynCall_iidiiii"]=function(){return(dynCall_iidiiii=Module["dynCall_iidiiii"]=Module["asm"]["Ca"]).apply(null,arguments)};Module["asm"]=asm;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}var calledMain=false;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(args){var entryFunction=Module["_main"];var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exit(ret,true)}catch(e){if(e instanceof ExitStatus){return}else if(e=="unwind"){noExitRuntime=true;return}else{var toLog=e;if(e&&typeof e==="object"&&e.stack){toLog=[e,e.stack]}err("exception thrown: "+toLog);quit_(1,e)}}finally{calledMain=true}}function run(args){args=args||arguments_;if(runDependencies>0){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"]();if(shouldRunNow)callMain(args);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(noExitRuntime){}else{ABORT=true;EXITSTATUS=status;exitRuntime();if(Module["onExit"])Module["onExit"](status)}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()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;noExitRuntime=true;run(); diff --git a/public/ff.wasm b/public/ff.wasm new file mode 100644 index 000000000..6ec029a05 Binary files /dev/null and b/public/ff.wasm differ diff --git a/public/img/carInout.jpg b/public/img/carInout.jpg new file mode 100644 index 000000000..2c876d8e7 Binary files /dev/null and b/public/img/carInout.jpg differ diff --git a/public/js/jessibuca/renderer.js b/public/js/jessibuca/renderer.js new file mode 100644 index 000000000..501856685 --- /dev/null +++ b/public/js/jessibuca/renderer.js @@ -0,0 +1,1663 @@ +!(function () { + /** + * @param opt + * container: DOM 容器 + * contextOptions: + * videoBuffer: + * forceNoGL: + * isNotMute: + * decoder: + * @constructor + */ + function Jessibuca(opt) { + this._opt = opt; + + if (typeof opt.container === "string") { + this._opt.container = document.getElementById(opt.container); + } + if (!this._opt.container) { + throw new Error('Jessibuca need container option'); + return; + } + + this._canvasElement = document.createElement("canvas"); + this._canvasElement.style.position = "absolute"; + this._canvasElement.style.top = 0; + this._canvasElement.style.left = 0; + this._opt.container.appendChild(this._canvasElement); + this._container = this._opt.container; + this._container.style.overflow = "hidden"; + this._containerOldPostion = { + position: this._container.style.position, + top: this._container.style.top, + left: this._container.style.left, + width: this._container.style.width, + height: this._container.style.height + } + if (this._containerOldPostion.position != "absolute") { + this._container.style.position = "relative" + } + this._opt.videoBuffer = opt.videoBuffer || 0; + this._opt.text = opt.text || ''; + // + this._opt.isResize = opt.isResize === false ? opt.isResize : true; + this._opt.isFullResize = opt.isFullResize === true ? opt.isFullResize : false; + this._opt.isDebug = opt.debug === true; + this._opt.timeout = typeof opt.timeout === 'number' ? opt.timeout : 30; + this._opt.supportDblclickFullscreen = opt.supportDblclickFullscreen === true; + this._opt.showBandwidth = opt.showBandwidth === true; + this._opt.operateBtns = Object.assign({ + fullscreen: false, + screenshot: false, + play: false, + audio: false + }, opt.operateBtns || {}); + this._opt.keepScreenOn = opt.keepScreenOn === true; + + if (!opt.forceNoGL) this._initContextGL(); + this._audioContext = new (window.AudioContext || window.webkitAudioContext)(); + this._audioEnabled(true); + if (!opt.isNotMute) this._audioEnabled(false); + if (this._contextGL) { + this._initProgram(); + this._initBuffers(); + this._initTextures(); + } + this._onresize = () => this.resize(); + this._onfullscreenchange = () => this._fullscreenchange(); + window.addEventListener("resize", this._onresize); + document.addEventListener('fullscreenchange', this._onfullscreenchange); + this._decoderWorker = new Worker(opt.decoder || 'ff.js') + var _this = this; + this._hasLoaded = false; + this._stats = { + buf: 0, + fps: 0, + abps: '', + vbps: '', + ts: '' + }; + + if (this._opt.supportDblclickFullscreen) { + this._canvasElement.addEventListener('dblclick', function () { + _this.fullscreen = !_this.fullscreen; + }, false); + } + this.onPlay = noop; + this.onPause = noop; + this.onRecord = noop; + this.onFullscreen = noop; + this.onMute = noop; + this.onLoad = noop; + this.onLog = noop; + this.onError = noop; + this.onTimeUpdate = noop; + this.onInitSize = noop; + this._onMessage(); + this._initDom(); + this._initStatus(); + this._initEventListener(); + this._hideBtns(); + // + this._initWakeLock(); + this._enableWakeLock(); + }; + + function noop() { + + } + + Jessibuca.prototype._initDom = function () { + var playBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAARVJREFUSMe9laEOglAUhs+5k9lJFpsJ5QWMJoNGbEY0mEy+gr6GNo0a3SiQCegMRILzGdw4hl+Cd27KxPuXb2zA/91z2YXoGRERkX4fvN3A2QxUiv4dFM3n8jZRBLbbVfd+ubJuF4xjiCyXkksueb1uSKCIZYGLBTEx8ekEoV7PkICeVgs8HiGyXoO2bUigCDM4HoPnM7bI8wwJ6Gk0sEXbLSay30Oo2TQkoGcwgFCSQMhxDAvoETEscDiQkJC4LjMz8+XyZ4HrFYWjEQqHQ1asWGWZfmdFAsVINxuw00HhbvfpydpvxWkKTqdYaRCUfUPJCdzv4Gr1uqfli0tOIAzByUT/iCrL6+84y3Bw+D6ui5Ou+jwA8FnIO++FACgAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAEl0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvYm9mYW5nLnN2Z8fICi0AAAAASUVORK5CYII='; + var pauseBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAHVJREFUSMftkCESwCAMBEOnCtdXVMKHeC7oInkEeQJXkRoEZWraipxZc8lsQqQZBACAlIS1oqGhhTCdu3oyxyyMcdRf79c5J7SWDBky+z4173rbJvR+VF/e/qwKqIAKqMBDgZyFzAQCoZTpxq7HLDyOrw/9b07l3z4dDnI2IAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMIo/vCcAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDD7YgSbAAAASnRFWHRzdmc6YmFzZS11cmkAZmlsZTovLy9ob21lL2FkbWluL2ljb24tZm9udC90bXAvaWNvbl9nZjcwMHM3YjNmdy96YW50aW5nLnN2ZxqNZJkAAAAASUVORK5CYII='; + var screenshotBase64 = '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'; + var fullscreenBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAALZJREFUSMftVbsORUAQVSj8DomChvh3lU5CoSVCQq2RObeYu8XG3deVoHCak81kds7Oaz3vxRcAAMwztOg6vX9d6/3XFQQC+b7iAoFhYE7Tvx9EIFAcy/ftO3MQGAQkCfM4MmeZWyajiLnvmYuCeduMAuSzvRBVYNluFHCssSgFp7Sq9ALKkjnPf9ubRtkDL27HNT3QtsY9cAjsNAVheHIKBOwD2wpxFHDbJpwmaHH2L1iWx+2BDy8RbXXtqbRBAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABTdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L3F1YW5waW5nenVpZGFodWEuc3ZnTBoI7AAAAABJRU5ErkJggg=='; + var minScreenBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAYJJREFUSMfdVbGKwkAQnQn+geAfWBixUTsVgp3YGKxSWflVNmIjARULwc5KO40ipNHWRgs/wGLniucKa+Jd5ODuuGle5u3szGRmd5bor4iIiMhuB3Sc+HXXBdp2/Lpta7v4dccRJUrUdhtNQIkSVa3C8HwG1uumg34f2OnEB+h0tF1Sv5b+YIsttpZLEhKSdhvscPi8IXFF74GJiYnHY7Cex8zMvFgkbInjmJnv98kqoO30vmhLtaRMB60WtEbDNDudgMUiKiQSzfjOMzFxoQAyCPSfw7/nQZ/PUYnpNGV6OR6BmYzJbzYIoBQCzGaRBDQvJCTdLnTLolg5HN5t6f8V1h/oUT4PrVKJWBotmEzQw+vV3J9Ow851P2/BaoX9Yfh0BrJZYKlk8uUyHOpDeLuBHwzMBJtN2PV6IPUhXK9Nf5cLMAxfluanrmGkRBggtRo03wfq66P/6CsJAnOg+f6rgfZI4BGYiYlHIx048eR6krcnq34kkj1GuVz8+jceo9+SD5A8yGh8CTq7AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABNdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L3p1aXhpYW9odWEuc3ZnoCFr0AAAAABJRU5ErkJggg=='; + var quietBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAR9JREFUSMfVlD0LglAYhe9VkwgNihpsjbYQf4JTS7+iuaGxpcGfJjS0NFRLk2NDi6MogafhJGRIX9yEzvJwrx/nvPd9VYh/F3LkyBuN2g3J1QoAgCQhPe/Hxq5Lo+0WlfJ9dYYAgGaTDAIyy/BUnwcwWJlhcLnZkN2ugIBAuy2kkEL2ep8F73S4kjfFcfn6cMj9KLodrWVBiXyf75tMyOOR+4MBOZ8XLXzorboA5UpnM/J0Ivd7+vX7xX2asqGpVKtFXi5sqWmypXefrfIWAACmU/JwKCoun8hu9zA0uk6u13wgirg+n7+bAcsibbt6SB3n9TQXPxwAwHJJpum7M6BcDDQa0SgMaw9QPkJNIxcLMo4ZcDz+eYDqQFLWbqxKV57EtW1WtMbmAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAwij+8JwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMS0wMS0wOFQxNjo0Mjo1MyswODowMPtiBJsAAABKdEVYdHN2ZzpiYXNlLXVyaQBmaWxlOi8vL2hvbWUvYWRtaW4vaWNvbi1mb250L3RtcC9pY29uX2dmNzAwczdiM2Z3L2ppbmd5aW4uc3ZnIlMYaQAAAABJRU5ErkJggg=='; + var playAudioBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAU5JREFUSMftkzGKwlAURf9PULBQwULSCKK1bZAgNuoaFFyAC3AdZg0uQCwshWzAShEEO7Gy0soUCu9Occ3An5nMGCfdzGsO7+Xy3/03iVL/lbAAACiVIBCI77O37Vi9QCDZbEqLm03ycEBUAoHk818v7nYpul5Jz4tf8HBKYa1mcjwmbzd8rG8NFIsU7ffk8UjmcjE3XK+RtB4G2PT75GbDeblMttumfjSKMRCGLxsQCKTReE9KIJDJxDw/SmKxiOZWWh+ntrSlre2WXRAorbTSrZapip7X66kbMKtQUFBQCENznsmQ93vqBhh5r8fO85jAcsnIrcce1yV3uxgD8zl5uZgU+dGBVlrp6GbTKRPwffaDAek45Gz2/M0AAJ0OeTol+w0rFYrOZ3K1MhNJEjEAwHF4cBA8Z8B1zcXV6msv+JMR2yaHQ1LrXx/8Z+sNRxsWcwZeb6UAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAEt0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvc2hlbmd5aW4uc3ZnFog1MQAAAABJRU5ErkJggg=='; + var recordBase64 = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQEAYAAABPYyMiAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAAPRJREFUSMflVDEOwjAQO0e8gr2sZYVunREbD6ISfAgmkBjpC/hBEQ+AtTWD6QAI0gBlqRfLp+TiXC5n1nXgMUCS5HBoNBqj6IOMMFwuEpsNAABl6d3HihWrOJaBsuRPkGW+c929HAxuYefb6L+R0ZgkMrJYiItCnCT1sl5Y1jwXj0bNniJNJWqujfX7LyrwJh8AYDxWgulU0dPp20IFlxoODm61kpE4VnS9/puBXyPYgH7LbKY3PhwUnUw+NdC4CdW9+71UgyZspwIBB9No3O0klktxUahyx+Pz+lYG0Xzu84lXRqTqwRQAGAzns8R223gUdxZXGcAK5Hp0ClIAAAAldEVYdGRhdGU6Y3JlYXRlADIwMjEtMDEtMDhUMTY6NDI6NTMrMDg6MDCKP7wnAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDIxLTAxLTA4VDE2OjQyOjUzKzA4OjAw+2IEmwAAAE50RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fZ2Y3MDBzN2IzZncvbHV6aGlzaGlwaW4uc3Zn5Zd7GQAAAABJRU5ErkJggg=='; + var recordingBase64 = '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=='; + var gifBase64 = 'data:image/gif;base64,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'; + var playBigBase64 = '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=='; + + function _setStyle(dom, cssObj) { + Object.keys(cssObj).forEach(function (key) { + dom.style[key] = cssObj[key]; + }) + } + + var doms = {}; + + var fragment = document.createDocumentFragment(); + var btnWrap = document.createElement('div'); + var control1 = document.createElement('div'); + var control2 = document.createElement('div'); + var textDom = document.createElement('div'); + var speedDom = document.createElement('div'); + var playDom = document.createElement('div'); + var playBigDom = document.createElement('div'); + var pauseDom = document.createElement('div'); + var screenshotsDom = document.createElement('div'); + var fullscreenDom = document.createElement('div'); + var minScreenDom = document.createElement('div'); + var loadingDom = document.createElement('div'); + var loadingTextDom = document.createElement('div'); + var quietAudioDom = document.createElement('div'); + var playAudioDom = document.createElement('div'); + var recordDom = document.createElement('div'); + var recordingDom = document.createElement('div'); + var bgDom = document.createElement('div'); + + loadingTextDom.innerText = this._opt.loadingText || ''; + textDom.innerText = this._opt.text || ''; + speedDom.innerText = ''; + playDom.title = '播放'; + pauseDom.title = '暂停'; + screenshotsDom.title = '截屏'; + fullscreenDom.title = '全屏'; + minScreenDom.title = '退出全屏'; + quietAudioDom.title = '静音'; + playAudioDom.title = '取消静音'; + recordDom.title = '录制'; + recordingDom.title = '取消录制'; + + var wrapStyle = { + height: '38px', + zIndex: 11, + position: 'absolute', + left: 0, + bottom: 0, + width: '100%', + background: 'rgba(0,0,0)' + }; + + var bgStyle = { + position: 'absolute', + width: '100%', + height: '100%', + }; + + if (this._opt.background) { + bgStyle = Object.assign({}, bgStyle, { + backgroundRepeat: "no-repeat", + backgroundPosition: "center", + backgroundSize: '100%', + backgroundImage: "url('" + this._opt.background + "')" + }) + } + + // + var loadingStyle = { + position: 'absolute', + width: '100%', + height: '100%', + textAlign: 'center', + color: "#fff", + display: 'none', + backgroundImage: "url('" + gifBase64 + "')", + backgroundRepeat: "no-repeat", + backgroundPosition: "center", + backgroundSize: "40px 40px", + }; + + var playBigStyle = { + position: 'absolute', + width: '100%', + height: '100%', + display: 'none', + background: 'rgba(0,0,0,0.4)', + backgroundImage: "url('" + playBigBase64 + "')", + backgroundRepeat: "no-repeat", + backgroundPosition: "center", + backgroundSize: "48px 48px", + cursor: "pointer" + }; + + var loadingTextStyle = { + position: 'absolute', + width: "100%", + top: '60%', + textAlign: 'center', + } + var controlStyle = { + position: 'absolute', + top: 0, + height: '100%', + display: 'flex', + alignItems: 'center', + }; + var styleObj = { + display: 'none', + position: 'relative', + fontSize: '13px', + color: '#fff', + lineHeight: '20px', + marginLeft: '5px', + marginRight: '5px', + userSelect: 'none' + }; + var styleObj2 = { + display: 'none', + position: 'relative', + width: '16px', + height: '16px', + marginLeft: '8px', + marginRight: '8px', + backgroundRepeat: "no-repeat", + backgroundPosition: "center", + backgroundSize: '100%', + cursor: 'pointer', + }; + _setStyle(bgDom, bgStyle); + _setStyle(btnWrap, wrapStyle); + _setStyle(loadingDom, loadingStyle); + _setStyle(playBigDom, playBigStyle); + _setStyle(loadingTextDom, loadingTextStyle); + _setStyle(control1, Object.assign({}, controlStyle, { + left: 0 + })); + _setStyle(control2, Object.assign({}, controlStyle, { + right: 0 + })); + _setStyle(textDom, styleObj); + _setStyle(speedDom, styleObj); + _setStyle(playDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + playBase64 + "')", + })); + + _setStyle(pauseDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + pauseBase64 + "')" + })); + + _setStyle(screenshotsDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + screenshotBase64 + "')" + })); + + _setStyle(fullscreenDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + fullscreenBase64 + "')" + })); + + _setStyle(minScreenDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + minScreenBase64 + "')" + })); + + _setStyle(quietAudioDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + quietBase64 + "')" + })); + + _setStyle(playAudioDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + playAudioBase64 + "')" + })); + + _setStyle(recordDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + recordBase64 + "')" + })); + + _setStyle(recordingDom, Object.assign({}, styleObj2, { + backgroundImage: "url('" + recordingBase64 + "')" + })); + + loadingDom.appendChild(loadingTextDom); + if (this._opt.text) { + control1.appendChild(textDom); + doms.textDom = textDom; + } + if (this._opt.showBandwidth) { + control1.appendChild(speedDom); + doms.speedDom = speedDom; + } + + // record + //control2.appendChild(recordingDom); + //control2.appendChild(recordDom); + + // screenshots + if (this._opt.operateBtns.screenshot) { + control2.appendChild(screenshotsDom); + doms.screenshotsDom = screenshotsDom; + } + + // play stop + if (this._opt.operateBtns.play) { + control2.appendChild(playDom); + control2.appendChild(pauseDom); + doms.playDom = playDom; + doms.pauseDom = pauseDom; + } + + // audio + if (this._opt.operateBtns.audio) { + control2.appendChild(playAudioDom); + control2.appendChild(quietAudioDom); + doms.playAudioDom = playAudioDom; + doms.quietAudioDom = quietAudioDom; + } + + // fullscreen + if (this._opt.operateBtns.fullscreen) { + control2.appendChild(fullscreenDom); + control2.appendChild(minScreenDom); + doms.fullscreenDom = fullscreenDom; + doms.minScreenDom = minScreenDom; + } + + btnWrap.appendChild(control1); + btnWrap.appendChild(control2); + + fragment.appendChild(bgDom); + doms.bgDom = bgDom; + fragment.appendChild(loadingDom); + doms.loadingDom = loadingDom; + if (this._showControl()) { + fragment.appendChild(btnWrap); + } + if (this._opt.operateBtns.play) { + fragment.appendChild(playBigDom); + doms.playBigDom = playBigDom; + } + this._container.appendChild(fragment); + this._doms = doms; + }; + + Jessibuca.prototype._initWakeLock = function () { + this._wakeLock = null; + var _this = this; + var handleWakeLock = () => { + if (this._wakeLock !== null && "visible" === document.visibilityState) { + _this._enableWakeLock(); + } + }; + + document.addEventListener('visibilitychange', handleWakeLock); + document.addEventListener('fullscreenchange', handleWakeLock); + }; + + Jessibuca.prototype._enableWakeLock = function () { + if (this._opt.keepScreenOn) { + if ("wakeLock" in navigator) { + var _this = this; + navigator.wakeLock.request("screen").then((lock) => { + _this._wakeLock = lock; + _this._wakeLock.addEventListener('release', function () { + }); + }) + } + } + }; + + + Jessibuca.prototype._initGainNode = function () { + var gainNode = this._audioContext.createGain(); + var _this = this; + var source; + if (!navigator.mediaDevices.getUserMedia) { + console.log('getUserMedia not supported on your browser!'); + return; + } + + navigator.mediaDevices.getUserMedia( + // constraints - only audio needed for this app + { + audio: true + }, + + // Success callback + function (stream) { + source = _this._audioContext.createMediaStreamSource(stream); + source.connect(gainNode); + gainNode.connect(_this._audioContext.destination); + _this._gainNode = gainNode; + }, + + // Error callback + function (err) { + console.log('The following gUM error occurred: ' + err); + } + ); + }; + + Jessibuca.prototype._showControl = function () { + var result = false; + + var hasBtnShow = false; + Object.keys(this._opt.operateBtns).forEach((key) => { + if (this._opt.operateBtns[key]) { + hasBtnShow = true; + } + }); + + if (this._opt.showBandwidth || this._opt.text || hasBtnShow) { + result = true; + } + + return result; + }; + + Jessibuca.prototype._onMessage = function () { + var _this = this; + this._decoderWorker.onmessage = function (event) { + var msg = event.data; + switch (msg.cmd) { + case "init": + _this._opt.isDebug && console.log("decoder worker init") + _this.setBufferTime(_this._opt.videoBuffer); + if (!_this._hasLoaded) { + _this._opt.isDebug && console.log("has loaded"); + _this._hasLoaded = true; + _this.onLoad(); + _this._trigger('load'); + } + break + case "initSize": + _this._canvasElement.width = msg.w; + _this._canvasElement.height = msg.h; + _this.onInitSize(); + _this.resize(); + _this._trigger('videoInfo', {w: msg.w, h: msg.h}); + if (_this.isWebGL()) { + + } else { + _this._initRGB(msg.w, msg.h) + } + break + case "render": + if (_this._contextGL) { + _this._drawNextOutputPictureGL(msg.output); + } else { + _this._drawNextOutputPictureRGBA(msg.buffer); + } + if (_this.loading) { + _this.loading = false; + _this.playing = true; + _this._opt.isDebug && console.log("clear check loading timeout"); + _this._clearCheckLoading(); + } + _this._trigger('timeUpdate', msg.ts); + _this.onTimeUpdate(msg.ts); + _this._updateStats({bps: msg.bps, ts: msg.ts}); + _this._checkHeart(); + break + case "initAudio": + _this._initAudioPlay(msg.frameCount, msg.samplerate, msg.channels) + _this._trigger('audioInfo', { + numOfChannels: msg.channels, // 声频通道 + length: msg.frameCount, // 帧数 + sampleRate: msg.samplerate // 采样率 + }); + break + case "playAudio": + _this._playAudio(msg.buffer) + break + case "print": + _this.onLog(msg.text) + this._trigger('log', msg.text); + _this._opt.isDebug && console.log(msg.text); + break + case "printErr": + _this.onLog(msg.text); + this._trigger('log', msg.text); + _this.onError(msg.text); + this._trigger('error', msg.text); + _this._opt.isDebug && console.error(msg.text); + break; + case "initAudioPlanar": + _this._initAudioPlanar(msg); + _this._trigger('audioInfo', { + numOfChannels: msg.channels, // 声频通道 + length: undefined, // 帧数 + sampleRate: msg.samplerate // 采样率 + }); + break; + default: + _this._opt.isDebug && console.log(msg); + _this[msg.cmd](msg) + } + }; + }; + + Jessibuca.prototype._initEventListener = function () { + var _this = this; + + this._doms.playDom && this._doms.playDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.play(); + }, false); + + this._doms.playBigDom && this._doms.playBigDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.play(); + }, false); + + this._doms.pauseDom && this._doms.pauseDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.pause(); + }, false); + + // screenshots + this._doms.screenshotsDom && this._doms.screenshotsDom.addEventListener('click', function (e) { + e.stopPropagation(); + var filename = _this._opt.text + '' + _now(); + _this._screenshot(filename); + }, false); + // + this._doms.fullscreenDom && this._doms.fullscreenDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.fullscreen = true; + }, false); + // + this._doms.minScreenDom && this._doms.minScreenDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.fullscreen = false; + }, false); + // + this._doms.recordDom && this._doms.recordDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.recording = true; + }, false); + // + this._doms.recordingDom && this._doms.recordingDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.recording = false; + }, false); + + this._doms.quietAudioDom && this._doms.quietAudioDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.cancelMute(); + }, false); + + this._doms.playAudioDom && this._doms.playAudioDom.addEventListener('click', function (e) { + e.stopPropagation(); + _this.mute(); + }, false); + }; + /** + * set debug + * @param flag + */ + Jessibuca.prototype.setDebug = function (flag) { + this._opt.isDebug = !!flag; + }; + /** + * mute + */ + Jessibuca.prototype.mute = function () { + this._audioEnabled(false); + this.quieting = true; + }; + + /** + * cancel mute + */ + Jessibuca.prototype.cancelMute = function () { + this._audioEnabled(true); + this.quieting = false; + }; + + /** + * 设置旋转角度 + */ + Jessibuca.prototype.setRotate = function (deg) { + + }; + + Jessibuca.prototype._initStatus = function () { + this._loading = true; + this.loading = true; + this._recording = false; + this.recording = false; + this._playing = false; + this.playing = false; + this._quieting = this._opt.isNotMute ? false : true; + this.quieting = this._opt.isNotMute ? false : true; + this._fullscreen = false; + this.fullscreen = false; + } + + Jessibuca.prototype._initBtns = function () { + // show + _domToggle(this._doms.pauseDom, true); + _domToggle(this._doms.screenshotsDom, true); + _domToggle(this._doms.fullscreenDom, true); + _domToggle(this._doms.quietAudioDom, true); + _domToggle(this._doms.textDom, true); + _domToggle(this._doms.speedDom, true); + _domToggle(this._doms.recordDom, true); + // hide + _domToggle(this._doms.loadingDom, false); + _domToggle(this._doms.playDom, false); + _domToggle(this._doms.playBigDom, false); + _domToggle(this._doms.bgDom, false); + }; + + Jessibuca.prototype._hideBtns = function () { + var _this = this; + Object.keys(this._doms).forEach(function (dom) { + if (dom !== 'bgDom') { + _domToggle(_this._doms[dom], false); + } + }) + }; + + function _checkFull() { + var isFull = document.fullscreenElement || window.webkitFullscreenElement || document.msFullscreenElement; + if (isFull === undefined) isFull = false; + return !!isFull; + } + + Jessibuca.prototype._updateStats = function (options) { + options = options || {}; + + if (!this._startBpsTime) { + this._startBpsTime = _now(); + } + var _nowTime = _now(); + var timestamp = _nowTime - this._startBpsTime; + + if (timestamp < 1 * 1000) { + this._bps += (options.bps || 0); + this._stats.fps += 1; + this._stats.vbps += parseInt((options.bps || 0)); + return; + } + this._stats.ts = options.ts; + this._doms.speedDom && (this._doms.speedDom.innerText = _bpsSize(this._bps)); + this._trigger('bps', this._bps); + this._trigger('stats', this._stats); + this._trigger('performance', _fpsStatus(this._stats.fps)); + this._bps = 0; + this._stats.fps = 0; + this._stats.vbps = 0; + this._startBpsTime = _nowTime; + }; + + + Jessibuca.prototype._checkHeart = function () { + if (this._checkHeartTimeout) { + clearTimeout(this._checkHeartTimeout); + this._checkHeartTimeout = null; + } + var _this = this; + this._checkHeartTimeout = setTimeout(function () { + _this._opt.isDebug && console.log('check heart timeout'); + _this._trigger('timeout'); + _this.recording = false; + _this.playing = false; + _this._close(); + }, this._opt.timeout * 1000); + }; + + Jessibuca.prototype._checkLoading = function () { + if (this._checkLoadingTimeout) { + clearTimeout(this._checkLoadingTimeout); + this._checkLoadingTimeout = null; + } + var _this = this; + this._checkLoadingTimeout = setTimeout(function () { + _this._opt.isDebug && console.log('check loading timeout'); + _this._trigger('timeout'); + _this.playing = false; + _this._close(); + _domToggle(_this._doms.loadingDom, false); + }, this._opt.timeout * 1000); + }; + + Jessibuca.prototype._clearCheckLoading = function () { + if (this._checkLoadingTimeout) { + clearTimeout(this._checkLoadingTimeout); + this._checkLoadingTimeout = null; + } + }; + + Jessibuca.prototype._initCheckVariable = function () { + this._startBpsTime = ''; + this._bps = 0; + if (this._checkHeartTimeout) { + clearTimeout(this._checkHeartTimeout); + this._checkHeartTimeout = null; + } + } + // + Jessibuca.prototype._initAudioPlanar = function (msg) { + var channels = msg.channels + var samplerate = msg.samplerate + var context = this._audioContext; + var isPlaying = false; + var audioBuffers = []; + if (!context) return false; + var _this = this + this._playAudio = function (buffer) { + var frameCount = buffer[0][0].length + var audioBuffer = context.createBuffer(channels, frameCount * buffer.length, samplerate); + var copyToCtxBuffer = function (fromBuffer) { + for (var channel = 0; channel < channels; channel++) { + var nowBuffering = audioBuffer.getChannelData(channel); + for (var j = 0; j < buffer.length; j++) { + for (var i = 0; i < frameCount; i++) { + nowBuffering[i + j * frameCount] = fromBuffer[j][channel][i] + } + //postMessage({ cmd: "setBufferA", buffer: fromBuffer[j] }, '*', fromBuffer[j].map(x => x.buffer)) + } + } + } + var playNextBuffer = function () { + isPlaying = false; + //console.log("~", audioBuffers.length) + if (audioBuffers.length) { + playAudio(audioBuffers.shift()); + } + //if (audioBuffers.length > 1) audioBuffers.shift(); + }; + var playAudio = function (fromBuffer) { + if (!fromBuffer) return + if (isPlaying) { + audioBuffers.push(fromBuffer); + //console.log(audioBuffers.length) + return; + } + isPlaying = true; + copyToCtxBuffer(fromBuffer); + var source = context.createBufferSource(); + source.buffer = audioBuffer; + source.connect(context.destination); + // source.onended = playNextBuffer; + source.start(); + }; + _this._playAudio = playAudio + _this.audioInterval = setInterval(playNextBuffer, audioBuffer.duration * 1000); + playAudio(buffer) + }; + } + + function _unlock(context) { + context.resume(); + var source = context.createBufferSource(); + source.buffer = context.createBuffer(1, 1, 22050); + source.connect(context.destination); + if (source.noteOn) + source.noteOn(0); + else + source.start(0); + } + + function _domToggle(dom, toggle) { + if (dom) { + dom.style.display = toggle ? 'block' : "none"; + } + } + + function _dataURLToFile(dataURL) { + const arr = dataURL.split(","); + const bstr = atob(arr[1]); + const type = arr[0].replace("data:", "").replace(";base64", "") + let n = bstr.length, u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + return new File([u8arr], 'file', {type}); + } + + function _downloadImg(content, fileName) { + const aLink = document.createElement("a"); + aLink.download = fileName; + aLink.href = URL.createObjectURL(content); + aLink.click(); + URL.revokeObjectURL(content); + } + + function _bpsSize(value) { + if (null == value || value === '') { + return "0 KB/S"; + } + var srcsize = parseFloat(value); + var size = srcsize / 1024; + size = size.toFixed(2); + return size + 'KB/S'; + } + + function _fpsStatus(fps) { + var result = 0; + if (fps >= 24) { + result = 2; + } else if (fps >= 15) { + result = 1; + } + + return result; + } + + /** + * set audio + * @param flag + */ + Jessibuca.prototype._audioEnabled = function (flag) { + if (flag) { + _unlock(this._audioContext) + this._audioEnabled = function (flag) { + if (flag) { + // 恢复 + this._audioContext.resume(); + + } else { + // 暂停 + this._audioContext.suspend(); + } + } + } else { + this._audioContext.suspend(); + } + } + + Jessibuca.prototype._playAudio = function (data) { + var context = this._audioContext; + var isPlaying = false; + var isDecoding = false; + if (!context) return false; + var audioBuffers = []; + var decodeQueue = [] + var _this = this + var playNextBuffer = function (e) { + if (audioBuffers.length) { + playBuffer(audioBuffers.shift()) + } + }; + var playBuffer = function (buffer) { + isPlaying = true; + var audioBufferSouceNode = context.createBufferSource(); + audioBufferSouceNode.buffer = buffer; + audioBufferSouceNode.connect(context.destination); + // audioBufferSouceNode.onended = playNextBuffer; + audioBufferSouceNode.start(); + if (!_this.audioInterval) { + _this.audioInterval = setInterval(playNextBuffer, buffer.duration * 1000 - 1); + } + } + var decodeAudio = function () { + if (decodeQueue.length) { + context.decodeAudioData(decodeQueue.shift(), tryPlay, decodeAudio); + } else { + isDecoding = false + } + } + var tryPlay = function (buffer) { + decodeAudio() + if (isPlaying) { + audioBuffers.push(buffer); + } else { + playBuffer(buffer) + } + } + var playAudio = function (data) { + decodeQueue.push(...data) + if (!isDecoding) { + isDecoding = true + decodeAudio() + } + } + this._playAudio = playAudio + playAudio(data) + } + Jessibuca.prototype._initAudioPlay = function (frameCount, samplerate, channels) { + var context = this._audioContext; + var isPlaying = false; + var audioBuffers = []; + if (!context) return false; + var _this = this + var resampled = samplerate < 22050; + if (resampled) { + _this._opt.isDebug && console.log("resampled!") + } + var audioBuffer = resampled ? context.createBuffer(channels, frameCount << 1, samplerate << 1) : context.createBuffer(channels, frameCount, samplerate); + var playNextBuffer = function () { + isPlaying = false; + //console.log("~", audioBuffers.length) + if (audioBuffers.length) { + playAudio(audioBuffers.shift()); + } + }; + + var copyToCtxBuffer = channels > 1 ? function (fromBuffer) { + for (var channel = 0; channel < channels; channel++) { + var nowBuffering = audioBuffer.getChannelData(channel); + if (resampled) { + for (var i = 0; i < frameCount; i++) { + nowBuffering[i * 2] = nowBuffering[i * 2 + 1] = fromBuffer[i * (channel + 1)] / 32768; + } + } else + for (var i = 0; i < frameCount; i++) { + nowBuffering[i] = fromBuffer[i * (channel + 1)] / 32768; + } + + } + } : function (fromBuffer) { + var nowBuffering = audioBuffer.getChannelData(0); + for (var i = 0; i < nowBuffering.length; i++) { + nowBuffering[i] = fromBuffer[i] / 32768; + } + }; + var playAudio = function (fromBuffer) { + if (isPlaying) { + audioBuffers.push(fromBuffer); + return; + } + isPlaying = true; + copyToCtxBuffer(fromBuffer); + var source = context.createBufferSource(); + source.buffer = audioBuffer; + source.connect(context.destination); + if (!_this.audioInterval) { + _this.audioInterval = setInterval(playNextBuffer, audioBuffer.duration * 1000); + } + source.start(); + }; + this._playAudio = playAudio; + } + /** + * Returns true if the canvas supports WebGL + */ + Jessibuca.prototype.isWebGL = function () { + return !!this._contextGL; + }; + /** + * set timeout + * @param time + */ + Jessibuca.prototype.setTimeout = function (time) { + if (typeof time === 'number') { + this._opt.timeout = Number(time); + } + }; + + /** + * @desc 视频缩放模式, 当视频分辨率比例与canvas显示区域比例不同时,缩放效果不同: + 0 视频画面完全填充canvas区域,画面会被拉伸 + 1 视频画面做等比缩放后,高或宽对齐canvas区域,画面不被拉伸,但有黑边(默认) + 2 视频画面做等比缩放后,完全填充canvas区域,画面不被拉伸,没有黑边,但画面显示不全 + * @param type + * + */ + Jessibuca.prototype.setScaleMode = function (type) { + if (type === 0) { + this._opt.isFullResize = false; + this._opt.isResize = false; + } else if (type === 1) { + this._opt.isFullResize = false; + this._opt.isResize = true; + } else if (type === 2) { + this._opt.isFullResize = true; + } + this.resize(); + }; + + /** + * Create the GL context from the canvas element + */ + Jessibuca.prototype._initContextGL = function () { + var canvas = this._canvasElement; + var gl = null; + + var validContextNames = ["webgl", "experimental-webgl", "moz-webgl", "webkit-3d"]; + var nameIndex = 0; + + while (!gl && nameIndex < validContextNames.length) { + var contextName = validContextNames[nameIndex]; + + try { + var contextOptions = {preserveDrawingBuffer: true}; + if (this._opt.contextOptions) { + contextOptions = Object.assign(contextOptions, this._opt.contextOptions); + } + + gl = canvas.getContext(contextName, contextOptions); + } catch (e) { + gl = null; + } + + if (!gl || typeof gl.getParameter !== "function") { + gl = null; + } + + ++nameIndex; + } + ; + + this._contextGL = gl; + }; + + /** + * Initialize GL shader program + */ + Jessibuca.prototype._initProgram = function () { + var gl = this._contextGL; + + var vertexShaderScript = [ + 'attribute vec4 vertexPos;', + 'attribute vec4 texturePos;', + 'varying vec2 textureCoord;', + + 'void main()', + '{', + 'gl_Position = vertexPos;', + 'textureCoord = texturePos.xy;', + '}' + ].join('\n'); + + var fragmentShaderScript = [ + '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'); + + var vertexShader = gl.createShader(gl.VERTEX_SHADER); + gl.shaderSource(vertexShader, vertexShaderScript); + gl.compileShader(vertexShader); + if (!gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS)) { + this._opt.isDebug && console.log('Vertex shader failed to compile: ' + gl.getShaderInfoLog(vertexShader)); + } + + var fragmentShader = gl.createShader(gl.FRAGMENT_SHADER); + gl.shaderSource(fragmentShader, fragmentShaderScript); + gl.compileShader(fragmentShader); + if (!gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS)) { + this._opt.isDebug && console.log('Fragment shader failed to compile: ' + gl.getShaderInfoLog(fragmentShader)); + } + + var program = gl.createProgram(); + gl.attachShader(program, vertexShader); + gl.attachShader(program, fragmentShader); + gl.linkProgram(program); + if (!gl.getProgramParameter(program, gl.LINK_STATUS)) { + this._opt.isDebug && console.log('Program failed to compile: ' + gl.getProgramInfoLog(program)); + } + + gl.useProgram(program); + + this._shaderProgram = program; + }; + + /** + * Initialize vertex buffers and attach to shader program + */ + Jessibuca.prototype._initBuffers = function () { + var gl = this._contextGL; + var program = this._shaderProgram; + + var vertexPosBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, vertexPosBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 1, -1, 1, 1, -1, -1, -1]), gl.STATIC_DRAW); + + var vertexPosRef = gl.getAttribLocation(program, 'vertexPos'); + gl.enableVertexAttribArray(vertexPosRef); + gl.vertexAttribPointer(vertexPosRef, 2, gl.FLOAT, false, 0, 0); + + var texturePosBuffer = gl.createBuffer(); + gl.bindBuffer(gl.ARRAY_BUFFER, texturePosBuffer); + gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([1, 0, 0, 0, 1, 1, 0, 1]), gl.STATIC_DRAW); + + var texturePosRef = gl.getAttribLocation(program, 'texturePos'); + gl.enableVertexAttribArray(texturePosRef); + gl.vertexAttribPointer(texturePosRef, 2, gl.FLOAT, false, 0, 0); + + this._texturePosBuffer = texturePosBuffer; + }; + + /** + * Initialize GL textures and attach to shader program + */ + Jessibuca.prototype._initTextures = function () { + var gl = this._contextGL; + var program = this._shaderProgram; + + var yTextureRef = this._initTexture(); + var ySamplerRef = gl.getUniformLocation(program, 'ySampler'); + gl.uniform1i(ySamplerRef, 0); + this._yTextureRef = yTextureRef; + + var uTextureRef = this._initTexture(); + var uSamplerRef = gl.getUniformLocation(program, 'uSampler'); + gl.uniform1i(uSamplerRef, 1); + this._uTextureRef = uTextureRef; + + var vTextureRef = this._initTexture(); + var vSamplerRef = gl.getUniformLocation(program, 'vSampler'); + gl.uniform1i(vSamplerRef, 2); + this._vTextureRef = vTextureRef; + }; + + /** + * Create and configure a single texture + */ + Jessibuca.prototype._initTexture = function () { + var gl = this._contextGL; + + var textureRef = gl.createTexture(); + gl.bindTexture(gl.TEXTURE_2D, textureRef); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); + gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); + gl.bindTexture(gl.TEXTURE_2D, null); + + return textureRef; + }; + + /** + * Draw picture data to the canvas. + * If this object is using WebGL, the data must be an I420 formatted ArrayBuffer, + * Otherwise, data must be an RGBA formatted ArrayBuffer. + */ + Jessibuca.prototype._drawNextOutputPicture = function (data) { + if (this._contextGL) { + this._drawNextOutputPictureGL(data); + } else { + this._drawNextOutputPictureRGBA(data); + } + }; + + /** + * Draw the next output picture using WebGL + */ + Jessibuca.prototype._drawNextOutputPictureGL = function (data) { + var gl = this._contextGL; + var texturePosBuffer = this._texturePosBuffer; + var yTextureRef = this._yTextureRef; + var uTextureRef = this._uTextureRef; + var vTextureRef = this._vTextureRef; + var croppingParams = this.croppingParams + var width = this._canvasElement.width + var height = this._canvasElement.height + if (croppingParams) { + gl.viewport(0, 0, croppingParams.width, croppingParams.height); + var tTop = croppingParams.top / height; + var tLeft = croppingParams.left / width; + var tBottom = croppingParams.height / height; + var tRight = croppingParams.width / width; + var texturePosValues = new Float32Array([tRight, tTop, tLeft, tTop, tRight, tBottom, tLeft, tBottom]); + + gl.bindBuffer(gl.ARRAY_BUFFER, texturePosBuffer); + gl.bufferData(gl.ARRAY_BUFFER, texturePosValues, gl.DYNAMIC_DRAW); + } else { + gl.viewport(0, 0, this._canvasElement.width, this._canvasElement.height); + } + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, yTextureRef); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, width, height, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data[0]); + + gl.activeTexture(gl.TEXTURE1); + gl.bindTexture(gl.TEXTURE_2D, uTextureRef); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, width / 2, height / 2, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data[1]); + + gl.activeTexture(gl.TEXTURE2); + gl.bindTexture(gl.TEXTURE_2D, vTextureRef); + gl.texImage2D(gl.TEXTURE_2D, 0, gl.LUMINANCE, width / 2, height / 2, 0, gl.LUMINANCE, gl.UNSIGNED_BYTE, data[2]); + + gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4); + }; + + /** + * Draw next output picture using ARGB data on a 2d canvas. + */ + Jessibuca.prototype._drawNextOutputPictureRGBA = function (data) { + this.imageData.data.set(data); + var croppingParams = this.croppingParams + if (!croppingParams) { + this.ctx2d.putImageData(this.imageData, 0, 0); + } else { + this.ctx2d.putImageData(this.imageData, -croppingParams.left, -croppingParams.top, 0, 0, croppingParams.width, croppingParams.height); + } + }; + Jessibuca.prototype.ctx2d = null; + Jessibuca.prototype.imageData = null; + Jessibuca.prototype._initRGB = function (width, height) { + this.ctx2d = this._canvasElement.getContext('2d'); + this.imageData = this.ctx2d.getImageData(0, 0, width, height); + this.clear = function () { + this.ctx2d.clearRect(0, 0, width, height) + }; + }; + + Jessibuca.prototype.pause = function () { + this._close(); + if (this.loading) { + _domToggle(this._doms.loadingDom, false); + } + this.recording = false; + this.playing = false; + }; + + Jessibuca.prototype._close = function () { + if (this.audioInterval) { + clearInterval(this.audioInterval) + } + delete this._playAudio + this._decoderWorker.postMessage({cmd: "close"}) + + if (this._wakeLock) { + this._wakeLock.release(); + this._wakeLock = null; + } + + // this._contextGL.clear(this._contextGL.COLOR_BUFFER_BIT); + this._initCheckVariable(); + } + /** + * destroy + * @desc delete worker, + */ + Jessibuca.prototype.destroy = function () { + // destroy + this._decoderWorker.terminate() + window.removeEventListener("resize", this._onresize); + window.removeEventListener('fullscreenchange', this._onfullscreenchange); + this._initCheckVariable(); + this._clearCheckLoading(); + this._off(); + this._hasLoaded = false; + // remove dom + while (this._container.firstChild) { + this._container.removeChild(this._container.firstChild); + } + if (this._wakeLock) { + this._wakeLock.release(); + } + } + + /** + * 清理画布为黑色背景 + * 用于canvas重用进行多个流切换播放时,将上一个画面清理 + * 避免后一个视频播放之前出现前一个视频最后一个画面 + */ + Jessibuca.prototype.clearView = function () { + this._contextGL.clear(this._contextGL.COLOR_BUFFER_BIT); + }; + /** + * play + * @param url + */ + Jessibuca.prototype.play = function (url) { + if (!this.playUrl && !url) { + return; + } + var needDelay = false; + if (url) { + if (this.playUrl) { + this._close(); + needDelay = true; + this._contextGL.clear(this._contextGL.COLOR_BUFFER_BIT); + } + this.loading = true; + _domToggle(this._doms.bgDom, false); + this._checkLoading(); + this.playUrl = url; + } else if (this.playUrl) { + // retry + if (this.loading) { + this._hideBtns(); + _domToggle(this._doms.fullscreenDom, true); + _domToggle(this._doms.pauseDom, true); + _domToggle(this._doms.loadingDom, true); + this._checkLoading(); + } else { + this.playing = true; + } + } + this._initCheckVariable(); + + if (needDelay) { + var _this = this; + setTimeout(function () { + _this._decoderWorker.postMessage({cmd: "play", url: _this.playUrl, isWebGL: _this.isWebGL()}) + }, 300); + } else { + this._decoderWorker.postMessage({cmd: "play", url: this.playUrl, isWebGL: this.isWebGL()}) + } + }; + /** + * has loaded + * @returns {boolean} + */ + Jessibuca.prototype.hasLoaded = function () { + return this._hasLoaded; + }; + + Object.defineProperty(Jessibuca.prototype, "fullscreen", { + set(value) { + if (value) { + if (!_checkFull()) { + this._container.requestFullscreen(); + } + _domToggle(this._doms.minScreenDom, true); + _domToggle(this._doms.fullscreenDom, false); + } else { + if (_checkFull()) { + document.exitFullscreen(); + } + _domToggle(this._doms.minScreenDom, false); + _domToggle(this._doms.fullscreenDom, true); + } + + if (this._fullscreen !== value) { + this.onFullscreen(value); + this._trigger('fullscreen', value); + } + this._fullscreen = value; + }, + get() { + return this._fullscreen; + } + }); + + Object.defineProperty(Jessibuca.prototype, 'playing', { + set(value) { + if (value) { + _domToggle(this._doms.playBigDom, false); + _domToggle(this._doms.playDom, false); + _domToggle(this._doms.pauseDom, true); + + _domToggle(this._doms.screenshotsDom, true); + _domToggle(this._doms.recordDom, true); + if (this._quieting) { + _domToggle(this._doms.quietAudioDom, true); + _domToggle(this._doms.playAudioDom, false); + } else { + _domToggle(this._doms.quietAudioDom, false); + _domToggle(this._doms.playAudioDom, true); + } + } else { + this._doms.speedDom && (this._doms.speedDom.innerText = ''); + if (this.playUrl) { + _domToggle(this._doms.playDom, true); + _domToggle(this._doms.playBigDom, true); + _domToggle(this._doms.pauseDom, false); + } + + // 在停止状态下录像,截屏,音量是非激活,只有播放,最大化时可点击 + _domToggle(this._doms.recordDom, false); + _domToggle(this._doms.recordingDom, false); + _domToggle(this._doms.screenshotsDom, false); + _domToggle(this._doms.quietAudioDom, false); + _domToggle(this._doms.playAudioDom, false); + } + + if (this._playing !== value) { + if (value) { + this.onPlay(); + this._trigger('play'); + } else { + this.onPause(); + this._trigger('pause'); + } + } + this._playing = value; + }, + get() { + return this._playing; + } + }); + + Object.defineProperty(Jessibuca.prototype, 'recording', { + set(value) { + if (value) { + _domToggle(this._doms.recordDom, false); + _domToggle(this._doms.recordingDom, true); + } else { + _domToggle(this._doms.recordDom, true); + _domToggle(this._doms.recordingDom, false); + + } + if (this._recording !== value) { + this.onRecord(value); + this._trigger('record', value); + this._recording = value; + } + }, + get() { + return this._recording; + } + }); + + Object.defineProperty(Jessibuca.prototype, 'quieting', { + set(value) { + if (value) { + _domToggle(this._doms.quietAudioDom, true); + _domToggle(this._doms.playAudioDom, false); + } else { + _domToggle(this._doms.quietAudioDom, false); + _domToggle(this._doms.playAudioDom, true); + } + if (this._quieting !== value) { + this.onMute(value); + this._trigger('mute', value); + } + this._quieting = value; + }, + get() { + return this._quieting; + } + }); + + Object.defineProperty(Jessibuca.prototype, 'loading', { + set(value) { + if (value) { + this._hideBtns(); + _domToggle(this._doms.fullscreenDom, true); + _domToggle(this._doms.pauseDom, true); + _domToggle(this._doms.loadingDom, true); + } else { + this._initBtns(); + } + this._loading = value; + }, + get() { + return this._loading; + } + }); + + /** + * resize + */ + Jessibuca.prototype.resize = function () { + var width = this._container.clientWidth; + var height = this._container.clientHeight; + if (this._showControl()) { + height -= 38; + } + var resizeWidth = this._canvasElement.width; + var resizeHeight = this._canvasElement.height; + var wScale = width / resizeWidth; + var hScale = height / resizeHeight; + var scale = wScale > hScale ? hScale : wScale; + if (!this._opt.isResize) { + if (wScale !== hScale) { + scale = wScale + ',' + hScale; + } + } + // + if (this._opt.isFullResize) { + scale = wScale > hScale ? wScale : hScale; + } + + this._opt.isDebug && console.log('wScale', wScale, 'hScale', hScale, 'scale', scale); + this._canvasElement.style.transform = "scale(" + scale + ")" + this._canvasElement.style.left = ((width - resizeWidth) / 2) + "px" + this._canvasElement.style.top = ((height - resizeHeight) / 2) + "px" + } + + Jessibuca.prototype._fullscreenchange = function () { + this.fullscreen = _checkFull(); + } + + /** + * change buffer + * @param buffer + */ + Jessibuca.prototype.changeBuffer = function (buffer) { + this._stats.buf = Number(buffer) * 1000; + this._decoderWorker.postMessage({cmd: "setVideoBuffer", time: Number(buffer)}); + }; + /** + * 设置最大缓冲时长,单位秒,播放器会自动消除延迟。 + * @param buffer + */ + Jessibuca.prototype.setBufferTime = function (buffer) { + this.changeBuffer(buffer); + }; + + /** + * 设置音量大小,取值0.0 — 1.0 + * 当为0.0时,完全无声 + * 当为1.0时,最大音量,默认值 + * @param volume + */ + Jessibuca.prototype.setVolume = function (volume) { + if (this._gainNode) { + this._gainNode.gain.setValueAtTime(volume, this._audioContext.currentTime); + } + }; + + /** + * 开启屏幕常亮, 在play前调用 + * 在手机浏览器上, canvas标签渲染视频并不会像video标签那样保持屏幕常亮 + * H5目前在chrome\edge 84, android chrome 84及以上有原生亮屏API, 需要是https页面 + * 其余平台为模拟实现,此时为兼容实现,并不保证所有浏览器都支持 + */ + Jessibuca.prototype.setKeepScreenOn = function () { + this._opt.keepScreenOn = true; + }; + + + /** + * set fullscreen + * @param flag + */ + Jessibuca.prototype.setFullscreen = function (flag) { + var fullscreen = !!flag; + if (this.fullscreen !== fullscreen) { + this.fullscreen = fullscreen; + } + }; + + function _now() { + return new Date().getTime(); + } + + Jessibuca.prototype._screenshot = function (filename, format, quality) { + filename = filename || _now(); + var formatType = { + png: 'image/png', + jpeg: 'image/jpeg', + webp: 'image/webp' + }; + var encoderOptions = 0.92; + + if (typeof quality !== 'undefined') { + encoderOptions = Number(quality); + } + + var dataURL = this._canvasElement.toDataURL(formatType[format] || formatType.png, encoderOptions); + _downloadImg(_dataURLToFile(dataURL), filename); + } + + /** + * 截图,调用后弹出下载框保存截图 + * @param filename 保存的文件名 默认时间戳 + * @param format 截图的格式,可选png或jpeg或者webp + * @param quality 可选参数,当格式是jpeg或者webp时,压缩质量,取值0.0 ~ 1.0 + */ + Jessibuca.prototype.screenshot = function (filename, format, quality) { + this._screenshot(filename, format, quality); + }; + + + var eventSplitter = /\s+/; + + // Execute callbacks + function _callEach(list, args, context) { + if (list) { + for (var i = 0, len = list.length; i < len; i += 1) { + list[i].apply(context, args); + } + } + } + + /** + * + * @param events + * @param callback + * @returns {Jessibuca} + */ + Jessibuca.prototype.on = function (events, callback) { + var cache, event, list; + if (!callback) return this; + cache = this.__events || (this.__events = {}); + events = events.split(eventSplitter); + while (event = events.shift()) { + list = cache[event] || (cache[event] = []); + list.push(callback); + } + return this; + }; + /** + * + * @param events + * @param callback + * @returns {Jessibuca} + * @private + */ + Jessibuca.prototype._off = function () { + var cache; + if (!(cache = this.__events)) return this; + delete this.__events; + return this; + }; + + /** + * + * @param events + * @returns {Jessibuca} + * @private + */ + Jessibuca.prototype._trigger = function (events) { + var cache, event, all, list, i, len, rest = [], args; + if (!(cache = this.__events)) return this; + events = events.split(eventSplitter); + // Fill up `rest` with the callback arguments. Since we're only copying + // the tail of `arguments`, a loop is much faster than Array#slice. + for (i = 1, len = arguments.length; i < len; i++) { + rest[i - 1] = arguments[i]; + } + // For each event, walk through the list of callbacks twice, first to + // trigger the event, then to trigger any `"all"` callbacks. + while (event = events.shift()) { + if (list = cache[event]) list = list.slice(); + // Execute event callbacks. + _callEach(list, rest, this); + } + return this; + } + + if (typeof define === 'function') { + define(function () { + return Jessibuca; + }); + } else if (typeof exports !== 'undefined') { + module.exports = Jessibuca; + } else { + window.Jessibuca = Jessibuca; + } +})(); diff --git a/public/pages/property/parkingAreaControl/parkingAreaControl.html b/public/pages/property/parkingAreaControl/parkingAreaControl.html index ba627e4c8..19cd8f248 100644 --- a/public/pages/property/parkingAreaControl/parkingAreaControl.html +++ b/public/pages/property/parkingAreaControl/parkingAreaControl.html @@ -1,7 +1,70 @@ -
      +
      -
      -
      -
      +
      + +
      + +
      +
      + +
      +
      + +
      +
      + +
      -
      \ No newline at end of file + +
      +
      + +
      + +
      \ No newline at end of file diff --git a/public/pages/property/parkingAreaControl/parkingAreaControl.js b/public/pages/property/parkingAreaControl/parkingAreaControl.js index 4f8abffc0..798d95473 100644 --- a/public/pages/property/parkingAreaControl/parkingAreaControl.js +++ b/public/pages/property/parkingAreaControl/parkingAreaControl.js @@ -2,132 +2,30 @@ 入驻小区 **/ (function (vc) { - var DEFAULT_PAGE = 1; - var DEFAULT_ROWS = 10; vc.extends({ data: { - parkingAreaManageInfo: { - parkingAreas: [], - total: 0, - records: 1, - moreCondition: false, - num: '', - listColumns: [], - conditions: { - num: '', - typeCd: '', - paId: '' - } + parkingAreaControlInfo: { + _currentTab: 'parkingAreaControlCarInout', + paId: '' + } }, _initMethod: function () { - - $that._getColumns(function () { - vc.component._listParkingAreas(DEFAULT_PAGE, DEFAULT_ROWS); + $that.parkingAreaControlInfo.paId = vc.getParam('paId'); + vc.emit('parkingAreaControlVideo', 'notify', { + paId: $that.parkingAreaControlInfo.paId }); }, _initEvent: function () { - vc.on('parkingAreaManage', 'listParkingArea', - function (_param) { - vc.component._listParkingAreas(DEFAULT_PAGE, DEFAULT_ROWS); - }); - vc.on('pagination', 'page_event', - function (_currentPage) { - vc.component._listParkingAreas(_currentPage, DEFAULT_ROWS); - }); + }, methods: { - _listParkingAreas: function (_page, _rows) { - vc.component.parkingAreaManageInfo.conditions.page = _page; - vc.component.parkingAreaManageInfo.conditions.row = _rows; - vc.component.parkingAreaManageInfo.conditions.communityId = vc.getCurrentCommunity().communityId; - var param = { - params: vc.component.parkingAreaManageInfo.conditions - }; - //发送get请求 - vc.http.get('parkingAreaManage', 'list', param, - function (json, res) { - var _parkingAreaManageInfo = JSON.parse(json); - vc.component.parkingAreaManageInfo.total = _parkingAreaManageInfo.total; - vc.component.parkingAreaManageInfo.records = _parkingAreaManageInfo.records; - vc.component.parkingAreaManageInfo.parkingAreas = _parkingAreaManageInfo.parkingAreas; - $that.dealParkingAreaAttr(_parkingAreaManageInfo.parkingAreas); - vc.emit('pagination', 'init', { - total: vc.component.parkingAreaManageInfo.records, - dataCount: vc.component.parkingAreaManageInfo.total, - currentPage: _page - }); - }, - function (errInfo, error) { - console.log('请求失败处理'); - }); - }, - _openAddParkingAreaModal: function () { - vc.emit('addParkingArea', 'openAddParkingAreaModal', {}); - }, - _openEditParkingAreaModel: function (_parkingArea) { - vc.emit('editParkingArea', 'openEditParkingAreaModal', _parkingArea); - }, - _openDeleteParkingAreaModel: function (_parkingArea) { - vc.emit('deleteParkingArea', 'openDeleteParkingAreaModal', _parkingArea); - }, - _queryParkingAreaMethod: function () { - vc.component._listParkingAreas(DEFAULT_PAGE, DEFAULT_ROWS); - }, - _moreCondition: function () { - if (vc.component.parkingAreaManageInfo.moreCondition) { - vc.component.parkingAreaManageInfo.moreCondition = false; - } else { - vc.component.parkingAreaManageInfo.moreCondition = true; - } - }, - dealParkingAreaAttr: function (parkingAreas) { - parkingAreas.forEach(item => { - $that._getColumnsValue(item); - }); - }, - _getColumnsValue: function (_parkingArea) { - _parkingArea.listValues = []; - console.log('attr',_parkingArea) - if (!_parkingArea.hasOwnProperty('attrs') || _parkingArea.attrs.length < 1) { - $that.parkingAreaManageInfo.listColumns.forEach(_value => { - _parkingArea.listValues.push(''); - }) - return; - } - let _parkingAreaAttrDtos = _parkingArea.attrs; - $that.parkingAreaManageInfo.listColumns.forEach(_value => { - let _tmpValue = ''; - _parkingAreaAttrDtos.forEach(_attrItem => { - if (_value.specCd == _attrItem.specCd) { - _tmpValue = _attrItem.value; - } - }) - _parkingArea.listValues.push(_tmpValue); + changeTab: function (_tab) { + $that.parkingAreaControlInfo._currentTab = _tab; + vc.emit(_tab, 'switch', { + paId: $that.parkingAreaControlInfo.paId }) }, - _getColumns: function (_call) { - console.log('_getColumns'); - $that.parkingAreaManageInfo.listColumns = []; - vc.getAttrSpec('parking_area_attr', function (data) { - $that.parkingAreaManageInfo.listColumns = []; - data.forEach(item => { - if (item.listShow == 'Y') { - $that.parkingAreaManageInfo.listColumns.push({ - specCd: item.specCd, - specName: item.specName - }); - } - }); - _call(); - }); - }, - _openParkingAreaText:function(_parkingArea){ - vc.jumpToPage('/admin.html#/pages/property/parkingAreaText?paId='+_parkingArea.paId) - }, - _openParkingAreaControl:function(_parkingArea){ - - } } }); })(window.vc); \ No newline at end of file