Rename RDP template directory to rdpwasm to separate JS assets from RDP page path

- Renamed templates/rdp/ to templates/rdpwasm/
- Updated embed_assets.sh to embed from rdpwasm and map to /rdpwasm/ paths
- Updated rdp.html to load scripts from /rdpwasm/
- Regenerated Makefile and rebuilt successfully
parent 06a17b30
......@@ -2,4 +2,6 @@
- if you need to build the debian packages, use ./build.sh --debian
- if a build give you any warning, fix the warning
- when you finish a todo list and everything is complete, execute a git commit
- If you need to rebuild the project, use always ./build.sh --clean && ./build.sh
- if you need to build the debian packages, use ./build.sh --debian
- when you finish a todo list and everything is complete, execute a git commit
temp_rdp_wasm @ 4477a0bc
Subproject commit 4477a0bcc46bc390780e73664bf678fbaaece2ac
- the html pages and the assets to add in wssshd are generated from the templates directory, using the script embed_assets.sh.
- the script embed_assets.sh is launched by the Makefile
- the Makefile is generated by the script configure.sh
- in wssshd webinterface, the vnc page and the rdp page uses different websocket implementation, looks at the specifics of web.c and vnc.c or rdp.c, the file
......@@ -244,9 +244,52 @@ const char *get_rdp_asset(const char *path, size_t *size) {
EOF
find templates/rdp -name "*.wasm" | sort | while read -r file; do
find templates/rdpwasm -name "*.js" | sort | while read -r file; do
if [ -f "$file" ]; then
RELPATH=$(echo "$file" | sed 's|templates/rdp/||')
RELPATH=$(echo "$file" | sed 's|templates/rdpwasm/||')
VARNAME=$(echo "$RELPATH" | sed 's|/|_|g; s|\.js$|_js|; s|\.|_|g')
HEADER_FILE="html_pages/rdp_${VARNAME}_page.h"
echo "Embedding $file as rdp_${VARNAME}"
# Create header with extern
cat > "$HEADER_FILE" << EOF
#ifndef RDP_${VARNAME^^}_PAGE_H
#define RDP_${VARNAME^^}_PAGE_H
extern const char *rdp_${VARNAME};
#endif /* RDP_${VARNAME^^}_PAGE_H */
EOF
# Add to rdp_assets.h
echo "#include \"html_pages/rdp_${VARNAME}_page.h\"" >> rdp_assets.h
# Add definition to rdp_asset_map.c
echo "const char *rdp_${VARNAME} =" >> rdp_asset_map.c
# Use python to properly escape
python3 -c "
import sys
with open('$file', 'r', encoding='utf-8', errors='ignore') as f:
content = f.read()
lines = content.split('\n')
for line in lines:
escaped_line = line.replace('\\\\', '\\\\\\\\').replace('\\\"', '\\\\\"')
print('\"' + escaped_line + '\\\\n\"')
" >> rdp_asset_map.c
echo ";" >> rdp_asset_map.c
# Add to rdp_asset_map.c
echo " if (strcmp(path, \"/rdpwasm/$RELPATH\") == 0) {" >> rdp_asset_map.c
echo " if (size) *size = strlen(rdp_${VARNAME});" >> rdp_asset_map.c
echo " return rdp_${VARNAME};" >> rdp_asset_map.c
echo " }" >> rdp_asset_map.c
fi
done
find templates/rdpwasm -name "*.wasm" | sort | while read -r file; do
if [ -f "$file" ]; then
RELPATH=$(echo "$file" | sed 's|templates/rdpwasm/||')
VARNAME=$(echo "$RELPATH" | sed 's|/|_|g; s|\.wasm$|_wasm|; s|\.|_|g')
HEADER_FILE="html_pages/rdp_${VARNAME}_page.h"
......@@ -269,14 +312,14 @@ EOF
# Embed binary file
xxd -i "$file" > temp_binary.h
# Rename the variables and add static
sed -i "s/templates_rdp_rdp_wasm/rdp_rdp_wasm/g" temp_binary.h
sed -i "s/templates_rdpwasm_rdp_wasm/rdp_rdp_wasm/g" temp_binary.h
sed -i "s/unsigned char rdp_rdp_wasm\[\]/static unsigned char rdp_rdp_wasm[]/g" temp_binary.h
sed -i "s/unsigned int rdp_rdp_wasm_len/static unsigned int rdp_rdp_wasm_len/g" temp_binary.h
cat temp_binary.h >> rdp_asset_map.c
rm temp_binary.h
# Add to rdp_asset_map.c
echo " if (strcmp(path, \"/rdp/$RELPATH\") == 0) {" >> rdp_asset_map.c
echo " if (strcmp(path, \"/rdpwasm/$RELPATH\") == 0) {" >> rdp_asset_map.c
echo " if (size) *size = rdp_${VARNAME}_len;" >> rdp_asset_map.c
echo " return (const char *)rdp_${VARNAME};" >> rdp_asset_map.c
echo " }" >> rdp_asset_map.c
......
This source diff could not be displayed because it is too large. You can view the blob instead.
#ifndef RDP_ASSETS_H
#define RDP_ASSETS_H
#include "html_pages/rdp_clipboard_js_page.h"
#include "html_pages/rdp_mstsc_js_page.h"
#include "html_pages/rdp_out_stream_js_page.h"
#include "html_pages/rdp_rdp_wasm_js_page.h"
#include "html_pages/rdp_rdp_graphics_js_page.h"
#include "html_pages/rdp_reversed_layouts_js_page.h"
#include "html_pages/rdp_scancodes_js_page.h"
#include "html_pages/rdp_rdp_wasm_page.h"
#endif /* RDP_ASSETS_H */
......@@ -7,12 +7,12 @@
<link rel="icon" href="/favicon.ico" type="image/x-icon">
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<script src="/rdp/rdp.wasm.js"></script>
<script src="/rdp/clipboard.js"></script>
<script src="/rdp/out_stream.js"></script>
<script src="/rdp/rdp_graphics.js"></script>
<script src="/rdp/reversed_layouts.js"></script>
<script src="/rdp/scancodes.js"></script>
<script src="/rdpwasm/rdp.wasm.js"></script>
<script src="/rdpwasm/clipboard.js"></script>
<script src="/rdpwasm/out_stream.js"></script>
<script src="/rdpwasm/rdp_graphics.js"></script>
<script src="/rdpwasm/reversed_layouts.js"></script>
<script src="/rdpwasm/scancodes.js"></script>
<style>
.navbar-brand {
font-weight: bold;
......
var WallixModule = (function() {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
return (
function(WallixModule) {
WallixModule = WallixModule || {};
null;var Module=typeof WallixModule!=="undefined"?WallixModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});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=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";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};readAsync=function readAsync(filename,onload,onerror){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);nodeFS["readFile"](filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status,toThrow){if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx<endPtr){var u0=heap[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heap[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heap[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heap[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}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;callRuntimeCallbacks(__ATINIT__)}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 addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;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+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="./rdp.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["I"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["O"];addOnInit(Module["asm"]["J"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}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().catch(readyPromiseReject);return{}}var ASM_CONSTS={445264:function(){let i=0;Module.MouseFlags=Object.freeze({"HorizontalWheel":arguments[i++],"VerticalWheel":arguments[i++],"WheelNegative":arguments[i++],"WheelRotationMask":arguments[i++],"Move":arguments[i++],"Up":arguments[i++],"Down":arguments[i++],"LeftButton":arguments[i++],"RightButton":arguments[i++],"MiddleButton":arguments[i++],"Button4":arguments[i++],"Button5":arguments[i++]})},445674:function(){let i=0;Module.KbdFlags=Object.freeze({"Down":arguments[i++],"Release":arguments[i++],"Extended":arguments[i++],"Extended1":arguments[i++]})},445835:function(){let i=0;Module.InputFlags=Object.freeze({"Scancodes":arguments[i++],"MouseX":arguments[i++],"FastPath":arguments[i++],"Unicode":arguments[i++],"HorizontalWheel":arguments[i++]})},446035:function(){let i=0;Module.GraphicOrders=Object.freeze({"MultiOpaqueRect":arguments[i++],"DstBlt":arguments[i++],"MultiDstBlt":arguments[i++],"PatBltAndOpaqueRect":arguments[i++],"MultiPatBlt":arguments[i++],"ScrBlt":arguments[i++],"MultiScrBlt":arguments[i++],"MemBlt":arguments[i++],"Mem3Blt":arguments[i++],"LineTo":arguments[i++],"Polyline":arguments[i++],"PolygonSC":arguments[i++],"PolygonCB":arguments[i++],"EllipseSC":arguments[i++],"EllipseCB":arguments[i++],"FastGlyph":arguments[i++],"Glyph":arguments[i++]})},446589:function($0,$1,$2){const msg=UTF8ToString($1,$2);if(Module.log){Module.log($0,msg)}else{console.log(msg)}},446695:function(){let i=0;Module.LogLevel=Object.freeze({"Error":arguments[i++],"Warning":arguments[i++],"Notice":arguments[i++],"Info":arguments[i++],"Debug":arguments[i++]})}};function mod_exp_js(base_str,modulus_str,exponent_str,out,out_len){let base=BigInt(UTF8ToString(base_str));const modulus=BigInt(UTF8ToString(modulus_str));let exponent=BigInt(UTF8ToString(exponent_str));const int2=BigInt(2);const int1=BigInt(1);let result=BigInt(1);while(exponent){if(exponent%int2===int1){result=result*base%modulus}base=base*base%modulus;exponent=exponent/int2}if(!result){return 0}const hex=result.toString(16);if(hex.length>out_len*2){return 0}out=HEAPU8.subarray(out,out+out_len);let ihex=0;let iout=0;const htoi=i=>i<=57?i-48:i-97+10;if(hex.length&1){out[iout++]=htoi(hex.charCodeAt(ihex++))}for(const endhex=hex.length;ihex<endhex;ihex+=2){out[iout++]=htoi(hex.charCodeAt(ihex))<<4|htoi(hex.charCodeAt(ihex+1))}return iout}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function ___cxa_allocate_exception(size){return _malloc(size+16)+16}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-16;this.set_type=function(type){HEAP32[this.ptr+4>>2]=type};this.get_type=function(){return HEAP32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAP32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAP32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},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},get64:function(low,high){return low}};function ___sys_getpid(){return 42}function ___sys_uname(buf){if(!buf)return-21;var layout={"__size__":390,"domainname":325,"machine":260,"nodename":65,"release":130,"sysname":0,"version":195};var copyString=function(element,value){var offset=layout[element];writeAsciiToMemory(value,buf+offset)};copyString("sysname","Emscripten");copyString("nodename","emscripten");copyString("release","1.0");copyString("version","#1");copyString("machine","wasm32");return 0}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach(function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(function(cb){cb()})}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&&registeredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i<arguments.length;i++){argCache[i]=arguments[i]}return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return wasmTable.get(rawFunction)}var fp=makeDynCaller();if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!=="void";var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}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[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1}case null:{return 2}case true:{return 3}case false:{return 4}default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<<bitshift>>>bitshift}}var isUnsignedType=name.includes("unsigned");registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}str=a.join("")}_free(value);return str},"toWireType":function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var getLength;var valueIsOfTypeString=typeof value==="string";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError("Cannot pass non-string to std::string")}if(stdStringIsUTF8&&valueIsOfTypeString){getLength=function(){return lengthBytesUTF8(value)}}else{getLength=function(){return value.length}}var length=getLength();var ptr=_malloc(4+length+1);HEAPU32[ptr>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+4+i]=value[i]}}}if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=function(){return HEAPU16};shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=function(){return HEAPU32};shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i<argCount;++i){a[i]=requireRegisteredType(HEAP32[(argTypes>>2)+i],"parameter "+i)}return a}function __emval_call(handle,argCount,argTypes,argv){handle=requireHandle(handle);var types=__emval_lookupTypes(argCount,argTypes);var args=new Array(argCount);for(var i=0;i<argCount;++i){var type=types[i];args[i]=type["readValueFromPointer"](argv);argv+=type["argPackAdvance"]}var rv=handle.apply(undefined,args);return __emval_register(rv)}function __emval_allocateDestructors(destructorsRef){var destructors=[];HEAP32[destructorsRef>>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;i<argCount-1;++i){argsList+=(i!==0?", ":"")+"arg"+i;params.push("argType"+i);args.push(types[1+i])}var functionName=makeLegalFunctionName("methodCaller_"+signatureName);var functionBody="return function "+functionName+"(handle, name, destructors, args) {\n";var offset=0;for(var i=0;i<argCount-1;++i){functionBody+=" var arg"+i+" = argType"+i+".readValueFromPointer(args"+(offset?"+"+offset:"")+");\n";offset+=types[i+1]["argPackAdvance"]}functionBody+=" var rv = handle[name]("+argsList+");\n";for(var i=0;i<argCount-1;++i){if(types[i+1]["deleteObject"]){functionBody+=" argType"+i+".deleteObject(arg"+i+");\n"}}if(!retType.isVoid){functionBody+=" return retType.toWireType(destructors, rv);\n"}functionBody+="};\n";params.push(functionBody);var invokerFunction=new_(Function,params).apply(null,args);return __emval_addMethodCaller(invokerFunction)}function __emval_get_property(handle,key){handle=requireHandle(handle);key=requireHandle(key);return __emval_register(handle[key])}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function __emval_new_cstring(v){return __emval_register(getStringOrSymbol(v))}function __emval_not(object){object=requireHandle(object);return!object}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){var double=ch<105;if(double&&buf&1)buf++;readAsmConstArgsArray.push(double?HEAPF64[buf++>>1]:HEAP32[buf]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;return false}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var asmLibraryArg={"c":___cxa_allocate_exception,"i":___cxa_throw,"a":___sys_getpid,"A":___sys_uname,"y":__embind_register_bigint,"C":__embind_register_bool,"v":__embind_register_class,"r":__embind_register_class_constructor,"l":__embind_register_class_function,"B":__embind_register_emval,"w":__embind_register_float,"u":__embind_register_function,"p":__embind_register_integer,"o":__embind_register_memory_view,"x":__embind_register_std_string,"t":__embind_register_std_wstring,"D":__embind_register_void,"k":__emval_as,"F":__emval_call,"G":__emval_call_method,"h":__emval_call_void_method,"b":__emval_decref,"H":__emval_get_global,"g":__emval_get_method_caller,"f":__emval_get_property,"m":__emval_incref,"e":__emval_new_cstring,"d":__emval_not,"j":__emval_run_destructors,"n":__emval_take_value,"q":_emscripten_asm_const_int,"z":_emscripten_memcpy_big,"s":_emscripten_resize_heap,"E":mod_exp_js};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["J"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["K"]).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"]["L"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["M"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["N"]).apply(null,arguments)};var dynCall_vijii=Module["dynCall_vijii"]=function(){return(dynCall_vijii=Module["dynCall_vijii"]=Module["asm"]["P"]).apply(null,arguments)};var dynCall_vijiii=Module["dynCall_vijiii"]=function(){return(dynCall_vijiii=Module["dynCall_vijiii"]=Module["asm"]["Q"]).apply(null,arguments)};Module["stringToUTF16"]=stringToUTF16;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
return WallixModule.ready
}
);
})();
if (typeof exports === 'object' && typeof module === 'object')
module.exports = WallixModule;
else if (typeof define === 'function' && define['amd'])
define([], function() { return WallixModule; });
else if (typeof exports === 'object')
exports["WallixModule"] = WallixModule;
"use strict";
// const maxPacketSize = 1600;
// const headerSize = 8;
const CF = Object.freeze({
// TEXT : 1,
BITMAP : 2,
// METAFILEPICT : 3,
// SYLK : 4,
// DIF : 5,
// TIFF : 6,
// OEMTEXT : 7,
// DIB : 8,
// PALETTE : 9,
// PENDATA : 10,
// RIFF : 11,
// WAVE : 12,
UNICODETEXT : 13,
// ENHMETAFILE : 14,
// HDROP : 15,
// LOCALE : 16,
// DIBV5 : 17,
// OWNERDISPLAY : 128,
// DSPTEXT : 129,
// DSPBITMAP : 130,
// DSPMETAFILEPICT : 131,
// DSPENHMETAFILE : 142,
// PRIVATEFIRST : 512,
// PRIVATELAST : 767,
// GDIOBJFIRST : 768,
// GDIOBJLAST : 1023,
});
const CustomCF = Object.freeze({
None: 0,
FileGroupDescriptorW: 33333,
});
const Charset = Object.freeze({
Ascii: 0,
Unicode: 1,
});
const FileContentsOp = Object.freeze({
Size: 1,
Range: 2,
});
const FileAttributes = Object.freeze({
Readonly: 0x1,
Hidden: 0x2,
System: 0x4,
Directory: 0x10,
Archive: 0x20,
Normal: 0x80,
});
const FileFlags = Object.freeze({
Attributes: 0X4,
FileSize: 0x40,
WriteTime: 0x20,
ShowProgressUI: 0x4000,
});
const ChannelFlags = Object.freeze({
First: 1,
Last: 2,
});
const MsgFlags = Object.freeze({
None: 0,
Ok: 1,
Fail: 2,
AsciiName: 4,
});
const CbType = Object.freeze({
MonitorReady: 0x0001,
FormatList: 0x0002,
ListResponse: 0x0003,
DataRequest: 0x0004,
DataResponse: 0x0005,
TempDirectory: 0x0006,
Capabilities: 0x0007,
FileContentsRequest: 0x0008,
FileContentsResponse: 0x0009,
Lock: 0x000A,
Unlock: 0x000B,
});
const CbGeneralFlags = Object.freeze({
UseLongFormatNames: 0x00000002,
StreamFileclipEnabled: 0x00000004,
FileclipNoFilePaths: 0x00000008,
CanLockClipData: 0x00000010,
HugeFileSupportEnabled: 0x00000020
})
class IdGenerator
{
constructor() {
this.ids = [];
this.maxId = 0;
}
createId() {
if (this.ids.length) {
return this.ids.pop();
}
return this.maxId++;
}
releaseId(id) {
this.ids.push(id);
}
}
const chunkSize = 1600;
const headerSize = 8;
const fileDescSize = 592;
const bufferSize = fileDescSize * 3 + headerSize;
class CliprdrBuffer
{
constructor(Module, clipboard) {
this.n = bufferSize;
this.ptr = Module._malloc(this.n);
this.stream = new OutStream(this.ptr, Module);
this.clipboard = clipboard;
this.Module = Module;
this.totalLen = 0;
this.channelflags = 0;
this.remainingLen = 0;
}
delete() {
this.Module._free(this.ptr);
}
beginFormatDescriptorList(count) {
this.stream.i = this.ptr;
this.stream.u16le(CbType.DataResponse);
this.stream.u16le(MsgFlags.Ok);
this.stream.u32le(fileDescSize * count);
this.totalLen = fileDescSize * count + 8;
this.remainingLen = this.totalLen;
this.channelflags = ChannelFlags.First;
if (this.remainingLen <= chunkSize) {
this.channelflags |= ChannelFlags.Last;
}
}
addFormatDescriptor(filename, flags, attrs, lastModified, size) {
this.stream.u32le(1/*files.length*/);
this.stream.u32le(flags);
this.stream.bzero(32);
this.stream.u32le(attrs);
this.stream.bzero(16);
// lastWriteTime: specifies the number of 100-nanoseconds intervals that have elapsed since 1 January 1601.
this.stream.u64le((lastModified + 11644473600) * 10000000);
this.stream.u64lem(size);
const byteLength = this.stream.copyStringAsAlignedUTF16(filename, 520 - 2);
this.stream.bzero(520 - byteLength);
const len = this.stream.i - this.ptr;
if (len > chunkSize) {
this.clipboard.sendRawData(this.ptr, chunkSize, this.totalLen, this.channelflags);
const overflowBuffer = new Uint8Array(Module.HEAPU8.buffer,
this.ptr + chunkSize,
len);
this.stream.i = this.ptr;
this.stream.copyAsArray(overflowBuffer);
this.remainingLen -= chunkSize;
this.channelflags = (this.remainingLen <= chunkSize) ? ChannelFlags.Last : 0;
}
}
endFormatDescriptorList() {
if (this.stream.i != this.ptr) {
const len = this.stream.i - this.ptr;
this.clipboard.sendRawData(this.ptr, len, this.totalLen, this.channelflags);
}
}
}
class Cliprdr
{
constructor(DOMBox, syncData, emccModule) {
// TODO DOMBox, syncData -> {addFormats, setFileGroupId, ...}
this.UTF8Decoder = new TextDecoder("utf-8");
this.UTF16Decoder = new TextDecoder("utf-16");
this.emccModule = emccModule;
this.syncData = syncData;
this.clipboard = null;
this.streams = [];
this.lockId = null;
this.formats = [];
this.fileGroupId = null;
this.dataDecoder = null;
this.ifile = 0;
this.files = []
this.streamId = 0;
this.remoteFileGroups = [];
this.currentFileGroupId = 0;
this.fileGroupIdGenerator = new IdGenerator();
this.streamIdGenerator = new IdGenerator();
const buflen = 1600;
const bufp = emccModule._malloc(buflen);
this.buffer = {
capacity: buflen,
i: bufp,
array: emccModule.HEAPU8.subarray(bufp, bufp + buflen)
}
this.DOMBox = DOMBox;
this.DOMFormats = this.DOMBox.appendChild(document.createElement('div'));
this.DOMFiles = this.DOMBox.appendChild(document.createElement('div'));
this.DOMFormats.onclick = (e) => {
e.preventDefault();
let formatId = e.originalTarget.dataset.formatId;
if (formatId) {
formatId = Number(formatId);
console.log('DOMFormats.onclick:', formatId);
const customCf = (formatId === this.fileGroupId)
? CustomCF.FileGroupDescriptorW
: 0;
this.clipboard.sendRequestFormat(formatId, customCf);
this.syncData();
}
};
this.DOMFiles.onclick = (e) => {
e.preventDefault();
let ifile = e.originalTarget.dataset.ifile;
if (ifile) {
ifile = Number(ifile);
console.log('DOMFiles.onclick:', ifile);
// TODO lock + pos + hugeFileSupport
const bytesToRead = 0xffff;
this.clipboard.sendFileContentsRequest(
FileContentsOp.Range, this.streamId, ifile, 0, 0, bytesToRead, 0, 0);
// FileContentsOp.Range, this.streamId, ifile, 0, 0, 0xffff,
// true, this.lockId);
const fileGroupId = e.originalTarget.parentNode.dataset.fileGroupId;
const streamId = this.streamIdGenerator.createId();
const fileGroup = this.remoteFileGroups[fileGroupId];
++fileGroup.countRef;
this.streams[streamId] = {
fileGroup,
ifile,
file: fileGroup.files[ifile],
offset: 0,
bytesToRead,
datas: [],
isActive: true,
};
this.syncData();
}
};
}
free() {
this.emccModule._free(this.buffer.i);
this.DOMBox.removeChild(this.DOMFormats);
this.DOMBox.removeChild(this.DOMFiles);
this.cliprdrBuffer.delete();
}
_processWithBuffer(bufLen, f) {
const reallocBuf = (this.buffer.capacity < bufLen);
if (this.buffer.capacity < bufLen) {
const ibuf = this.emccModule._malloc(bufLen);
if (!ibuf) {
return false;
}
// TODO first parameter not used
f(this.emccModule.HEAPU8.subarray(ibuf, ibuf + bufLen), ibuf);
this.emccModule._free(ibuf);
}
else {
// TODO first parameter not used
f(this.buffer.array.subarray(0, bufLen), this.buffer.i)
}
return true;
}
setEmcChannel(chann) {
this.clipboard = chann;
this.cliprdrBuffer = new CliprdrBuffer(this.emccModule, chann);
}
setGeneralCapability(generalFlags) {
// TODO reset others values
console.log('setGeneralCapability:', generalFlags);
// TODO
this.lockSupport = !!(generalFlags & CbGeneralFlags.CanLockClipData);
// this.fileSupport = !!(generalFlags & CbGeneralFlags.StreamFileclipEnabled);
// this.hugeFileSupport = !!(generalFlags & CbGeneralFlags.HugeFileSupportEnabled);
return generalFlags & ~CbGeneralFlags.CanLockClipData;
}
_resetUnlockedFileGroup() {
// TODO remove streams
const fileGroup = this.remoteFileGroups.pop();
if (fileGroup) {
this.DOMFiles.removeChild(fileGroup.DOMElement);
}
}
formatListStart() {
this.DOMFiles.innerText = '';
this.DOMFormats.innerText = '';
this.fileGroupId = null;
if (this.lockSupport) {
this.currentFileGroupId = this.fileGroupIdGenerator.createId();
}
else {
this._resetUnlockedFileGroup();
}
}
formatListFormat(dataName, formatId, customFormatId, isUTF8) {
console.log('formatList:', formatId, customFormatId, isUTF8);
const button = document.createElement('button');
button.dataset.formatId = formatId;
switch (formatId) {
case CF.UNICODETEXT: {
button.appendChild(new Text("UNICODETEXT"));
break;
}
case CF.BITMAP: {
button.appendChild(new Text("BITMAP"));
break;
}
default: {
switch (customFormatId) {
case CustomCF.FileGroupDescriptorW:
button.appendChild(new Text(`${formatId}: FileGroupDescriptorW`));
this.fileGroupId = formatId;
break;
case CustomCF.None:
const decoder = (isUTF8 ? this.UTF8Decoder : this.UTF16Decoder);
const name = decoder.decode(dataName);
button.appendChild(new Text(`${formatId}: ${name}`));
break;
}
break;
}
}
this.DOMFormats.appendChild(button);
}
formatListStop() {
console.log('formatListStop');
}
formatDataResponse(data, remainingDataLen, formatId, channelFlags) {
console.log('formatDataResponse:', remainingDataLen, formatId, channelFlags);
switch (formatId) {
case CF.UNICODETEXT: {
if (channelFlags & ChannelFlags.First) {
this.dataDecoder = new TextDecoder("utf-16");
}
if (channelFlags & ChannelFlags.Last) {
const text = this.dataDecoder.decode(data)
console.log(text);
}
else {
const chunckedText = this.dataDecoder.decode(data, {stream: true});
console.log(chunckedText)
}
break;
}
// TODO
// case CF.BITMAP:
// break;
default:
console.log('Unknown data');
}
}
formatDataResponseFileStart(countFile) {
console.log('formatDataResponseFileStart:', countFile);
this.responseFiles = []
if (!this.lockSupport) {
this._resetUnlockedFileGroup();
}
}
formatDataResponseFile(utf16Name, attributes, flags, sizeLow, sizeHigh, lastWriteTimeLow, lastWriteTimeHigh) {
const filename = this.UTF16Decoder.decode(utf16Name);
console.log('formatDataResponseFile:', filename, attributes, flags, sizeLow, sizeHigh, lastWriteTimeLow, lastWriteTimeHigh);
this.responseFiles.push({name: filename, size: (sizeHigh << 32) + sizeLow,})
}
formatDataResponseFileStop() {
console.log('formatDataResponseFileStop');
const div = document.createElement('div');
div.dataset.fileGroupId = this.currentFileGroupId;
for (const i in this.responseFiles) {
const button = div.appendChild(document.createElement('button'));
button.appendChild(new Text(this.responseFiles[i].name));
button.dataset.ifile = i;
}
this.remoteFileGroups[this.currentFileGroupId] = {
// TODO used ?
fileGroupId: this.currentFileGroupId,
files: this.responseFiles,
streamIds: {},
countRef: 1,
DOMElement: div,
};
this.DOMFiles.appendChild(div);
}
fileContentsResponse(data, streamId, remainingDataLen, channelFlags) {
console.log('fileContentsResponse:', data.byteLength, streamId, remainingDataLen, channelFlags);
const fileStream = this.streams[streamId];
if (channelFlags & ChannelFlags.Last) {
const newOffset = fileStream.offset + fileStream.bytesToRead;
console.log('newOffset: ', newOffset);
if (fileStream.file.size > newOffset && fileStream.isActive) {
fileStream.datas.push(data.buffer.slice(
data.byteOffset, data.byteOffset + data.byteLength));
// TODO lock + pos + hugeFileSupport
this.clipboard.sendFileContentsRequest(
FileContentsOp.Range, streamId, fileStream.ifile,
newOffset, 0, fileStream.bytesToRead, 0, 0);
fileStream.offset = newOffset;
}
else {
// TODO remove this.remoteFileGroups[fileStream.fileGroup.fileGroupId] id countRef == 0
const byteLength = Math.min(
data.byteLength, fileStream.file.size - fileStream.offset);
fileStream.datas.push(data.buffer.slice(
data.byteOffset, data.byteOffset + byteLength));
--fileStream.fileGroup.countRef;
delete this.streams[streamId];
this.streamIdGenerator.releaseId(streamId);
const blob = new Blob(fileStream.datas, {type: "application/octet-stream"});
const objectURL = URL.createObjectURL(blob);
cbDownload.href = objectURL;
cbDownload.download = fileStream.file.name;
cbDownload.click();
URL.revokeObjectURL(objectURL);
}
}
else {
fileStream.datas.push(data.buffer.slice(
data.byteOffset, data.byteOffset + data.byteLength));
}
}
formatDataRequest(formatId) {
console.log('formatDataRequest:', formatId);
switch (formatId) {
case CF.UNICODETEXT: {
const data = sendCbUtf8_data.value;
const capacity = data.length * 2 + 2 /*"\0\0"*/ + 8 /* header size */;
if (!this._processWithBuffer(capacity, (arr, ibuffer) => {
let len = this.emccModule.stringToUTF16(data, ibuffer + 8, capacity - 8) + 2;
const stream = new OutStream(ibuffer, this.emccModule)
stream.u16le(CbType.DataResponse);
stream.u16le(MsgFlags.Ok);
stream.u32le(len);
if (capacity <= 1600) {
this.clipboard.sendRawData(
ibuffer, capacity, capacity, ChannelFlags.First | ChannelFlags.Last);
}
else {
this.clipboard.sendRawData(ibuffer, 1600, capacity, ChannelFlags.First);
let i = 1600;
while (capacity - i > 1600) {
this.clipboard.sendRawData(ibuffer + i, 1600, capacity, 0);
i += 1600;
}
this.clipboard.sendRawData(
ibuffer + i, capacity - i, capacity, ChannelFlags.Last);
}
})) {
// TODO malloc error
}
break;
}
case CustomCF.FileGroupDescriptorW: {
const file = sendCbFile_data.files[0];
if (file.size > 4294967296
&& !(this.generalFlags & CbGeneralFlags.HugeFileSupportEnabled)
) {
console.error('Huge file doesn\'t supported');
this.clipboard.sendHeader(CbType.DataResponse, MsgFlags.Fail, 0);
}
const flags = FileFlags.FileSize | FileFlags.ShowProgressUI /*| FileFlags.WriteTime*/;
const attrs = FileAttributes.Normal;
this.cliprdrBuffer.beginFormatDescriptorList(1);
this.cliprdrBuffer.addFormatDescriptor(
file.name, flags, attrs, file.lastModified, file.size);
this.cliprdrBuffer.endFormatDescriptorList();
break;
}
}
}
fileContentsRequest(streamId, type, lindex, nposLow, nposHigh, szRequested) {
console.log("fileContentsRequest:", ...arguments);
const file = sendCbFile_data.files[lindex];
console.log(file.size, file.name);
switch (type)
{
case FileContentsOp.Size: {
const stream = new OutStream(this.buffer.i, this.emccModule);
stream.u16le(CbType.FileContentsResponse);
stream.u16le(MsgFlags.Ok);
const headerSizePos = stream.i;
stream.skip(4);
stream.u32le(streamId);
stream.u64le(file.size);
const totalLen = stream.i - this.buffer.i;
stream.i = headerSizePos;
stream.u32le(totalLen);
console.log(totalLen);
this.clipboard.sendRawData(this.buffer.i, totalLen, totalLen, ChannelFlags.First | ChannelFlags.Last);
rdpclient.sendBufferedData();
break;
}
case FileContentsOp.Range: {
// TODO chunk
const reader = new FileReader();
// Closure to capture the file information.
reader.onload = (e) => {
const contents = new Uint8Array(e.target.result);
console.log(contents.length);
const stream = new OutStream(this.buffer.i, this.emccModule);
stream.u16le(CbType.FileContentsResponse);
stream.u16le(MsgFlags.Ok);
const headerSizePos = stream.i;
stream.skip(4);
stream.u32le(streamId);
stream.copyAsArray(contents);
const totalLen = stream.i - this.buffer.i;
stream.i = headerSizePos;
stream.u32le(totalLen);
console.log(totalLen);
this.clipboard.sendRawData(this.buffer.i, totalLen, totalLen, ChannelFlags.First | ChannelFlags.Last);
rdpclient.sendBufferedData();
};
reader.readAsArrayBuffer(file);
break;
}
}
}
lock(lockId) {
console.log("lock:", lockId);
this.lockId = lockId;
}
unlock(lockId) {
console.log("unlock:", lockId);
this.lockId = null;
}
receiveResponseFail(msgType) {
console.log("receiveResponseFail", msgType);
// TODO streamId for disable transfer
}
}
// mstsc.js
(function() {
/**
* Use for domain declaration
*/
Mstsc = function () {
}
Mstsc.prototype = {
// shortcut
$ : function (id) {
return document.getElementById(id);
},
/**
* Compute screen offset for a target element
* @param el {DOM element}
* @return {top : {integer}, left {integer}}
*/
elementOffset : function (el) {
var x = 0;
var y = 0;
while (el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop )) {
x += el.offsetLeft - el.scrollLeft;
y += el.offsetTop - el.scrollTop;
el = el.offsetParent;
}
return { top: y, left: x };
},
/**
* Try to detect browser
* @returns {String} [firefox|chrome|ie]
*/
browser : function () {
if (typeof InstallTrigger !== 'undefined') {
return 'firefox';
}
if (!!window.chrome) {
return 'chrome';
}
if (!!document.docuemntMode) {
return 'ie';
}
return null;
},
/**
* Try to detect language
* @returns
*/
locale : function () {
return window.navigator.userLanguage || window.navigator.language;
}
}
})();
this.Mstsc = new Mstsc();
// client.js
(function() {
/**
* Mouse button mapping
* @param button {integer} client button number
*/
function mouseButtonMap(button) {
switch(button) {
case 0:
return 1;
case 2:
return 2;
default:
return 0;
}
};
/**
* Mstsc client
* @param canvas {canvas} rendering element
* @param Module rdp wasm module
*/
function Client(Module, canvas, stream) {
this.canvas = canvas;
this.socket = stream;
// create renderer
//this.render = new Mstsc.Canvas.create(this.canvas);
this.activeSession = true;
this.config = Object.assign({
width: 1024,
height: 768,
bpp: 16,
disabledGraphicOrders: 0, // MultiSelectToInt(disabled_graphics_input, Module.GraphicOrders),
username: 'Administrator',
password: 'HSCN123!',
// getRandomValues: (data) => crypto.getRandomValues(data),
verbosity: 0/*0x04000000*/,
keylayout: 0x00010409,
});
this.flag = 0;
console.log('newRdpGraphics2D', newRdpGraphics2D)
// optional
const LogLevel = Module.LogLevel;
Module.log = function(priority, msg) {
const logger = (priority === LogLevel.Info) ? console.log
: (priority === LogLevel.Warning) ? console.warn
: (priority === LogLevel.Error) ? console.error
: (priority === LogLevel.Debug) ? (s) => {
console.debug("%c%s", 'color:yellow', s)
}
: console.info;
logger(msg);
};
const self = this
if(typeof(newRdpGraphics2D) === 'undefined') {
console.log('no newRdpGraphics2D')
return;
}
const gd = newRdpGraphics2D(canvas, Module);
self.render = new Module.RdpClient(gd, self.config);
self.MouseFlags = Module.MouseFlags;
self.InputFlags = Module.InputFlags;
self.GraphicOrders = Module.GraphicOrders;
//self.clipboard = new ClipboardChannel()
this.install();
}
Client.prototype = {
install : function () {
var self = this;
this.sendMouseEvent = function(evt, flags)
{
evt.preventDefault();
evt.stopImmediatePropagation();
self.render.writeMouseEvent(evt.offsetX, evt.offsetY, flags);
self.sendData();
}
// bind mouse move event
this.canvas.addEventListener('mousemove', function (e) {
if (!self.socket) return;
//self.sendMouseEvent(e, self.flag);
//self.sendMouseEvent(e, self.MouseFlags.Move)
return false;
});
this.canvas.addEventListener('mousedown', function (e) {
if (!self.socket) return;
self.sendMouseButton(e, self.MouseFlags.Down)
return false;
});
this.canvas.addEventListener('mouseup', function (e) {
if (!self.socket) return;
self.sendMouseButton(e, self.MouseFlags.Up)
return false;
});
this.canvas.addEventListener('contextmenu', function (e) {
e.preventDefault();
return false;
});
this.canvas.addEventListener('DOMMouseScroll', function (e) {
if (!self.socket || !self.activeSession) return;
var isHorizontal = false;
var delta = e.detail;
var step = Math.round(Math.abs(delta) * 15 / 8);
var offset = Mstsc.elementOffset(self.canvas);
//self.socket.emit('wheel', e.clientX - offset.left, e.clientY - offset.top, step, delta > 0, isHorizontal);
e.preventDefault();
return false;
});
this.canvas.addEventListener('mousewheel', function (evt) {
if (!self.socket || !self.activeSession) return;
if (evt.deltaY) {
const delta = (evt.deltaY < 0)
? self.MouseFlags.WheelRotationMask
: self.MouseFlags.WheelNegative;
self.sendMouseEvent(evt, self.MouseFlags.VerticalWheel | delta);
}
else if (evt.deltaX && hWheelSupport) {
const delta = (evt.deltaX < 0)
? self.MouseFlags.WheelRotationMask
: self.MouseFlags.WheelNegative;
self.sendMouseEvent(evt, self.MouseFlags.HorizontalWheel | delta);
}
return false;
});
// bind keyboard event
window.addEventListener('keydown', function (e) {
if (!self.socket || !self.activeSession) return;
self.sendScancodes([Mstsc.scancode(e)], e);
return false;
});
window.addEventListener('keyup', function (e) {
if (!self.socket || !self.activeSession) return;
//self.sendScancodes([Mstsc.scancode(e)], e);
return false;
});
this.sendData = function() {
const out = self.render.getOutputData();
if (out.length) {
self.socket.send(out);
self.render.resetOutputData();
}
};
this.socket.onopen = function(e) {
self.render.writeFirstPacket();
self.sendData();
/*
self.t = setInterval(function() {
console.log('render')
self.sendData();
}, 1000);*/
}
this.socket.onerror = function(e) {
console.log('onerror')
}
this.socket.onclose = function(e) {
console.log('onclose')
self.render.delete();
clearInterval(self.t);
}
this.socket.onmessage = function(event) {
//console.log('onmessage', event.data)
try {
self.render.processInputData(event.data);
self.sendData();
}
catch(e) {
console.log('processInputData', e);
self.socket = null;
self.render = null;
clearInterval(self.t);
var ctx = self.canvas.getContext("2d");
ctx.font = "30px Verdana";
// Create gradient
var gradient = ctx.createLinearGradient(0, 0, self.canvas.width, 0);
gradient.addColorStop("0", "magenta");
gradient.addColorStop("0.5", "blue");
gradient.addColorStop("1.0", "red");
// Fill with gradient
ctx.strokeStyle = gradient;
ctx.strokeText("connection losed!~", self.canvas.width/2 - 150, self.canvas.height/2);
}
}
self.sendScancodes = function(scancodes, evt) {
if (scancodes) {
evt.preventDefault();
evt.stopImmediatePropagation();
for (let i = 0; i < scancodes.length; ++i) {
const scancode = scancodes[i];
console.log('Scancode: send', scancode, '0x'+scancode.toString(16));
self.render.writeScancodeEvent(scancode);
}
self.sendData();
}
else {
console.warn('Scancode: unknown keycode', evt.key, evt.code)
}
}
this.sendMouseEvent = function (evt, flags)
{
evt.preventDefault();
evt.stopImmediatePropagation();
self.render.writeMouseEvent(evt.offsetX, evt.offsetY, flags);
self.sendData();
}
this.sendMouseButton = function (evt, flag)
{
switch (evt.button) {
case 0: return self.sendMouseEvent(evt, flag | self.MouseFlags.LeftButton);
case 1: return self.sendMouseEvent(evt, flag | self.MouseFlags.MiddleButton);
case 2: return self.sendMouseEvent(evt, flag | self.MouseFlags.RightButton);
case 3: return self.sendMouseEvent(evt, flag | self.MouseFlags.Button4); break;
case 4: return self.sendMouseEvent(evt, flag | self.MouseFlags.Button5); break;
}
}
return this;
}
}
Mstsc.client = {
create : function (Module, gd, canvas, stream) {
return new Client(Module, gd, canvas, stream);
}
}
})();
(function() {
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
var KeyMap = {
"" : 0x0000,
"Escape" : 0x0001,
"Digit1" : 0x0002,
"Digit2" : 0x0003,
"Digit3" : 0x0004,
"Digit4" : 0x0005,
"Digit5" : 0x0006,
"Digit6" : 0x0007,
"Digit7" : 0x0008,
"Digit8" : 0x0009,
"Digit9" : 0x000A,
"Digit0" : 0x000B,
"Minus" : 0x000C,
"Equal" : 0x000D,
"Backspace" : 0x000E,
"Tab" : 0x000F,
"KeyQ" : 0x0010,
"KeyW" : 0x0011,
"KeyE" : 0x0012,
"KeyR" : 0x0013,
"KeyT" : 0x0014,
"KeyY" : 0x0015,
"KeyU" : 0x0016,
"KeyI" : 0x0017,
"KeyO" : 0x0018,
"KeyP" : 0x0019,
"BracketLeft" : 0x001A,
"BracketRight" : 0x001B,
"Enter" : 0x001C,
"ControlLeft" : 0x001D,
"KeyA" : 0x001E,
"KeyS" : 0x001F,
"KeyD" : 0x0020,
"KeyF" : 0x0021,
"KeyG" : 0x0022,
"KeyH" : 0x0023,
"KeyJ" : 0x0024,
"KeyK" : 0x0025,
"KeyL" : 0x0026,
"Semicolon" : 0x0027,
"Quote" : 0x0028,
"Backquote" : 0x0029,
"ShiftLeft" : 0x002A,
"Backslash" : 0x002B,
"KeyZ" : 0x002C,
"KeyX" : 0x002D,
"KeyC" : 0x002E,
"KeyV" : 0x002F,
"KeyB" : 0x0030,
"KeyN" : 0x0031,
"KeyM" : 0x0032,
"Comma" : 0x0033,
"Period" : 0x0034,
"Slash" : 0x0035,
"ShiftRight" : 0x0036,
"NumpadMultiply" : 0x0037,
"AltLeft" : 0x0038,
"Space" : 0x0039,
"CapsLock" : 0x003A,
"F1" : 0x003B,
"F2" : 0x003C,
"F3" : 0x003D,
"F4" : 0x003E,
"F5" : 0x003F,
"F6" : 0x0040,
"F7" : 0x0041,
"F8" : 0x0042,
"F9" : 0x0043,
"F10" : 0x0044,
"Pause" : 0x0045,
"ScrollLock" : 0x0046,
"Numpad7" : 0x0047,
"Numpad8" : 0x0048,
"Numpad9" : 0x0049,
"NumpadSubtract" : 0x004A,
"Numpad4" : 0x004B,
"Numpad5" : 0x004C,
"Numpad6" : 0x004D,
"NumpadAdd" : 0x004E,
"Numpad1" : 0x004F,
"Numpad2" : 0x0050,
"Numpad3" : 0x0051,
"Numpad0" : 0x0052,
"NumpadDecimal" : 0x0053,
"PrintScreen" : 0x0054,
"IntlBackslash" : 0x0056,
"F11" : 0x0057,
"F12" : 0x0058,
"NumpadEqual" : 0x0059,
"F13" : 0x0064,
"F14" : 0x0065,
"F15" : 0x0066,
"F16" : 0x0067,
"F17" : 0x0068,
"F18" : 0x0069,
"F19" : 0x006A,
"F20" : 0x006B,
"F21" : 0x006C,
"F22" : 0x006D,
"F23" : 0x006E,
"KanaMode" : 0x0070,
"Lang2" : 0x0071,
"Lang1" : 0x0072,
"IntlRo" : 0x0073,
"F24" : 0x0076,
"Convert" : 0x0079,
"NonConvert" : 0x007B,
"IntlYen" : 0x007D,
"NumpadComma" : 0x007E,
"MediaTrackPrevious" : 0xE010,
"MediaTrackNext" : 0xE019,
"NumpadEnter" : 0xE01C,
"ControlRight" : 0xE01D,
"VolumeMute" : 0xE020,
"LaunchApp2" : 0xE021,
"MediaPlayPause" : 0xE022,
"MediaStop" : 0xE024,
"VolumeDown" : 0xE02E,
"VolumeUp" : 0xE030,
"BrowserHome" : 0xE032,
"NumpadDivide" : 0xE035,
"PrintScreen" : 0xE037,
"AltRight" : 0xE038,
"NumLock" : 0xE045,
"Pause" : 0xE046,
"Home" : 0xE047,
"ArrowUp" : 0xE048,
"PageUp" : 0xE049,
"ArrowLeft" : 0xE04B,
"ArrowRight" : 0xE04D,
"End" : 0xE04F,
"ArrowDown" : 0xE050,
"PageDown" : 0xE051,
"Insert" : 0xE052,
"Delete" : 0xE053,
"OSLeft" : 0xE05B,
"OSRight" : 0xE05C,
"ContextMenu" : 0xE05D,
"Power" : 0xE05E,
"BrowserSearch" : 0xE065,
"BrowserFavorites" : 0xE066,
"BrowserRefresh" : 0xE067,
"BrowserStop" : 0xE068,
"BrowserForward" : 0xE069,
"BrowserBack" : 0xE06A,
"LaunchApp1" : 0xE06B,
"LaunchMail" : 0xE06C,
"MediaSelect" : 0xE06D
};
var UnicodeToCodeFirefox_FR = {
27 : "Escape",
112 : "F1",
113 : "F2",
114 : "F3",
115 : "F4",
116 : "F5",
117 : "F6",
118 : "F7",
119 : "F8",
120 : "F9",
121 : "F10",
122 : "F11",
123 : "F12",
0 : "Backquote",
49 : "Digit1",
50 : "Digit2",
51 : "Digit3",
52 : "Digit4",
53 : "Digit5",
54 : "Digit6",
55 : "Digit7",
56 : "Digit8",
57 : "Digit9",
48 : "Digit0",
169 : "Minus",
61 : "Equal",
8 : "Backspace",
9 : "Tab",
65 : "KeyQ",
90 : "KeyW",
69 : "KeyE",
82 : "KeyR",
84 : "KeyT",
89 : "KeyY",
85 : "KeyU",
73 : "KeyI",
79 : "KeyO",
80 : "KeyP",
160 : "BracketLeft",
164 : "BracketRight",
13 : "Enter",
20 : "CapsLock",
20 : "CapsLock",
81 : "KeyA",
83 : "KeyS",
68 : "KeyD",
70 : "KeyF",
71 : "KeyG",
72 : "KeyH",
74 : "KeyJ",
75 : "KeyK",
76 : "KeyL",
77 : "Semicolon",
165 : "Quote",
170 : "Backslash",
16 : "ShiftLeft",
60 : "IntlBackslash",
87 : "KeyZ",
88 : "KeyX",
67 : "KeyC",
86 : "KeyV",
66 : "KeyB",
78 : "KeyN",
188 : "KeyM",
59 : "Comma",
58 : "Period",
161 : "Slash",
16 : "ShiftRight",
17 : "ControlLeft",
91 : "OSLeft",
18 : "AltLeft",
32 : "Space",
17 : "ControlLeft",
18 : "AltRight",
91 : "OSRight",
93 : "ContextMenu",
17 : "ControlRight",
37 : "ArrowLeft",
38 : "ArrowUp",
40 : "ArrowDown",
39 : "ArrowRight",
144 : "NumLock",
144 : "NumLock",
111 : "NumpadDivide",
106 : "NumpadMultiply",
109 : "NumpadSubtract",
103 : "Numpad7",
104 : "Numpad8",
105 : "Numpad9",
107 : "NumpadAdd",
100 : "Numpad4",
101 : "Numpad5",
102 : "Numpad6",
97 : "Numpad1",
98 : "Numpad2",
99 : "Numpad3",
96 : "Numpad0",
110 : "NumpadDecimal",
13 : "NumpadEnter",
17 : "ControlLeft",
67 : "KeyC",
17 : "ControlLeft"
};
var UnicodeToCodeChrome_FR = {
27 : "Escape",
112 : "F1",
113 : "F2",
114 : "F3",
115 : "F4",
116 : "F5",
117 : "F6",
118 : "F7",
119 : "F8",
120 : "F9",
121 : "F10",
122 : "F11",
123 : "F12",
0 : "Backquote",
49 : "Digit1",
50 : "Digit2",
51 : "Digit3",
52 : "Digit4",
53 : "Digit5",
54 : "Digit6",
55 : "Digit7",
56 : "Digit8",
57 : "Digit9",
48 : "Digit0",
219 : "Minus",
187 : "Equal",
8 : "Backspace",
9 : "Tab",
65 : "KeyQ",
90 : "KeyW",
69 : "KeyE",
82 : "KeyR",
84 : "KeyT",
89 : "KeyY",
85 : "KeyU",
73 : "KeyI",
79 : "KeyO",
80 : "KeyP",
221 : "BracketLeft",
186 : "BracketRight",
13 : "Enter",
20 : "CapsLock",
20 : "CapsLock",
81 : "KeyA",
83 : "KeyS",
68 : "KeyD",
70 : "KeyF",
71 : "KeyG",
72 : "KeyH",
74 : "KeyJ",
75 : "KeyK",
76 : "KeyL",
77 : "Semicolon",
192 : "Quote",
220 : "Backslash",
16 : "ShiftLeft",
60 : "IntlBackslash",
87 : "KeyZ",
88 : "KeyX",
67 : "KeyC",
86 : "KeyV",
66 : "KeyB",
78 : "KeyN",
188 : "KeyM",
190 : "Comma",
191 : "Period",
223 : "Slash",
16 : "ShiftRight",
17 : "ControlLeft",
91 : "OSLeft",
18 : "AltLeft",
32 : "Space",
17 : "ControlLeft",
18 : "AltRight",
91 : "OSRight",
93 : "ContextMenu",
17 : "ControlRight",
37 : "ArrowLeft",
38 : "ArrowUp",
40 : "ArrowDown",
39 : "ArrowRight",
144 : "NumLock",
144 : "NumLock",
111 : "NumpadDivide",
106 : "NumpadMultiply",
109 : "NumpadSubtract",
103 : "Numpad7",
104 : "Numpad8",
105 : "Numpad9",
107 : "NumpadAdd",
100 : "Numpad4",
101 : "Numpad5",
102 : "Numpad6",
97 : "Numpad1",
98 : "Numpad2",
99 : "Numpad3",
96 : "Numpad0",
110 : "NumpadDecimal",
13 : "NumpadEnter",
17 : "ControlLeft",
67 : "KeyC",
17 : "ControlLeft"
};
var UnicodeToCode_EN = {
27 : "Escape",
112 : "F1",
113 : "F2",
114 : "F3",
115 : "F4",
116 : "F5",
117 : "F6",
118 : "F7",
119 : "F8",
120 : "F9",
121 : "F10",
122 : "F11",
123 : "F12",
192 : "Backquote",
49 : "Digit1",
50 : "Digit2",
51 : "Digit3",
52 : "Digit4",
53 : "Digit5",
54 : "Digit6",
55 : "Digit7",
56 : "Digit8",
57 : "Digit9",
48 : "Digit0",
173 : "Minus",
61 : "Equal",
8 : "Backspace",
9 : "Tab",
81 : "KeyQ",
87 : "KeyW",
69 : "KeyE",
82 : "KeyR",
84 : "KeyT",
89 : "KeyY",
85 : "KeyU",
73 : "KeyI",
79 : "KeyO",
80 : "KeyP",
219 : "BracketLeft",
221 : "BracketRight",
13 : "Enter",
20 : "CapsLock",
65 : "KeyA",
83 : "KeyS",
68 : "KeyD",
70 : "KeyF",
71 : "KeyG",
72 : "KeyH",
74 : "KeyJ",
75 : "KeyK",
76 : "KeyL",
59 : "Semicolon",
222 : "Quote",
220 : "Backslash",
16 : "ShiftLeft",
220 : "IntlBackslash",
90 : "KeyZ",
88 : "KeyX",
67 : "KeyC",
86 : "KeyV",
66 : "KeyB",
78 : "KeyN",
77 : "KeyM",
188 : "Comma",
190 : "Period",
191 : "Slash",
16 : "ShiftRight",
17 : "ControlLeft",
18 : "AltLeft",
91 : "OSLeft",
32 : "Space",
18 : "AltRight",
91 : "OSRight",
93 : "ContextMenu",
17 : "ControlRight",
37 : "ArrowLeft",
38 : "ArrowUp",
40 : "ArrowDown",
39 : "ArrowRight",
144 : "NumLock",
144 : "NumLock",
111 : "NumpadDivide",
106 : "NumpadMultiply",
109 : "NumpadSubtract",
103 : "Numpad7",
104 : "Numpad8",
105 : "Numpad9",
107 : "NumpadAdd",
100 : "Numpad4",
101 : "Numpad5",
102 : "Numpad6",
97 : "Numpad1",
98 : "Numpad2",
99 : "Numpad3",
13 : "NumpadEnter",
96 : "Numpad0",
110 : "NumpadDecimal",
17 : "ControlLeft"
};
var UnicodeToCode = {
'firefox' : {
'fr' : UnicodeToCodeFirefox_FR,
'en' : UnicodeToCode_EN
},
'chrome' : {
'fr' : UnicodeToCodeChrome_FR,
'en' : UnicodeToCode_EN
}
}
/**
* Scancode of keyevent
* @param e {keyboardevent}
* @return {integer} scancode
*/
function scancode (e) {
var locale = Mstsc.locale();
//locale = (['fr', 'en'].indexOf(locale) > 0 && locale) || 'en';
locale = 'en';
//console.log(KeyMap[e.code || UnicodeToCode[Mstsc.browser() || 'firefox'][locale][e.keyCode]])
return KeyMap[e.code || UnicodeToCode[Mstsc.browser() || 'firefox'][locale][e.keyCode]];
}
Mstsc.scancode = scancode;
})();
"use strict";
class OutStream
{
constructor(ptr, emccModule) {
this.i = ptr;
this.HEAPU8 = emccModule.HEAPU8;
this.emccModule = emccModule;
}
skip(n) {
this.i += n;
}
u64lem(x) {
if (x > 0xffffffff) {
this.u32le(x - 0xffffffff);
}
else {
this.bzero(4);
}
this.u32le(x);
}
u64le(x) {
this.u32le(x);
if (x > 0xffffffff) {
this.u32le(x - 0xffffffff);
}
else {
this.bzero(4);
}
}
u32le(x) {
this.HEAPU8[this.i++] = x;
this.HEAPU8[this.i++] = (x >> 8);
this.HEAPU8[this.i++] = (x >> 16);
this.HEAPU8[this.i++] = (x >> 24);
}
u16le(x) {
this.HEAPU8[this.i++] = x;
this.HEAPU8[this.i++] = (x >> 8);
}
bzero(n) {
this.HEAPU8.fill(0, this.i, this.i + n);
this.i += n;
}
copyAsArray(array) {
this.HEAPU8.set(array, this.i);
this.i += array.length;
}
copyStringAsAlignedUTF16(str, maxBytesToWrite) {
if (maxBytesToWrite === undefined) {
maxBytesToWrite = 0x7FFFFFFF;
}
let iheap = this.i / 2;
const iend = (maxBytesToWrite < str.length * 2) ? (maxBytesToWrite >> 2) : str.length;
const HEAPU16 = this.emccModule.HEAPU16;
for (let i = 0; i < iend; ++i, ++iheap) {
HEAPU16[iheap] = str.charCodeAt(i);
}
this.i = iheap * 2;
return iend * 2;
}
}
var WallixModule = (function() {
var _scriptDir = typeof document !== 'undefined' && document.currentScript ? document.currentScript.src : undefined;
if (typeof __filename !== 'undefined') _scriptDir = _scriptDir || __filename;
return (
function(WallixModule) {
WallixModule = WallixModule || {};
null;var Module=typeof WallixModule!=="undefined"?WallixModule:{};var readyPromiseResolve,readyPromiseReject;Module["ready"]=new Promise(function(resolve,reject){readyPromiseResolve=resolve;readyPromiseReject=reject});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=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof process.versions==="object"&&typeof process.versions.node==="string";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};readAsync=function readAsync(filename,onload,onerror){if(!nodeFS)nodeFS=require("fs");if(!nodePath)nodePath=require("path");filename=nodePath["normalize"](filename);nodeFS["readFile"](filename,function(err,data){if(err)onerror(err);else onload(data.buffer)})};if(process["argv"].length>1){thisProgram=process["argv"][1].replace(/\\/g,"/")}arguments_=process["argv"].slice(2);process["on"]("uncaughtException",function(ex){if(!(ex instanceof ExitStatus)){throw ex}});process["on"]("unhandledRejection",abort);quit_=function(status,toThrow){if(keepRuntimeAlive()){process["exitCode"]=status;throw toThrow}process["exit"](status)};Module["inspect"]=function(){return"[Emscripten Module object]"}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptDir){scriptDirectory=_scriptDir}if(scriptDirectory.indexOf("blob:")!==0){scriptDirectory=scriptDirectory.substr(0,scriptDirectory.lastIndexOf("/")+1)}else{scriptDirectory=""}{read_=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(ENVIRONMENT_IS_WORKER){readBinary=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response);return}onerror()};xhr.onerror=onerror;xhr.send(null)}}setWindowTitle=function(title){document.title=title}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.warn.bind(console);for(key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["quit"])quit_=Module["quit"];var wasmBinary;if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];var noExitRuntime=Module["noExitRuntime"]||true;if(typeof WebAssembly!=="object"){abort("no native wasm support detected")}var wasmMemory;var ABORT=false;var EXITSTATUS;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var UTF8Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf8"):undefined;function UTF8ArrayToString(heap,idx,maxBytesToRead){var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heap[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heap.subarray&&UTF8Decoder){return UTF8Decoder.decode(heap.subarray(idx,endPtr))}else{var str="";while(idx<endPtr){var u0=heap[idx++];if(!(u0&128)){str+=String.fromCharCode(u0);continue}var u1=heap[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}var u2=heap[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u0=(u0&7)<<18|u1<<12|u2<<6|heap[idx++]&63}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}return str}function UTF8ToString(ptr,maxBytesToRead){return ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):""}function stringToUTF8Array(str,heap,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx}function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}function lengthBytesUTF8(str){var len=0;for(var i=0;i<str.length;++i){var u=str.charCodeAt(i);if(u>=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127)++len;else if(u<=2047)len+=2;else if(u<=65535)len+=3;else len+=4}return len}var UTF16Decoder=typeof TextDecoder!=="undefined"?new TextDecoder("utf-16le"):undefined;function UTF16ToString(ptr,maxBytesToRead){var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder){return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr))}else{var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str}}function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite<str.length*2?maxBytesToWrite/2:str.length;for(var i=0;i<numCharsToWrite;++i){var codeUnit=str.charCodeAt(i);HEAP16[outPtr>>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}function lengthBytesUTF16(str){return str.length*2}function UTF32ToString(ptr,maxBytesToRead){var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str}function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}function lengthBytesUTF32(str){var len=0;for(var i=0;i<str.length;++i){var codeUnit=str.charCodeAt(i);if(codeUnit>=55296&&codeUnit<=57343)++i;len+=4}return len}function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i<str.length;++i){HEAP8[buffer++>>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}var buffer,HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateGlobalBufferAndViews(buf){buffer=buf;Module["HEAP8"]=HEAP8=new Int8Array(buf);Module["HEAP16"]=HEAP16=new Int16Array(buf);Module["HEAP32"]=HEAP32=new Int32Array(buf);Module["HEAPU8"]=HEAPU8=new Uint8Array(buf);Module["HEAPU16"]=HEAPU16=new Uint16Array(buf);Module["HEAPU32"]=HEAPU32=new Uint32Array(buf);Module["HEAPF32"]=HEAPF32=new Float32Array(buf);Module["HEAPF64"]=HEAPF64=new Float64Array(buf)}var INITIAL_MEMORY=Module["INITIAL_MEMORY"]||16777216;var wasmTable;var __ATPRERUN__=[];var __ATINIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeKeepaliveCounter=0;function keepRuntimeAlive(){return noExitRuntime||runtimeKeepaliveCounter>0}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;callRuntimeCallbacks(__ATINIT__)}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 addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;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+="";err(what);ABORT=true;EXITSTATUS=1;what="abort("+what+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";function isDataURI(filename){return filename.startsWith(dataURIPrefix)}function isFileURI(filename){return filename.startsWith("file://")}var wasmBinaryFile;wasmBinaryFile="./rdp.wasm";if(!isDataURI(wasmBinaryFile)){wasmBinaryFile=locateFile(wasmBinaryFile)}function getBinary(file){try{if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}else{throw"both async and sync fetching of the wasm failed"}}catch(err){abort(err)}}function getBinaryPromise(){if(!wasmBinary&&(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER)){if(typeof fetch==="function"&&!isFileURI(wasmBinaryFile)){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){if(!response["ok"]){throw"failed to load wasm binary file at '"+wasmBinaryFile+"'"}return response["arrayBuffer"]()}).catch(function(){return getBinary(wasmBinaryFile)})}else{if(readAsync){return new Promise(function(resolve,reject){readAsync(wasmBinaryFile,function(response){resolve(new Uint8Array(response))},reject)})}}}return Promise.resolve().then(function(){return getBinary(wasmBinaryFile)})}function createWasm(){var info={"a":asmLibraryArg};function receiveInstance(instance,module){var exports=instance.exports;Module["asm"]=exports;wasmMemory=Module["asm"]["I"];updateGlobalBufferAndViews(wasmMemory.buffer);wasmTable=Module["asm"]["O"];addOnInit(Module["asm"]["J"]);removeRunDependency("wasm-instantiate")}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}function instantiateArrayBuffer(receiver){return getBinaryPromise().then(function(binary){return WebAssembly.instantiate(binary,info)}).then(function(instance){return instance}).then(receiver,function(reason){err("failed to asynchronously prepare wasm: "+reason);abort(reason)})}function instantiateAsync(){if(!wasmBinary&&typeof WebAssembly.instantiateStreaming==="function"&&!isDataURI(wasmBinaryFile)&&!isFileURI(wasmBinaryFile)&&typeof fetch==="function"){return fetch(wasmBinaryFile,{credentials:"same-origin"}).then(function(response){var result=WebAssembly.instantiateStreaming(response,info);return result.then(receiveInstantiationResult,function(reason){err("wasm streaming compile failed: "+reason);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(receiveInstantiationResult)})})}else{return instantiateArrayBuffer(receiveInstantiationResult)}}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().catch(readyPromiseReject);return{}}var ASM_CONSTS={445264:function(){let i=0;Module.MouseFlags=Object.freeze({"HorizontalWheel":arguments[i++],"VerticalWheel":arguments[i++],"WheelNegative":arguments[i++],"WheelRotationMask":arguments[i++],"Move":arguments[i++],"Up":arguments[i++],"Down":arguments[i++],"LeftButton":arguments[i++],"RightButton":arguments[i++],"MiddleButton":arguments[i++],"Button4":arguments[i++],"Button5":arguments[i++]})},445674:function(){let i=0;Module.KbdFlags=Object.freeze({"Down":arguments[i++],"Release":arguments[i++],"Extended":arguments[i++],"Extended1":arguments[i++]})},445835:function(){let i=0;Module.InputFlags=Object.freeze({"Scancodes":arguments[i++],"MouseX":arguments[i++],"FastPath":arguments[i++],"Unicode":arguments[i++],"HorizontalWheel":arguments[i++]})},446035:function(){let i=0;Module.GraphicOrders=Object.freeze({"MultiOpaqueRect":arguments[i++],"DstBlt":arguments[i++],"MultiDstBlt":arguments[i++],"PatBltAndOpaqueRect":arguments[i++],"MultiPatBlt":arguments[i++],"ScrBlt":arguments[i++],"MultiScrBlt":arguments[i++],"MemBlt":arguments[i++],"Mem3Blt":arguments[i++],"LineTo":arguments[i++],"Polyline":arguments[i++],"PolygonSC":arguments[i++],"PolygonCB":arguments[i++],"EllipseSC":arguments[i++],"EllipseCB":arguments[i++],"FastGlyph":arguments[i++],"Glyph":arguments[i++]})},446589:function($0,$1,$2){const msg=UTF8ToString($1,$2);if(Module.log){Module.log($0,msg)}else{console.log(msg)}},446695:function(){let i=0;Module.LogLevel=Object.freeze({"Error":arguments[i++],"Warning":arguments[i++],"Notice":arguments[i++],"Info":arguments[i++],"Debug":arguments[i++]})}};function mod_exp_js(base_str,modulus_str,exponent_str,out,out_len){let base=BigInt(UTF8ToString(base_str));const modulus=BigInt(UTF8ToString(modulus_str));let exponent=BigInt(UTF8ToString(exponent_str));const int2=BigInt(2);const int1=BigInt(1);let result=BigInt(1);while(exponent){if(exponent%int2===int1){result=result*base%modulus}base=base*base%modulus;exponent=exponent/int2}if(!result){return 0}const hex=result.toString(16);if(hex.length>out_len*2){return 0}out=HEAPU8.subarray(out,out+out_len);let ihex=0;let iout=0;const htoi=i=>i<=57?i-48:i-97+10;if(hex.length&1){out[iout++]=htoi(hex.charCodeAt(ihex++))}for(const endhex=hex.length;ihex<endhex;ihex+=2){out[iout++]=htoi(hex.charCodeAt(ihex))<<4|htoi(hex.charCodeAt(ihex+1))}return iout}function callRuntimeCallbacks(callbacks){while(callbacks.length>0){var callback=callbacks.shift();if(typeof callback=="function"){callback(Module);continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){wasmTable.get(func)()}else{wasmTable.get(func)(callback.arg)}}else{func(callback.arg===undefined?null:callback.arg)}}}function ___cxa_allocate_exception(size){return _malloc(size+16)+16}function ExceptionInfo(excPtr){this.excPtr=excPtr;this.ptr=excPtr-16;this.set_type=function(type){HEAP32[this.ptr+4>>2]=type};this.get_type=function(){return HEAP32[this.ptr+4>>2]};this.set_destructor=function(destructor){HEAP32[this.ptr+8>>2]=destructor};this.get_destructor=function(){return HEAP32[this.ptr+8>>2]};this.set_refcount=function(refcount){HEAP32[this.ptr>>2]=refcount};this.set_caught=function(caught){caught=caught?1:0;HEAP8[this.ptr+12>>0]=caught};this.get_caught=function(){return HEAP8[this.ptr+12>>0]!=0};this.set_rethrown=function(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13>>0]=rethrown};this.get_rethrown=function(){return HEAP8[this.ptr+13>>0]!=0};this.init=function(type,destructor){this.set_type(type);this.set_destructor(destructor);this.set_refcount(0);this.set_caught(false);this.set_rethrown(false)};this.add_ref=function(){var value=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=value+1};this.release_ref=function(){var prev=HEAP32[this.ptr>>2];HEAP32[this.ptr>>2]=prev-1;return prev===1}}var exceptionLast=0;var uncaughtExceptionCount=0;function ___cxa_throw(ptr,type,destructor){var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw ptr}var SYSCALLS={mappings:{},buffers:[null,[],[]],printChar:function(stream,curr){var buffer=SYSCALLS.buffers[stream];if(curr===0||curr===10){(stream===1?out:err)(UTF8ArrayToString(buffer,0));buffer.length=0}else{buffer.push(curr)}},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},get64:function(low,high){return low}};function ___sys_getpid(){return 42}function ___sys_uname(buf){if(!buf)return-21;var layout={"__size__":390,"domainname":325,"machine":260,"nodename":65,"release":130,"sysname":0,"version":195};var copyString=function(element,value){var offset=layout[element];writeAsciiToMemory(value,buf+offset)};copyString("sysname","Emscripten");copyString("nodename","emscripten");copyString("release","1.0");copyString("version","#1");copyString("machine","wasm32");return 0}function __embind_register_bigint(primitiveType,name,size,minRange,maxRange){}function getShiftFromSize(size){switch(size){case 1:return 0;case 2:return 1;case 4:return 2;case 8:return 3;default:throw new TypeError("Unknown type size: "+size)}}function embind_init_charCodes(){var codes=new Array(256);for(var i=0;i<256;++i){codes[i]=String.fromCharCode(i)}embind_charCodes=codes}var embind_charCodes=undefined;function readLatin1String(ptr){var ret="";var c=ptr;while(HEAPU8[c]){ret+=embind_charCodes[HEAPU8[c++]]}return ret}var awaitingDependencies={};var registeredTypes={};var typeDependencies={};var char_0=48;var char_9=57;function makeLegalFunctionName(name){if(undefined===name){return"_unknown"}name=name.replace(/[^a-zA-Z0-9_]/g,"$");var f=name.charCodeAt(0);if(f>=char_0&&f<=char_9){return"_"+name}else{return name}}function createNamedFunction(name,body){name=makeLegalFunctionName(name);return new Function("body","return function "+name+"() {\n"+' "use strict";'+" return body.apply(this, arguments);\n"+"};\n")(body)}function extendError(baseErrorType,errorName){var errorClass=createNamedFunction(errorName,function(message){this.name=errorName;this.message=message;var stack=new Error(message).stack;if(stack!==undefined){this.stack=this.toString()+"\n"+stack.replace(/^Error(:[^\n]*)?\n/,"")}});errorClass.prototype=Object.create(baseErrorType.prototype);errorClass.prototype.constructor=errorClass;errorClass.prototype.toString=function(){if(this.message===undefined){return this.name}else{return this.name+": "+this.message}};return errorClass}var BindingError=undefined;function throwBindingError(message){throw new BindingError(message)}var InternalError=undefined;function throwInternalError(message){throw new InternalError(message)}function whenDependentTypesAreResolved(myTypes,dependentTypes,getTypeConverters){myTypes.forEach(function(type){typeDependencies[type]=dependentTypes});function onComplete(typeConverters){var myTypeConverters=getTypeConverters(typeConverters);if(myTypeConverters.length!==myTypes.length){throwInternalError("Mismatched type converter count")}for(var i=0;i<myTypes.length;++i){registerType(myTypes[i],myTypeConverters[i])}}var typeConverters=new Array(dependentTypes.length);var unregisteredTypes=[];var registered=0;dependentTypes.forEach(function(dt,i){if(registeredTypes.hasOwnProperty(dt)){typeConverters[i]=registeredTypes[dt]}else{unregisteredTypes.push(dt);if(!awaitingDependencies.hasOwnProperty(dt)){awaitingDependencies[dt]=[]}awaitingDependencies[dt].push(function(){typeConverters[i]=registeredTypes[dt];++registered;if(registered===unregisteredTypes.length){onComplete(typeConverters)}})}});if(0===unregisteredTypes.length){onComplete(typeConverters)}}function registerType(rawType,registeredInstance,options){options=options||{};if(!("argPackAdvance"in registeredInstance)){throw new TypeError("registerType registeredInstance requires argPackAdvance")}var name=registeredInstance.name;if(!rawType){throwBindingError('type "'+name+'" must have a positive integer typeid pointer')}if(registeredTypes.hasOwnProperty(rawType)){if(options.ignoreDuplicateRegistrations){return}else{throwBindingError("Cannot register type '"+name+"' twice")}}registeredTypes[rawType]=registeredInstance;delete typeDependencies[rawType];if(awaitingDependencies.hasOwnProperty(rawType)){var callbacks=awaitingDependencies[rawType];delete awaitingDependencies[rawType];callbacks.forEach(function(cb){cb()})}}function __embind_register_bool(rawType,name,size,trueValue,falseValue){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(wt){return!!wt},"toWireType":function(destructors,o){return o?trueValue:falseValue},"argPackAdvance":8,"readValueFromPointer":function(pointer){var heap;if(size===1){heap=HEAP8}else if(size===2){heap=HEAP16}else if(size===4){heap=HEAP32}else{throw new TypeError("Unknown boolean type size: "+name)}return this["fromWireType"](heap[pointer>>shift])},destructorFunction:null})}function ClassHandle_isAliasOf(other){if(!(this instanceof ClassHandle)){return false}if(!(other instanceof ClassHandle)){return false}var leftClass=this.$$.ptrType.registeredClass;var left=this.$$.ptr;var rightClass=other.$$.ptrType.registeredClass;var right=other.$$.ptr;while(leftClass.baseClass){left=leftClass.upcast(left);leftClass=leftClass.baseClass}while(rightClass.baseClass){right=rightClass.upcast(right);rightClass=rightClass.baseClass}return leftClass===rightClass&&left===right}function shallowCopyInternalPointer(o){return{count:o.count,deleteScheduled:o.deleteScheduled,preservePointerOnDelete:o.preservePointerOnDelete,ptr:o.ptr,ptrType:o.ptrType,smartPtr:o.smartPtr,smartPtrType:o.smartPtrType}}function throwInstanceAlreadyDeleted(obj){function getInstanceTypeName(handle){return handle.$$.ptrType.registeredClass.name}throwBindingError(getInstanceTypeName(obj)+" instance already deleted")}var finalizationGroup=false;function detachFinalizer(handle){}function runDestructor($$){if($$.smartPtr){$$.smartPtrType.rawDestructor($$.smartPtr)}else{$$.ptrType.registeredClass.rawDestructor($$.ptr)}}function releaseClassHandle($$){$$.count.value-=1;var toDelete=0===$$.count.value;if(toDelete){runDestructor($$)}}function attachFinalizer(handle){if("undefined"===typeof FinalizationGroup){attachFinalizer=function(handle){return handle};return handle}finalizationGroup=new FinalizationGroup(function(iter){for(var result=iter.next();!result.done;result=iter.next()){var $$=result.value;if(!$$.ptr){console.warn("object already deleted: "+$$.ptr)}else{releaseClassHandle($$)}}});attachFinalizer=function(handle){finalizationGroup.register(handle,handle.$$,handle.$$);return handle};detachFinalizer=function(handle){finalizationGroup.unregister(handle.$$)};return attachFinalizer(handle)}function ClassHandle_clone(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.preservePointerOnDelete){this.$$.count.value+=1;return this}else{var clone=attachFinalizer(Object.create(Object.getPrototypeOf(this),{$$:{value:shallowCopyInternalPointer(this.$$)}}));clone.$$.count.value+=1;clone.$$.deleteScheduled=false;return clone}}function ClassHandle_delete(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}detachFinalizer(this);releaseClassHandle(this.$$);if(!this.$$.preservePointerOnDelete){this.$$.smartPtr=undefined;this.$$.ptr=undefined}}function ClassHandle_isDeleted(){return!this.$$.ptr}var delayFunction=undefined;var deletionQueue=[];function flushPendingDeletes(){while(deletionQueue.length){var obj=deletionQueue.pop();obj.$$.deleteScheduled=false;obj["delete"]()}}function ClassHandle_deleteLater(){if(!this.$$.ptr){throwInstanceAlreadyDeleted(this)}if(this.$$.deleteScheduled&&!this.$$.preservePointerOnDelete){throwBindingError("Object already scheduled for deletion")}deletionQueue.push(this);if(deletionQueue.length===1&&delayFunction){delayFunction(flushPendingDeletes)}this.$$.deleteScheduled=true;return this}function init_ClassHandle(){ClassHandle.prototype["isAliasOf"]=ClassHandle_isAliasOf;ClassHandle.prototype["clone"]=ClassHandle_clone;ClassHandle.prototype["delete"]=ClassHandle_delete;ClassHandle.prototype["isDeleted"]=ClassHandle_isDeleted;ClassHandle.prototype["deleteLater"]=ClassHandle_deleteLater}function ClassHandle(){}var registeredPointers={};function ensureOverloadTable(proto,methodName,humanName){if(undefined===proto[methodName].overloadTable){var prevFunc=proto[methodName];proto[methodName]=function(){if(!proto[methodName].overloadTable.hasOwnProperty(arguments.length)){throwBindingError("Function '"+humanName+"' called with an invalid number of arguments ("+arguments.length+") - expects one of ("+proto[methodName].overloadTable+")!")}return proto[methodName].overloadTable[arguments.length].apply(this,arguments)};proto[methodName].overloadTable=[];proto[methodName].overloadTable[prevFunc.argCount]=prevFunc}}function exposePublicSymbol(name,value,numArguments){if(Module.hasOwnProperty(name)){if(undefined===numArguments||undefined!==Module[name].overloadTable&&undefined!==Module[name].overloadTable[numArguments]){throwBindingError("Cannot register public name '"+name+"' twice")}ensureOverloadTable(Module,name,name);if(Module.hasOwnProperty(numArguments)){throwBindingError("Cannot register multiple overloads of a function with the same number of arguments ("+numArguments+")!")}Module[name].overloadTable[numArguments]=value}else{Module[name]=value;if(undefined!==numArguments){Module[name].numArguments=numArguments}}}function RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast){this.name=name;this.constructor=constructor;this.instancePrototype=instancePrototype;this.rawDestructor=rawDestructor;this.baseClass=baseClass;this.getActualType=getActualType;this.upcast=upcast;this.downcast=downcast;this.pureVirtualFunctions=[]}function upcastPointer(ptr,ptrClass,desiredClass){while(ptrClass!==desiredClass){if(!ptrClass.upcast){throwBindingError("Expected null or instance of "+desiredClass.name+", got an instance of "+ptrClass.name)}ptr=ptrClass.upcast(ptr);ptrClass=ptrClass.baseClass}return ptr}function constNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function genericPointerToWireType(destructors,handle){var ptr;if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}if(this.isSmartPointer){ptr=this.rawConstructor();if(destructors!==null){destructors.push(this.rawDestructor,ptr)}return ptr}else{return 0}}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(!this.isConst&&handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);if(this.isSmartPointer){if(undefined===handle.$$.smartPtr){throwBindingError("Passing raw pointer to smart pointer is illegal")}switch(this.sharingPolicy){case 0:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{throwBindingError("Cannot convert argument of type "+(handle.$$.smartPtrType?handle.$$.smartPtrType.name:handle.$$.ptrType.name)+" to parameter type "+this.name)}break;case 1:ptr=handle.$$.smartPtr;break;case 2:if(handle.$$.smartPtrType===this){ptr=handle.$$.smartPtr}else{var clonedHandle=handle["clone"]();ptr=this.rawShare(ptr,__emval_register(function(){clonedHandle["delete"]()}));if(destructors!==null){destructors.push(this.rawDestructor,ptr)}}break;default:throwBindingError("Unsupporting sharing policy")}}return ptr}function nonConstNoSmartPtrRawPointerToWireType(destructors,handle){if(handle===null){if(this.isReference){throwBindingError("null is not a valid "+this.name)}return 0}if(!handle.$$){throwBindingError('Cannot pass "'+_embind_repr(handle)+'" as a '+this.name)}if(!handle.$$.ptr){throwBindingError("Cannot pass deleted object as a pointer of type "+this.name)}if(handle.$$.ptrType.isConst){throwBindingError("Cannot convert argument of type "+handle.$$.ptrType.name+" to parameter type "+this.name)}var handleClass=handle.$$.ptrType.registeredClass;var ptr=upcastPointer(handle.$$.ptr,handleClass,this.registeredClass);return ptr}function simpleReadValueFromPointer(pointer){return this["fromWireType"](HEAPU32[pointer>>2])}function RegisteredPointer_getPointee(ptr){if(this.rawGetPointee){ptr=this.rawGetPointee(ptr)}return ptr}function RegisteredPointer_destructor(ptr){if(this.rawDestructor){this.rawDestructor(ptr)}}function RegisteredPointer_deleteObject(handle){if(handle!==null){handle["delete"]()}}function downcastPointer(ptr,ptrClass,desiredClass){if(ptrClass===desiredClass){return ptr}if(undefined===desiredClass.baseClass){return null}var rv=downcastPointer(ptr,ptrClass,desiredClass.baseClass);if(rv===null){return null}return desiredClass.downcast(rv)}function getInheritedInstanceCount(){return Object.keys(registeredInstances).length}function getLiveInheritedInstances(){var rv=[];for(var k in registeredInstances){if(registeredInstances.hasOwnProperty(k)){rv.push(registeredInstances[k])}}return rv}function setDelayFunction(fn){delayFunction=fn;if(deletionQueue.length&&delayFunction){delayFunction(flushPendingDeletes)}}function init_embind(){Module["getInheritedInstanceCount"]=getInheritedInstanceCount;Module["getLiveInheritedInstances"]=getLiveInheritedInstances;Module["flushPendingDeletes"]=flushPendingDeletes;Module["setDelayFunction"]=setDelayFunction}var registeredInstances={};function getBasestPointer(class_,ptr){if(ptr===undefined){throwBindingError("ptr should not be undefined")}while(class_.baseClass){ptr=class_.upcast(ptr);class_=class_.baseClass}return ptr}function getInheritedInstance(class_,ptr){ptr=getBasestPointer(class_,ptr);return registeredInstances[ptr]}function makeClassHandle(prototype,record){if(!record.ptrType||!record.ptr){throwInternalError("makeClassHandle requires ptr and ptrType")}var hasSmartPtrType=!!record.smartPtrType;var hasSmartPtr=!!record.smartPtr;if(hasSmartPtrType!==hasSmartPtr){throwInternalError("Both smartPtrType and smartPtr must be specified")}record.count={value:1};return attachFinalizer(Object.create(prototype,{$$:{value:record}}))}function RegisteredPointer_fromWireType(ptr){var rawPointer=this.getPointee(ptr);if(!rawPointer){this.destructor(ptr);return null}var registeredInstance=getInheritedInstance(this.registeredClass,rawPointer);if(undefined!==registeredInstance){if(0===registeredInstance.$$.count.value){registeredInstance.$$.ptr=rawPointer;registeredInstance.$$.smartPtr=ptr;return registeredInstance["clone"]()}else{var rv=registeredInstance["clone"]();this.destructor(ptr);return rv}}function makeDefaultHandle(){if(this.isSmartPointer){return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this.pointeeType,ptr:rawPointer,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(this.registeredClass.instancePrototype,{ptrType:this,ptr:ptr})}}var actualType=this.registeredClass.getActualType(rawPointer);var registeredPointerRecord=registeredPointers[actualType];if(!registeredPointerRecord){return makeDefaultHandle.call(this)}var toType;if(this.isConst){toType=registeredPointerRecord.constPointerType}else{toType=registeredPointerRecord.pointerType}var dp=downcastPointer(rawPointer,this.registeredClass,toType.registeredClass);if(dp===null){return makeDefaultHandle.call(this)}if(this.isSmartPointer){return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp,smartPtrType:this,smartPtr:ptr})}else{return makeClassHandle(toType.registeredClass.instancePrototype,{ptrType:toType,ptr:dp})}}function init_RegisteredPointer(){RegisteredPointer.prototype.getPointee=RegisteredPointer_getPointee;RegisteredPointer.prototype.destructor=RegisteredPointer_destructor;RegisteredPointer.prototype["argPackAdvance"]=8;RegisteredPointer.prototype["readValueFromPointer"]=simpleReadValueFromPointer;RegisteredPointer.prototype["deleteObject"]=RegisteredPointer_deleteObject;RegisteredPointer.prototype["fromWireType"]=RegisteredPointer_fromWireType}function RegisteredPointer(name,registeredClass,isReference,isConst,isSmartPointer,pointeeType,sharingPolicy,rawGetPointee,rawConstructor,rawShare,rawDestructor){this.name=name;this.registeredClass=registeredClass;this.isReference=isReference;this.isConst=isConst;this.isSmartPointer=isSmartPointer;this.pointeeType=pointeeType;this.sharingPolicy=sharingPolicy;this.rawGetPointee=rawGetPointee;this.rawConstructor=rawConstructor;this.rawShare=rawShare;this.rawDestructor=rawDestructor;if(!isSmartPointer&&registeredClass.baseClass===undefined){if(isConst){this["toWireType"]=constNoSmartPtrRawPointerToWireType;this.destructorFunction=null}else{this["toWireType"]=nonConstNoSmartPtrRawPointerToWireType;this.destructorFunction=null}}else{this["toWireType"]=genericPointerToWireType}}function replacePublicSymbol(name,value,numArguments){if(!Module.hasOwnProperty(name)){throwInternalError("Replacing nonexistant public symbol")}if(undefined!==Module[name].overloadTable&&undefined!==numArguments){Module[name].overloadTable[numArguments]=value}else{Module[name]=value;Module[name].argCount=numArguments}}function dynCallLegacy(sig,ptr,args){var f=Module["dynCall_"+sig];return args&&args.length?f.apply(null,[ptr].concat(args)):f.call(null,ptr)}function dynCall(sig,ptr,args){if(sig.includes("j")){return dynCallLegacy(sig,ptr,args)}return wasmTable.get(ptr).apply(null,args)}function getDynCaller(sig,ptr){var argCache=[];return function(){argCache.length=arguments.length;for(var i=0;i<arguments.length;i++){argCache[i]=arguments[i]}return dynCall(sig,ptr,argCache)}}function embind__requireFunction(signature,rawFunction){signature=readLatin1String(signature);function makeDynCaller(){if(signature.includes("j")){return getDynCaller(signature,rawFunction)}return wasmTable.get(rawFunction)}var fp=makeDynCaller();if(typeof fp!=="function"){throwBindingError("unknown function pointer with signature "+signature+": "+rawFunction)}return fp}var UnboundTypeError=undefined;function getTypeName(type){var ptr=___getTypeName(type);var rv=readLatin1String(ptr);_free(ptr);return rv}function throwUnboundTypeError(message,types){var unboundTypes=[];var seen={};function visit(type){if(seen[type]){return}if(registeredTypes[type]){return}if(typeDependencies[type]){typeDependencies[type].forEach(visit);return}unboundTypes.push(type);seen[type]=true}types.forEach(visit);throw new UnboundTypeError(message+": "+unboundTypes.map(getTypeName).join([", "]))}function __embind_register_class(rawType,rawPointerType,rawConstPointerType,baseClassRawType,getActualTypeSignature,getActualType,upcastSignature,upcast,downcastSignature,downcast,name,destructorSignature,rawDestructor){name=readLatin1String(name);getActualType=embind__requireFunction(getActualTypeSignature,getActualType);if(upcast){upcast=embind__requireFunction(upcastSignature,upcast)}if(downcast){downcast=embind__requireFunction(downcastSignature,downcast)}rawDestructor=embind__requireFunction(destructorSignature,rawDestructor);var legalFunctionName=makeLegalFunctionName(name);exposePublicSymbol(legalFunctionName,function(){throwUnboundTypeError("Cannot construct "+name+" due to unbound types",[baseClassRawType])});whenDependentTypesAreResolved([rawType,rawPointerType,rawConstPointerType],baseClassRawType?[baseClassRawType]:[],function(base){base=base[0];var baseClass;var basePrototype;if(baseClassRawType){baseClass=base.registeredClass;basePrototype=baseClass.instancePrototype}else{basePrototype=ClassHandle.prototype}var constructor=createNamedFunction(legalFunctionName,function(){if(Object.getPrototypeOf(this)!==instancePrototype){throw new BindingError("Use 'new' to construct "+name)}if(undefined===registeredClass.constructor_body){throw new BindingError(name+" has no accessible constructor")}var body=registeredClass.constructor_body[arguments.length];if(undefined===body){throw new BindingError("Tried to invoke ctor of "+name+" with invalid number of parameters ("+arguments.length+") - expected ("+Object.keys(registeredClass.constructor_body).toString()+") parameters instead!")}return body.apply(this,arguments)});var instancePrototype=Object.create(basePrototype,{constructor:{value:constructor}});constructor.prototype=instancePrototype;var registeredClass=new RegisteredClass(name,constructor,instancePrototype,rawDestructor,baseClass,getActualType,upcast,downcast);var referenceConverter=new RegisteredPointer(name,registeredClass,true,false,false);var pointerConverter=new RegisteredPointer(name+"*",registeredClass,false,false,false);var constPointerConverter=new RegisteredPointer(name+" const*",registeredClass,false,true,false);registeredPointers[rawType]={pointerType:pointerConverter,constPointerType:constPointerConverter};replacePublicSymbol(legalFunctionName,constructor);return[referenceConverter,pointerConverter,constPointerConverter]})}function heap32VectorToArray(count,firstElement){var array=[];for(var i=0;i<count;i++){array.push(HEAP32[(firstElement>>2)+i])}return array}function runDestructors(destructors){while(destructors.length){var ptr=destructors.pop();var del=destructors.pop();del(ptr)}}function __embind_register_class_constructor(rawClassType,argCount,rawArgTypesAddr,invokerSignature,invoker,rawConstructor){assert(argCount>0);var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);invoker=embind__requireFunction(invokerSignature,invoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName="constructor "+classType.name;if(undefined===classType.registeredClass.constructor_body){classType.registeredClass.constructor_body=[]}if(undefined!==classType.registeredClass.constructor_body[argCount-1]){throw new BindingError("Cannot register multiple constructors with identical number of parameters ("+(argCount-1)+") for class '"+classType.name+"'! Overload resolution is currently only performed using the parameter count, not actual type info!")}classType.registeredClass.constructor_body[argCount-1]=function unboundTypeHandler(){throwUnboundTypeError("Cannot construct "+classType.name+" due to unbound types",rawArgTypes)};whenDependentTypesAreResolved([],rawArgTypes,function(argTypes){argTypes.splice(1,0,null);classType.registeredClass.constructor_body[argCount-1]=craftInvokerFunction(humanName,argTypes,null,invoker,rawConstructor);return[]});return[]})}function new_(constructor,argumentList){if(!(constructor instanceof Function)){throw new TypeError("new_ called with constructor type "+typeof constructor+" which is not a function")}var dummy=createNamedFunction(constructor.name||"unknownFunctionName",function(){});dummy.prototype=constructor.prototype;var obj=new dummy;var r=constructor.apply(obj,argumentList);return r instanceof Object?r:obj}function craftInvokerFunction(humanName,argTypes,classType,cppInvokerFunc,cppTargetFunc){var argCount=argTypes.length;if(argCount<2){throwBindingError("argTypes array size mismatch! Must at least get return value and 'this' types!")}var isClassMethodFunc=argTypes[1]!==null&&classType!==null;var needsDestructorStack=false;for(var i=1;i<argTypes.length;++i){if(argTypes[i]!==null&&argTypes[i].destructorFunction===undefined){needsDestructorStack=true;break}}var returns=argTypes[0].name!=="void";var argsList="";var argsListWired="";for(var i=0;i<argCount-2;++i){argsList+=(i!==0?", ":"")+"arg"+i;argsListWired+=(i!==0?", ":"")+"arg"+i+"Wired"}var invokerFnBody="return function "+makeLegalFunctionName(humanName)+"("+argsList+") {\n"+"if (arguments.length !== "+(argCount-2)+") {\n"+"throwBindingError('function "+humanName+" called with ' + arguments.length + ' arguments, expected "+(argCount-2)+" args!');\n"+"}\n";if(needsDestructorStack){invokerFnBody+="var destructors = [];\n"}var dtorStack=needsDestructorStack?"destructors":"null";var args1=["throwBindingError","invoker","fn","runDestructors","retType","classParam"];var args2=[throwBindingError,cppInvokerFunc,cppTargetFunc,runDestructors,argTypes[0],argTypes[1]];if(isClassMethodFunc){invokerFnBody+="var thisWired = classParam.toWireType("+dtorStack+", this);\n"}for(var i=0;i<argCount-2;++i){invokerFnBody+="var arg"+i+"Wired = argType"+i+".toWireType("+dtorStack+", arg"+i+"); // "+argTypes[i+2].name+"\n";args1.push("argType"+i);args2.push(argTypes[i+2])}if(isClassMethodFunc){argsListWired="thisWired"+(argsListWired.length>0?", ":"")+argsListWired}invokerFnBody+=(returns?"var rv = ":"")+"invoker(fn"+(argsListWired.length>0?", ":"")+argsListWired+");\n";if(needsDestructorStack){invokerFnBody+="runDestructors(destructors);\n"}else{for(var i=isClassMethodFunc?1:2;i<argTypes.length;++i){var paramName=i===1?"thisWired":"arg"+(i-2)+"Wired";if(argTypes[i].destructorFunction!==null){invokerFnBody+=paramName+"_dtor("+paramName+"); // "+argTypes[i].name+"\n";args1.push(paramName+"_dtor");args2.push(argTypes[i].destructorFunction)}}}if(returns){invokerFnBody+="var ret = retType.fromWireType(rv);\n"+"return ret;\n"}else{}invokerFnBody+="}\n";args1.push(invokerFnBody);var invokerFunction=new_(Function,args1).apply(null,args2);return invokerFunction}function __embind_register_class_function(rawClassType,methodName,argCount,rawArgTypesAddr,invokerSignature,rawInvoker,context,isPureVirtual){var rawArgTypes=heap32VectorToArray(argCount,rawArgTypesAddr);methodName=readLatin1String(methodName);rawInvoker=embind__requireFunction(invokerSignature,rawInvoker);whenDependentTypesAreResolved([],[rawClassType],function(classType){classType=classType[0];var humanName=classType.name+"."+methodName;if(methodName.startsWith("@@")){methodName=Symbol[methodName.substring(2)]}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[]})}var emval_free_list=[];var emval_handle_array=[{},{value:undefined},{value:null},{value:true},{value:false}];function __emval_decref(handle){if(handle>4&&0===--emval_handle_array[handle].refcount){emval_handle_array[handle]=undefined;emval_free_list.push(handle)}}function count_emval_handles(){var count=0;for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){++count}}return count}function get_first_emval(){for(var i=5;i<emval_handle_array.length;++i){if(emval_handle_array[i]!==undefined){return emval_handle_array[i]}}return null}function init_emval(){Module["count_emval_handles"]=count_emval_handles;Module["get_first_emval"]=get_first_emval}function __emval_register(value){switch(value){case undefined:{return 1}case null:{return 2}case true:{return 3}case false:{return 4}default:{var handle=emval_free_list.length?emval_free_list.pop():emval_handle_array.length;emval_handle_array[handle]={refcount:1,value:value};return handle}}}function __embind_register_emval(rawType,name){name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(handle){var rv=emval_handle_array[handle].value;__emval_decref(handle);return rv},"toWireType":function(destructors,value){return __emval_register(value)},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:null})}function _embind_repr(v){if(v===null){return"null"}var t=typeof v;if(t==="object"||t==="array"||t==="function"){return v.toString()}else{return""+v}}function floatReadValueFromPointer(name,shift){switch(shift){case 2:return function(pointer){return this["fromWireType"](HEAPF32[pointer>>2])};case 3:return function(pointer){return this["fromWireType"](HEAPF64[pointer>>3])};default:throw new TypeError("Unknown float type: "+name)}}function __embind_register_float(rawType,name,size){var shift=getShiftFromSize(size);name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":function(value){return value},"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}return value},"argPackAdvance":8,"readValueFromPointer":floatReadValueFromPointer(name,shift),destructorFunction:null})}function __embind_register_function(name,argCount,rawArgTypesAddr,signature,rawInvoker,fn){var argTypes=heap32VectorToArray(argCount,rawArgTypesAddr);name=readLatin1String(name);rawInvoker=embind__requireFunction(signature,rawInvoker);exposePublicSymbol(name,function(){throwUnboundTypeError("Cannot call "+name+" due to unbound types",argTypes)},argCount-1);whenDependentTypesAreResolved([],argTypes,function(argTypes){var invokerArgsArray=[argTypes[0],null].concat(argTypes.slice(1));replacePublicSymbol(name,craftInvokerFunction(name,invokerArgsArray,null,rawInvoker,fn),argCount-1);return[]})}function integerReadValueFromPointer(name,shift,signed){switch(shift){case 0:return signed?function readS8FromPointer(pointer){return HEAP8[pointer]}:function readU8FromPointer(pointer){return HEAPU8[pointer]};case 1:return signed?function readS16FromPointer(pointer){return HEAP16[pointer>>1]}:function readU16FromPointer(pointer){return HEAPU16[pointer>>1]};case 2:return signed?function readS32FromPointer(pointer){return HEAP32[pointer>>2]}:function readU32FromPointer(pointer){return HEAPU32[pointer>>2]};default:throw new TypeError("Unknown integer type: "+name)}}function __embind_register_integer(primitiveType,name,size,minRange,maxRange){name=readLatin1String(name);if(maxRange===-1){maxRange=4294967295}var shift=getShiftFromSize(size);var fromWireType=function(value){return value};if(minRange===0){var bitshift=32-8*size;fromWireType=function(value){return value<<bitshift>>>bitshift}}var isUnsignedType=name.includes("unsigned");registerType(primitiveType,{name:name,"fromWireType":fromWireType,"toWireType":function(destructors,value){if(typeof value!=="number"&&typeof value!=="boolean"){throw new TypeError('Cannot convert "'+_embind_repr(value)+'" to '+this.name)}if(value<minRange||value>maxRange){throw new TypeError('Passing a number "'+_embind_repr(value)+'" from JS side to C/C++ side to an argument of type "'+name+'", which is outside the valid range ['+minRange+", "+maxRange+"]!")}return isUnsignedType?value>>>0:value|0},"argPackAdvance":8,"readValueFromPointer":integerReadValueFromPointer(name,shift,minRange!==0),destructorFunction:null})}function __embind_register_memory_view(rawType,dataTypeIndex,name){var typeMapping=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array];var TA=typeMapping[dataTypeIndex];function decodeMemoryView(handle){handle=handle>>2;var heap=HEAPU32;var size=heap[handle];var data=heap[handle+1];return new TA(buffer,data,size)}name=readLatin1String(name);registerType(rawType,{name:name,"fromWireType":decodeMemoryView,"argPackAdvance":8,"readValueFromPointer":decodeMemoryView},{ignoreDuplicateRegistrations:true})}function __embind_register_std_string(rawType,name){name=readLatin1String(name);var stdStringIsUTF8=name==="std::string";registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var str;if(stdStringIsUTF8){var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i;if(i==length||HEAPU8[currentBytePtr]==0){var maxRead=currentBytePtr-decodeStartPtr;var stringSegment=UTF8ToString(decodeStartPtr,maxRead);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+1}}}else{var a=new Array(length);for(var i=0;i<length;++i){a[i]=String.fromCharCode(HEAPU8[value+4+i])}str=a.join("")}_free(value);return str},"toWireType":function(destructors,value){if(value instanceof ArrayBuffer){value=new Uint8Array(value)}var getLength;var valueIsOfTypeString=typeof value==="string";if(!(valueIsOfTypeString||value instanceof Uint8Array||value instanceof Uint8ClampedArray||value instanceof Int8Array)){throwBindingError("Cannot pass non-string to std::string")}if(stdStringIsUTF8&&valueIsOfTypeString){getLength=function(){return lengthBytesUTF8(value)}}else{getLength=function(){return value.length}}var length=getLength();var ptr=_malloc(4+length+1);HEAPU32[ptr>>2]=length;if(stdStringIsUTF8&&valueIsOfTypeString){stringToUTF8(value,ptr+4,length+1)}else{if(valueIsOfTypeString){for(var i=0;i<length;++i){var charCode=value.charCodeAt(i);if(charCode>255){_free(ptr);throwBindingError("String has UTF-16 code units that do not fit in 8 bits")}HEAPU8[ptr+4+i]=charCode}}else{for(var i=0;i<length;++i){HEAPU8[ptr+4+i]=value[i]}}}if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_std_wstring(rawType,charSize,name){name=readLatin1String(name);var decodeString,encodeString,getHeap,lengthBytesUTF,shift;if(charSize===2){decodeString=UTF16ToString;encodeString=stringToUTF16;lengthBytesUTF=lengthBytesUTF16;getHeap=function(){return HEAPU16};shift=1}else if(charSize===4){decodeString=UTF32ToString;encodeString=stringToUTF32;lengthBytesUTF=lengthBytesUTF32;getHeap=function(){return HEAPU32};shift=2}registerType(rawType,{name:name,"fromWireType":function(value){var length=HEAPU32[value>>2];var HEAP=getHeap();var str;var decodeStartPtr=value+4;for(var i=0;i<=length;++i){var currentBytePtr=value+4+i*charSize;if(i==length||HEAP[currentBytePtr>>shift]==0){var maxReadBytes=currentBytePtr-decodeStartPtr;var stringSegment=decodeString(decodeStartPtr,maxReadBytes);if(str===undefined){str=stringSegment}else{str+=String.fromCharCode(0);str+=stringSegment}decodeStartPtr=currentBytePtr+charSize}}_free(value);return str},"toWireType":function(destructors,value){if(!(typeof value==="string")){throwBindingError("Cannot pass non-string to C++ string type "+name)}var length=lengthBytesUTF(value);var ptr=_malloc(4+length+charSize);HEAPU32[ptr>>2]=length>>shift;encodeString(value,ptr+4,length+charSize);if(destructors!==null){destructors.push(_free,ptr)}return ptr},"argPackAdvance":8,"readValueFromPointer":simpleReadValueFromPointer,destructorFunction:function(ptr){_free(ptr)}})}function __embind_register_void(rawType,name){name=readLatin1String(name);registerType(rawType,{isVoid:true,name:name,"argPackAdvance":0,"fromWireType":function(){return undefined},"toWireType":function(destructors,o){return undefined}})}function requireHandle(handle){if(!handle){throwBindingError("Cannot use deleted val. handle = "+handle)}return emval_handle_array[handle].value}function requireRegisteredType(rawType,humanName){var impl=registeredTypes[rawType];if(undefined===impl){throwBindingError(humanName+" has unknown type "+getTypeName(rawType))}return impl}function __emval_as(handle,returnType,destructorsRef){handle=requireHandle(handle);returnType=requireRegisteredType(returnType,"emval::as");var destructors=[];var rd=__emval_register(destructors);HEAP32[destructorsRef>>2]=rd;return returnType["toWireType"](destructors,handle)}function __emval_lookupTypes(argCount,argTypes){var a=new Array(argCount);for(var i=0;i<argCount;++i){a[i]=requireRegisteredType(HEAP32[(argTypes>>2)+i],"parameter "+i)}return a}function __emval_call(handle,argCount,argTypes,argv){handle=requireHandle(handle);var types=__emval_lookupTypes(argCount,argTypes);var args=new Array(argCount);for(var i=0;i<argCount;++i){var type=types[i];args[i]=type["readValueFromPointer"](argv);argv+=type["argPackAdvance"]}var rv=handle.apply(undefined,args);return __emval_register(rv)}function __emval_allocateDestructors(destructorsRef){var destructors=[];HEAP32[destructorsRef>>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;i<argCount-1;++i){argsList+=(i!==0?", ":"")+"arg"+i;params.push("argType"+i);args.push(types[1+i])}var functionName=makeLegalFunctionName("methodCaller_"+signatureName);var functionBody="return function "+functionName+"(handle, name, destructors, args) {\n";var offset=0;for(var i=0;i<argCount-1;++i){functionBody+=" var arg"+i+" = argType"+i+".readValueFromPointer(args"+(offset?"+"+offset:"")+");\n";offset+=types[i+1]["argPackAdvance"]}functionBody+=" var rv = handle[name]("+argsList+");\n";for(var i=0;i<argCount-1;++i){if(types[i+1]["deleteObject"]){functionBody+=" argType"+i+".deleteObject(arg"+i+");\n"}}if(!retType.isVoid){functionBody+=" return retType.toWireType(destructors, rv);\n"}functionBody+="};\n";params.push(functionBody);var invokerFunction=new_(Function,params).apply(null,args);return __emval_addMethodCaller(invokerFunction)}function __emval_get_property(handle,key){handle=requireHandle(handle);key=requireHandle(key);return __emval_register(handle[key])}function __emval_incref(handle){if(handle>4){emval_handle_array[handle].refcount+=1}}function __emval_new_cstring(v){return __emval_register(getStringOrSymbol(v))}function __emval_not(object){object=requireHandle(object);return!object}function __emval_run_destructors(handle){var destructors=emval_handle_array[handle].value;runDestructors(destructors);__emval_decref(handle)}function __emval_take_value(type,argv){type=requireRegisteredType(type,"_emval_take_value");var v=type["readValueFromPointer"](argv);return __emval_register(v)}var readAsmConstArgsArray=[];function readAsmConstArgs(sigPtr,buf){readAsmConstArgsArray.length=0;var ch;buf>>=2;while(ch=HEAPU8[sigPtr++]){var double=ch<105;if(double&&buf&1)buf++;readAsmConstArgsArray.push(double?HEAPF64[buf++>>1]:HEAP32[buf]);++buf}return readAsmConstArgsArray}function _emscripten_asm_const_int(code,sigPtr,argbuf){var args=readAsmConstArgs(sigPtr,argbuf);return ASM_CONSTS[code].apply(null,args)}function _emscripten_memcpy_big(dest,src,num){HEAPU8.copyWithin(dest,src,src+num)}function _emscripten_resize_heap(requestedSize){var oldSize=HEAPU8.length;requestedSize=requestedSize>>>0;return false}embind_init_charCodes();BindingError=Module["BindingError"]=extendError(Error,"BindingError");InternalError=Module["InternalError"]=extendError(Error,"InternalError");init_ClassHandle();init_RegisteredPointer();init_embind();UnboundTypeError=Module["UnboundTypeError"]=extendError(Error,"UnboundTypeError");init_emval();var asmLibraryArg={"c":___cxa_allocate_exception,"i":___cxa_throw,"a":___sys_getpid,"A":___sys_uname,"y":__embind_register_bigint,"C":__embind_register_bool,"v":__embind_register_class,"r":__embind_register_class_constructor,"l":__embind_register_class_function,"B":__embind_register_emval,"w":__embind_register_float,"u":__embind_register_function,"p":__embind_register_integer,"o":__embind_register_memory_view,"x":__embind_register_std_string,"t":__embind_register_std_wstring,"D":__embind_register_void,"k":__emval_as,"F":__emval_call,"G":__emval_call_method,"h":__emval_call_void_method,"b":__emval_decref,"H":__emval_get_global,"g":__emval_get_method_caller,"f":__emval_get_property,"m":__emval_incref,"e":__emval_new_cstring,"d":__emval_not,"j":__emval_run_destructors,"n":__emval_take_value,"q":_emscripten_asm_const_int,"z":_emscripten_memcpy_big,"s":_emscripten_resize_heap,"E":mod_exp_js};var asm=createWasm();var ___wasm_call_ctors=Module["___wasm_call_ctors"]=function(){return(___wasm_call_ctors=Module["___wasm_call_ctors"]=Module["asm"]["J"]).apply(null,arguments)};var ___getTypeName=Module["___getTypeName"]=function(){return(___getTypeName=Module["___getTypeName"]=Module["asm"]["K"]).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"]["L"]).apply(null,arguments)};var _malloc=Module["_malloc"]=function(){return(_malloc=Module["_malloc"]=Module["asm"]["M"]).apply(null,arguments)};var _free=Module["_free"]=function(){return(_free=Module["_free"]=Module["asm"]["N"]).apply(null,arguments)};var dynCall_vijii=Module["dynCall_vijii"]=function(){return(dynCall_vijii=Module["dynCall_vijii"]=Module["asm"]["P"]).apply(null,arguments)};var dynCall_vijiii=Module["dynCall_vijiii"]=function(){return(dynCall_vijiii=Module["dynCall_vijiii"]=Module["asm"]["Q"]).apply(null,arguments)};Module["stringToUTF16"]=stringToUTF16;var calledRun;function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function run(args){args=args||arguments_;if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(function(){setTimeout(function(){Module["setStatus"]("")},1);doRun()},1)}else{doRun()}}Module["run"]=run;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}run();
return WallixModule.ready
}
);
})();
if (typeof exports === 'object' && typeof module === 'object')
module.exports = WallixModule;
else if (typeof define === 'function' && define['amd'])
define([], function() { return WallixModule; });
else if (typeof exports === 'object')
exports["WallixModule"] = WallixModule;
"use strict";
const rgbToCss = function(color) {
return '#'+color.toString(16).padStart(6, '0');
};
// const has_intersection = (x1,y1,w1,h1,x2,y2,w2,h2) =>
// ((x2 >= x1 && x2 < x1 + w1) || (x1 >= x2 && x1 < x2 + w2))
// && ((y2 >= y1 && y2 < y1 + h1) || (y1 >= y2 && y1 < y2 + h2));
const newRdpPointer = function(canvasElement, module) {
const _ecusorCanvas = (function(){
try {
return new OffsreenCanvas(0,0);
}
catch (e) {
return document.createElement('canvas');
}
})();
const _cusorCanvas = _ecusorCanvas.getContext('2d');
const _u8buffer = module.HEAPU8.buffer;
const _cachePointers = [];
_ecusorCanvas.imageSmoothingEnabled = false;
const _image2CSS = function(idata, w, h, x, y) {
const array = new Uint8ClampedArray(_u8buffer, idata, w * h * 4);
const image = new ImageData(array, w, h);
_ecusorCanvas.width = w;
_ecusorCanvas.height = h;
_cusorCanvas.putImageData(image, 0, 0);
const dataURL = _ecusorCanvas.toDataURL();
// console.log('url(' + dataURL + ') ' + x + ' ' + y + ', auto');
return 'url(' + dataURL + ') ' + x + ' ' + y + ', auto';
};
return {
// @{
// implementation for hack
_cusorCanvas: _cusorCanvas,
_cusorElement: _ecusorCanvas,
_cachePointers: _cachePointers,
// @}
newPointer: function(idata, w, h, offset, x, y) {
const data = _image2CSS(idata, w, h, x, y);
_cachePointers[offset] = data;
canvasElement.style.cursor = data;
},
cachedPointer: function(offset) {
canvasElement.style.cursor = _cachePointers[offset];
},
};
};
const createBuffer = function(bufferLength, module) {
let bufferPtr = module._malloc(bufferLength);
return {
delete: function() { module._free(bufferPtr); },
getBufferPtr: function() { return bufferPtr; },
reserve: function(n) {
if (n > bufferLength) {
module._free(bufferPtr);
bufferLength = n;
bufferPtr = module._malloc(n);
}
return bufferPtr;
},
};
};
const newRdpCanvas = function(canvasElement, module, ropError) {
const _ctx2d = canvasElement.getContext('2d', {alpha: false});
if (!_ctx2d) {
return ;
}
let _width = canvasElement.width;
let _height = canvasElement.height;
const _u8buffer = module.HEAPU8.buffer;
const _imgBuffer = createBuffer(64*64*4, module);
let _imgBufferIndex = _imgBuffer.getBufferPtr();
const _cacheImages = [];
_ctx2d.imageSmoothingEnabled = false;
const unsupportedRop = ropError;
const _transformImage2 = function(dstImg, srcImg, sx, sy, x, y, f) {
const destU32a = new Uint32Array(dstImg.data.buffer);
const srcU32a = new Uint32Array(srcImg.data.buffer);
const w = dstImg.width;
const len = w * dstImg.height;
const srcInc = srcImg.width - w;
let isrc = sy * srcImg.width + sx;
for (let idst = 0; idst < len;) {
for (let ie = idst + w; idst < ie; ++idst, ++isrc) {
destU32a[idst] = f(srcU32a[isrc] & 0xffffff, destU32a[idst] & 0xffffff)
| 0xff000000;
}
isrc += srcInc;
}
_ctx2d.putImageData(dstImg, x, y);
};
const _transformDstImage = function(img, sx, sy, dx, dy, dw, dh, f) {
const dstImg = _ctx2d.getImageData(dx, dy, dw, dh);
_transformImage2(dstImg, img, sx, sy, dx, dy, f);
};
const _copyImage = function(img, sx, sy, dw, dh) {
const w = img.width;
const h = img.height;
const u32av = new Uint32Array(img.data.buffer);
const data = new Uint32Array(dh*dw);
if (0 === sx && w === dw) {
data.set(u32av.subarray(sy*dw, dh*dw));
}
else {
let i = sy*w + sx;
const ie = i + dh*w;
for (; i < ie; ++i, i+=w) {
data.set(u8av.slice(i, i+dw));
}
}
return new ImageData(new Uint8ClampedArray(data.buffer), dw, dh);
};
const _transformPixels2 = function(sx, sy, dx, dy, dw, dh, f) {
const dstImg = _ctx2d.getImageData(dx, dy, w, h);
const srcImg = _ctx2d.getImageData(sx, sy, w, h);
_transformImage2(dstImg, srcImg, 0, 0, dx, dy, f);
};
const _transformImage = function(img, x, y, f) {
const u32a = new Uint32Array(img.data.buffer);
const len = img.width * img.height;
for (let i = 0; i < len; ++i) {
u32a[i] = f(u32a[i] & 0xffffff) | 0xff000000;
}
_ctx2d.putImageData(img, x, y);
};
const _transformPixels = function(x, y, w, h, f) {
const img = _ctx2d.getImageData(x, y, w, h);
_transformImage(img, x, y, f);
};
const _transformPixelsBrush = function(orgX, orgY, w, h, backColor, foreColor, brushData, f) {
const imgData = _ctx2d.getImageData(orgX, orgY, w, h);
const u32a = new Uint32Array(imgData.data.buffer);
w = imgData.width;
h = imgData.height;
for (let y = 0; y < h; ++y) {
const brushU8 = brushData[(y + orgY) % 8];
const i = y * w;
for (let x = 0; x < w; ++x) {
const selectColor = (brushU8 & ((1 << 7) >> ((x + orgX) % 8)));
u32a[i+x] = f(selectColor ? backColor : foreColor, u32a[i+x] & 0xffffff)
| 0xff000000;
}
}
_ctx2d.putImageData(imgData, orgX, orgY);
};
const drawRect = function(x, y, w, h, color) {
// console.log('drawRect');
_ctx2d.fillStyle = rgbToCss(color);
_ctx2d.fillRect(x,y,w,h);
};
return {
// @{
// implementation for hack
_canvas: canvasElement,
_ctx2d: _ctx2d,
_cacheImages: _cacheImages,
_transformImage2: _transformImage2,
_transformDstImage: _transformDstImage,
_copyImage: _copyImage,
_transformPixels2: _transformPixels2,
_transformPixels: _transformPixels,
_transformImage: _transformImage,
_transformPixelsBrush: _transformPixelsBrush,
// @}
get width() { return _width; },
get height() { return _height; },
delete: function() {
// console.log('RdpGraphics: free memory')
_imgBuffer.delete();
},
drawRect: drawRect,
frameMarker: function(isFrameStart) {
},
resizeCanvas: function(w, h, bpp) {
// console.log('RdpGraphics: resize(' + w + ', ' + h + ', ' + bpp + ')');
canvasElement.width = _width = w;
canvasElement.height = _height = h;
drawRect(0, 0, w, h, 0);
},
setBmpCacheEntries: function(
cache0_nb_entries, cache0_bmp_size, cache0_is_persistent,
cache1_nb_entries, cache1_bmp_size, cache1_is_persistent,
cache2_nb_entries, cache2_bmp_size, cache2_is_persistent,
) {
_cacheImages.length = cache0_nb_entries + cache1_nb_entries + cache2_nb_entries;
},
setBmpCacheIndex: function(byteOffset, bitsPerPixel, w, h, lineSize, imageIdx) {
// assume w*h <= 64*64
module.convertBmpToImageData(_imgBufferIndex,
byteOffset, bitsPerPixel, w, h, lineSize);
const array = _u8buffer.slice(_imgBufferIndex, _imgBufferIndex + w*h*4);
// array is copied by Uint8ClampedArray
_cacheImages[imageIdx] = new ImageData(new Uint8ClampedArray(array), w, h);
},
drawMemBlt: function(imageIdx, rop, sx, sy, dx, dy, dw, dh) {
const img = _cacheImages[imageIdx];
dw = Math.min(img.width - sx, _width - dx, dw);
dh = Math.min(img.height - sy, _height - dy, dh);
if (dw <= 0 || dh <= 0) {
return;
}
switch (rop) {
case 0x00:
_ctx2d.fillStyle = "#000";
_ctx2d.fillRect(dx, dy, dw, dh);
break;
case 0x55:
const newImg = _copyImage(img, sx, sy, dw, dh);
_transformImage(newImg, dx, dy, (src) => src ^ 0xffffff);
break;
case 0xCC:
_ctx2d.putImageData(img, dx, dy, sx, sy, dw, dh);
break;
case 0x22:
_transformDstImage(img, sx, sy, dx, dy, dw, dh, (src, dst) => ~src & dst);
break;
case 0x66:
_transformDstImage(img, sx, sy, dx, dy, dw, dh, (src, dst) => src ^ dst);
break;
case 0x88:
_transformDstImage(img, sx, sy, dx, dy, dw, dh, (src, dst) => src & dst);
break;
case 0xBB:
_transformDstImage(img, sx, sy, dx, dy, dw, dh, (src, dst) => ~src | dst);
break;
case 0xEE:
_transformDstImage(img, sx, sy, dx, dy, dw, dh, (src, dst) => src | dst);
break;
case 0xff:
_ctx2d.fillStyle = "#fff";
_ctx2d.fillRect(dx, dy, dw, dh);
break;
default:
unsupportedRop('MemBlt', rop);
break;
}
},
drawMem3Blt: function(brushData, orgX, orgY, style,
imageIdx, rop, sx, sy, dx, dy, dw, dh, backColor, foreColor
) {
const img = _cacheImages[imageIdx];
dw = Math.min(img.width - sx, _width - dx, dw);
dh = Math.min(img.height - sy, _height - dy, dh);
if (dw <= 0 || dh <= 0) {
return;
}
foreColor &= 0xffffff;
switch (rop) {
case 0xB8:
_transformDstImage(img, sx, sy, dx, dy, dw, dh,
(src, dst) => ((dst ^ foreColor) & src) ^ foreColor);
break;
default:
unsupportedRop('Mem3Blt', rop);
break;
}
},
drawImage: function(byteOffset, bitsPerPixel, w, h, lineSize, dx, dy) {
let destOffset;
if (bitsPerPixel != 32) {
destOffset = _imgBuffer.reserve(w*h*4);
module.convertBmpToImageData(destOffset, byteOffset,
bitsPerPixel, w, h, lineSize);
}
else {
destOffset = byteOffset;
}
// buffer is referenced by Uint8ClampedArray
const array = new Uint8ClampedArray(_u8buffer, destOffset, w*h*4);
_ctx2d.putImageData(new ImageData(array, w, h), dx, dy);
},
drawScrBlt: function(sx, sy, w, h, dx, dy, rop) {
// console.log('drawScrBlt');
switch (rop) {
case 0x00:
_ctx2d.fillStyle = "#000";
_ctx2d.fillRect(x,y,w,h);
break;
case 0x11: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => ~(src | dst)); break;
case 0x22: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => ~src & dst); break;
case 0x33: _transformPixels(sx,sy,w,h, (src) => ~src); break;
case 0x44: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => src & ~dst); break;
case 0x55: _transformPixels(dx,dy,w,h, (dst) => ~dst); break;
case 0x66: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => src ^ dst); break;
case 0x77: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => ~(src & dst)); break;
case 0x88: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => src & dst); break;
case 0x99: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => ~(src ^ dst)); break;
case 0xaa: break;
case 0xbb: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => ~src | dst); break;
case 0xcc: _ctx2d.putImageData(_ctx2d.getImageData(sx,sy,w,h), dx,dy); break;
case 0xdd: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => src | ~dst); break;
case 0xee: _transformPixels2(sx,sy,dx,dy,w,h, (src, dst) => src | dst); break;
case 0xff:
_ctx2d.fillStyle = "#fff";
_ctx2d.fillRect(x,y,w,h);
break;
default:
unsupportedRop('ScrBlt', rop);
break;
}
},
drawLineTo: function(
backMode, startX, startY, endX, endY, backColor, penStyle, penWidth, penColor
) {
// console.log('drawLineTo');
_ctx2d.save();
_ctx2d.fillStyle = rgbToCss(backColor);
_ctx2d.strokeStyle = rgbToCss(penColor);
// behavior of stroke is strange (transparency color with a odd penWidth)
if (!penStyle && startX === endX) {
if (endX < startX) {
startX = endX;
}
if (endY < startY) {
[startY, endY] = [endY, startY];
}
_ctx2d.fillRect(startX, startY, penWidth||1, endY-startY+1);
}
else if (!penStyle && startY === endY) {
if (endY < startY) {
startY = endY;
}
if (endX < startX) {
[startX, endX] = [endX, startX];
}
_ctx2d.fillRect(startX, startY, endX-startX+1, penWidth||1);
}
else {
_ctx2d.beginPath();
_ctx2d.moveTo(startX, startY);
_ctx2d.lineTo(endX, endY);
_ctx2d.lineWidth = penWidth;
switch (penStyle) {
case 1: _ctx2d.setLineDash([ 10, 6, 10, 6 ]); break;
case 2: _ctx2d.setLineDash([ 3, 3, 3, 3 ]); break;
case 3: _ctx2d.setLineDash([ 9, 6, 3, 6 ]); break;
case 4: _ctx2d.setLineDash([ 9, 3, 3, 3 ]); break;
case 5: _ctx2d.setLineDash([ 16, 0, 16, 0 ]); break;
}
// BackMode does not imply the transparency level of what is about too be drawn
// canvas.globalAlpha = (backMode === 1 /* TRANSPARENT */? 0.0 : 1.0);
_ctx2d.stroke();
}
_ctx2d.restore();
},
drawPolyline: function(startX, startY, deltas, clipX, clipY, clipW, clipH, penColor) {
// console.log('drawPolyline');
_ctx2d.save();
_ctx2d.strokeStyle = rgbToCss(penColor);
_ctx2d.beginPath();
_ctx2d.moveTo(startX, startY);
let endX = startX;
let endY = startY;
const iend = deltas.length
for (let i = 0; i < iend; i += 2) {
endX += deltas[i];
endY += deltas[i+1];
_ctx2d.lineTo(endX, endY);
}
_ctx2d.stroke();
_ctx2d.restore();
},
drawPatBlt: function(brushData, orgX, orgY, style, x, y, w, h, rop, backColor, foreColor) {
switch (rop) {
case 0x00:
_ctx2d.fillStyle = "#000";
_ctx2d.fillRect(x,y,w,h);
break;
case 0x05: _transformPixels(x,y,w,h, (src) => ~(backColor | src)); break;
case 0x0f: _transformPixels(x,y,w,h, (src) => ~src); break;
case 0x50: _transformPixels(x,y,w,h, (src) => src & ~backColor); break;
case 0x55: _transformPixels(x,y,w,h, (src) => src ^ 0xffffff); break;
case 0x5a:
if (style === 0x03) {
_transformPixelsBrush(x,y,w,h,backColor,foreColor,brushData,
(src,c) => src ^ c);
}
else {
_transformPixels(x,y,w,h, (src) => backColor ^ src);
}
break;
case 0x5f: _transformPixels(x,y,w,h, (src) => ~(backColor & src)); break;
case 0xa0: _transformPixels(x,y,w,h, (src) => backColor & src); break;
case 0xa5: _transformPixels(x,y,w,h, (src) => ~(backColor ^ src)); break;
case 0xaa: break;
case 0xaf: _transformPixels(x,y,w,h, (src) => backColor | ~src); break;
case 0xf0:
if (style === 0x03) {
_transformPixelsBrush(x,y,w,h,backColor,foreColor,brushData,
(src,c) => src);
}
else {
_ctx2d.fillStyle = rgbToCss(backColor);
_ctx2d.fillRect(x,y,w,h);
}
break;
case 0xfa: _transformPixels(x,y,w,h, (src) => src | backColor); break;
case 0xf5: _transformPixels(x,y,w,h, (src) => src | ~backColor); break;
case 0xff:
_ctx2d.fillStyle = "#fff";
_ctx2d.fillRect(x,y,w,h);
break;
default:
unsupportedRop('PatBlt', rop);
break;
}
},
drawDstBlt: function(x, y, w, h, rop) {
switch (rop) {
case 0x00:
_ctx2d.fillStyle = "#000";
_ctx2d.fillRect(x,y,w,h);
break;
case 0x55: _transformPixels(x,y,w,h, (src) => src ^ 0xffffff); break;
// case 0xAA: break;
case 0xff:
_ctx2d.fillStyle = "#fff";
_ctx2d.fillRect(x,y,w,h);
break;
default:
unsupportedRop('DstBlt', rop);
break;
}
},
updatePointerPosition: function(x, y) {
},
};
};
const isPowerOf2 = function(value) {
return (value & (value - 1)) === 0;
}
const newRdpGL = function(canvasElement, module, ropError) {
const glOptions = {
preserveDrawingBuffer: true,
antialias: false,
alpha: false,
};
const gl = canvasElement.getContext('webgl', glOptions)
|| canvasElement.getContext('experimental-webgl', glOptions);
if (!gl) {
return ;
}
let _width = canvasElement.width;
let _height = canvasElement.height;
const _u8buffer = module.HEAPU8.buffer;
const _u16buffer = module.HEAPU16.buffer;
const _imgBuffer = createBuffer(64*64*4, module);
const unsupportedRop = ropError;
const compilePairShader = function(prog, code) {
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.attachShader(prog, fragmentShader);
gl.attachShader(prog, vertexShader);
gl.shaderSource(fragmentShader, code);
gl.compileShader(fragmentShader);
return [vertexShader, fragmentShader];
};
const rectProgram = gl.createProgram();
const imgProgram = gl.createProgram();
const img24Program = gl.createProgram();
const [rectVertexShader, rectFragmentShader] = compilePairShader(rectProgram, `
// precision highp float;
precision mediump float;
uniform vec3 uColor;
void main() {
gl_FragColor = vec4(uColor.x, uColor.y, uColor.z, 1.0);
}`);
const [imgVertexShader, imgFragmentShader] = compilePairShader(imgProgram, `
// precision highp float;
precision mediump float;
uniform sampler2D texture;
varying vec2 vTex;
void main() {
gl_FragColor = texture2D(texture, vTex);
}`);
const [img24VertexShader, img24FragmentShader] = compilePairShader(img24Program, `
// precision highp float;
precision mediump float;
uniform sampler2D texture;
varying vec2 vTex;
void main() {
vec4 color = texture2D(texture, vTex);
float tmp = color.x;
color.x = color.z;
color.z = tmp;
gl_FragColor = color;
}`);
const programs = [
[rectProgram, rectVertexShader, rectFragmentShader],
[imgProgram, imgVertexShader, imgFragmentShader],
[img24Program, img24VertexShader, img24FragmentShader],
];
const compileShader = function(shader, code){
gl.shaderSource(shader, code);
gl.compileShader(shader);
};
const deletePrograms = function() {
for (const [prog, vs, fs] of programs) {
gl.deleteProgram(prog);
}
};
const buildPrograms = function() {
const computePosition = `
// clip from 0 to 2
vec2 zeroToTwo = aLocation / vec2(${_width/2}, ${_height/2});
// convert 0->2 to -1->+1
vec2 clipSpace = (zeroToTwo - 1.0);
// flip y coordinate
vec2 finalPosition = clipSpace * vec2(1, -1);
gl_Position = vec4(finalPosition, 0, 1);
`;
compileShader(rectVertexShader, `
attribute vec2 aLocation;
void main() {
${computePosition}
}`
);
const imgSource = `
attribute vec2 aLocation;
attribute vec2 aTextureLocation;
// uniform vec2 pos;
varying vec2 vTex;
void main() {
${computePosition}
vTex = aTextureLocation;
}`;
compileShader(imgVertexShader, imgSource);
compileShader(img24VertexShader, imgSource);
// link in parallel threads
for (const [prog, vs, fs] of programs) {
gl.linkProgram(prog);
}
let hasError = false;
for (const [prog, vs, fs] of programs) {
if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {
console.error('Link failed: ' + gl.getProgramInfoLog(prog));
console.error('vs info-log: ' + gl.getShaderInfoLog(vs));
console.error('fs info-log: ' + gl.getShaderInfoLog(fs));
hasError = true;
}
}
if (hasError) {
const err = gl.getError();
deletePrograms();
throw new Error(err);
}
rectProgram.aLocation = gl.getAttribLocation(rectProgram, "aLocation");
imgProgram.aLocation = gl.getAttribLocation(imgProgram, "aLocation");
imgProgram.aTextureLocation = gl.getAttribLocation(imgProgram, "aTextureLocation");
img24Program.aLocation = gl.getAttribLocation(img24Program, "aLocation");
img24Program.aTextureLocation = gl.getAttribLocation(img24Program, "aTextureLocation");
};
const initShaders = function(){
buildPrograms();
gl.viewport(0, 0, _width, _height);
gl.clearColor(.0, .0, .0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
};
initShaders();
const rectVertexBuffer = gl.createBuffer();
const texVertexBuffer = gl.createBuffer();
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
const drawRect = function(x, y, w, h, color) {
// console.log('drawRect');
gl.useProgram(rectProgram);
const vertex = [
x+w,y, x,y+h, x,y,
x+w,y, x,y+h, x+w,y+h
];
let vertexArray = new Float32Array(vertex);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertexArray, gl.STATIC_DRAW);
const aLocation = rectProgram.aLocation;
gl.enableVertexAttribArray(aLocation);
gl.vertexAttribPointer(aLocation, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
const red = ((color >> 16) & 0xff) / 255.;
const green = ((color >> 8 ) & 0xff) / 255.;
const blue = ((color ) & 0xff) / 255.;
const uColor = gl.getUniformLocation(rectProgram, "uColor");
gl.uniform3fv(uColor, [red, green, blue]);
gl.drawArrays(gl.TRIANGLES, 0, /*vertexCount=*/6);
};
return {
get width() { return _width; },
get height() { return _height; },
delete() {
deletePrograms();
},
frameMarker: function(isFrameStart) {
},
drawRect: drawRect,
// mendatory for drawRect
drawPatBlt: function(brushData, orgX, orgY, style, x, y, w, h, rop, backColor, foreColor) {
switch (rop) {
case 0x00: drawRect(x,y,w,h, 0); break;
// case 0x05: _transformPixels(x,y,w,h, (src) => ~(backColor | src)); break;
// case 0x0f: _transformPixels(x,y,w,h, (src) => ~src); break;
// case 0x50: _transformPixels(x,y,w,h, (src) => src & ~backColor); break;
// case 0x55: _transformPixels(x,y,w,h, (src) => src ^ 0xffffff); break;
// case 0x5a:
// if (style === 0x03) {
// _transformPixelsBrush(x,y,w,h,backColor,foreColor,brushData,
// (src,c) => src ^ c);
// }
// else {
// _transformPixels(x,y,w,h, (src) => backColor ^ src);
// }
// break;
// case 0x5f: _transformPixels(x,y,w,h, (src) => ~(backColor & src)); break;
// case 0xa0: _transformPixels(x,y,w,h, (src) => backColor & src); break;
// case 0xa5: _transformPixels(x,y,w,h, (src) => ~(backColor ^ src)); break;
// case 0xaa: break;
// case 0xaf: _transformPixels(x,y,w,h, (src) => backColor | ~src); break;
case 0xf0:
const fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
// gl.viewport(0, 0, w,h);
// drawRect(0,0,w,h,0xff00ff);
// const attachmentPoint = gl.COLOR_ATTACHMENT0;
// gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint,
// gl.TEXTURE_2D, texture, 0);
gl.activeTexture(gl.TEXTURE1);
// gl.bindTexture(gl.TEXTURE_2D, texture);
// gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
// 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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
const program = imgProgram;
gl.useProgram(program);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
x, y,
x, y+h,
x+w, y+h,
x+w, y,
]), gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, texVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0, 1,
0, 0,
1, 0,
1, 1,
]), gl.STATIC_DRAW);
if (isPowerOf2(w) && isPowerOf2(h)) {
gl.generateMipmap(gl.TEXTURE_2D);
}
else {
// wrapping to clamp to edge
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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
}
const vloc = program.aLocation;
const tloc = program.aTextureLocation;
gl.enableVertexAttribArray(vloc);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.vertexAttribPointer(vloc, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(tloc);
gl.bindBuffer(gl.ARRAY_BUFFER, texVertexBuffer);
gl.vertexAttribPointer(tloc, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLE_FAN, 0, /*vertexCount=*/4);
// if (style === 0x03) {
// unsupportedRop('PatBlt', rop);
// // _transformPixelsBrush(x,y,w,h,backColor,foreColor,brushData,
// // (src,c) => src);
// }
// else {
// drawRect(x,y,w,h, backColor);
// }
break;
// case 0xfa: _transformPixels(x,y,w,h, (src) => src | backColor); break;
// case 0xf5: _transformPixels(x,y,w,h, (src) => src | ~backColor); break;
// case 0xff: drawRect(x,y,w,h, 0xffffff); break;
default:
unsupportedRop('PatBlt', rop);
break;
}
},
resizeCanvas: function(w, h, bpp) {
console.log('RdpGraphics: resize(' + w + ', ' + h + ', ' + bpp + ')');
if (_width != w || _height != h) {
canvasElement.width = _width = w;
canvasElement.height = _height = h;
initShaders();
}
drawRect(0, 0, w, h, 0);
},
drawImage: function(byteOffset, bitsPerPixel, w, h, lineSize, dx, dy) {
// console.log('img');
let program;
let xration;
let texWidth;
let format;
let type;
let pixels;
switch (bitsPerPixel) {
case 15:
module.transformBmp15ToBmp16(byteOffset, h, lineSize);
case 16:
xratio = w * 2 / lineSize;
program = imgProgram;
texWidth = lineSize / 2;
format = gl.RGB;
type = gl.UNSIGNED_SHORT_5_6_5;
pixels = new Uint16Array(_u16buffer, byteOffset, texWidth*h);
break;
case 24:
xratio = w * 3 / lineSize;
program = img24Program;
// what to do if is not divisible by 3?
texWidth = lineSize / 3;
format = gl.RGB;
type = gl.UNSIGNED_BYTE;
pixels = new Uint8Array(_u8buffer, byteOffset, lineSize*h);
break;
case 32:
xratio = w * 4 / lineSize;
program = imgProgram;
texWidth = lineSize / 4;
format = gl.RGBA;
type = gl.UNSIGNED_BYTE;
pixels = new Uint8Array(_u8buffer, byteOffset, lineSize*h);
break;
case 8:
const bufLen = lineSize*h*2;
const pbuf = _imgBuffer.reserve(bufLen);
module.convertBmp8ToBmp16(pbuf, byteOffset, h, lineSize);
xratio = w / lineSize;
program = imgProgram;
texWidth = lineSize;
format = gl.RGB;
type = gl.UNSIGNED_SHORT_5_6_5;
pixels = new Uint16Array(_u16buffer, pbuf, texWidth*h);
break;
default:
console.error(`invalid bitsPerPixel: ${bitsPerPixel}`);
return ;
}
gl.useProgram(program);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
dx, dy,
dx, dy+h,
dx+w, dy+h,
dx+w, dy,
]), gl.STATIC_DRAW);
gl.texImage2D(gl.TEXTURE_2D, 0, format, texWidth, h, 0, format, type, pixels);
gl.bindBuffer(gl.ARRAY_BUFFER, texVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0, 1,
0, 0,
xratio, 0,
xratio, 1,
]), gl.STATIC_DRAW);
// WebGL1 has different requirements for power of 2 images
// vs non power of 2 images so check if the image is a
// power of 2 in both dimensions.
if (isPowerOf2(texWidth) && isPowerOf2(h)) {
gl.generateMipmap(gl.TEXTURE_2D);
}
else {
// wrapping to clamp to edge
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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
}
// gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST);
// gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST);
const vloc = program.aLocation;
const tloc = program.aTextureLocation;
gl.enableVertexAttribArray(vloc);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.vertexAttribPointer(vloc, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(tloc);
gl.bindBuffer(gl.ARRAY_BUFFER, texVertexBuffer);
gl.vertexAttribPointer(tloc, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLE_FAN, 0, /*vertexCount=*/4);
},
};
};
const newRdpGL2 = function(canvasElement, module, ropError) {
const glOptions = {
// TODO premultipliedAlpha: true,
preserveDrawingBuffer: true,
antialias: false,
alpha: false,
};
const gl = canvasElement.getContext('webgl2', glOptions);
if (!gl) {
return ;
}
let _width = canvasElement.width;
let _height = canvasElement.height;
const _u8buffer = module.HEAPU8.buffer;
const _u16buffer = module.HEAPU16.buffer;
const _imgBuffer = createBuffer(64*64*4, module);
const unsupportedRop = ropError;
const compilePairShader = function(prog, code) {
const fragmentShader = gl.createShader(gl.FRAGMENT_SHADER);
const vertexShader = gl.createShader(gl.VERTEX_SHADER);
gl.attachShader(prog, fragmentShader);
gl.attachShader(prog, vertexShader);
gl.shaderSource(fragmentShader, code);
gl.compileShader(fragmentShader);
return [vertexShader, fragmentShader];
};
const rectProgram = gl.createProgram();
const imgProgram = gl.createProgram();
const img24Program = gl.createProgram();
const [rectVertexShader, rectFragmentShader] = compilePairShader(rectProgram, `
// precision highp float;
precision mediump float;
uniform vec3 uColor;
void main() {
gl_FragColor = vec4(uColor.x, uColor.y, uColor.z, 1.0);
}`);
const [imgVertexShader, imgFragmentShader] = compilePairShader(imgProgram, `
// precision highp float;
precision mediump float;
uniform sampler2D texture;
varying vec2 vTex;
void main() {
gl_FragColor = texture2D(texture, vTex);
}`);
const [img24VertexShader, img24FragmentShader] = compilePairShader(img24Program, `
// precision highp float;
precision mediump float;
uniform sampler2D texture;
varying vec2 vTex;
void main() {
vec4 color = texture2D(texture, vTex);
float tmp = color.x;
color.x = color.z;
color.z = tmp;
gl_FragColor = color;
}`);
const programs = [
[rectProgram, rectVertexShader, rectFragmentShader],
[imgProgram, imgVertexShader, imgFragmentShader],
[img24Program, img24VertexShader, img24FragmentShader],
];
const compileShader = function(shader, code){
gl.shaderSource(shader, code);
gl.compileShader(shader);
};
const deletePrograms = function() {
for (const [prog, vs, fs] of programs) {
gl.deleteProgram(prog);
}
};
const buildPrograms = function() {
const computePosition = `
// clip from 0 to 2
vec2 zeroToTwo = aLocation / vec2(${_width/2}, ${_height/2});
// convert 0->2 to -1->+1
vec2 clipSpace = (zeroToTwo - 1.0);
// flip y coordinate
vec2 finalPosition = clipSpace * vec2(1, -1);
gl_Position = vec4(finalPosition, 0, 1);
`;
compileShader(rectVertexShader, `
attribute vec2 aLocation;
void main() {
${computePosition}
}`
);
const imgSource = `
attribute vec2 aLocation;
attribute vec2 aTextureLocation;
// uniform vec2 pos;
varying vec2 vTex;
void main() {
${computePosition}
vTex = aTextureLocation;
}`;
compileShader(imgVertexShader, imgSource);
compileShader(img24VertexShader, imgSource);
// link in parallel threads
for (const [prog, vs, fs] of programs) {
gl.linkProgram(prog);
}
let hasError = false;
for (const [prog, vs, fs] of programs) {
if (!gl.getProgramParameter(prog, gl.LINK_STATUS)) {
console.error('Link failed: ' + gl.getProgramInfoLog(prog));
console.error('vs info-log: ' + gl.getShaderInfoLog(vs));
console.error('fs info-log: ' + gl.getShaderInfoLog(fs));
hasError = true;
}
}
if (hasError) {
const err = gl.getError();
deletePrograms();
throw new Error(err);
}
rectProgram.aLocation = gl.getAttribLocation(rectProgram, "aLocation");
imgProgram.aLocation = gl.getAttribLocation(imgProgram, "aLocation");
imgProgram.aTextureLocation = gl.getAttribLocation(imgProgram, "aTextureLocation");
img24Program.aLocation = gl.getAttribLocation(img24Program, "aLocation");
img24Program.aTextureLocation = gl.getAttribLocation(img24Program, "aTextureLocation");
};
const initShaders = function(){
buildPrograms();
gl.viewport(0, 0, _width, _height);
gl.clearColor(.0, .0, .0, 1.0);
gl.clear(gl.COLOR_BUFFER_BIT);
};
initShaders();
const rectVertexBuffer = gl.createBuffer();
const texVertexBuffer = gl.createBuffer();
const texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
const drawRect = function(x, y, w, h, color) {
// console.log('drawRect');
gl.useProgram(rectProgram);
const vertex = [
x+w,y, x,y+h, x,y,
x+w,y, x,y+h, x+w,y+h
];
let vertexArray = new Float32Array(vertex);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, vertexArray, gl.STATIC_DRAW);
const aLocation = rectProgram.aLocation;
gl.enableVertexAttribArray(aLocation);
gl.vertexAttribPointer(aLocation, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
const red = ((color >> 16) & 0xff) / 255.;
const green = ((color >> 8 ) & 0xff) / 255.;
const blue = ((color ) & 0xff) / 255.;
// TODO external
const uColor = gl.getUniformLocation(rectProgram, "uColor");
gl.uniform3fv(uColor, [red, green, blue]);
gl.drawArrays(gl.TRIANGLES, 0, /*vertexCount=*/6);
};
return {
get width() { return _width; },
get height() { return _height; },
delete() {
deletePrograms();
},
frameMarker: function(isFrameStart) {
},
drawRect: drawRect,
// mendatory for drawRect
drawPatBlt: function(brushData, orgX, orgY, style, x, y, w, h, rop, backColor, foreColor) {
switch (rop) {
case 0x00: drawRect(x,y,w,h, 0); break;
// case 0x05: _transformPixels(x,y,w,h, (src) => ~(backColor | src)); break;
// case 0x0f: _transformPixels(x,y,w,h, (src) => ~src); break;
// case 0x50: _transformPixels(x,y,w,h, (src) => src & ~backColor); break;
// case 0x55: _transformPixels(x,y,w,h, (src) => src ^ 0xffffff); break;
// case 0x5a:
// if (style === 0x03) {
// _transformPixelsBrush(x,y,w,h,backColor,foreColor,brushData,
// (src,c) => src ^ c);
// }
// else {
// _transformPixels(x,y,w,h, (src) => backColor ^ src);
// }
// break;
// case 0x5f: _transformPixels(x,y,w,h, (src) => ~(backColor & src)); break;
// case 0xa0: _transformPixels(x,y,w,h, (src) => backColor & src); break;
// case 0xa5: _transformPixels(x,y,w,h, (src) => ~(backColor ^ src)); break;
// case 0xaa: break;
// case 0xaf: _transformPixels(x,y,w,h, (src) => backColor | ~src); break;
case 0xf0:
const fb = gl.createFramebuffer();
gl.bindFramebuffer(gl.FRAMEBUFFER, fb);
// gl.viewport(0, 0, w,h);
// drawRect(0,0,w,h,0xff00ff);
// const attachmentPoint = gl.COLOR_ATTACHMENT0;
// gl.framebufferTexture2D(gl.FRAMEBUFFER, attachmentPoint,
// gl.TEXTURE_2D, texture, 0);
gl.activeTexture(gl.TEXTURE1);
// gl.bindTexture(gl.TEXTURE_2D, texture);
// gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, w, h, 0, gl.RGBA, gl.UNSIGNED_BYTE, null);
// 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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);
gl.bindFramebuffer(gl.FRAMEBUFFER, null);
const program = imgProgram;
gl.useProgram(program);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
x, y,
x, y+h,
x+w, y+h,
x+w, y,
]), gl.STATIC_DRAW);
gl.bindBuffer(gl.ARRAY_BUFFER, texVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0, 1,
0, 0,
1, 0,
1, 1,
]), gl.STATIC_DRAW);
if (isPowerOf2(w) && isPowerOf2(h)) {
gl.generateMipmap(gl.TEXTURE_2D);
}
else {
// wrapping to clamp to edge
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.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
}
const vloc = program.aLocation;
const tloc = program.aTextureLocation;
gl.enableVertexAttribArray(vloc);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.vertexAttribPointer(vloc, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(tloc);
gl.bindBuffer(gl.ARRAY_BUFFER, texVertexBuffer);
gl.vertexAttribPointer(tloc, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLE_FAN, 0, /*vertexCount=*/4);
// if (style === 0x03) {
// unsupportedRop('PatBlt', rop);
// // _transformPixelsBrush(x,y,w,h,backColor,foreColor,brushData,
// // (src,c) => src);
// }
// else {
// drawRect(x,y,w,h, backColor);
// }
break;
// case 0xfa: _transformPixels(x,y,w,h, (src) => src | backColor); break;
// case 0xf5: _transformPixels(x,y,w,h, (src) => src | ~backColor); break;
// case 0xff: drawRect(x,y,w,h, 0xffffff); break;
default:
unsupportedRop('PatBlt', rop);
break;
}
},
resizeCanvas: function(w, h, bpp) {
console.log('RdpGraphics: resize(' + w + ', ' + h + ', ' + bpp + ')');
if (_width != w || _height != h) {
canvasElement.width = _width = w;
canvasElement.height = _height = h;
initShaders();
}
drawRect(0, 0, w, h, 0);
},
drawImage: function(byteOffset, bitsPerPixel, w, h, lineSize, dx, dy) {
// console.log('img');
let program;
let xration;
let texWidth;
let format;
let type;
let pixels;
switch (bitsPerPixel) {
case 15:
xratio = w * 2 / lineSize;
program = imgProgram;
texWidth = lineSize / 2;
format = gl.RGB565;
type = gl.UNSIGNED_SHORT_5_6_5;
pixels = new Uint16Array(_u16buffer, byteOffset, texWidth*h);
case 16:
xratio = w * 2 / lineSize;
program = imgProgram;
texWidth = lineSize / 2;
format = gl.RGB;
type = gl.UNSIGNED_SHORT_5_6_5;
pixels = new Uint16Array(_u16buffer, byteOffset, texWidth*h);
break;
case 24:
xratio = w * 3 / lineSize;
program = img24Program;
// what to do if is not divisible by 3?
texWidth = lineSize / 3;
format = gl.RGB;
type = gl.UNSIGNED_BYTE;
pixels = new Uint8Array(_u8buffer, byteOffset, lineSize*h);
break;
case 32:
xratio = w * 4 / lineSize;
program = imgProgram;
texWidth = lineSize / 4;
format = gl.RGBA;
type = gl.UNSIGNED_BYTE;
pixels = new Uint8Array(_u8buffer, byteOffset, lineSize*h);
break;
case 8:
const bufLen = lineSize*h*2;
const pbuf = _imgBuffer.reserve(bufLen);
module.convertBmp8ToBmp16(pbuf, byteOffset, h, lineSize);
xratio = w / lineSize;
program = imgProgram;
texWidth = lineSize;
format = gl.RGB;
type = gl.UNSIGNED_SHORT_5_6_5;
pixels = new Uint16Array(_u16buffer, pbuf, texWidth*h);
break;
default:
console.error(`invalid bitsPerPixel: ${bitsPerPixel}`);
return ;
}
gl.useProgram(program);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
dx, dy,
dx, dy+h,
dx+w, dy+h,
dx+w, dy,
]), gl.STATIC_DRAW);
gl.texImage2D(gl.TEXTURE_2D, 0, format, texWidth, h, 0, format, type, pixels);
gl.bindBuffer(gl.ARRAY_BUFFER, texVertexBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([
0, 1,
0, 0,
xratio, 0,
xratio, 1,
]), gl.STATIC_DRAW);
gl.generateMipmap(gl.TEXTURE_2D);
const vloc = program.aLocation;
const tloc = program.aTextureLocation;
gl.enableVertexAttribArray(vloc);
gl.bindBuffer(gl.ARRAY_BUFFER, rectVertexBuffer);
gl.vertexAttribPointer(vloc, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
gl.enableVertexAttribArray(tloc);
gl.bindBuffer(gl.ARRAY_BUFFER, texVertexBuffer);
gl.vertexAttribPointer(tloc, /*numComponents=*/2, gl.FLOAT, false, 0, 0);
gl.drawArrays(gl.TRIANGLE_FAN, 0, /*vertexCount=*/4);
},
};
};
const createCtx = function(...contexts) {
const deleters = [];
for (const ctx of contexts) {
if (ctx.delete) {
deleters.push(ctx.delete);
}
}
let deleter;
switch (deleters.length) {
case 0: deleter = function() {}; break;
case 1: deleter = deleters[0]; break;
default: deleter = () => { for (deleter of deleters) deleter(); }; break;
}
const ret = Object.assign(...contexts);
ret.delete = deleter;
return ret;
};
const getDefaultRopError = function() {
let loggedMap = {};
return function(cmd, rop) {
const k = cmd + rop;
if (!(k in loggedMap)) {
loggedMap[k] = true;
console.error(`${cmd}: Unsupported rop 0x${rop.toString(16).padStart(2, '0')}`);
}
};
};
const newRdpGraphics2D = function(canvasElement, module, ropError) {
ropError = ropError || getDefaultRopError();
return createCtx(newRdpCanvas(canvasElement, module, ropError),
newRdpPointer(canvasElement, module));
};
const newRdpGraphicsGL = function(canvasElement, module, ropError) {
ropError = ropError || getDefaultRopError();
return createCtx(newRdpGL(canvasElement, module, ropError),
newRdpPointer(canvasElement, module));
};
const newRdpGraphicsGL2 = function(canvasElement, module, ropError) {
ropError = ropError || getDefaultRopError();
return createCtx(newRdpGL2(canvasElement, module, ropError),
newRdpPointer(canvasElement, module));
};
const newRdpGraphics = function(canvasElement, module, ropError) {
ropError = ropError || getDefaultRopError();
const ctx = newRdpGL2(canvasElement, module, ropError)
|| newRdpCanvas(canvasElement, module, ropError);
return ctx ? createCtx(ctx, newRdpPointer(canvasElement, module)) : undefined;
};
try {
module.exports.newRdpGraphics2D = newRdpGraphics2D;
module.exports.newRdpGraphicsGL = newRdpGraphicsGL;
module.exports.newRdpGraphicsGL2 = newRdpGraphicsGL2;
module.exports.newRdpGraphics = newRdpGraphics;
module.exports.newRdpCanvas = newRdpCanvas;
module.exports.newRdpGL = newRdpGL;
module.exports.newRdpGL2 = newRdpGL2;
module.exports.newRdpPointer = newRdpPointer;
}
catch (e) {
// module not found
}
This source diff could not be displayed because it is too large. You can view the blob instead.
"use strict";
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key/Key_Values
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code
// 0xE0 -> 0x0100
// /!\ rotate digit code
// Note: special code has a same value that code (ControlLeft, ArrowDown, etc)
//
// test:
// https://yari-demos.prod.mdn.mozit.cloud/en-US/docs/Web/API/KeyboardEvent/code/_sample_.Exercising_KeyboardEvent.html
// https://w3c.github.io/uievents/tools/key-event-viewer.html
/// \return Number | undefined
const keycodeToSingleScancode = function(code) {
switch (code)
{
case "KeyA": return 0x1E;
case "KeyB": return 0x30;
case "KeyC": return 0x2E;
case "KeyD": return 0x20;
case "KeyE": return 0x12;
case "KeyF": return 0x21;
case "KeyG": return 0x22;
case "KeyH": return 0x23;
case "KeyI": return 0x17;
case "KeyJ": return 0x24;
case "KeyK": return 0x25;
case "KeyL": return 0x26;
case "KeyM": return 0x32;
case "KeyN": return 0x31;
case "KeyO": return 0x18;
case "KeyP": return 0x19;
case "KeyQ": return 0x10;
case "KeyR": return 0x13;
case "KeyS": return 0x1F;
case "KeyT": return 0x14;
case "KeyU": return 0x16;
case "KeyV": return 0x2F;
case "KeyW": return 0x11;
case "KeyX": return 0x2D;
case "KeyY": return 0x15;
case "KeyZ": return 0x2C;
case "Comma": return 0x33;
case "Convert": return 0x79;
case "Slash": return 0x35;
case "BracketLeft": return 0x1A;
case "BracketRight": return 0x1B;
case "Backslash": return 0x2B;
case "Quote": return 0x28;
case "Semicolon": return 0x27;
case "Period": return 0x34;
case "Space": return 0x39;
case "Tab": return 0x0F;
case "PageDown": return 0x151;
case "PageUp": return 0x149;
case "Home": return 0x147;
case "End": return 0x14F;
case "Delete": return 0x153;
case "Insert": return 0x152;
case "Enter": return 0x1C;
case "Escape": return 0x01;
case "Backquote": return 0x29;
case "Digit0": return 0x0B;
case "Digit1": return 0x02;
case "Digit2": return 0x03;
case "Digit3": return 0x04;
case "Digit4": return 0x05;
case "Digit5": return 0x06;
case "Digit6": return 0x07;
case "Digit7": return 0x08;
case "Digit8": return 0x09;
case "Digit9": return 0x0A;
case "Minus": return 0x0B;
case "Equal": return 0x0C;
case "Backspace": return 0x0E;
case "ArrowDown": return 0x150;
case "ArrowLeft": return 0x14B;
case "ArrowRight": return 0x14D;
case "ArrowUp": return 0x148;
case "CapsLock": return 0x3A;
case "ContextMenu": return 0x15D;
case "ControlLeft": return 0x1D;
case "ControlRight": return 0x11D;
case "AltGraph": return 0x138;
case "AltLeft": return 0x38;
case "AltRight": return 0x138;
case "OSLeft": return 0x15B;
case "OSRight": return 0x15C;
case "MetaLeft": return 0x15B;
case "MetaRight": return 0x15C;
case "ShiftLeft": return 0x2A;
case "ShiftRight": return 0x36;
case "KanaMode": return 0x70;
case "NumLock": return 0x45;
case "Numpad0": return 0x52;
case "Numpad1": return 0x4F;
case "Numpad2": return 0x50;
case "Numpad3": return 0x51;
case "Numpad4": return 0x4B;
case "Numpad5": return 0x4C;
case "NumpadClear": return 0x4C;
case "Numpad6": return 0x4D;
case "Numpad7": return 0x47;
case "Numpad8": return 0x48;
case "Numpad9": return 0x49;
case "NumpadAdd": return 0x4E;
case "NumpadComma": return 0x7E;
case "NumpadEnter": return 0x11C;
case "NumpadEqual": return 0x59;
case "NumpadDivide": return 0x135;
case "NumpadDecimal": return 0x53;
case "NumpadMultiply": return 0x37;
case "NumpadSubtract": return 0x4A;
case "F1": return 0x3B;
case "F2": return 0x3C;
case "F3": return 0x3D;
case "F4": return 0x3E;
case "F5": return 0x3F;
case "F6": return 0x40;
case "F7": return 0x41;
case "F8": return 0x42;
case "F9": return 0x43;
case "F10": return 0x44;
case "F11": return 0x57;
case "F12": return 0x58;
case "F13": return 0x64;
case "F14": return 0x65;
case "F15": return 0x66;
case "F16": return 0x67;
case "F17": return 0x68;
case "F18": return 0x69;
case "F19": return 0x6A;
case "F20": return 0x6B;
case "F21": return 0x6C;
case "F22": return 0x6D;
case "F23": return 0x6E;
case "F24": return 0x76;
case "PrintScreen": return 0x37;
case "ScrollLock": return 0x46;
case "Paste": return 0x10A;
case "Copy": return 0x118;
case "Cut": return 0x117;
case "AudioVolumeDown": return 0x12E;
case "AudioVolumeMute": return 0x120;
case "AudioVolumeUp": return 0x130;
case "BrowserBack": return 0x16A;
case "BrowserFavorites": return 0x166;
case "BrowserForward": return 0x169;
case "BrowserHome": return 0x132;
case "BrowserRefresh": return 0x167;
case "BrowserSearch": return 0x165;
case "BrowserStop": return 0x168;
case "LaunchApp1": return 0x16B;
case "LaunchApp2": return 0x121;
case "LaunchMail": return 0x16C;
case "LaunchMediaPlayer": return 0x16D;
case "MediaPlayPause": return 0x122;
case "MediaStop": return 0x124;
case "MediaTrackNext": return 0x119;
case "MediaTrackPrevious": return 0x110;
case "VolumeDown": return 0x12E;
case "VolumeMute": return 0x120;
case "VolumeUp": return 0x130;
case "Eject": return 0x12C;
case "Help": return 0x63;
case "IntlBackslash": return 0x56;
case "IntlRo": return 0x73;
case "IntlYen": return 0x7D;
// case "Lang1": return 0x1F2; /* key with Korean keyboard layout */
// case "Lang2": return 0x1F1; /* key with Korean keyboard layout */
case "Lang1": return 0x72;
case "Lang2": return 0x71;
case "NonConvert": return 0x7B;
case "Power": return 0x15E;
case "Undo": return 0x108;
}
};
/// \return Number | undefined
const numpadCodeToScancode = function(key) {
switch (key)
{
case "NumpadMultiply": /*case "*": case "Multiply": */ return 0x37;
case "Numpad7": /*case "7": case "Home": */ return 0x47;
case "Numpad8": /*case "8": case "ArrowUp": */ return 0x48;
case "Numpad9": /*case "9": case "PageUp": */ return 0x49;
case "NumpadSubtract": /*case "-": case "Subtract": */ return 0x4A;
case "Numpad4": /*case "4": case "ArrowLeft": */ return 0x4B;
case "Numpad5": /*case "5": case "Unidentified":*/ return 0x4C;
case "NumpadClear": return 0x4C;
case "Numpad6": /*case "6": case "AltRight": */ return 0x4D;
case "NumpadAdd": /*case "+": case "Add": */ return 0x4E;
case "Numpad1": /*case "1": case "End": */ return 0x4F;
case "Numpad2": /*case "2": case "ArrowDown": */ return 0x50;
case "Numpad3": /*case "3": case "PageDown": */ return 0x51;
case "Numpad0": /*case "0": case "Insert": */ return 0x52;
case "NumpadDecimal": /*case ".": case "Delete": */ return 0x53;
case "NumpadEqual": /*case "=": */ return 0x59;
case "NumpadComma": /*case ",": case "Separator": */ return 0x7E;
case "NumpadEnter": /*case "Enter": */ return 0x11C;
case "NumpadDivide": /*case "/": case "Divide": */ return 0x135;
case "NumLock": /* */ return 0x45;
}
};
/// \brief convert keycode to scancodes
/// \return Array[Number] | undefined
const codeToScancodes = function(code, flag) {
const scancode = keycodeToSingleScancode(code);
if (scancode) return [scancode | flag];
if (code === "Pause") return [0x21D | flag, 0x45 | flag];
};
// reverse keylayout mask (see tools/gen_reversed_keymap.py)
const ShiftMod = 1 << 0;
const AltGrMod = 1 << 1;
const CapsLockMod = 1 << 2;
const CtrlMod = 1 << 3;
const AltMod = 1 << 4;
const OEM8Mod = 1 << 5;
const KanaMod = 1 << 6;
const KanaLockMod = 1 << 7;
const NumLockMod = 1 << 8;
// extra flags
const RightShiftMod = 1 << 9;
const RightCtrlMod = 1 << 10;
// Control scancodes
const LShiftSC = 0x2A;
const RShiftSC = 0x36;
const LCtrlSC = 0x1D;
const RCtrlSC = 0x11D;
const AltSC = 0x38;
const AltGrSC = 0x138;
const LMetaSC = 0x15B;
const RMetaSC = 0x15C;
const CapsLockSC = 0x3A;
const NumLockSC = 0x45;
// key flags
const KeyRelease = 0x8000;
const KeyAcquire = 0;
const SyncFlags = Object.freeze({
NoSync: 0,
// rdp lock flags
ScrollLock: 0x01,
NumLock: 0x02,
CapsLock: 0x04,
KanaLock: 0x08,
// control scancodes
ControlLeft: 0x0010,
ControlRight: 0x0020,
ShiftLeft: 0x0040,
ShiftRight: 0x0080,
AltLeft: 0x0100,
AltRight: 0x0200,
OSLeft: 0x0400,
OSRight: 0x0800,
Kana: 0x1000,
});
const ScancodeByMod = Object.freeze({
ControlLeft: LCtrlSC,
ControlRight: RCtrlSC,
ShiftLeft: LShiftSC,
ShiftRight: RShiftSC,
AltLeft: AltSC,
AltRight: AltGrSC,
OSLeft: LMetaSC,
OSRight: RMetaSC,
Kana: 0x70,
});
const emptyReversedLayout = {
klid: 0,
localeName: "NoKeyboard",
displayName: "NoKeyboard",
ctrlRightIsOem8: false,
keymap: {},
actions: {},
deadkeys: {},
accents: [],
};
const remappingModByLeftMods = {
OS: 'OSLeft',
Meta: 'OSLeft',
Shift: 'ShiftLeft',
Control: 'ControlLeft',
};
const remappingModByRightMods = {
OS: 'OSRight',
Meta: 'OSRight',
Shift: 'ShiftRight',
Control: 'ControlRight',
};
// { code : { key: newcode } }
const remappingCodeByKeys = {
OSLeft: remappingModByLeftMods,
MetaLeft: remappingModByLeftMods,
ShiftLeft: remappingModByLeftMods,
ControlLeft: remappingModByLeftMods,
OSRight: remappingModByRightMods,
MetaRight: remappingModByRightMods,
ShiftRight: remappingModByRightMods,
ControlRight: remappingModByRightMods,
};
/// \return scancodes
const scancodesForSynchronizedMods = function(syncFlags) {
const accu = [];
accu.push(LShiftSC | ((syncFlags & SyncFlags.ShiftLeft) ? KeyAcquire : KeyRelease));
accu.push(RShiftSC | ((syncFlags & SyncFlags.ShiftRight) ? KeyAcquire : KeyRelease));
accu.push(LCtrlSC | ((syncFlags & SyncFlags.ControlLeft) ? KeyAcquire : KeyRelease));
accu.push(RCtrlSC | ((syncFlags & SyncFlags.ControlRight) ? KeyAcquire : KeyRelease));
accu.push(AltSC | ((syncFlags & SyncFlags.AltLeft) ? KeyAcquire : KeyRelease));
accu.push(AltGrSC | ((syncFlags & SyncFlags.AltRight) ? KeyAcquire : KeyRelease));
accu.push(LMetaSC | ((syncFlags & SyncFlags.OSLeft) ? KeyAcquire : KeyRelease));
accu.push(RMetaSC | ((syncFlags & SyncFlags.OSRight) ? KeyAcquire : KeyRelease));
// accu.push(KanaSC | ((syncFlags & SyncFlags.Kana) ? KeyAcquire : KeyRelease));
return accu;
};
const toHumanReadableMods = function(mods) {
return `ShiftLeft: ${(mods & ShiftMod) ? '1' : '0'}
ShiftRight: ${(mods & RightShiftMod) ? '1' : '0'}
CtrlLeft: ${(mods & CtrlMod) ? '1' : '0'}
CtrlRight: ${(mods & RightCtrlMod) ? '1' : '0'}
Alt: ${(mods & AltMod) ? '1' : '0'}
AltGr: ${(mods & AltGrMod) ? '1' : '0'}
OEM8: ${(mods & OEM8Mod) ? '1' : '0'}
Kana: ${(mods & KanaMod) ? '1' : '0'}
CapsLock: ${(mods & CapsLockMod) ? '1' : '0'}
NumLock: ${(mods & NumLockMod) ? '1' : '0'}
KanaLock: ${(mods & KanaLockMod) ? '1' : '0'}`;
};
// Keyboard behavior
//
// Windows: ctrl+alt = altgr
//
// | Windows | Linux
// Numpad8 + Verrnum off | Up | Up
// Numpad8 + Verrnum off + Shift | Up | 8
// Numpad8 + Verrnum on | 8 | 8
// Numpad8 + Verrnum on + Shift | Up | Up
//
// Digit1 + CapsLock off | & | & (fr)
// Digit1 + CapsLock on | 1 | & (fr)
// Digit1 + CapsLock off + Shift | 1 | 1 (fr)
// Digit1 + CapsLock on + Shift | & | 1 (fr)
class ReversedKeymap
{
// _virtualModFlags:
// - contains left shift (for right and left shift), altgr and oem8
// - ctrl+alt = altgr when _altGrIsCtrlAndAlt
// - eom8 when _rctrlIsOem8 && (_modFlags & RightCtrlMod)
// _modFlags: all controls
constructor(reversedLayout) {
this._modFlags = 0;
this._virtualModFlags = 0;
this._altGrIsCtrlAndAlt = true;
this.layout = reversedLayout || emptyReversedLayout;
}
// states for test
getModFlags() { return this._modFlags; }
getVirtualModFlags() { return this._virtualModFlags; }
get altGrIsCtrlAndAlt() {
return this._altGrIsCtrlAndAlt;
}
set altGrIsCtrlAndAlt(altGrIsCtrlAndAlt) {
this._altGrIsCtrlAndAlt = altGrIsCtrlAndAlt;
this._updateVirtualMod();
}
get layout() {
return this._layout;
}
set layout(reversedLayout) {
this._layout = reversedLayout;
this._keymap = reversedLayout.keymap;
this._deadKeymap = reversedLayout.deadkeys;
this._accentKeymap = reversedLayout.accents;
this._rctrlIsOem8 = reversedLayout.ctrlRightIsOem8;
this._updateVirtualMod();
}
sync(syncFlags) {
let modFlags = 0;
modFlags |= (syncFlags & SyncFlags.ShiftLeft) ? ShiftMod : 0;
modFlags |= (syncFlags & SyncFlags.ShiftRight) ? RightShiftMod : 0;
modFlags |= (syncFlags & SyncFlags.ControlLeft) ? CtrlMod : 0;
modFlags |= (syncFlags & SyncFlags.ControlRight) ? RightCtrlMod : 0;
modFlags |= (syncFlags & SyncFlags.AltLeft) ? AltMod : 0;
modFlags |= (syncFlags & SyncFlags.AltRight) ? AltGrMod : 0;
modFlags |= (syncFlags & SyncFlags.CapsLock) ? CapsLockMod : 0;
modFlags |= (syncFlags & SyncFlags.NumLock) ? NumLockMod : 0;
// modFlags |= (syncFlags & SyncFlags.KanaLock) ? KanaLockMod : 0;
// modFlags |= (syncFlags & SyncFlags.Kana) ? KanaMod : 0;
// ignore ScrollLock value
this._modFlags = modFlags;
this._updateVirtualMod();
}
keyUp(key, code) {
return this.toScancodesAndFlags(key, code, KeyRelease);
}
keyDown(key, code) {
return this.toScancodesAndFlags(key, code, KeyAcquire);
}
/// @param flag = 0 (KeyAcquire) or 0x8000 (KeyRelease)
toScancodesAndFlags(key, code, flag) {
const scancodeByMods = this._keymap[key];
if (scancodeByMods) {
return this._scancodeByModsToScancodes(scancodeByMods, flag);
}
// dead key
const dk = this._deadKeymap[key];
if (dk) {
const accu = this._scancodeByModsToScancodes(this._accentKeymap[dk[0]], flag);
for (let i = 1; i < dk.length; ++i) {
accu.push(...this._scancodeByModsToScancodes(this._keymap[dk[i]], flag));
}
return accu;
}
// use key before code for special configuration such as Esc <-> CapsLock
return this._modToScancode(key, flag) ||
this._modToScancode(code, flag) ||
// transform a named key to scancode. Do not use `code`.
codeToScancodes(key, flag);
}
_scancodeByModsToScancodes(scancodeByMods, flag) {
let scancode = scancodeByMods[this._virtualModFlags];
if (scancode) {
return [scancode | flag];
}
// emulate control key up/down
let expectedModFlags;
for (expectedModFlags in scancodeByMods) {
scancode = scancodeByMods[expectedModFlags];
if (flag === KeyRelease) {
return [scancode | flag];
}
break;
}
// if scancodeByMods
if (!scancode) {
return;
}
// const release = flag ^ KeyRelease;
// const down = flag & KeyRelease;
const release = KeyRelease;
const down = 0;
const accu = [];
// shift
if ((this._virtualModFlags ^ expectedModFlags) & ShiftMod) {
if (expectedModFlags & ShiftMod) {
accu.push(LShiftSC | down);
}
else {
if (this._modFlags & ShiftMod) accu.push(LShiftSC | release);
if (this._modFlags & RightShiftMod) accu.push(RShiftSC | release);
}
}
// ctrl
// if ((this._virtualModFlags ^ expectedModFlags) & CtrlMod) {
// if (expectedModFlags & CtrlMod) {
// accu.push(LCtrlSC | down);
// }
// else {
// if (this._modFlags & CtrlMod) accu.push(LCtrlSC | release);
// if ((this._modFlags & RightCtrlMod) && !this._rctrlIsOem8) accu.push(RCtrlSC | release);
// }
// }
// oem8
if ((this._virtualModFlags ^ expectedModFlags) & OEM8Mod) {
accu.push(RCtrlSC | ((expectedModFlags & OEM8Mod) ? down : release));
}
// alt
// if ((this._virtualModFlags ^ expectedModFlags) & AltMod) {
// accu.push(AltSC | ((expectedModFlags & AltMod) ? down : release));
// }
// altGr
if ((this._virtualModFlags ^ expectedModFlags) & AltGrMod) {
accu.push(AltGrSC | ((expectedModFlags & AltGrMod) ? down : release));
}
// CapsLock
const hasCapLock = (this._virtualModFlags ^ expectedModFlags) & CapsLockMod;
if (hasCapLock) {
accu.push(CapsLockSC | down);
accu.push(CapsLockSC | release);
}
// // KanaMod
// if ((this._virtualModFlags ^ expectedModFlags) & KanaMod) {
// accu.push(KanaModSC | ((expectedModFlags & KanaMod) ? down : release));
// }
//
// // KanaLockMod
// if ((this._virtualModFlags ^ expectedModFlags) & KanaLockMod) {
// accu.push(KanaLockSC | ((expectedModFlags & KanaLockMod) ? down : release));
// }
let accuLen = accu.length;
if (hasCapLock) {
accuLen -= 2;
}
accu.push(scancode);
// reset emulated keys
for (let i = 0; i < accuLen; ++i) {
accu.push(accu[i] ^ KeyRelease);
}
if (hasCapLock) {
accu.push(CapsLockSC | down);
accu.push(CapsLockSC | release);
}
return accu;
}
_modToScancode(code, flag) {
switch (code) {
case "CapsLock":
if (flag === KeyAcquire) {
this._modFlags ^= CapsLockMod;
this._virtualModFlags ^= CapsLockMod;
}
return [CapsLockSC | flag];
case "NumLock":
if (flag === KeyAcquire) {
this._modFlags ^= NumLockMod;
}
return [NumLockSC | flag];
case "ControlLeft":
this._updateFlags(CtrlMod, flag);
return [LCtrlSC | flag];
case "ControlRight":
this._updateFlags(RightCtrlMod, flag);
return [RCtrlSC | flag];
case "AltGraph":
case "AltRight":
this._updateFlags(AltGrMod, flag);
return [AltGrSC | flag];
case "Alt":
case "AltLeft":
this._updateFlags(AltMod, flag);
return [AltSC | flag];
case "ShiftLeft":
this._updateFlags(ShiftMod, flag);
return [LShiftSC | flag];
case "ShiftRight":
this._updateFlags(RightShiftMod, flag);
return [RShiftSC | flag];
case "OSLeft":
case "MetaLeft":
return [LMetaSC | flag];
case "OSRight":
case "MetaRight":
return [RMetaSC | flag];
}
}
_updateFlags(modf, flag) {
if (flag === KeyRelease) {
this._modFlags &= ~modf;
}
else {
this._modFlags |= modf;
}
this._updateVirtualMod();
}
_updateVirtualMod() {
const ctrl = this._rctrlIsOem8 ? CtrlMod : (CtrlMod | RightCtrlMod);
const hasCtrl = this._modFlags & ctrl;
const hasAlt = this._modFlags & AltMod;
this._virtualModFlags = this._modFlags & (AltGrMod | ShiftMod | CapsLockMod);
this._virtualModFlags |= (this._modFlags & RightShiftMod) ? ShiftMod : 0;
this._virtualModFlags |= (this._altGrIsCtrlAndAlt && (hasCtrl && hasAlt)) ? AltGrMod : 0;
this._virtualModFlags |= (this._rctrlIsOem8 && (this._modFlags & RightCtrlMod)) ? OEM8Mod : 0;
}
};
const scancodeFromScancodeAndFlags = function(scancodeAndFlags) { return scancodeAndFlags & 0xff; };
const flagsFromScancodeAndFlags = function(scancodeAndFlags) { return scancodeAndFlags & 0xff00; };
try {
module.exports.scancodesForSynchronizedMods = scancodesForSynchronizedMods;
module.exports.scancodeFromScancodeAndFlags = scancodeFromScancodeAndFlags;
module.exports.flagsFromScancodeAndFlags = flagsFromScancodeAndFlags;
module.exports.keycodeToSingleScancode = keycodeToSingleScancode;
module.exports.numpadCodeToScancode = numpadCodeToScancode;
module.exports.codeToScancodes = codeToScancodes;
module.exports.ReversedKeymap = ReversedKeymap;
module.exports.ScancodeByMod = ScancodeByMod;
module.exports.KeyRelease = KeyRelease;
module.exports.KeyAcquire = KeyAcquire;
module.exports.SyncFlags = SyncFlags;
module.exports.toHumanReadableMods = toHumanReadableMods;
}
catch (e) {
// module not found
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment