From 55a5e6c6d125a5605dda7ca82fdf1f455eddc043 Mon Sep 17 00:00:00 2001 From: EthanMKY Date: Sun, 2 Aug 2026 14:49:56 +0100 Subject: [PATCH] fixed text loading example --- examples/text/text_font_loading.js | 10777 ++++++++++++++++++++++++- examples/text/text_font_loading.wasm | Bin 313188 -> 588048 bytes 2 files changed, 10776 insertions(+), 1 deletion(-) diff --git a/examples/text/text_font_loading.js b/examples/text/text_font_loading.js index 4ae2a4cb..59504cb0 100644 --- a/examples/text/text_font_loading.js +++ b/examples/text/text_font_loading.js @@ -1 +1,10776 @@ -var Module=typeof Module!="undefined"?Module:{};var ENVIRONMENT_IS_WEB=!!globalThis.window;var ENVIRONMENT_IS_WORKER=!!globalThis.WorkerGlobalScope;var ENVIRONMENT_IS_NODE=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer";var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var _scriptName=globalThis.document?.currentScript?.src;if(typeof __filename!="undefined"){_scriptName=__filename}else if(ENVIRONMENT_IS_WORKER){_scriptName=self.location.href}var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_NODE){var fs=require("node:fs");scriptDirectory=__dirname+"/";readBinary=filename=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename);return ret};readAsync=async(filename,binary=true)=>{filename=isFileURI(filename)?new URL(filename):filename;var ret=fs.readFileSync(filename,binary?undefined:"utf8");return ret};if(process.argv.length>1){thisProgram=process.argv[1].replace(/\\/g,"/")}arguments_=process.argv.slice(2);if(typeof module!="undefined"){module["exports"]=Module}quit_=(status,toThrow)=>{process.exitCode=status;throw toThrow}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){try{scriptDirectory=new URL(".",_scriptName).href}catch{}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=async url=>{if(isFileURI(url)){return new Promise((resolve,reject)=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=()=>{if(xhr.status==200||xhr.status==0&&xhr.response){resolve(xhr.response);return}reject(xhr.status)};xhr.onerror=reject;xhr.send(null)})}var response=await fetch(url,{credentials:"same-origin"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+" : "+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);var wasmBinary;var ABORT=false;var EXITSTATUS;var isFileURI=filename=>filename.startsWith("file://");var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var HEAP64,HEAPU64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);HEAPU8=new Uint8Array(b);HEAPU16=new Uint16Array(b);HEAP32=new Int32Array(b);HEAPU32=new Uint32Array(b);HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(onPreRuns)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();TTY.init();wasmExports["le"]();FS.ignorePermissions=false}function preMain(){}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(onPostRuns)}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);throw e}var wasmBinaryFile;function findWasmBinary(){return locateFile("text_font_loading.wasm")}function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}async function getWasmBinary(binaryFile){if(!wasmBinary){try{var response=await readAsync(binaryFile);return new Uint8Array(response)}catch{}}return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){if(!binary&&!isFileURI(binaryFile)&&!ENVIRONMENT_IS_NODE){try{var response=fetch(binaryFile,{credentials:"same-origin"});var instantiationResult=await WebAssembly.instantiateStreaming(response,imports);return instantiationResult}catch(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation")}}return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){var imports={a:wasmImports};return imports}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmExports=Asyncify.instrumentWasmExports(wasmExports);assignWasmExports(wasmExports);updateMemoryViews();removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){return receiveInstance(result["instance"])}var info=getWasmImports();if(Module["instantiateWasm"]){return new Promise((resolve,reject)=>{Module["instantiateWasm"](info,(inst,mod)=>{resolve(receiveInstance(inst,mod))})})}wasmBinaryFile??=findWasmBinary();var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}class ExitStatus{name="ExitStatus";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};var onPostRuns=[];var addOnPostRun=cb=>onPostRuns.push(cb);var onPreRuns=[];var addOnPreRun=cb=>onPreRuns.push(cb);var runDependencies=0;var dependenciesFulfilled=null;var removeRunDependency=id=>{runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}};var addRunDependency=id=>{runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)};var dynCalls={};var noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=globalThis.TextDecoder&&new TextDecoder;var findStringEnd=(heapOrArray,idx,maxBytesToRead,ignoreNul)=>{var maxIdx=idx+maxBytesToRead;if(ignoreNul)return maxIdx;while(heapOrArray[idx]&&!(idx>=maxIdx))++idx;return idx};var UTF8ArrayToString=(heapOrArray,idx=0,maxBytesToRead,ignoreNul)=>{var endPtr=findStringEnd(heapOrArray,idx,maxBytesToRead,ignoreNul);if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";var ___assert_fail=(condition,filename,line,func)=>abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"]);var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.slice(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.slice(0,-1)}return root+dir},basename:path=>path&&path.match(/([^\/]+|\/)\/*$/)[1],join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(ENVIRONMENT_IS_NODE){var nodeCrypto=require("node:crypto");return view=>nodeCrypto.randomFillSync(view)}return view=>crypto.getRandomValues(view)};var randomFill=view=>{(randomFill=initRandomFill())(view)};var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).slice(1);to=PATH_FS.resolve(to).slice(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=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;i++}}heap[outIdx]=0;return outIdx-startIdx};var intArrayFromString=(stringy,dontAddNull,length)=>{var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array};var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(ENVIRONMENT_IS_NODE){var BUFSIZE=256;var buf=Buffer.alloc(BUFSIZE);var bytesRead=0;var fd=process.stdin.fd;try{bytesRead=fs.readSync(fd,buf,0,BUFSIZE)}catch(e){if(e.toString().includes("EOF"))bytesRead=0;else throw e}if(bytesRead>0){result=buf.slice(0,bytesRead).toString("utf-8")}}else if(globalThis.window?.prompt){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output?.length>0){err(UTF8ArrayToString(tty.output));tty.output=[]}}}};var mmapAlloc=size=>{abort()};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16895,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=MEMFS.emptyFileContents??=new Uint8Array(0)}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.atime=node.mtime=node.ctime=Date.now();if(parent){parent.contents[name]=node;parent.atime=parent.mtime=parent.ctime=node.atime}return node},getFileDataAsTypedArray(node){return node.contents.subarray(0,node.usedBytes)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents.length;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity)newCapacity=Math.max(newCapacity,256);var oldContents=MEMFS.getFileDataAsTypedArray(node);node.contents=new Uint8Array(newCapacity);node.contents.set(oldContents)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;var oldContents=node.contents;node.contents=new Uint8Array(newSize);node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)));node.usedBytes=newSize},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.atime);attr.mtime=new Date(node.mtime);attr.ctime=new Date(node.ctime);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){for(const key of["mode","atime","mtime","ctime"]){if(attr[key]!=null){node[key]=attr[key]}}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){if(!MEMFS.doesNotExistError){MEMFS.doesNotExistError=new FS.ErrnoError(44);MEMFS.doesNotExistError.stack=""}throw MEMFS.doesNotExistError},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){if(FS.isDir(old_node.mode)){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}FS.hashRemoveNode(new_node)}delete old_node.parent.contents[old_node.name];new_dir.contents[new_name]=old_node;old_node.name=new_name;new_dir.ctime=new_dir.mtime=old_node.parent.ctime=old_node.parent.mtime=Date.now()},unlink(parent,name){delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.ctime=parent.mtime=Date.now()},readdir(node){return[".","..",...Object.keys(node.contents)]},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);buffer.set(contents.subarray(position,position+size),offset);return size},write(stream,buffer,offset,length,position,canOwn){if(!length)return 0;var node=stream.node;node.mtime=node.ctime=Date.now();if(canOwn){node.contents=buffer.subarray(offset,offset+length);node.usedBytes=length}else if(node.usedBytes===0&&position===0){node.contents=buffer.slice(offset,offset+length);node.usedBytes=length}else{MEMFS.expandFileStorage(node,position+length);node.contents.set(buffer.subarray(offset,offset+length),position);node.usedBytes=Math.max(node.usedBytes,position+length)}return length},llseek(stream,offset,whence){var position=offset;if(whence===1){position+=stream.position}else if(whence===2){if(FS.isFile(stream.node.mode)){position+=stream.node.usedBytes}}if(position<0){throw new FS.ErrnoError(28)}return position},mmap(stream,length,position,prot,flags){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}var ptr;var allocated;var contents=stream.node.contents;if(!(flags&2)&&contents.buffer===HEAP8.buffer){allocated=false;ptr=contents.byteOffset}else{allocated=true;ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}if(contents){if(position>0||position+length{if(typeof str!="string")return str;var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_fileDataToTypedArray=data=>{if(typeof data=="string"){data=intArrayFromString(data,true)}if(!data.subarray){data=new Uint8Array(data)}return data};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var asyncLoad=async url=>{var arrayBuffer=await readAsync(url);return new Uint8Array(arrayBuffer)};var FS_createDataFile=(...args)=>FS.createDataFile(...args);var getUniqueRunDependency=id=>id;var preloadPlugins=[];var FS_handledByPreloadPlugin=async(byteArray,fullname)=>{if(typeof Browser!="undefined")Browser.init();for(var plugin of preloadPlugins){if(plugin["canHandle"](fullname)){return plugin["handle"](byteArray,fullname)}}return byteArray};var FS_preloadFile=async(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);addRunDependency(dep);try{var byteArray=url;if(typeof url=="string"){byteArray=await asyncLoad(url)}byteArray=await FS_handledByPreloadPlugin(byteArray,fullname);preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}}finally{removeRunDependency(dep)}};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{FS_preloadFile(parent,name,url,canRead,canWrite,dontCreateFile,canOwn,preFinish).then(onload).catch(onerror)};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,filesystems:null,syncFSRequests:0,ErrnoError:class{name="ErrnoError";constructor(errno){this.errno=errno}},FSStream:class{shared={};get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{node_ops={};stream_ops={};readMode=292|73;writeMode=146;mounted=null;constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.rdev=rdev;this.atime=this.mtime=this.ctime=Date.now()}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){if(!path){throw new FS.ErrnoError(44)}opts.follow_mount??=true;if(!PATH.isAbs(path)){path=FS.cwd()+"/"+path}linkloop:for(var nlinks=0;nlinks<40;nlinks++){var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}if(perms.includes("w")&&!(node.mode&146)){return 2}if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){if(!FS.isDir(dir.mode)){return 54}try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else if(FS.isDir(node.mode)){return 31}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}var mode=FS.flagsToPermissionString(flags);if(FS.isDir(node.mode)){if(mode!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,mode)},checkOpExists(op,err){if(!op){throw new FS.ErrnoError(err)}return op},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},doSetAttr(stream,node,attr){var setattr=stream?.stream_ops.setattr;var arg=setattr?stream:node;setattr??=node.node_ops.setattr;FS.checkOpExists(setattr,63);setattr(arg,attr)},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}for(var mount of mounts){if(mount.type.syncfs){mount.type.syncfs(mount,populate,done)}else{done(null)}}},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);for(var[hash,current]of Object.entries(FS.nameTable)){while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}}node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name){throw new FS.ErrnoError(28)}if(name==="."||name===".."){throw new FS.ErrnoError(20)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},statfs(path){return FS.statfsNode(FS.lookupPath(path,{follow:true}).node)},statfsStream(stream){return FS.statfsNode(stream.node)},statfsNode(node){var rtn={bsize:4096,frsize:4096,blocks:1e6,bfree:5e5,bavail:5e5,files:FS.nextInode,ffree:FS.nextInode-1,fsid:42,flags:2,namelen:255};if(node.node_ops.statfs){Object.assign(rtn,node.node_ops.statfs(node.mount.opts.root))}return rtn},create(path,mode=438){mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode=511){mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var dir of dirs){if(!dir)continue;if(d||PATH.isAbs(path))d+="/";d+=dir;try{FS.mkdir(d,mode)}catch(e){if(e.errno!=20)throw e}}},mkdev(path,mode,dev){if(typeof dev=="undefined"){dev=mode;mode=438}mode|=8192;return FS.mknod(path,mode,dev)},symlink(oldpath,newpath){if(!PATH_FS.resolve(oldpath)){throw new FS.ErrnoError(44)}var lookup=FS.lookupPath(newpath,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var newname=PATH.basename(newpath);var errCode=FS.mayCreate(parent,newname);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.symlink){throw new FS.ErrnoError(63)}return parent.node_ops.symlink(parent,newname,oldpath)},rename(old_path,new_path){var old_dirname=PATH.dirname(old_path);var new_dirname=PATH.dirname(new_path);var old_name=PATH.basename(old_path);var new_name=PATH.basename(new_path);var lookup,old_dir,new_dir;lookup=FS.lookupPath(old_path,{parent:true});old_dir=lookup.node;lookup=FS.lookupPath(new_path,{parent:true});new_dir=lookup.node;if(!old_dir||!new_dir)throw new FS.ErrnoError(44);if(old_dir.mount!==new_dir.mount){throw new FS.ErrnoError(75)}var old_node=FS.lookupNode(old_dir,old_name);var relative=PATH_FS.relative(old_path,new_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(28)}relative=PATH_FS.relative(new_path,old_dirname);if(relative.charAt(0)!=="."){throw new FS.ErrnoError(55)}var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(old_node===new_node){return}var isdir=FS.isDir(old_node.mode);var errCode=FS.mayDelete(old_dir,old_name,isdir);if(errCode){throw new FS.ErrnoError(errCode)}errCode=new_node?FS.mayDelete(new_dir,new_name,isdir):FS.mayCreate(new_dir,new_name);if(errCode){throw new FS.ErrnoError(errCode)}if(!old_dir.node_ops.rename){throw new FS.ErrnoError(63)}if(FS.isMountpoint(old_node)||new_node&&FS.isMountpoint(new_node)){throw new FS.ErrnoError(10)}if(new_dir!==old_dir){errCode=FS.nodePermissions(old_dir,"w");if(errCode){throw new FS.ErrnoError(errCode)}}FS.hashRemoveNode(old_node);try{old_dir.node_ops.rename(old_node,new_dir,new_name);old_node.parent=new_dir}catch(e){throw e}finally{FS.hashAddNode(old_node)}},rmdir(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,true);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.rmdir){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.rmdir(parent,name);FS.destroyNode(node)},readdir(path){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var readdir=FS.checkOpExists(node.node_ops.readdir,54);return readdir(node)},unlink(path){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;if(!parent){throw new FS.ErrnoError(44)}var name=PATH.basename(path);var node=FS.lookupNode(parent,name);var errCode=FS.mayDelete(parent,name,false);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.unlink){throw new FS.ErrnoError(63)}if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}parent.node_ops.unlink(parent,name);FS.destroyNode(node)},readlink(path){var lookup=FS.lookupPath(path);var link=lookup.node;if(!link){throw new FS.ErrnoError(44)}if(!link.node_ops.readlink){throw new FS.ErrnoError(28)}return link.node_ops.readlink(link)},stat(path,dontFollow){var lookup=FS.lookupPath(path,{follow:!dontFollow});var node=lookup.node;var getattr=FS.checkOpExists(node.node_ops.getattr,63);return getattr(node)},fstat(fd){var stream=FS.getStreamChecked(fd);var node=stream.node;var getattr=stream.stream_ops.getattr;var arg=getattr?stream:node;getattr??=node.node_ops.getattr;FS.checkOpExists(getattr,63);return getattr(arg)},lstat(path){return FS.stat(path,true)},doChmod(stream,node,mode,dontFollow){FS.doSetAttr(stream,node,{mode:mode&4095|node.mode&~4095,ctime:Date.now(),dontFollow})},chmod(path,mode,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChmod(null,node,mode,dontFollow)},lchmod(path,mode){FS.chmod(path,mode,true)},fchmod(fd,mode){var stream=FS.getStreamChecked(fd);FS.doChmod(stream,stream.node,mode,false)},doChown(stream,node,dontFollow){FS.doSetAttr(stream,node,{timestamp:Date.now(),dontFollow})},chown(path,uid,gid,dontFollow){var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:!dontFollow});node=lookup.node}else{node=path}FS.doChown(null,node,dontFollow)},lchown(path,uid,gid){FS.chown(path,uid,gid,true)},fchown(fd,uid,gid){var stream=FS.getStreamChecked(fd);FS.doChown(stream,stream.node,false)},doTruncate(stream,node,len){if(FS.isDir(node.mode)){throw new FS.ErrnoError(31)}if(!FS.isFile(node.mode)){throw new FS.ErrnoError(28)}var errCode=FS.nodePermissions(node,"w");if(errCode){throw new FS.ErrnoError(errCode)}FS.doSetAttr(stream,node,{size:len,timestamp:Date.now()})},truncate(path,len){if(len<0){throw new FS.ErrnoError(28)}var node;if(typeof path=="string"){var lookup=FS.lookupPath(path,{follow:true});node=lookup.node}else{node=path}FS.doTruncate(null,node,len)},ftruncate(fd,len){var stream=FS.getStreamChecked(fd);if(len<0||(stream.flags&2097155)===0){throw new FS.ErrnoError(28)}FS.doTruncate(stream,stream.node,len)},utime(path,atime,mtime){var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;var setattr=FS.checkOpExists(node.node_ops.setattr,63);setattr(node,{atime,mtime})},open(path,flags,mode=438){if(path===""){throw new FS.ErrnoError(44)}flags=FS_modeStringToFlags(flags);if(flags&64){mode=mode&4095|32768}else{mode=0}var node;var isDirPath;if(typeof path=="object"){node=path}else{isDirPath=path.endsWith("/");var lookup=FS.lookupPath(path,{follow:!(flags&131072),noent_okay:true});node=lookup.node;path=lookup.path}var created=false;if(flags&64){if(node){if(flags&128){throw new FS.ErrnoError(20)}}else if(isDirPath){throw new FS.ErrnoError(31)}else{node=FS.mknod(path,mode|511,0);created=true}}if(!node){throw new FS.ErrnoError(44)}if(FS.isChrdev(node.mode)){flags&=~512}if(flags&65536&&!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}if(!created){var errCode=FS.mayOpen(node,flags);if(errCode){throw new FS.ErrnoError(errCode)}}if(flags&512&&!created){FS.truncate(node,0)}flags&=~(128|512|131072);var stream=FS.createStream({node,path:FS.getPath(node),flags,seekable:true,position:0,stream_ops:node.stream_ops,ungotten:[],error:false});if(stream.stream_ops.open){stream.stream_ops.open(stream)}if(created){FS.chmod(node,mode&511)}return stream},close(stream){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(stream.getdents)stream.getdents=null;try{if(stream.stream_ops.close){stream.stream_ops.close(stream)}}catch(e){throw e}finally{FS.closeStream(stream.fd)}stream.fd=null},isClosed(stream){return stream.fd===null},llseek(stream,offset,whence){if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if(!stream.seekable||!stream.stream_ops.llseek){throw new FS.ErrnoError(70)}if(whence!=0&&whence!=1&&whence!=2){throw new FS.ErrnoError(28)}stream.position=stream.stream_ops.llseek(stream,offset,whence);stream.ungotten=[];return stream.position},read(stream,buffer,offset,length,position){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.read){throw new FS.ErrnoError(28)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesRead=stream.stream_ops.read(stream,buffer,offset,length,position);if(!seeking)stream.position+=bytesRead;return bytesRead},write(stream,buffer,offset,length,position,canOwn){if(length<0||position<0){throw new FS.ErrnoError(28)}if(FS.isClosed(stream)){throw new FS.ErrnoError(8)}if((stream.flags&2097155)===0){throw new FS.ErrnoError(8)}if(FS.isDir(stream.node.mode)){throw new FS.ErrnoError(31)}if(!stream.stream_ops.write){throw new FS.ErrnoError(28)}if(stream.seekable&&stream.flags&1024){FS.llseek(stream,0,2)}var seeking=typeof position!="undefined";if(!seeking){position=stream.position}else if(!stream.seekable){throw new FS.ErrnoError(70)}var bytesWritten=stream.stream_ops.write(stream,buffer,offset,length,position,canOwn);if(!seeking)stream.position+=bytesWritten;return bytesWritten},mmap(stream,length,position,prot,flags){if((prot&2)!==0&&(flags&2)===0&&(stream.flags&2097155)!==2){throw new FS.ErrnoError(2)}if((stream.flags&2097155)===1){throw new FS.ErrnoError(2)}if(!stream.stream_ops.mmap){throw new FS.ErrnoError(43)}if(!length){throw new FS.ErrnoError(28)}return stream.stream_ops.mmap(stream,length,position,prot,flags)},msync(stream,buffer,offset,length,mmapFlags){if(!stream.stream_ops.msync){return 0}return stream.stream_ops.msync(stream,buffer,offset,length,mmapFlags)},ioctl(stream,cmd,arg){if(!stream.stream_ops.ioctl){throw new FS.ErrnoError(59)}return stream.stream_ops.ioctl(stream,cmd,arg)},readFile(path,opts={}){opts.flags=opts.flags||0;opts.encoding=opts.encoding||"binary";if(opts.encoding!=="utf8"&&opts.encoding!=="binary"){abort(`Invalid encoding type "${opts.encoding}"`)}var stream=FS.open(path,opts.flags);var stat=FS.stat(path);var length=stat.size;var buf=new Uint8Array(length);FS.read(stream,buf,0,length,0);if(opts.encoding==="utf8"){buf=UTF8ArrayToString(buf)}FS.close(stream);return buf},writeFile(path,data,opts={}){opts.flags=opts.flags||577;var stream=FS.open(path,opts.flags,opts.mode);data=FS_fileDataToTypedArray(data);FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn);FS.close(stream)},cwd:()=>FS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length,llseek:()=>0});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomFill(randomBuffer);randomLeft=randomBuffer.byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16895,73);node.stream_ops={llseek:MEMFS.stream_ops.llseek};node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path},id:fd+1};ret.parent=ret;return ret},readdir(){return Array.from(FS.streams.entries()).filter(([k,v])=>v).map(([k,v])=>k.toString())}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var stream of FS.streams){if(stream){FS.close(stream)}}},findObject(path,dontResolveLastLink){var ret=FS.analyzePath(path,dontResolveLastLink);if(!ret.exists){return null}return ret.object},analyzePath(path,dontResolveLastLink){try{var lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});path=lookup.path}catch(e){}var ret={isRoot:false,exists:false,error:0,name:null,path:null,object:null,parentExists:false,parentPath:null,parentObject:null};try{var lookup=FS.lookupPath(path,{parent:true});ret.parentExists=true;ret.parentPath=lookup.path;ret.parentObject=lookup.node;ret.name=PATH.basename(path);lookup=FS.lookupPath(path,{follow:!dontResolveLastLink});ret.exists=true;ret.path=lookup.path;ret.object=lookup.node;ret.name=lookup.node.name;ret.isRoot=lookup.path==="/"}catch(e){ret.error=e.errno}return ret},createPath(parent,path,canRead,canWrite){parent=typeof parent=="string"?parent:FS.getPath(parent);var parts=path.split("/").reverse();while(parts.length){var part=parts.pop();if(!part)continue;var current=PATH.join2(parent,part);try{FS.mkdir(current)}catch(e){if(e.errno!=20)throw e}parent=current}return current},createFile(parent,name,properties,canRead,canWrite){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(canRead,canWrite);return FS.create(path,mode)},createDataFile(parent,name,data,canRead,canWrite,canOwn){var path=name;if(parent){parent=typeof parent=="string"?parent:FS.getPath(parent);path=name?PATH.join2(parent,name):parent}var mode=FS_getMode(canRead,canWrite);var node=FS.create(path,mode);if(data){data=FS_fileDataToTypedArray(data);FS.chmod(node,mode|146);var stream=FS.open(node,577);FS.write(stream,data,0,data.length,0,canOwn);FS.close(stream);FS.chmod(node,mode)}},createDevice(parent,name,input,output){var path=PATH.join2(typeof parent=="string"?parent:FS.getPath(parent),name);var mode=FS_getMode(!!input,!!output);FS.createDevice.major??=64;var dev=FS.makedev(FS.createDevice.major++,0);FS.registerDevice(dev,{open(stream){stream.seekable=false},close(stream){if(output?.buffer?.length){output(10)}},read(stream,buffer,offset,length,pos){var bytesRead=0;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)abort("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)abort("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))abort("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")abort("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(globalThis.XMLHttpRequest){if(!ENVIRONMENT_IS_WORKER)abort("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};for(const[key,fn]of Object.entries(node.stream_ops)){stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}}function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return dir+"/"+path},writeStat(buf,stat){HEAPU32[buf>>2]=stat.dev;HEAPU32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAPU32[buf+12>>2]=stat.uid;HEAPU32[buf+16>>2]=stat.gid;HEAPU32[buf+20>>2]=stat.rdev;HEAP64[buf+24>>3]=BigInt(stat.size);HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();HEAP64[buf+40>>3]=BigInt(Math.floor(atime/1e3));HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;HEAP64[buf+56>>3]=BigInt(Math.floor(mtime/1e3));HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;HEAP64[buf+72>>3]=BigInt(Math.floor(ctime/1e3));HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;HEAP64[buf+88>>3]=BigInt(stat.ino);return 0},writeStatFs(buf,stats){HEAPU32[buf+4>>2]=stats.bsize;HEAPU32[buf+60>>2]=stats.bsize;HEAP64[buf+8>>3]=BigInt(stats.blocks);HEAP64[buf+16>>3]=BigInt(stats.bfree);HEAP64[buf+24>>3]=BigInt(stats.bavail);HEAP64[buf+32>>3]=BigInt(stats.files);HEAP64[buf+40>>3]=BigInt(stats.ffree);HEAPU32[buf+48>>2]=stats.fsid;HEAPU32[buf+64>>2]=stats.flags;HEAPU32[buf+56>>2]=stats.namelen},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var syscallGetVarargI=()=>{var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret};var syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(size>2]=termios.c_iflag||0;HEAP32[argp+4>>2]=termios.c_oflag||0;HEAP32[argp+8>>2]=termios.c_cflag||0;HEAP32[argp+12>>2]=termios.c_lflag||0;for(var i=0;i<32;i++){HEAP8[argp+i+17]=termios.c_cc[i]||0}return 0}return 0}case 21510:case 21511:case 21512:{if(!stream.tty)return-59;return 0}case 21506:case 21507:case 21508:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tcsets){var argp=syscallGetVarargP();var c_iflag=HEAP32[argp>>2];var c_oflag=HEAP32[argp+4>>2];var c_cflag=HEAP32[argp+8>>2];var c_lflag=HEAP32[argp+12>>2];var c_cc=[];for(var i=0;i<32;i++){c_cc.push(HEAP8[argp+i+17])}return stream.tty.ops.ioctl_tcsets(stream.tty,op,{c_iflag,c_oflag,c_cflag,c_lflag,c_cc})}return 0}case 21519:{if(!stream.tty)return-59;var argp=syscallGetVarargP();HEAP32[argp>>2]=0;return 0}case 21520:{if(!stream.tty)return-59;return-28}case 21537:case 21531:{var argp=syscallGetVarargP();return FS.ioctl(stream,op,argp)}case 21523:{if(!stream.tty)return-59;if(stream.tty.ops.ioctl_tiocgwinsz){var winsize=stream.tty.ops.ioctl_tiocgwinsz(stream.tty);var argp=syscallGetVarargP();HEAP16[argp>>1]=winsize[0];HEAP16[argp+2>>1]=winsize[1]}return 0}case 21524:{if(!stream.tty)return-59;return 0}case 21515:{if(!stream.tty)return-59;return 0}default:return-28}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_openat(dirfd,path,flags,varargs){SYSCALLS.varargs=varargs;try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);var mode=varargs?syscallGetVarargI():0;return FS.open(path,flags,mode).fd}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var _emscripten_get_now=()=>performance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function _clock_time_get(clk_id,ignored_precision,ptime){ignored_precision=bigintToI53Checked(ignored_precision);if(!checkWasiClock(clk_id)){return 28}var now;if(clk_id===0){now=_emscripten_date_now()}else if(nowIsMonotonic){now=_emscripten_get_now()}else{return 52}var nsec=Math.round(now*1e3*1e3);HEAP64[ptime>>3]=BigInt(nsec);return 0}var readEmAsmArgsArray=[];var readEmAsmArgs=(sigPtr,buf)=>{readEmAsmArgsArray.length=0;var ch;while(ch=HEAPU8[sigPtr++]){var wide=ch!=105;wide&=ch!=112;buf+=wide&&buf%8?4:0;readEmAsmArgsArray.push(ch==112?HEAPU32[buf>>2]:ch==106?HEAP64[buf>>3]:ch==105?HEAP32[buf>>2]:HEAPF64[buf>>3]);buf+=wide?8:4}return readEmAsmArgsArray};var runEmAsmFunction=(code,sigPtr,argbuf)=>{var args=readEmAsmArgs(sigPtr,argbuf);return ASM_CONSTS[code](...args)};var _emscripten_asm_const_double=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var _emscripten_asm_const_int=(code,sigPtr,argbuf)=>runEmAsmFunction(code,sigPtr,argbuf);var maybeCStringToJsString=cString=>cString>2?UTF8ToString(cString):cString;var specialHTMLTargets=[0,globalThis.document??0,globalThis.window??0];var findEventTarget=target=>{target=maybeCStringToJsString(target);var domElement=specialHTMLTargets[target]||globalThis.document?.querySelector(target);return domElement};var getBoundingClientRect=e=>specialHTMLTargets.indexOf(e)<0?e.getBoundingClientRect():{left:0,top:0};var _emscripten_get_element_css_size=(target,width,height)=>{target=findEventTarget(target);if(!target)return-4;var rect=getBoundingClientRect(target);HEAPF64[width>>3]=rect.width;HEAPF64[height>>3]=rect.height;return 0};var JSEvents={removeAllEventListeners(){while(JSEvents.eventHandlers.length){JSEvents._removeHandler(JSEvents.eventHandlers.length-1)}JSEvents.deferredCalls=[]},inEventHandler:0,deferredCalls:[],deferCall(targetFunction,precedence,argsList){function arraysHaveEqualContent(arrA,arrB){if(arrA.length!=arrB.length)return false;for(var i in arrA){if(arrA[i]!=arrB[i])return false}return true}for(var call of JSEvents.deferredCalls){if(call.targetFunction==targetFunction&&arraysHaveEqualContent(call.argsList,argsList)){return}}JSEvents.deferredCalls.push({targetFunction,precedence,argsList});JSEvents.deferredCalls.sort((x,y)=>x.precedencecall.targetFunction!=targetFunction)},canPerformEventHandlerRequests(){if(navigator.userActivation){return navigator.userActivation.isActive}return JSEvents.inEventHandler&&JSEvents.currentEventHandler.allowsDeferredCalls},runDeferredCalls(){if(!JSEvents.canPerformEventHandlerRequests()){return}var deferredCalls=JSEvents.deferredCalls;JSEvents.deferredCalls=[];for(var call of deferredCalls){call.targetFunction(...call.argsList)}},eventHandlers:[],removeAllHandlersOnTarget:(target,eventTypeString)=>{for(var i=0;i{HEAPF64[eventStruct>>3]=e.timestamp;for(var i=0;i>3]=e.axes[i]}for(var i=0;i>3]=e.buttons[i].value}else{HEAPF64[eventStruct+i*8+528>>3]=e.buttons[i]}}for(var i=0;i>2]=e.index;HEAP32[eventStruct+8>>2]=e.axes.length;HEAP32[eventStruct+12>>2]=e.buttons.length;stringToUTF8(e.id,eventStruct+1112,64);stringToUTF8(e.mapping,eventStruct+1176,64)};var _emscripten_get_gamepad_status=(index,gamepadState)=>{if(index<0||index>=JSEvents.lastGamepadState.length)return-5;if(!JSEvents.lastGamepadState[index])return-7;fillGamepadEventData(gamepadState,JSEvents.lastGamepadState[index]);return 0};var _emscripten_get_num_gamepads=()=>JSEvents.lastGamepadState.length;var GLctx;var webgl_enable_ANGLE_instanced_arrays=ctx=>{var ext=ctx.getExtension("ANGLE_instanced_arrays");if(ext){ctx["vertexAttribDivisor"]=(index,divisor)=>ext["vertexAttribDivisorANGLE"](index,divisor);ctx["drawArraysInstanced"]=(mode,first,count,primcount)=>ext["drawArraysInstancedANGLE"](mode,first,count,primcount);ctx["drawElementsInstanced"]=(mode,count,type,indices,primcount)=>ext["drawElementsInstancedANGLE"](mode,count,type,indices,primcount);return 1}};var webgl_enable_OES_vertex_array_object=ctx=>{var ext=ctx.getExtension("OES_vertex_array_object");if(ext){ctx["createVertexArray"]=()=>ext["createVertexArrayOES"]();ctx["deleteVertexArray"]=vao=>ext["deleteVertexArrayOES"](vao);ctx["bindVertexArray"]=vao=>ext["bindVertexArrayOES"](vao);ctx["isVertexArray"]=vao=>ext["isVertexArrayOES"](vao);return 1}};var webgl_enable_WEBGL_draw_buffers=ctx=>{var ext=ctx.getExtension("WEBGL_draw_buffers");if(ext){ctx["drawBuffers"]=(n,bufs)=>ext["drawBuffersWEBGL"](n,bufs);return 1}};var webgl_enable_EXT_polygon_offset_clamp=ctx=>!!(ctx.extPolygonOffsetClamp=ctx.getExtension("EXT_polygon_offset_clamp"));var webgl_enable_EXT_clip_control=ctx=>!!(ctx.extClipControl=ctx.getExtension("EXT_clip_control"));var webgl_enable_WEBGL_polygon_mode=ctx=>!!(ctx.webglPolygonMode=ctx.getExtension("WEBGL_polygon_mode"));var webgl_enable_WEBGL_multi_draw=ctx=>!!(ctx.multiDrawWebgl=ctx.getExtension("WEBGL_multi_draw"));var getEmscriptenSupportedExtensions=ctx=>{var supportedExtensions=["ANGLE_instanced_arrays","EXT_blend_minmax","EXT_disjoint_timer_query","EXT_frag_depth","EXT_shader_texture_lod","EXT_sRGB","OES_element_index_uint","OES_fbo_render_mipmap","OES_standard_derivatives","OES_texture_float","OES_texture_half_float","OES_texture_half_float_linear","OES_vertex_array_object","WEBGL_color_buffer_float","WEBGL_depth_texture","WEBGL_draw_buffers","EXT_clip_control","EXT_color_buffer_half_float","EXT_depth_clamp","EXT_float_blend","EXT_polygon_offset_clamp","EXT_texture_compression_bptc","EXT_texture_compression_rgtc","EXT_texture_filter_anisotropic","KHR_parallel_shader_compile","OES_texture_float_linear","WEBGL_blend_func_extended","WEBGL_compressed_texture_astc","WEBGL_compressed_texture_etc","WEBGL_compressed_texture_etc1","WEBGL_compressed_texture_s3tc","WEBGL_compressed_texture_s3tc_srgb","WEBGL_debug_renderer_info","WEBGL_debug_shaders","WEBGL_lose_context","WEBGL_multi_draw","WEBGL_polygon_mode"];return(ctx.getSupportedExtensions()||[]).filter(ext=>supportedExtensions.includes(ext))};var GL={counter:1,buffers:[],programs:[],framebuffers:[],renderbuffers:[],textures:[],shaders:[],vaos:[],contexts:[],offscreenCanvases:{},queries:[],stringCache:{},unpackAlignment:4,unpackRowLength:0,recordError:errorCode=>{if(!GL.lastError){GL.lastError=errorCode}},getNewId:table=>{var ret=GL.counter++;for(var i=table.length;i{for(var i=0;i>2]=id}},getSource:(shader,count,string,length)=>{var source="";for(var i=0;i>2]:undefined;source+=UTF8ToString(HEAPU32[string+i*4>>2],len)}return source},createContext:(canvas,webGLContextAttributes)=>{if(!canvas.getContextSafariWebGL2Fixed){canvas.getContextSafariWebGL2Fixed=canvas.getContext;function fixedGetContext(ver,attrs){var gl=canvas.getContextSafariWebGL2Fixed(ver,attrs);return ver=="webgl"==gl instanceof WebGLRenderingContext?gl:null}canvas.getContext=fixedGetContext}var ctx=canvas.getContext("webgl",webGLContextAttributes);if(!ctx)return 0;var handle=GL.registerContext(ctx,webGLContextAttributes);return handle},registerContext:(ctx,webGLContextAttributes)=>{var handle=GL.getNewId(GL.contexts);var context={handle,attributes:webGLContextAttributes,version:webGLContextAttributes.majorVersion,GLctx:ctx};if(ctx.canvas)ctx.canvas.GLctxObject=context;GL.contexts[handle]=context;if(typeof webGLContextAttributes.enableExtensionsByDefault=="undefined"||webGLContextAttributes.enableExtensionsByDefault){GL.initExtensions(context)}return handle},makeContextCurrent:contextHandle=>{GL.currentContext=GL.contexts[contextHandle];Module["ctx"]=GLctx=GL.currentContext?.GLctx;return!(contextHandle&&!GLctx)},getContext:contextHandle=>GL.contexts[contextHandle],deleteContext:contextHandle=>{if(GL.currentContext===GL.contexts[contextHandle]){GL.currentContext=null}if(typeof JSEvents=="object"){JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas)}if(GL.contexts[contextHandle]?.GLctx.canvas){GL.contexts[contextHandle].GLctx.canvas.GLctxObject=undefined}GL.contexts[contextHandle]=null},initExtensions:context=>{context||=GL.currentContext;if(context.initExtensionsDone)return;context.initExtensionsDone=true;var GLctx=context.GLctx;webgl_enable_WEBGL_multi_draw(GLctx);webgl_enable_EXT_polygon_offset_clamp(GLctx);webgl_enable_EXT_clip_control(GLctx);webgl_enable_WEBGL_polygon_mode(GLctx);webgl_enable_ANGLE_instanced_arrays(GLctx);webgl_enable_OES_vertex_array_object(GLctx);webgl_enable_WEBGL_draw_buffers(GLctx);{GLctx.disjointTimerQueryExt=GLctx.getExtension("EXT_disjoint_timer_query")}for(var ext of getEmscriptenSupportedExtensions(GLctx)){if(!ext.includes("lose_context")&&!ext.includes("debug")){GLctx.getExtension(ext)}}}};var _emscripten_glActiveTexture=x0=>GLctx.activeTexture(x0);var _emscripten_glAttachShader=(program,shader)=>{GLctx.attachShader(GL.programs[program],GL.shaders[shader])};var _emscripten_glBeginQueryEXT=(target,id)=>{GLctx.disjointTimerQueryExt["beginQueryEXT"](target,GL.queries[id])};var _emscripten_glBindAttribLocation=(program,index,name)=>{GLctx.bindAttribLocation(GL.programs[program],index,UTF8ToString(name))};var _emscripten_glBindBuffer=(target,buffer)=>{GLctx.bindBuffer(target,GL.buffers[buffer])};var _emscripten_glBindFramebuffer=(target,framebuffer)=>{GLctx.bindFramebuffer(target,GL.framebuffers[framebuffer])};var _emscripten_glBindRenderbuffer=(target,renderbuffer)=>{GLctx.bindRenderbuffer(target,GL.renderbuffers[renderbuffer])};var _emscripten_glBindTexture=(target,texture)=>{GLctx.bindTexture(target,GL.textures[texture])};var _emscripten_glBindVertexArray=vao=>{GLctx.bindVertexArray(GL.vaos[vao])};var _glBindVertexArray=_emscripten_glBindVertexArray;var _emscripten_glBindVertexArrayOES=_glBindVertexArray;var _emscripten_glBlendColor=(x0,x1,x2,x3)=>GLctx.blendColor(x0,x1,x2,x3);var _emscripten_glBlendEquation=x0=>GLctx.blendEquation(x0);var _emscripten_glBlendEquationSeparate=(x0,x1)=>GLctx.blendEquationSeparate(x0,x1);var _emscripten_glBlendFunc=(x0,x1)=>GLctx.blendFunc(x0,x1);var _emscripten_glBlendFuncSeparate=(x0,x1,x2,x3)=>GLctx.blendFuncSeparate(x0,x1,x2,x3);var _emscripten_glBufferData=(target,size,data,usage)=>{GLctx.bufferData(target,data?HEAPU8.subarray(data,data+size):size,usage)};var _emscripten_glBufferSubData=(target,offset,size,data)=>{GLctx.bufferSubData(target,offset,HEAPU8.subarray(data,data+size))};var _emscripten_glCheckFramebufferStatus=x0=>GLctx.checkFramebufferStatus(x0);var _emscripten_glClear=x0=>GLctx.clear(x0);var _emscripten_glClearColor=(x0,x1,x2,x3)=>GLctx.clearColor(x0,x1,x2,x3);var _emscripten_glClearDepthf=x0=>GLctx.clearDepth(x0);var _emscripten_glClearStencil=x0=>GLctx.clearStencil(x0);var _emscripten_glClipControlEXT=(origin,depth)=>{GLctx.extClipControl["clipControlEXT"](origin,depth)};var _emscripten_glColorMask=(red,green,blue,alpha)=>{GLctx.colorMask(!!red,!!green,!!blue,!!alpha)};var _emscripten_glCompileShader=shader=>{GLctx.compileShader(GL.shaders[shader])};var _emscripten_glCompressedTexImage2D=(target,level,internalFormat,width,height,border,imageSize,data)=>{GLctx.compressedTexImage2D(target,level,internalFormat,width,height,border,HEAPU8.subarray(data,data+imageSize))};var _emscripten_glCompressedTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,imageSize,data)=>{GLctx.compressedTexSubImage2D(target,level,xoffset,yoffset,width,height,format,HEAPU8.subarray(data,data+imageSize))};var _emscripten_glCopyTexImage2D=(x0,x1,x2,x3,x4,x5,x6,x7)=>GLctx.copyTexImage2D(x0,x1,x2,x3,x4,x5,x6,x7);var _emscripten_glCopyTexSubImage2D=(x0,x1,x2,x3,x4,x5,x6,x7)=>GLctx.copyTexSubImage2D(x0,x1,x2,x3,x4,x5,x6,x7);var _emscripten_glCreateProgram=()=>{var id=GL.getNewId(GL.programs);var program=GLctx.createProgram();program.name=id;program.maxUniformLength=program.maxAttributeLength=program.maxUniformBlockNameLength=0;program.uniformIdCounter=1;GL.programs[id]=program;return id};var _emscripten_glCreateShader=shaderType=>{var id=GL.getNewId(GL.shaders);GL.shaders[id]=GLctx.createShader(shaderType);return id};var _emscripten_glCullFace=x0=>GLctx.cullFace(x0);var _emscripten_glDeleteBuffers=(n,buffers)=>{for(var i=0;i>2];var buffer=GL.buffers[id];if(!buffer)continue;GLctx.deleteBuffer(buffer);buffer.name=0;GL.buffers[id]=null}};var _emscripten_glDeleteFramebuffers=(n,framebuffers)=>{for(var i=0;i>2];var framebuffer=GL.framebuffers[id];if(!framebuffer)continue;GLctx.deleteFramebuffer(framebuffer);framebuffer.name=0;GL.framebuffers[id]=null}};var _emscripten_glDeleteProgram=id=>{if(!id)return;var program=GL.programs[id];if(!program){GL.recordError(1281);return}GLctx.deleteProgram(program);program.name=0;GL.programs[id]=null};var _emscripten_glDeleteQueriesEXT=(n,ids)=>{for(var i=0;i>2];var query=GL.queries[id];if(!query)continue;GLctx.disjointTimerQueryExt["deleteQueryEXT"](query);GL.queries[id]=null}};var _emscripten_glDeleteRenderbuffers=(n,renderbuffers)=>{for(var i=0;i>2];var renderbuffer=GL.renderbuffers[id];if(!renderbuffer)continue;GLctx.deleteRenderbuffer(renderbuffer);renderbuffer.name=0;GL.renderbuffers[id]=null}};var _emscripten_glDeleteShader=id=>{if(!id)return;var shader=GL.shaders[id];if(!shader){GL.recordError(1281);return}GLctx.deleteShader(shader);GL.shaders[id]=null};var _emscripten_glDeleteTextures=(n,textures)=>{for(var i=0;i>2];var texture=GL.textures[id];if(!texture)continue;GLctx.deleteTexture(texture);texture.name=0;GL.textures[id]=null}};var _emscripten_glDeleteVertexArrays=(n,vaos)=>{for(var i=0;i>2];GLctx.deleteVertexArray(GL.vaos[id]);GL.vaos[id]=null}};var _glDeleteVertexArrays=_emscripten_glDeleteVertexArrays;var _emscripten_glDeleteVertexArraysOES=_glDeleteVertexArrays;var _emscripten_glDepthFunc=x0=>GLctx.depthFunc(x0);var _emscripten_glDepthMask=flag=>{GLctx.depthMask(!!flag)};var _emscripten_glDepthRangef=(x0,x1)=>GLctx.depthRange(x0,x1);var _emscripten_glDetachShader=(program,shader)=>{GLctx.detachShader(GL.programs[program],GL.shaders[shader])};var _emscripten_glDisable=x0=>GLctx.disable(x0);var _emscripten_glDisableVertexAttribArray=index=>{GLctx.disableVertexAttribArray(index)};var _emscripten_glDrawArrays=(mode,first,count)=>{GLctx.drawArrays(mode,first,count)};var _emscripten_glDrawArraysInstanced=(mode,first,count,primcount)=>{GLctx.drawArraysInstanced(mode,first,count,primcount)};var _glDrawArraysInstanced=_emscripten_glDrawArraysInstanced;var _emscripten_glDrawArraysInstancedANGLE=_glDrawArraysInstanced;var tempFixedLengthArray=[];var _emscripten_glDrawBuffers=(n,bufs)=>{var bufArray=tempFixedLengthArray[n];for(var i=0;i>2]}GLctx.drawBuffers(bufArray)};var _glDrawBuffers=_emscripten_glDrawBuffers;var _emscripten_glDrawBuffersWEBGL=_glDrawBuffers;var _emscripten_glDrawElements=(mode,count,type,indices)=>{GLctx.drawElements(mode,count,type,indices)};var _emscripten_glDrawElementsInstanced=(mode,count,type,indices,primcount)=>{GLctx.drawElementsInstanced(mode,count,type,indices,primcount)};var _glDrawElementsInstanced=_emscripten_glDrawElementsInstanced;var _emscripten_glDrawElementsInstancedANGLE=_glDrawElementsInstanced;var _emscripten_glEnable=x0=>GLctx.enable(x0);var _emscripten_glEnableVertexAttribArray=index=>{GLctx.enableVertexAttribArray(index)};var _emscripten_glEndQueryEXT=target=>{GLctx.disjointTimerQueryExt["endQueryEXT"](target)};var _emscripten_glFinish=()=>GLctx.finish();var _emscripten_glFlush=()=>GLctx.flush();var _emscripten_glFramebufferRenderbuffer=(target,attachment,renderbuffertarget,renderbuffer)=>{GLctx.framebufferRenderbuffer(target,attachment,renderbuffertarget,GL.renderbuffers[renderbuffer])};var _emscripten_glFramebufferTexture2D=(target,attachment,textarget,texture,level)=>{GLctx.framebufferTexture2D(target,attachment,textarget,GL.textures[texture],level)};var _emscripten_glFrontFace=x0=>GLctx.frontFace(x0);var _emscripten_glGenBuffers=(n,buffers)=>{GL.genObject(n,buffers,"createBuffer",GL.buffers)};var _emscripten_glGenFramebuffers=(n,ids)=>{GL.genObject(n,ids,"createFramebuffer",GL.framebuffers)};var _emscripten_glGenQueriesEXT=(n,ids)=>{for(var i=0;i>2]=0;return}var id=GL.getNewId(GL.queries);query.name=id;GL.queries[id]=query;HEAP32[ids+i*4>>2]=id}};var _emscripten_glGenRenderbuffers=(n,renderbuffers)=>{GL.genObject(n,renderbuffers,"createRenderbuffer",GL.renderbuffers)};var _emscripten_glGenTextures=(n,textures)=>{GL.genObject(n,textures,"createTexture",GL.textures)};var _emscripten_glGenVertexArrays=(n,arrays)=>{GL.genObject(n,arrays,"createVertexArray",GL.vaos)};var _glGenVertexArrays=_emscripten_glGenVertexArrays;var _emscripten_glGenVertexArraysOES=_glGenVertexArrays;var _emscripten_glGenerateMipmap=x0=>GLctx.generateMipmap(x0);var __glGetActiveAttribOrUniform=(funcName,program,index,bufSize,length,size,type,name)=>{program=GL.programs[program];var info=GLctx[funcName](program,index);if(info){var numBytesWrittenExclNull=name&&stringToUTF8(info.name,name,bufSize);if(length)HEAP32[length>>2]=numBytesWrittenExclNull;if(size)HEAP32[size>>2]=info.size;if(type)HEAP32[type>>2]=info.type}};var _emscripten_glGetActiveAttrib=(program,index,bufSize,length,size,type,name)=>__glGetActiveAttribOrUniform("getActiveAttrib",program,index,bufSize,length,size,type,name);var _emscripten_glGetActiveUniform=(program,index,bufSize,length,size,type,name)=>__glGetActiveAttribOrUniform("getActiveUniform",program,index,bufSize,length,size,type,name);var _emscripten_glGetAttachedShaders=(program,maxCount,count,shaders)=>{var result=GLctx.getAttachedShaders(GL.programs[program]);var len=result.length;if(len>maxCount){len=maxCount}HEAP32[count>>2]=len;for(var i=0;i>2]=id}};var _emscripten_glGetAttribLocation=(program,name)=>GLctx.getAttribLocation(GL.programs[program],UTF8ToString(name));var writeI53ToI64=(ptr,num)=>{HEAPU32[ptr>>2]=num;var lower=HEAPU32[ptr>>2];HEAPU32[ptr+4>>2]=(num-lower)/4294967296};var emscriptenWebGLGet=(name_,p,type)=>{if(!p){GL.recordError(1281);return}var ret=undefined;switch(name_){case 36346:ret=1;break;case 36344:if(type!=0&&type!=1){GL.recordError(1280)}return;case 36345:ret=0;break;case 34466:var formats=GLctx.getParameter(34467);ret=formats?formats.length:0;break}if(ret===undefined){var result=GLctx.getParameter(name_);switch(typeof result){case"number":ret=result;break;case"boolean":ret=result?1:0;break;case"string":GL.recordError(1280);return;case"object":if(result===null){switch(name_){case 34964:case 35725:case 34965:case 36006:case 36007:case 32873:case 34229:case 34068:{ret=0;break}default:{GL.recordError(1280);return}}}else if(result instanceof Float32Array||result instanceof Uint32Array||result instanceof Int32Array||result instanceof Array){for(var i=0;i>2]=result[i];break;case 2:HEAPF32[p+i*4>>2]=result[i];break;case 4:HEAP8[p+i]=result[i]?1:0;break}}return}else{try{ret=result.name|0}catch(e){GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Unknown object returned from WebGL getParameter(${name_})! (error: ${e})`);return}}break;default:GL.recordError(1280);err(`GL_INVALID_ENUM in glGet${type}v: Native code calling glGet${type}v(${name_}) and it returns ${result} of type ${typeof result}!`);return}}switch(type){case 1:writeI53ToI64(p,ret);break;case 0:HEAP32[p>>2]=ret;break;case 2:HEAPF32[p>>2]=ret;break;case 4:HEAP8[p]=ret?1:0;break}};var _emscripten_glGetBooleanv=(name_,p)=>emscriptenWebGLGet(name_,p,4);var _emscripten_glGetBufferParameteriv=(target,value,data)=>{if(!data){GL.recordError(1281);return}HEAP32[data>>2]=GLctx.getBufferParameter(target,value)};var _emscripten_glGetError=()=>{var error=GLctx.getError()||GL.lastError;GL.lastError=0;return error};var _emscripten_glGetFloatv=(name_,p)=>emscriptenWebGLGet(name_,p,2);var _emscripten_glGetFramebufferAttachmentParameteriv=(target,attachment,pname,params)=>{var result=GLctx.getFramebufferAttachmentParameter(target,attachment,pname);if(result instanceof WebGLRenderbuffer||result instanceof WebGLTexture){result=result.name|0}HEAP32[params>>2]=result};var _emscripten_glGetIntegerv=(name_,p)=>emscriptenWebGLGet(name_,p,0);var _emscripten_glGetProgramInfoLog=(program,maxLength,length,infoLog)=>{var log=GLctx.getProgramInfoLog(GL.programs[program]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetProgramiv=(program,pname,p)=>{if(!p){GL.recordError(1281);return}if(program>=GL.counter){GL.recordError(1281);return}program=GL.programs[program];if(pname==35716){var log=GLctx.getProgramInfoLog(program);if(log===null)log="(unknown error)";HEAP32[p>>2]=log.length+1}else if(pname==35719){if(!program.maxUniformLength){var numActiveUniforms=GLctx.getProgramParameter(program,35718);for(var i=0;i>2]=program.maxUniformLength}else if(pname==35722){if(!program.maxAttributeLength){var numActiveAttributes=GLctx.getProgramParameter(program,35721);for(var i=0;i>2]=program.maxAttributeLength}else if(pname==35381){if(!program.maxUniformBlockNameLength){var numActiveUniformBlocks=GLctx.getProgramParameter(program,35382);for(var i=0;i>2]=program.maxUniformBlockNameLength}else{HEAP32[p>>2]=GLctx.getProgramParameter(program,pname)}};var _emscripten_glGetQueryObjecti64vEXT=(id,pname,params)=>{if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param;{param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname)}var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}writeI53ToI64(params,ret)};var _emscripten_glGetQueryObjectivEXT=(id,pname,params)=>{if(!params){GL.recordError(1281);return}var query=GL.queries[id];var param=GLctx.disjointTimerQueryExt["getQueryObjectEXT"](query,pname);var ret;if(typeof param=="boolean"){ret=param?1:0}else{ret=param}HEAP32[params>>2]=ret};var _glGetQueryObjecti64vEXT=_emscripten_glGetQueryObjecti64vEXT;var _emscripten_glGetQueryObjectui64vEXT=_glGetQueryObjecti64vEXT;var _glGetQueryObjectivEXT=_emscripten_glGetQueryObjectivEXT;var _emscripten_glGetQueryObjectuivEXT=_glGetQueryObjectivEXT;var _emscripten_glGetQueryivEXT=(target,pname,params)=>{if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.disjointTimerQueryExt["getQueryEXT"](target,pname)};var _emscripten_glGetRenderbufferParameteriv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getRenderbufferParameter(target,pname)};var _emscripten_glGetShaderInfoLog=(shader,maxLength,length,infoLog)=>{var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var numBytesWrittenExclNull=maxLength>0&&infoLog?stringToUTF8(log,infoLog,maxLength):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetShaderPrecisionFormat=(shaderType,precisionType,range,precision)=>{var result=GLctx.getShaderPrecisionFormat(shaderType,precisionType);HEAP32[range>>2]=result.rangeMin;HEAP32[range+4>>2]=result.rangeMax;HEAP32[precision>>2]=result.precision};var _emscripten_glGetShaderSource=(shader,bufSize,length,source)=>{var result=GLctx.getShaderSource(GL.shaders[shader]);if(!result)return;var numBytesWrittenExclNull=bufSize>0&&source?stringToUTF8(result,source,bufSize):0;if(length)HEAP32[length>>2]=numBytesWrittenExclNull};var _emscripten_glGetShaderiv=(shader,pname,p)=>{if(!p){GL.recordError(1281);return}if(pname==35716){var log=GLctx.getShaderInfoLog(GL.shaders[shader]);if(log===null)log="(unknown error)";var logLength=log?log.length+1:0;HEAP32[p>>2]=logLength}else if(pname==35720){var source=GLctx.getShaderSource(GL.shaders[shader]);var sourceLength=source?source.length+1:0;HEAP32[p>>2]=sourceLength}else{HEAP32[p>>2]=GLctx.getShaderParameter(GL.shaders[shader],pname)}};var stringToNewUTF8=str=>{var size=lengthBytesUTF8(str)+1;var ret=_malloc(size);if(ret)stringToUTF8(str,ret,size);return ret};var webglGetExtensions=()=>{var exts=getEmscriptenSupportedExtensions(GLctx);exts=exts.concat(exts.map(e=>"GL_"+e));return exts};var _emscripten_glGetString=name_=>{var ret=GL.stringCache[name_];if(!ret){switch(name_){case 7939:ret=stringToNewUTF8(webglGetExtensions().join(" "));break;case 7936:case 7937:case 37445:case 37446:var s=GLctx.getParameter(name_);if(!s){GL.recordError(1280)}ret=s?stringToNewUTF8(s):0;break;case 7938:var webGLVersion=GLctx.getParameter(7938);var glVersion=`OpenGL ES 2.0 (${webGLVersion})`;ret=stringToNewUTF8(glVersion);break;case 35724:var glslVersion=GLctx.getParameter(35724);var ver_re=/^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/;var ver_num=glslVersion.match(ver_re);if(ver_num!==null){if(ver_num[1].length==3)ver_num[1]=ver_num[1]+"0";glslVersion=`OpenGL ES GLSL ES ${ver_num[1]} (${glslVersion})`}ret=stringToNewUTF8(glslVersion);break;default:GL.recordError(1280)}GL.stringCache[name_]=ret}return ret};var _emscripten_glGetTexParameterfv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}HEAPF32[params>>2]=GLctx.getTexParameter(target,pname)};var _emscripten_glGetTexParameteriv=(target,pname,params)=>{if(!params){GL.recordError(1281);return}HEAP32[params>>2]=GLctx.getTexParameter(target,pname)};var jstoi_q=str=>parseInt(str);var webglGetLeftBracePos=name=>name.slice(-1)=="]"&&name.lastIndexOf("[");var webglPrepareUniformLocationsBeforeFirstUse=program=>{var uniformLocsById=program.uniformLocsById,uniformSizeAndIdsByName=program.uniformSizeAndIdsByName,i,j;if(!uniformLocsById){program.uniformLocsById=uniformLocsById={};program.uniformArrayNamesById={};var numActiveUniforms=GLctx.getProgramParameter(program,35718);for(i=0;i0?nm.slice(0,lb):nm;var id=program.uniformIdCounter;program.uniformIdCounter+=sz;uniformSizeAndIdsByName[arrayName]=[sz,id];for(j=0;j{name=UTF8ToString(name);if(program=GL.programs[program]){webglPrepareUniformLocationsBeforeFirstUse(program);var uniformLocsById=program.uniformLocsById;var arrayIndex=0;var uniformBaseName=name;var leftBrace=webglGetLeftBracePos(name);if(leftBrace>0){arrayIndex=jstoi_q(name.slice(leftBrace+1))>>>0;uniformBaseName=name.slice(0,leftBrace)}var sizeAndId=program.uniformSizeAndIdsByName[uniformBaseName];if(sizeAndId&&arrayIndex{var p=GLctx.currentProgram;if(p){var webglLoc=p.uniformLocsById[location];if(typeof webglLoc=="number"){p.uniformLocsById[location]=webglLoc=GLctx.getUniformLocation(p,p.uniformArrayNamesById[location]+(webglLoc>0?`[${webglLoc}]`:""))}return webglLoc}else{GL.recordError(1282)}};var emscriptenWebGLGetUniform=(program,location,params,type)=>{if(!params){GL.recordError(1281);return}program=GL.programs[program];webglPrepareUniformLocationsBeforeFirstUse(program);var data=GLctx.getUniform(program,webglGetUniformLocation(location));if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break}}}};var _emscripten_glGetUniformfv=(program,location,params)=>{emscriptenWebGLGetUniform(program,location,params,2)};var _emscripten_glGetUniformiv=(program,location,params)=>{emscriptenWebGLGetUniform(program,location,params,0)};var _emscripten_glGetVertexAttribPointerv=(index,pname,pointer)=>{if(!pointer){GL.recordError(1281);return}HEAP32[pointer>>2]=GLctx.getVertexAttribOffset(index,pname)};var emscriptenWebGLGetVertexAttrib=(index,pname,params,type)=>{if(!params){GL.recordError(1281);return}var data=GLctx.getVertexAttrib(index,pname);if(pname==34975){HEAP32[params>>2]=data&&data["name"]}else if(typeof data=="number"||typeof data=="boolean"){switch(type){case 0:HEAP32[params>>2]=data;break;case 2:HEAPF32[params>>2]=data;break;case 5:HEAP32[params>>2]=Math.fround(data);break}}else{for(var i=0;i>2]=data[i];break;case 2:HEAPF32[params+i*4>>2]=data[i];break;case 5:HEAP32[params+i*4>>2]=Math.fround(data[i]);break}}}};var _emscripten_glGetVertexAttribfv=(index,pname,params)=>{emscriptenWebGLGetVertexAttrib(index,pname,params,2)};var _emscripten_glGetVertexAttribiv=(index,pname,params)=>{emscriptenWebGLGetVertexAttrib(index,pname,params,5)};var _emscripten_glHint=(x0,x1)=>GLctx.hint(x0,x1);var _emscripten_glIsBuffer=buffer=>{var b=GL.buffers[buffer];if(!b)return 0;return GLctx.isBuffer(b)};var _emscripten_glIsEnabled=x0=>GLctx.isEnabled(x0);var _emscripten_glIsFramebuffer=framebuffer=>{var fb=GL.framebuffers[framebuffer];if(!fb)return 0;return GLctx.isFramebuffer(fb)};var _emscripten_glIsProgram=program=>{program=GL.programs[program];if(!program)return 0;return GLctx.isProgram(program)};var _emscripten_glIsQueryEXT=id=>{var query=GL.queries[id];if(!query)return 0;return GLctx.disjointTimerQueryExt["isQueryEXT"](query)};var _emscripten_glIsRenderbuffer=renderbuffer=>{var rb=GL.renderbuffers[renderbuffer];if(!rb)return 0;return GLctx.isRenderbuffer(rb)};var _emscripten_glIsShader=shader=>{var s=GL.shaders[shader];if(!s)return 0;return GLctx.isShader(s)};var _emscripten_glIsTexture=id=>{var texture=GL.textures[id];if(!texture)return 0;return GLctx.isTexture(texture)};var _emscripten_glIsVertexArray=array=>{var vao=GL.vaos[array];if(!vao)return 0;return GLctx.isVertexArray(vao)};var _glIsVertexArray=_emscripten_glIsVertexArray;var _emscripten_glIsVertexArrayOES=_glIsVertexArray;var _emscripten_glLineWidth=x0=>GLctx.lineWidth(x0);var _emscripten_glLinkProgram=program=>{program=GL.programs[program];GLctx.linkProgram(program);program.uniformLocsById=0;program.uniformSizeAndIdsByName={}};var _emscripten_glPixelStorei=(pname,param)=>{if(pname==3317){GL.unpackAlignment=param}else if(pname==3314){GL.unpackRowLength=param}GLctx.pixelStorei(pname,param)};var _emscripten_glPolygonModeWEBGL=(face,mode)=>{GLctx.webglPolygonMode["polygonModeWEBGL"](face,mode)};var _emscripten_glPolygonOffset=(x0,x1)=>GLctx.polygonOffset(x0,x1);var _emscripten_glPolygonOffsetClampEXT=(factor,units,clamp)=>{GLctx.extPolygonOffsetClamp["polygonOffsetClampEXT"](factor,units,clamp)};var _emscripten_glQueryCounterEXT=(id,target)=>{GLctx.disjointTimerQueryExt["queryCounterEXT"](GL.queries[id],target)};var computeUnpackAlignedImageSize=(width,height,sizePerPixel)=>{function roundedToNextMultipleOf(x,y){return x+y-1&-y}var plainRowSize=(GL.unpackRowLength||width)*sizePerPixel;var alignedRowSize=roundedToNextMultipleOf(plainRowSize,GL.unpackAlignment);return height*alignedRowSize};var colorChannelsInGlTextureFormat=format=>{var colorChannels={5:3,6:4,8:2,29502:3,29504:4};return colorChannels[format-6402]||1};var heapObjectForWebGLType=type=>{type-=5120;if(type==1)return HEAPU8;if(type==4)return HEAP32;if(type==6)return HEAPF32;if(type==5||type==28922)return HEAPU32;return HEAPU16};var toTypedArrayIndex=(pointer,heap)=>pointer>>>31-Math.clz32(heap.BYTES_PER_ELEMENT);var emscriptenWebGLGetTexPixelData=(type,format,width,height,pixels,internalFormat)=>{var heap=heapObjectForWebGLType(type);var sizePerPixel=colorChannelsInGlTextureFormat(format)*heap.BYTES_PER_ELEMENT;var bytes=computeUnpackAlignedImageSize(width,height,sizePerPixel);return heap.subarray(toTypedArrayIndex(pixels,heap),toTypedArrayIndex(pixels+bytes,heap))};var _emscripten_glReadPixels=(x,y,width,height,format,type,pixels)=>{var pixelData=emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,format);if(!pixelData){GL.recordError(1280);return}GLctx.readPixels(x,y,width,height,format,type,pixelData)};var _emscripten_glReleaseShaderCompiler=()=>{};var _emscripten_glRenderbufferStorage=(x0,x1,x2,x3)=>GLctx.renderbufferStorage(x0,x1,x2,x3);var _emscripten_glSampleCoverage=(value,invert)=>{GLctx.sampleCoverage(value,!!invert)};var _emscripten_glScissor=(x0,x1,x2,x3)=>GLctx.scissor(x0,x1,x2,x3);var _emscripten_glShaderBinary=(count,shaders,binaryformat,binary,length)=>{GL.recordError(1280)};var _emscripten_glShaderSource=(shader,count,string,length)=>{var source=GL.getSource(shader,count,string,length);GLctx.shaderSource(GL.shaders[shader],source)};var _emscripten_glStencilFunc=(x0,x1,x2)=>GLctx.stencilFunc(x0,x1,x2);var _emscripten_glStencilFuncSeparate=(x0,x1,x2,x3)=>GLctx.stencilFuncSeparate(x0,x1,x2,x3);var _emscripten_glStencilMask=x0=>GLctx.stencilMask(x0);var _emscripten_glStencilMaskSeparate=(x0,x1)=>GLctx.stencilMaskSeparate(x0,x1);var _emscripten_glStencilOp=(x0,x1,x2)=>GLctx.stencilOp(x0,x1,x2);var _emscripten_glStencilOpSeparate=(x0,x1,x2,x3)=>GLctx.stencilOpSeparate(x0,x1,x2,x3);var _emscripten_glTexImage2D=(target,level,internalFormat,width,height,border,format,type,pixels)=>{var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,internalFormat):null;GLctx.texImage2D(target,level,internalFormat,width,height,border,format,type,pixelData)};var _emscripten_glTexParameterf=(x0,x1,x2)=>GLctx.texParameterf(x0,x1,x2);var _emscripten_glTexParameterfv=(target,pname,params)=>{var param=HEAPF32[params>>2];GLctx.texParameterf(target,pname,param)};var _emscripten_glTexParameteri=(x0,x1,x2)=>GLctx.texParameteri(x0,x1,x2);var _emscripten_glTexParameteriv=(target,pname,params)=>{var param=HEAP32[params>>2];GLctx.texParameteri(target,pname,param)};var _emscripten_glTexSubImage2D=(target,level,xoffset,yoffset,width,height,format,type,pixels)=>{var pixelData=pixels?emscriptenWebGLGetTexPixelData(type,format,width,height,pixels,0):null;GLctx.texSubImage2D(target,level,xoffset,yoffset,width,height,format,type,pixelData)};var _emscripten_glUniform1f=(location,v0)=>{GLctx.uniform1f(webglGetUniformLocation(location),v0)};var miniTempWebGLFloatBuffers=[];var _emscripten_glUniform1fv=(location,count,value)=>{if(count<=288){var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform1i=(location,v0)=>{GLctx.uniform1i(webglGetUniformLocation(location),v0)};var miniTempWebGLIntBuffers=[];var _emscripten_glUniform1iv=(location,count,value)=>{if(count<=288){var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2]}}else{var view=HEAP32.subarray(value>>2,value+count*4>>2)}GLctx.uniform1iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform2f=(location,v0,v1)=>{GLctx.uniform2f(webglGetUniformLocation(location),v0,v1)};var _emscripten_glUniform2fv=(location,count,value)=>{if(count<=144){count*=2;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=HEAPF32[value+(4*i+4)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform2i=(location,v0,v1)=>{GLctx.uniform2i(webglGetUniformLocation(location),v0,v1)};var _emscripten_glUniform2iv=(location,count,value)=>{if(count<=144){count*=2;var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2];view[i+1]=HEAP32[value+(4*i+4)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*8>>2)}GLctx.uniform2iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform3f=(location,v0,v1,v2)=>{GLctx.uniform3f(webglGetUniformLocation(location),v0,v1,v2)};var _emscripten_glUniform3fv=(location,count,value)=>{if(count<=96){count*=3;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform3i=(location,v0,v1,v2)=>{GLctx.uniform3i(webglGetUniformLocation(location),v0,v1,v2)};var _emscripten_glUniform3iv=(location,count,value)=>{if(count<=96){count*=3;var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*12>>2)}GLctx.uniform3iv(webglGetUniformLocation(location),view)};var _emscripten_glUniform4f=(location,v0,v1,v2,v3)=>{GLctx.uniform4f(webglGetUniformLocation(location),v0,v1,v2,v3)};var _emscripten_glUniform4fv=(location,count,value)=>{if(count<=72){var view=miniTempWebGLFloatBuffers[4*count];var heap=HEAPF32;value=value>>2;count*=4;for(var i=0;i>2,value+count*16>>2)}GLctx.uniform4fv(webglGetUniformLocation(location),view)};var _emscripten_glUniform4i=(location,v0,v1,v2,v3)=>{GLctx.uniform4i(webglGetUniformLocation(location),v0,v1,v2,v3)};var _emscripten_glUniform4iv=(location,count,value)=>{if(count<=72){count*=4;var view=miniTempWebGLIntBuffers[count];for(var i=0;i>2];view[i+1]=HEAP32[value+(4*i+4)>>2];view[i+2]=HEAP32[value+(4*i+8)>>2];view[i+3]=HEAP32[value+(4*i+12)>>2]}}else{var view=HEAP32.subarray(value>>2,value+count*16>>2)}GLctx.uniform4iv(webglGetUniformLocation(location),view)};var _emscripten_glUniformMatrix2fv=(location,count,transpose,value)=>{if(count<=72){count*=4;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*16>>2)}GLctx.uniformMatrix2fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUniformMatrix3fv=(location,count,transpose,value)=>{if(count<=32){count*=9;var view=miniTempWebGLFloatBuffers[count];for(var i=0;i>2];view[i+1]=HEAPF32[value+(4*i+4)>>2];view[i+2]=HEAPF32[value+(4*i+8)>>2];view[i+3]=HEAPF32[value+(4*i+12)>>2];view[i+4]=HEAPF32[value+(4*i+16)>>2];view[i+5]=HEAPF32[value+(4*i+20)>>2];view[i+6]=HEAPF32[value+(4*i+24)>>2];view[i+7]=HEAPF32[value+(4*i+28)>>2];view[i+8]=HEAPF32[value+(4*i+32)>>2]}}else{var view=HEAPF32.subarray(value>>2,value+count*36>>2)}GLctx.uniformMatrix3fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUniformMatrix4fv=(location,count,transpose,value)=>{if(count<=18){var view=miniTempWebGLFloatBuffers[16*count];var heap=HEAPF32;value=value>>2;count*=16;for(var i=0;i>2,value+count*64>>2)}GLctx.uniformMatrix4fv(webglGetUniformLocation(location),!!transpose,view)};var _emscripten_glUseProgram=program=>{program=GL.programs[program];GLctx.useProgram(program);GLctx.currentProgram=program};var _emscripten_glValidateProgram=program=>{GLctx.validateProgram(GL.programs[program])};var _emscripten_glVertexAttrib1f=(x0,x1)=>GLctx.vertexAttrib1f(x0,x1);var _emscripten_glVertexAttrib1fv=(index,v)=>{GLctx.vertexAttrib1f(index,HEAPF32[v>>2])};var _emscripten_glVertexAttrib2f=(x0,x1,x2)=>GLctx.vertexAttrib2f(x0,x1,x2);var _emscripten_glVertexAttrib2fv=(index,v)=>{GLctx.vertexAttrib2f(index,HEAPF32[v>>2],HEAPF32[v+4>>2])};var _emscripten_glVertexAttrib3f=(x0,x1,x2,x3)=>GLctx.vertexAttrib3f(x0,x1,x2,x3);var _emscripten_glVertexAttrib3fv=(index,v)=>{GLctx.vertexAttrib3f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2])};var _emscripten_glVertexAttrib4f=(x0,x1,x2,x3,x4)=>GLctx.vertexAttrib4f(x0,x1,x2,x3,x4);var _emscripten_glVertexAttrib4fv=(index,v)=>{GLctx.vertexAttrib4f(index,HEAPF32[v>>2],HEAPF32[v+4>>2],HEAPF32[v+8>>2],HEAPF32[v+12>>2])};var _emscripten_glVertexAttribDivisor=(index,divisor)=>{GLctx.vertexAttribDivisor(index,divisor)};var _glVertexAttribDivisor=_emscripten_glVertexAttribDivisor;var _emscripten_glVertexAttribDivisorANGLE=_glVertexAttribDivisor;var _emscripten_glVertexAttribPointer=(index,size,type,normalized,stride,ptr)=>{GLctx.vertexAttribPointer(index,size,type,!!normalized,stride,ptr)};var _emscripten_glViewport=(x0,x1,x2,x3)=>GLctx.viewport(x0,x1,x2,x3);var abortOnCannotGrowMemory=requestedSize=>{abort("OOM")};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;abortOnCannotGrowMemory(requestedSize)};var _emscripten_sample_gamepad_data=()=>{try{if(navigator.getGamepads)return(JSEvents.lastGamepadState=navigator.getGamepads())?0:-1}catch(e){navigator.getGamepads=null}return-1};var registerFocusEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var eventSize=256;JSEvents.focusEvent||=_malloc(eventSize);var focusEventHandlerFunc=e=>{var nodeName=JSEvents.getNodeNameForTarget(e.target);var id=e.target.id?e.target.id:"";var focusEvent=JSEvents.focusEvent;stringToUTF8(nodeName,focusEvent+0,128);stringToUTF8(id,focusEvent+128,128);if(((a1,a2,a3)=>dynCall_iiii(callbackfunc,a1,a2,a3))(eventTypeId,focusEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),eventTypeString,eventTypeId,userData,callbackfunc,handlerFunc:focusEventHandlerFunc,useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_blur_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerFocusEventCallback(target,userData,useCapture,callbackfunc,12,"blur",targetThread);var findCanvasEventTarget=findEventTarget;var _emscripten_set_canvas_element_size=(target,width,height)=>{var canvas=findCanvasEventTarget(target);if(!canvas)return-4;canvas.width=width;canvas.height=height;return 0};var fillMouseEventData=(eventStruct,e,target)=>{HEAPF64[eventStruct>>3]=e.timeStamp;var idx=eventStruct>>2;HEAP32[idx+2]=e.screenX;HEAP32[idx+3]=e.screenY;HEAP32[idx+4]=e.clientX;HEAP32[idx+5]=e.clientY;HEAP8[eventStruct+24]=e.ctrlKey;HEAP8[eventStruct+25]=e.shiftKey;HEAP8[eventStruct+26]=e.altKey;HEAP8[eventStruct+27]=e.metaKey;HEAP16[idx*2+14]=e.button;HEAP16[idx*2+15]=e.buttons;HEAP32[idx+8]=e["movementX"];HEAP32[idx+9]=e["movementY"];var rect=getBoundingClientRect(target);HEAP32[idx+10]=e.clientX-(rect.left|0);HEAP32[idx+11]=e.clientY-(rect.top|0)};var registerMouseEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var eventSize=64;JSEvents.mouseEvent||=_malloc(eventSize);target=findEventTarget(target);var mouseEventHandlerFunc=e=>{fillMouseEventData(JSEvents.mouseEvent,e,target);if(((a1,a2,a3)=>dynCall_iiii(callbackfunc,a1,a2,a3))(eventTypeId,JSEvents.mouseEvent,userData))e.preventDefault()};var eventHandler={target,allowsDeferredCalls:eventTypeString!="mousemove"&&eventTypeString!="mouseenter"&&eventTypeString!="mouseleave",eventTypeString,eventTypeId,userData,callbackfunc,handlerFunc:mouseEventHandlerFunc,useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_click_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,4,"click",targetThread);var _emscripten_set_focus_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerFocusEventCallback(target,userData,useCapture,callbackfunc,13,"focus",targetThread);function getFullscreenElement(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.webkitCurrentFullScreenElement||document.msFullscreenElement}var fillFullscreenChangeEventData=eventStruct=>{var fullscreenElement=getFullscreenElement();var isFullscreen=!!fullscreenElement;HEAP8[eventStruct]=isFullscreen;HEAP8[eventStruct+1]=JSEvents.fullscreenEnabled();var reportedElement=isFullscreen?fullscreenElement:JSEvents.previousFullscreenElement;var nodeName=JSEvents.getNodeNameForTarget(reportedElement);var id=reportedElement?.id||"";stringToUTF8(nodeName,eventStruct+2,128);stringToUTF8(id,eventStruct+130,128);HEAP32[eventStruct+260>>2]=reportedElement?reportedElement.clientWidth:0;HEAP32[eventStruct+264>>2]=reportedElement?reportedElement.clientHeight:0;HEAP32[eventStruct+268>>2]=screen.width;HEAP32[eventStruct+272>>2]=screen.height;if(isFullscreen){JSEvents.previousFullscreenElement=fullscreenElement}};var registerFullscreenChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var eventSize=276;JSEvents.fullscreenChangeEvent||=_malloc(eventSize);var fullscreenChangeEventHandlerFunc=e=>{var fullscreenChangeEvent=JSEvents.fullscreenChangeEvent;fillFullscreenChangeEventData(fullscreenChangeEvent);if(((a1,a2,a3)=>dynCall_iiii(callbackfunc,a1,a2,a3))(eventTypeId,fullscreenChangeEvent,userData))e.preventDefault()};var eventHandler={target,eventTypeString,eventTypeId,userData,callbackfunc,handlerFunc:fullscreenChangeEventHandlerFunc,useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_fullscreenchange_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{if(!JSEvents.fullscreenEnabled())return-1;target=findEventTarget(target);if(!target)return-4;registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"webkitfullscreenchange",targetThread);return registerFullscreenChangeEventCallback(target,userData,useCapture,callbackfunc,19,"fullscreenchange",targetThread)};var registerGamepadEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var eventSize=1240;JSEvents.gamepadEvent||=_malloc(eventSize);var gamepadEventHandlerFunc=e=>{var gamepadEvent=JSEvents.gamepadEvent;fillGamepadEventData(gamepadEvent,e["gamepad"]);if(((a1,a2,a3)=>dynCall_iiii(callbackfunc,a1,a2,a3))(eventTypeId,gamepadEvent,userData))e.preventDefault()};var eventHandler={target:findEventTarget(target),allowsDeferredCalls:true,eventTypeString,eventTypeId,userData,callbackfunc,handlerFunc:gamepadEventHandlerFunc,useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_gamepadconnected_callback_on_thread=(userData,useCapture,callbackfunc,targetThread)=>{if(_emscripten_sample_gamepad_data())return-1;return registerGamepadEventCallback(2,userData,useCapture,callbackfunc,26,"gamepadconnected",targetThread)};var _emscripten_set_gamepaddisconnected_callback_on_thread=(userData,useCapture,callbackfunc,targetThread)=>{if(_emscripten_sample_gamepad_data())return-1;return registerGamepadEventCallback(2,userData,useCapture,callbackfunc,27,"gamepaddisconnected",targetThread)};var _emscripten_set_mousemove_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerMouseEventCallback(target,userData,useCapture,callbackfunc,8,"mousemove",targetThread);var fillPointerlockChangeEventData=eventStruct=>{var pointerLockElement=document.pointerLockElement;var isPointerlocked=!!pointerLockElement;HEAP8[eventStruct]=isPointerlocked;var nodeName=JSEvents.getNodeNameForTarget(pointerLockElement);var id=pointerLockElement?.id||"";stringToUTF8(nodeName,eventStruct+1,128);stringToUTF8(id,eventStruct+129,128)};var registerPointerlockChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var eventSize=257;JSEvents.pointerlockChangeEvent||=_malloc(eventSize);var pointerlockChangeEventHandlerFunc=e=>{var pointerlockChangeEvent=JSEvents.pointerlockChangeEvent;fillPointerlockChangeEventData(pointerlockChangeEvent);if(((a1,a2,a3)=>dynCall_iiii(callbackfunc,a1,a2,a3))(eventTypeId,pointerlockChangeEvent,userData))e.preventDefault()};var eventHandler={target,eventTypeString,eventTypeId,userData,callbackfunc,handlerFunc:pointerlockChangeEventHandlerFunc,useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_pointerlockchange_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>{if(!document.body?.requestPointerLock){return-1}target=findEventTarget(target);if(!target)return-4;return registerPointerlockChangeEventCallback(target,userData,useCapture,callbackfunc,20,"pointerlockchange",targetThread)};var registerUiEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var eventSize=36;JSEvents.uiEvent||=_malloc(eventSize);target=findEventTarget(target);var uiEventHandlerFunc=e=>{if(e.target!=target){return}var b=document.body;if(!b){return}var uiEvent=JSEvents.uiEvent;HEAP32[uiEvent>>2]=0;HEAP32[uiEvent+4>>2]=b.clientWidth;HEAP32[uiEvent+8>>2]=b.clientHeight;HEAP32[uiEvent+12>>2]=innerWidth;HEAP32[uiEvent+16>>2]=innerHeight;HEAP32[uiEvent+20>>2]=outerWidth;HEAP32[uiEvent+24>>2]=outerHeight;HEAP32[uiEvent+28>>2]=pageXOffset|0;HEAP32[uiEvent+32>>2]=pageYOffset|0;if(((a1,a2,a3)=>dynCall_iiii(callbackfunc,a1,a2,a3))(eventTypeId,uiEvent,userData))e.preventDefault()};var eventHandler={target,eventTypeString,eventTypeId,userData,callbackfunc,handlerFunc:uiEventHandlerFunc,useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_resize_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerUiEventCallback(target,userData,useCapture,callbackfunc,10,"resize",targetThread);var registerTouchEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var eventSize=1552;JSEvents.touchEvent||=_malloc(eventSize);target=findEventTarget(target);var touchEventHandlerFunc=e=>{var t,touches={},et=e.touches;for(let t of et){t.isChanged=t.onTarget=0;touches[t.identifier]=t}for(let t of e.changedTouches){t.isChanged=1;touches[t.identifier]=t}for(let t of e.targetTouches){touches[t.identifier].onTarget=1}var touchEvent=JSEvents.touchEvent;HEAPF64[touchEvent>>3]=e.timeStamp;HEAP8[touchEvent+12]=e.ctrlKey;HEAP8[touchEvent+13]=e.shiftKey;HEAP8[touchEvent+14]=e.altKey;HEAP8[touchEvent+15]=e.metaKey;var idx=touchEvent+16;var targetRect=getBoundingClientRect(target);var numTouches=0;for(let t of Object.values(touches)){var idx32=idx>>2;HEAP32[idx32+0]=t.identifier;HEAP32[idx32+1]=t.screenX;HEAP32[idx32+2]=t.screenY;HEAP32[idx32+3]=t.clientX;HEAP32[idx32+4]=t.clientY;HEAP32[idx32+5]=t.pageX;HEAP32[idx32+6]=t.pageY;HEAP8[idx+28]=t.isChanged;HEAP8[idx+29]=t.onTarget;HEAP32[idx32+8]=t.clientX-(targetRect.left|0);HEAP32[idx32+9]=t.clientY-(targetRect.top|0);idx+=48;if(++numTouches>31){break}}HEAP32[touchEvent+8>>2]=numTouches;if(((a1,a2,a3)=>dynCall_iiii(callbackfunc,a1,a2,a3))(eventTypeId,touchEvent,userData))e.preventDefault()};var eventHandler={target,allowsDeferredCalls:eventTypeString=="touchstart"||eventTypeString=="touchend",eventTypeString,eventTypeId,userData,callbackfunc,handlerFunc:touchEventHandlerFunc,useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_touchcancel_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,25,"touchcancel",targetThread);var _emscripten_set_touchend_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,23,"touchend",targetThread);var _emscripten_set_touchmove_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,24,"touchmove",targetThread);var _emscripten_set_touchstart_callback_on_thread=(target,userData,useCapture,callbackfunc,targetThread)=>registerTouchEventCallback(target,userData,useCapture,callbackfunc,22,"touchstart",targetThread);var fillVisibilityChangeEventData=eventStruct=>{var visibilityStates=["hidden","visible","prerender","unloaded"];var visibilityState=visibilityStates.indexOf(document.visibilityState);HEAP8[eventStruct]=document.hidden;HEAP32[eventStruct+4>>2]=visibilityState};var registerVisibilityChangeEventCallback=(target,userData,useCapture,callbackfunc,eventTypeId,eventTypeString,targetThread)=>{var eventSize=8;JSEvents.visibilityChangeEvent||=_malloc(eventSize);var visibilityChangeEventHandlerFunc=e=>{var visibilityChangeEvent=JSEvents.visibilityChangeEvent;fillVisibilityChangeEventData(visibilityChangeEvent);if(((a1,a2,a3)=>dynCall_iiii(callbackfunc,a1,a2,a3))(eventTypeId,visibilityChangeEvent,userData))e.preventDefault()};var eventHandler={target,eventTypeString,eventTypeId,userData,callbackfunc,handlerFunc:visibilityChangeEventHandlerFunc,useCapture};return JSEvents.registerOrRemoveHandler(eventHandler)};var _emscripten_set_visibilitychange_callback_on_thread=(userData,useCapture,callbackfunc,targetThread)=>{if(!specialHTMLTargets[1]){return-4}return registerVisibilityChangeEventCallback(specialHTMLTargets[1],userData,useCapture,callbackfunc,21,"visibilitychange",targetThread)};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{return func()}catch(e){handleException(e)}finally{maybeExit()}};var safeSetTimeout=(func,timeout)=>setTimeout(()=>{callUserCallback(func)},timeout);var warnOnce=text=>{warnOnce.shown||={};if(!warnOnce.shown[text]){warnOnce.shown[text]=1;if(ENVIRONMENT_IS_NODE)text="warning: "+text;err(text)}};var Browser={useWebGL:false,isFullscreen:false,pointerLock:false,moduleContextCreatedCallbacks:[],workers:[],preloadedImages:{},preloadedAudios:{},getCanvas:()=>Module["canvas"],init(){if(Browser.initted)return;Browser.initted=true;var imagePlugin={};imagePlugin["canHandle"]=name=>!Module["noImageDecoding"]&&/\.(jpg|jpeg|png|bmp|webp)$/i.test(name);imagePlugin["handle"]=async(byteArray,name)=>{var b=new Blob([byteArray],{type:Browser.getMimetype(name)});if(b.size!==byteArray.length){b=new Blob([new Uint8Array(byteArray).buffer],{type:Browser.getMimetype(name)})}var url=URL.createObjectURL(b);return new Promise((resolve,reject)=>{var img=new Image;img.onload=()=>{var canvas=document.createElement("canvas");canvas.width=img.width;canvas.height=img.height;var ctx=canvas.getContext("2d");ctx.drawImage(img,0,0);Browser.preloadedImages[name]=canvas;URL.revokeObjectURL(url);resolve(byteArray)};img.onerror=event=>{err(`Image ${url} could not be decoded`);reject()};img.src=url})};preloadPlugins.push(imagePlugin);var audioPlugin={};audioPlugin["canHandle"]=name=>!Module["noAudioDecoding"]&&name.slice(-4)in{".ogg":1,".wav":1,".mp3":1};audioPlugin["handle"]=async(byteArray,name)=>new Promise((resolve,reject)=>{var done=false;function finish(audio){if(done)return;done=true;Browser.preloadedAudios[name]=audio;resolve(byteArray)}var b=new Blob([byteArray],{type:Browser.getMimetype(name)});var url=URL.createObjectURL(b);var audio=new Audio;audio.addEventListener("canplaythrough",()=>finish(audio),false);audio.onerror=event=>{if(done)return;err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`);function encode64(data){var BASE="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";var PAD="=";var ret="";var leftchar=0;var leftbits=0;for(var i=0;i=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.slice(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;safeSetTimeout(()=>{finish(audio)},1e4)});preloadPlugins.push(audioPlugin);function pointerLockChange(){var canvas=Browser.getCanvas();Browser.pointerLock=document.pointerLockElement===canvas}var canvas=Browser.getCanvas();if(canvas){document.addEventListener("pointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",ev=>{if(!Browser.pointerLock&&Browser.getCanvas().requestPointerLock){Browser.getCanvas().requestPointerLock();ev.preventDefault()}},false)}}},createContext(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module["ctx"]&&canvas==Browser.getCanvas())return Module["ctx"];var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false,majorVersion:1};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}if(typeof GL!="undefined"){contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}}}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){Module["ctx"]=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Browser.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach(callback=>callback());Browser.init()}return ctx},fullscreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Browser.getCanvas();function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if(getFullscreenElement()===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas)}}Module["onFullScreen"]?.(Browser.isFullscreen);Module["onFullscreen"]?.(Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},exitFullscreen(){if(!Browser.isFullscreen){return false}var CFS=document["exitFullscreen"]||document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["msExitFullscreen"]||document["webkitCancelFullScreen"]||(()=>{});CFS.apply(document,[]);return true},safeSetTimeout(func,timeout){return safeSetTimeout(func,timeout)},getMimetype(name){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[name.slice(name.lastIndexOf(".")+1)]},getUserMedia(func){window.getUserMedia||=navigator["getUserMedia"]||navigator["mozGetUserMedia"];window.getUserMedia(func)},getMovementX(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0},getMovementY(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0},getMouseWheelDelta(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail/3;break;case"mousewheel":delta=event.wheelDelta/120;break;case"wheel":delta=event.deltaY;switch(event.deltaMode){case 0:delta/=100;break;case 1:delta/=3;break;case 2:delta*=80;break;default:abort("unrecognized mouse wheel delta mode: "+event.deltaMode)}break;default:abort("unrecognized mouse wheel event: "+event.type)}return delta},mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseCoords(pageX,pageY){var canvas=Browser.getCanvas();var rect=canvas.getBoundingClientRect();var scrollX=typeof window.scrollX!="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!="undefined"?window.scrollY:window.pageYOffset;var adjustedX=pageX-(scrollX+rect.left);var adjustedY=pageY-(scrollY+rect.top);adjustedX=adjustedX*(canvas.width/rect.width);adjustedY=adjustedY*(canvas.height/rect.height);return{x:adjustedX,y:adjustedY}},setMouseCoords(pageX,pageY){const{x,y}=Browser.calculateMouseCoords(pageX,pageY);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y},calculateMouseEvent(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}else{if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var coords=Browser.calculateMouseCoords(touch.pageX,touch.pageY);if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];last||=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}Browser.setMouseCoords(event.pageX,event.pageY)}},resizeListeners:[],updateResizeListeners(){var canvas=Browser.getCanvas();Browser.resizeListeners.forEach(listener=>listener(canvas.width,canvas.height))},setCanvasSize(width,height,noUpdates){var canvas=Browser.getCanvas();Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()},windowedWidth:0,windowedHeight:0,setFullscreenCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags|8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Browser.getCanvas());Browser.updateResizeListeners()},setWindowedCanvasSize(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen>>2];flags=flags&~8388608;HEAP32[SDL.screen>>2]=flags}Browser.updateCanvasDimensions(Browser.getCanvas());Browser.updateResizeListeners()},updateCanvasDimensions(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]>0){if(w/hdocument.title=UTF8ToString(title);var _emscripten_sleep=function(ms){let innerFunc=()=>new Promise(resolve=>setTimeout(resolve,ms));return Asyncify.handleAsync(innerFunc)};_emscripten_sleep.isAsync=true;function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset,whence,newOffset){offset=bigintToI53Checked(offset);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);HEAP64[newOffset>>3]=BigInt(stream.position);if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var _glActiveTexture=_emscripten_glActiveTexture;var _glAttachShader=_emscripten_glAttachShader;var _glBindAttribLocation=_emscripten_glBindAttribLocation;var _glBindBuffer=_emscripten_glBindBuffer;var _glBindTexture=_emscripten_glBindTexture;var _glBlendFunc=_emscripten_glBlendFunc;var _glBufferData=_emscripten_glBufferData;var _glBufferSubData=_emscripten_glBufferSubData;var _glClear=_emscripten_glClear;var _glClearColor=_emscripten_glClearColor;var _glClearDepthf=_emscripten_glClearDepthf;var _glCompileShader=_emscripten_glCompileShader;var _glCompressedTexImage2D=_emscripten_glCompressedTexImage2D;var _glCreateProgram=_emscripten_glCreateProgram;var _glCreateShader=_emscripten_glCreateShader;var _glCullFace=_emscripten_glCullFace;var _glDeleteBuffers=_emscripten_glDeleteBuffers;var _glDeleteProgram=_emscripten_glDeleteProgram;var _glDeleteShader=_emscripten_glDeleteShader;var _glDeleteTextures=_emscripten_glDeleteTextures;var _glDepthFunc=_emscripten_glDepthFunc;var _glDetachShader=_emscripten_glDetachShader;var _glDisable=_emscripten_glDisable;var _glDisableVertexAttribArray=_emscripten_glDisableVertexAttribArray;var _glDrawArrays=_emscripten_glDrawArrays;var _glDrawElements=_emscripten_glDrawElements;var _glEnable=_emscripten_glEnable;var _glEnableVertexAttribArray=_emscripten_glEnableVertexAttribArray;var _glFrontFace=_emscripten_glFrontFace;var _glGenBuffers=_emscripten_glGenBuffers;var _glGenTextures=_emscripten_glGenTextures;var _glGetAttribLocation=_emscripten_glGetAttribLocation;var _glGetFloatv=_emscripten_glGetFloatv;var _glGetProgramInfoLog=_emscripten_glGetProgramInfoLog;var _glGetProgramiv=_emscripten_glGetProgramiv;var _glGetShaderInfoLog=_emscripten_glGetShaderInfoLog;var _glGetShaderiv=_emscripten_glGetShaderiv;var _glGetString=_emscripten_glGetString;var _glGetUniformLocation=_emscripten_glGetUniformLocation;var _glLinkProgram=_emscripten_glLinkProgram;var _glPixelStorei=_emscripten_glPixelStorei;var _glReadPixels=_emscripten_glReadPixels;var _glShaderSource=_emscripten_glShaderSource;var _glTexImage2D=_emscripten_glTexImage2D;var _glTexParameterf=_emscripten_glTexParameterf;var _glTexParameteri=_emscripten_glTexParameteri;var _glUniform1i=_emscripten_glUniform1i;var _glUniform4f=_emscripten_glUniform4f;var _glUniformMatrix4fv=_emscripten_glUniformMatrix4fv;var _glUseProgram=_emscripten_glUseProgram;var _glVertexAttribPointer=_emscripten_glVertexAttribPointer;var _glViewport=_emscripten_glViewport;function GLFW_Window(id,width,height,framebufferWidth,framebufferHeight,title,monitor,share){this.id=id;this.x=0;this.y=0;this.fullscreen=false;this.storedX=0;this.storedY=0;this.width=width;this.height=height;this.framebufferWidth=framebufferWidth;this.framebufferHeight=framebufferHeight;this.storedWidth=width;this.storedHeight=height;this.title=title;this.monitor=monitor;this.share=share;this.attributes={...GLFW.hints};this.inputModes={208897:212993,208898:0,208899:0};this.buttons=0;this.keys=new Array;this.domKeys=new Array;this.shouldClose=0;this.title=null;this.windowPosFunc=0;this.windowSizeFunc=0;this.windowCloseFunc=0;this.windowRefreshFunc=0;this.windowFocusFunc=0;this.windowIconifyFunc=0;this.windowMaximizeFunc=0;this.framebufferSizeFunc=0;this.windowContentScaleFunc=0;this.mouseButtonFunc=0;this.cursorPosFunc=0;this.cursorEnterFunc=0;this.scrollFunc=0;this.dropFunc=0;this.keyFunc=0;this.charFunc=0;this.userptr=0}var _emscripten_set_main_loop_timing=(mode,value)=>{MainLoop.timingMode=mode;MainLoop.timingValue=value;if(!MainLoop.func){return 1}if(!MainLoop.running){MainLoop.running=true}if(mode==0){MainLoop.scheduler=function MainLoop_scheduler_setTimeout(){var timeUntilNextTick=Math.max(0,MainLoop.tickStartTime+value-_emscripten_get_now())|0;setTimeout(MainLoop.runner,timeUntilNextTick)}}else if(mode==1){MainLoop.scheduler=function MainLoop_scheduler_rAF(){MainLoop.requestAnimationFrame(MainLoop.runner)}}else{if(!MainLoop.setImmediate){if(globalThis.setImmediate){MainLoop.setImmediate=setImmediate}else{var setImmediates=[];var emscriptenMainLoopMessageId="setimmediate";var MainLoop_setImmediate_messageHandler=event=>{if(event.data===emscriptenMainLoopMessageId||event.data.target===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}};addEventListener("message",MainLoop_setImmediate_messageHandler,true);MainLoop.setImmediate=func=>{setImmediates.push(func);if(ENVIRONMENT_IS_WORKER){Module["setImmediates"]??=[];Module["setImmediates"].push(func);postMessage({target:emscriptenMainLoopMessageId})}else postMessage(emscriptenMainLoopMessageId,"*")}}}MainLoop.scheduler=function MainLoop_scheduler_setImmediate(){MainLoop.setImmediate(MainLoop.runner)}}return 0};var setMainLoop=(iterFunc,fps,simulateInfiniteLoop,arg,noSetTiming)=>{MainLoop.func=iterFunc;MainLoop.arg=arg;var thisMainLoopId=MainLoop.currentlyRunningMainloop;function checkIsRunning(){if(thisMainLoopId0){var start=Date.now();var blocker=MainLoop.queue.shift();blocker.func(blocker.arg);if(MainLoop.remainingBlockers){var remaining=MainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){MainLoop.remainingBlockers=next}else{next=next+.5;MainLoop.remainingBlockers=(8*remaining+next)/9}}MainLoop.updateStatus();if(!checkIsRunning())return;setTimeout(MainLoop.runner,0);return}if(!checkIsRunning())return;MainLoop.currentFrameNumber=MainLoop.currentFrameNumber+1|0;if(MainLoop.timingMode==1&&MainLoop.timingValue>1&&MainLoop.currentFrameNumber%MainLoop.timingValue!=0){MainLoop.scheduler();return}else if(MainLoop.timingMode==0){MainLoop.tickStartTime=_emscripten_get_now()}MainLoop.runIter(iterFunc);if(!checkIsRunning())return;MainLoop.scheduler()};if(!noSetTiming){if(fps>0){_emscripten_set_main_loop_timing(0,1e3/fps)}else{_emscripten_set_main_loop_timing(1,1)}MainLoop.scheduler()}if(simulateInfiniteLoop){throw"unwind"}};var MainLoop={running:false,scheduler:null,currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],preMainLoop:[],postMainLoop:[],pause(){MainLoop.scheduler=null;MainLoop.currentlyRunningMainloop++},resume(){MainLoop.currentlyRunningMainloop++;var timingMode=MainLoop.timingMode;var timingValue=MainLoop.timingValue;var func=MainLoop.func;MainLoop.func=null;setMainLoop(func,0,false,MainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);MainLoop.scheduler()},updateStatus(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=MainLoop.remainingBlockers??0;var expected=MainLoop.expectedBlockers??0;if(remaining){if(remaining=MainLoop.nextRAF){MainLoop.nextRAF+=1e3/60}}var delay=Math.max(MainLoop.nextRAF-now,0);setTimeout(func,delay)},requestAnimationFrame(func){if(globalThis.requestAnimationFrame){requestAnimationFrame(func)}else{MainLoop.fakeRequestAnimationFrame(func)}}};var GLFW={WindowFromId:id=>{if(id<=0||!GLFW.windows)return null;return GLFW.windows[id-1]},joystickFunc:0,errorFunc:0,monitorFunc:0,active:null,scale:null,windows:null,monitors:null,monitorString:null,versionString:null,initialTime:null,extensions:null,devicePixelRatioMQL:null,hints:null,primaryTouchId:null,defaultHints:{131073:0,131074:0,131075:1,131076:1,131077:1,131082:0,135169:8,135170:8,135171:8,135172:8,135173:24,135174:8,135175:0,135176:0,135177:0,135178:0,135179:0,135180:0,135181:0,135182:0,135183:0,139265:196609,139266:1,139267:0,139268:0,139269:0,139270:0,139271:0,139272:0,139276:0},DOMToGLFWKeyCode:keycode=>{switch(keycode){case 32:return 32;case 222:return 39;case 188:return 44;case 173:return 45;case 189:return 45;case 190:return 46;case 191:return 47;case 48:return 48;case 49:return 49;case 50:return 50;case 51:return 51;case 52:return 52;case 53:return 53;case 54:return 54;case 55:return 55;case 56:return 56;case 57:return 57;case 59:return 59;case 61:return 61;case 187:return 61;case 65:return 65;case 66:return 66;case 67:return 67;case 68:return 68;case 69:return 69;case 70:return 70;case 71:return 71;case 72:return 72;case 73:return 73;case 74:return 74;case 75:return 75;case 76:return 76;case 77:return 77;case 78:return 78;case 79:return 79;case 80:return 80;case 81:return 81;case 82:return 82;case 83:return 83;case 84:return 84;case 85:return 85;case 86:return 86;case 87:return 87;case 88:return 88;case 89:return 89;case 90:return 90;case 219:return 91;case 220:return 92;case 221:return 93;case 192:return 96;case 27:return 256;case 13:return 257;case 9:return 258;case 8:return 259;case 45:return 260;case 46:return 261;case 39:return 262;case 37:return 263;case 40:return 264;case 38:return 265;case 33:return 266;case 34:return 267;case 36:return 268;case 35:return 269;case 20:return 280;case 145:return 281;case 144:return 282;case 44:return 283;case 19:return 284;case 112:return 290;case 113:return 291;case 114:return 292;case 115:return 293;case 116:return 294;case 117:return 295;case 118:return 296;case 119:return 297;case 120:return 298;case 121:return 299;case 122:return 300;case 123:return 301;case 124:return 302;case 125:return 303;case 126:return 304;case 127:return 305;case 128:return 306;case 129:return 307;case 130:return 308;case 131:return 309;case 132:return 310;case 133:return 311;case 134:return 312;case 135:return 313;case 136:return 314;case 96:return 320;case 97:return 321;case 98:return 322;case 99:return 323;case 100:return 324;case 101:return 325;case 102:return 326;case 103:return 327;case 104:return 328;case 105:return 329;case 110:return 330;case 111:return 331;case 106:return 332;case 109:return 333;case 107:return 334;case 16:return 340;case 17:return 341;case 18:return 342;case 91:return 343;case 224:return 343;case 93:return 348;default:return-1}},getModBits:win=>{var mod=0;if(win.keys[340])mod|=1;if(win.keys[341])mod|=2;if(win.keys[342])mod|=4;if(win.keys[343]||win.keys[348])mod|=8;return mod},onKeyPress:event=>{if(!GLFW.active||!GLFW.active.charFunc)return;if(event.ctrlKey||event.metaKey)return;var charCode=event.charCode;if(charCode==0||charCode>=0&&charCode<=31)return;((a1,a2)=>dynCall_vii(GLFW.active.charFunc,a1,a2))(GLFW.active.id,charCode)},onKeyChanged:(keyCode,status)=>{if(!GLFW.active)return;var key=GLFW.DOMToGLFWKeyCode(keyCode);if(key==-1)return;var repeat=status&&GLFW.active.keys[key];GLFW.active.keys[key]=status;GLFW.active.domKeys[keyCode]=status;if(GLFW.active.keyFunc){if(repeat)status=2;((a1,a2,a3,a4,a5)=>dynCall_viiiii(GLFW.active.keyFunc,a1,a2,a3,a4,a5))(GLFW.active.id,key,keyCode,status,GLFW.getModBits(GLFW.active))}},onGamepadConnected:event=>{GLFW.refreshJoysticks()},onGamepadDisconnected:event=>{GLFW.refreshJoysticks()},onKeydown:event=>{GLFW.onKeyChanged(event.keyCode,1);if(event.key=="Backspace"||event.key=="Tab"){event.preventDefault()}},onKeyup:event=>{GLFW.onKeyChanged(event.keyCode,0)},onBlur:event=>{if(!GLFW.active)return;for(var i=0;i{if(!GLFW.active)return;if(event.type==="touchmove"){event.preventDefault();let primaryChanged=false;for(let i of event.changedTouches){if(GLFW.primaryTouchId===i.identifier){Browser.setMouseCoords(i.pageX,i.pageY);primaryChanged=true;break}}if(!primaryChanged){return}}else{Browser.calculateMouseEvent(event)}if(event.target!=Browser.getCanvas()||!GLFW.active.cursorPosFunc)return;if(GLFW.active.cursorPosFunc){((a1,a2,a3)=>dynCall_vidd(GLFW.active.cursorPosFunc,a1,a2,a3))(GLFW.active.id,Browser.mouseX,Browser.mouseY)}},DOMToGLFWMouseButton:event=>{var eventButton=event["button"];if(eventButton>0){if(eventButton==1){eventButton=2}else{eventButton=1}}return eventButton},onMouseenter:event=>{if(!GLFW.active)return;if(event.target!=Browser.getCanvas())return;if(GLFW.active.cursorEnterFunc){((a1,a2)=>dynCall_vii(GLFW.active.cursorEnterFunc,a1,a2))(GLFW.active.id,1)}},onMouseleave:event=>{if(!GLFW.active)return;if(event.target!=Browser.getCanvas())return;if(GLFW.active.cursorEnterFunc){((a1,a2)=>dynCall_vii(GLFW.active.cursorEnterFunc,a1,a2))(GLFW.active.id,0)}},onMouseButtonChanged:(event,status)=>{if(!GLFW.active)return;if(event.target!=Browser.getCanvas())return;const isTouchType=event.type==="touchstart"||event.type==="touchend"||event.type==="touchcancel";let eventButton=0;if(isTouchType){event.preventDefault();let primaryChanged=false;if(GLFW.primaryTouchId===null&&event.type==="touchstart"&&event.targetTouches.length>0){const chosenTouch=event.targetTouches[0];GLFW.primaryTouchId=chosenTouch.identifier;Browser.setMouseCoords(chosenTouch.pageX,chosenTouch.pageY);primaryChanged=true}else if(event.type==="touchend"||event.type==="touchcancel"){for(let i of event.changedTouches){if(GLFW.primaryTouchId===i.identifier){GLFW.primaryTouchId=null;primaryChanged=true;break}}}if(!primaryChanged){return}}else{Browser.calculateMouseEvent(event);eventButton=GLFW.DOMToGLFWMouseButton(event)}if(status==1){GLFW.active.buttons|=1<dynCall_viiii(GLFW.active.mouseButtonFunc,a1,a2,a3,a4))(GLFW.active.id,eventButton,status,GLFW.getModBits(GLFW.active))}},onMouseButtonDown:event=>{if(!GLFW.active)return;GLFW.onMouseButtonChanged(event,1)},onMouseButtonUp:event=>{if(!GLFW.active)return;GLFW.onMouseButtonChanged(event,0)},onMouseWheel:event=>{var delta=-Browser.getMouseWheelDelta(event);delta=delta==0?0:delta>0?Math.max(delta,1):Math.min(delta,-1);GLFW.wheelPos+=delta;if(!GLFW.active||!GLFW.active.scrollFunc||event.target!=Browser.getCanvas())return;var sx=0;var sy=delta;if(event.type=="mousewheel"){sx=event.wheelDeltaX}else{sx=event.deltaX}((a1,a2,a3)=>dynCall_vidd(GLFW.active.scrollFunc,a1,a2,a3))(GLFW.active.id,sx,sy);event.preventDefault()},onCanvasResize:(width,height,framebufferWidth,framebufferHeight)=>{if(!GLFW.active)return;var resizeNeeded=false;if(getFullscreenElement()){if(!GLFW.active.fullscreen){resizeNeeded=width!=screen.width||height!=screen.height;GLFW.active.storedX=GLFW.active.x;GLFW.active.storedY=GLFW.active.y;GLFW.active.storedWidth=GLFW.active.width;GLFW.active.storedHeight=GLFW.active.height;GLFW.active.x=GLFW.active.y=0;GLFW.active.width=screen.width;GLFW.active.height=screen.height;GLFW.active.fullscreen=true}}else if(GLFW.active.fullscreen==true){resizeNeeded=width!=GLFW.active.storedWidth||height!=GLFW.active.storedHeight;GLFW.active.x=GLFW.active.storedX;GLFW.active.y=GLFW.active.storedY;GLFW.active.width=GLFW.active.storedWidth;GLFW.active.height=GLFW.active.storedHeight;GLFW.active.fullscreen=false}if(resizeNeeded){Browser.setCanvasSize(GLFW.active.width,GLFW.active.height)}else if(GLFW.active.width!=width||GLFW.active.height!=height||GLFW.active.framebufferWidth!=framebufferWidth||GLFW.active.framebufferHeight!=framebufferHeight){GLFW.active.width=width;GLFW.active.height=height;GLFW.active.framebufferWidth=framebufferWidth;GLFW.active.framebufferHeight=framebufferHeight;GLFW.onWindowSizeChanged();GLFW.onFramebufferSizeChanged()}},onWindowSizeChanged:()=>{if(!GLFW.active)return;if(GLFW.active.windowSizeFunc){((a1,a2,a3)=>dynCall_viii(GLFW.active.windowSizeFunc,a1,a2,a3))(GLFW.active.id,GLFW.active.width,GLFW.active.height)}},onFramebufferSizeChanged:()=>{if(!GLFW.active)return;if(GLFW.active.framebufferSizeFunc){((a1,a2,a3)=>dynCall_viii(GLFW.active.framebufferSizeFunc,a1,a2,a3))(GLFW.active.id,GLFW.active.framebufferWidth,GLFW.active.framebufferHeight)}},onWindowContentScaleChanged:scale=>{GLFW.scale=scale;if(!GLFW.active)return;if(GLFW.active.windowContentScaleFunc){((a1,a2,a3)=>dynCall_viff(GLFW.active.windowContentScaleFunc,a1,a2,a3))(GLFW.active.id,GLFW.scale,GLFW.scale)}},getTime:()=>_emscripten_get_now()/1e3,setWindowTitle:(winid,title)=>{var win=GLFW.WindowFromId(winid);if(!win)return;win.title=title;if(GLFW.active.id==win.id){_emscripten_set_window_title(title)}},setJoystickCallback:cbfun=>{var prevcbfun=GLFW.joystickFunc;GLFW.joystickFunc=cbfun;GLFW.refreshJoysticks();return prevcbfun},joys:{},lastGamepadState:[],lastGamepadStateFrame:null,refreshJoysticks:()=>{if(MainLoop.currentFrameNumber!==GLFW.lastGamepadStateFrame||!MainLoop.currentFrameNumber){GLFW.lastGamepadState=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads||[];GLFW.lastGamepadStateFrame=MainLoop.currentFrameNumber;for(var joy=0;joydynCall_vii(GLFW.joystickFunc,a1,a2))(joy,262145)}}var data=GLFW.joys[joy];for(var i=0;i>2]=gamepad.axes[i]}}else{if(GLFW.joys[joy]){out("glfw joystick disconnected",joy);if(GLFW.joystickFunc){((a1,a2)=>dynCall_vii(GLFW.joystickFunc,a1,a2))(joy,262146)}_free(GLFW.joys[joy].id);_free(GLFW.joys[joy].buttons);_free(GLFW.joys[joy].axes);delete GLFW.joys[joy]}}}}},setKeyCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.keyFunc;win.keyFunc=cbfun;return prevcbfun},setCharCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.charFunc;win.charFunc=cbfun;return prevcbfun},setMouseButtonCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.mouseButtonFunc;win.mouseButtonFunc=cbfun;return prevcbfun},setCursorPosCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.cursorPosFunc;win.cursorPosFunc=cbfun;return prevcbfun},setScrollCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.scrollFunc;win.scrollFunc=cbfun;return prevcbfun},setDropCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.dropFunc;win.dropFunc=cbfun;return prevcbfun},onDrop:event=>{if(!GLFW.active||!GLFW.active.dropFunc)return;if(!event.dataTransfer||!event.dataTransfer.files||event.dataTransfer.files.length==0)return;event.preventDefault();var drop_dir=".glfw_dropped_files";var filenames=_malloc(event.dataTransfer.files.length*4);var filenamesArray=[];for(var i=0;i>2]=filename}var written=0;FS.createPath("/",drop_dir);function save(file,in_path,numfiles){var path="/"+drop_dir+in_path+"/"+file.name.replace(/\//g,"_");var reader=new FileReader;reader.onloadend=e=>{if(reader.readyState!=2){++written;err(`failed to read dropped file: ${in_path}/${file.name}: ${reader.error}`);return}var data=e.target.result;FS.writeFile(path,new Uint8Array(data));if(++written===numfiles){((a1,a2,a3)=>dynCall_viii(GLFW.active.dropFunc,a1,a2,a3))(GLFW.active.id,filenamesArray.length,filenames);for(var i=0;i-1)entriesTree[parentpath].subpaths.splice(fpIndex,1);if(recursive)markDone(parentpath,true);if(Object.keys(entriesTree).length==0)finalize()}function processEntry(entry){let fp=entry.fullPath;let pp=fp.substring(0,fp.lastIndexOf("/"));entriesTree[fp]={subpaths:[]};if(entry.isFile){entry.file(f=>{filesQ.push({file:f,path:pp});markDone(fp,false)})}else if(entry.isDirectory){if(entriesTree.hasOwnProperty(pp))entriesTree[pp].subpaths.push(fp);FS.createPath("/"+drop_dir+pp,entry.name);var reader=entry.createReader();var rRead=function(dirEntries){if(dirEntries.length==0){markDone(fp,true);return}for(const ent of dirEntries)processEntry(ent);reader.readEntries(rRead)};reader.readEntries(rRead)}}for(const item of event.dataTransfer.items){processEntry(item.webkitGetAsEntry())}}else{for(const file of event.dataTransfer.files){filesQ.push({file,path:""})}finalize()}return false},onDragover:event=>{if(!GLFW.active||!GLFW.active.dropFunc)return;event.preventDefault();return false},setWindowSizeCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowSizeFunc;win.windowSizeFunc=cbfun;return prevcbfun},setWindowCloseCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowCloseFunc;win.windowCloseFunc=cbfun;return prevcbfun},setWindowRefreshCallback:(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowRefreshFunc;win.windowRefreshFunc=cbfun;return prevcbfun},onClickRequestPointerLock:e=>{var canvas=Browser.getCanvas();if(!Browser.pointerLock&&canvas.requestPointerLock){canvas.requestPointerLock();e.preventDefault()}},setInputMode:(winid,mode,value)=>{var win=GLFW.WindowFromId(winid);if(!win)return;switch(mode){case 208897:{var canvas=Browser.getCanvas();switch(value){case 212993:{win.inputModes[mode]=value;canvas.removeEventListener("click",GLFW.onClickRequestPointerLock,true);document.exitPointerLock();break}case 212994:{err("glfwSetInputMode called with GLFW_CURSOR_HIDDEN value not implemented");break}case 212995:{win.inputModes[mode]=value;canvas.addEventListener("click",GLFW.onClickRequestPointerLock,true);canvas.requestPointerLock();break}default:{err(`glfwSetInputMode called with unknown value parameter value: ${value}`);break}}break}case 208898:{err("glfwSetInputMode called with GLFW_STICKY_KEYS mode not implemented");break}case 208899:{err("glfwSetInputMode called with GLFW_STICKY_MOUSE_BUTTONS mode not implemented");break}case 208900:{err("glfwSetInputMode called with GLFW_LOCK_KEY_MODS mode not implemented");break}case 208901:{err("glfwSetInputMode called with GLFW_RAW_MOUSE_MOTION mode not implemented");break}default:{err(`glfwSetInputMode called with unknown mode parameter value: ${mode}`);break}}},getKey:(winid,key)=>{var win=GLFW.WindowFromId(winid);if(!win)return 0;return win.keys[key]},getMouseButton:(winid,button)=>{var win=GLFW.WindowFromId(winid);if(!win)return 0;return(win.buttons&1<0},getCursorPos:(winid,x,y)=>{HEAPF64[x>>3]=Browser.mouseX;HEAPF64[y>>3]=Browser.mouseY},getMousePos:(winid,x,y)=>{HEAP32[x>>2]=Browser.mouseX;HEAP32[y>>2]=Browser.mouseY},setCursorPos:(winid,x,y)=>{},getWindowPos:(winid,x,y)=>{var wx=0;var wy=0;var win=GLFW.WindowFromId(winid);if(win){wx=win.x;wy=win.y}if(x){HEAP32[x>>2]=wx}if(y){HEAP32[y>>2]=wy}},setWindowPos:(winid,x,y)=>{var win=GLFW.WindowFromId(winid);if(!win)return;win.x=x;win.y=y},getWindowSize:(winid,width,height)=>{var ww=0;var wh=0;var win=GLFW.WindowFromId(winid);if(win){ww=win.width;wh=win.height}if(width){HEAP32[width>>2]=ww}if(height){HEAP32[height>>2]=wh}},setWindowSize:(winid,width,height)=>{var win=GLFW.WindowFromId(winid);if(!win)return;if(GLFW.active.id==win.id){Browser.setCanvasSize(width,height)}},defaultWindowHints:()=>{GLFW.hints={...GLFW.defaultHints}},createWindow:(width,height,title,monitor,share)=>{var i,id;for(i=0;i0)abort("glfwCreateWindow only supports one window at time currently");id=i+1;if(width<=0||height<=0)return 0;if(monitor){Browser.requestFullscreen()}else{Browser.setCanvasSize(width,height)}for(i=0;i0;if(i==GLFW.windows.length){if(useWebGL){var contextAttributes={antialias:GLFW.hints[135181]>1,depth:GLFW.hints[135173]>0,stencil:GLFW.hints[135174]>0,alpha:GLFW.hints[135172]>0};Browser.createContext(canvas,true,true,contextAttributes)}else{Browser.init()}}if(!Module["ctx"]&&useWebGL)return 0;var win=new GLFW_Window(id,width,height,canvas.width,canvas.height,title,monitor,share);if(id-1==GLFW.windows.length){GLFW.windows.push(win)}else{GLFW.windows[id-1]=win}GLFW.active=win;GLFW.adjustCanvasDimensions();return win.id},destroyWindow:winid=>{var win=GLFW.WindowFromId(winid);if(!win)return;if(win.windowCloseFunc){(a1=>dynCall_vi(win.windowCloseFunc,a1))(win.id)}GLFW.windows[win.id-1]=null;if(GLFW.active.id==win.id){GLFW.active=null}for(win of GLFW.windows){if(win!==null)return}delete Module["ctx"]},swapBuffers:winid=>{},requestFullscreen(lockPointer,resizeCanvas){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;if(typeof Browser.lockPointer=="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas=="undefined")Browser.resizeCanvas=false;var canvas=Browser.getCanvas();function fullscreenChange(){Browser.isFullscreen=false;var canvasContainer=canvas.parentNode;if(getFullscreenElement()===canvasContainer){canvas.exitFullscreen=Browser.exitFullscreen;if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullscreen=true;if(Browser.resizeCanvas){Browser.setFullscreenCanvasSize()}else{Browser.updateCanvasDimensions(canvas);Browser.updateResizeListeners()}}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas){Browser.setWindowedCanvasSize()}else{Browser.updateCanvasDimensions(canvas);Browser.updateResizeListeners()}}Module["onFullScreen"]?.(Browser.isFullscreen);Module["onFullscreen"]?.(Browser.isFullscreen)}if(!Browser.fullscreenHandlersInstalled){Browser.fullscreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullscreenChange,false);document.addEventListener("mozfullscreenchange",fullscreenChange,false);document.addEventListener("webkitfullscreenchange",fullscreenChange,false);document.addEventListener("MSFullscreenChange",fullscreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullscreen=canvasContainer["requestFullscreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullscreen"]?()=>canvasContainer["webkitRequestFullscreen"](Element["ALLOW_KEYBOARD_INPUT"]):null)||(canvasContainer["webkitRequestFullScreen"]?()=>canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"]):null);canvasContainer.requestFullscreen()},updateCanvasDimensions(canvas,wNative,hNative){const scale=GLFW.getHiDPIScale();if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h{var win=GLFW.WindowFromId(winid);if(!win)return;const isHiDPIAware=GLFW.isHiDPIAware();win.attributes[attrib]=value;if(isHiDPIAware!==GLFW.isHiDPIAware())GLFW.adjustCanvasDimensions()},getDevicePixelRatio(){return typeof devicePixelRatio=="number"&&devicePixelRatio||1},isHiDPIAware(){if(GLFW.active)return GLFW.active.attributes[139276]>0;else return false},isCSSScalingEnabled(){return!GLFW.isHiDPIAware()},adjustCanvasDimensions(){if(GLFW.active){Browser.updateCanvasDimensions(Browser.getCanvas(),GLFW.active.width,GLFW.active.height);Browser.updateResizeListeners()}},getHiDPIScale(){return GLFW.isHiDPIAware()?GLFW.scale:1},onDevicePixelRatioChange(){GLFW.onWindowContentScaleChanged(GLFW.getDevicePixelRatio());GLFW.adjustCanvasDimensions()},GLFW2ParamToGLFW3Param:param=>{var table={196609:0,196610:0,196611:0,196612:0,196613:0,196614:0,131073:0,131074:0,131075:0,131076:0,131077:135169,131078:135170,131079:135171,131080:135172,131081:135173,131082:135174,131083:135183,131084:135175,131085:135176,131086:135177,131087:135178,131088:135179,131089:135180,131090:0,131091:135181,131092:139266,131093:139267,131094:139270,131095:139271,131096:139272};return table[param]}};var _glfwCreateWindow=(width,height,title,monitor,share)=>GLFW.createWindow(width,height,title,monitor,share);var _glfwDefaultWindowHints=()=>GLFW.defaultWindowHints();var _glfwDestroyWindow=winid=>GLFW.destroyWindow(winid);var _glfwGetPrimaryMonitor=()=>1;var _glfwGetTime=()=>GLFW.getTime()-GLFW.initialTime;var _glfwGetVideoModes=(monitor,count)=>{HEAP32[count>>2]=0;return 0};var _glfwInit=()=>{if(GLFW.windows)return 1;GLFW.initialTime=GLFW.getTime();GLFW.defaultWindowHints();GLFW.windows=new Array;GLFW.active=null;GLFW.scale=GLFW.getDevicePixelRatio();window.addEventListener("gamepadconnected",GLFW.onGamepadConnected,true);window.addEventListener("gamepaddisconnected",GLFW.onGamepadDisconnected,true);window.addEventListener("keydown",GLFW.onKeydown,true);window.addEventListener("keypress",GLFW.onKeyPress,true);window.addEventListener("keyup",GLFW.onKeyup,true);window.addEventListener("blur",GLFW.onBlur,true);GLFW.devicePixelRatioMQL=window.matchMedia("(resolution: "+GLFW.getDevicePixelRatio()+"dppx)");GLFW.devicePixelRatioMQL.addEventListener("change",GLFW.onDevicePixelRatioChange);var canvas=Browser.getCanvas();canvas.addEventListener("touchmove",GLFW.onMousemove,true);canvas.addEventListener("touchstart",GLFW.onMouseButtonDown,true);canvas.addEventListener("touchcancel",GLFW.onMouseButtonUp,true);canvas.addEventListener("touchend",GLFW.onMouseButtonUp,true);canvas.addEventListener("mousemove",GLFW.onMousemove,true);canvas.addEventListener("mousedown",GLFW.onMouseButtonDown,true);canvas.addEventListener("mouseup",GLFW.onMouseButtonUp,true);canvas.addEventListener("wheel",GLFW.onMouseWheel,true);canvas.addEventListener("mousewheel",GLFW.onMouseWheel,true);canvas.addEventListener("mouseenter",GLFW.onMouseenter,true);canvas.addEventListener("mouseleave",GLFW.onMouseleave,true);canvas.addEventListener("drop",GLFW.onDrop,true);canvas.addEventListener("dragover",GLFW.onDragover,true);Browser.requestFullscreen=GLFW.requestFullscreen;Browser.calculateMouseCoords=GLFW.calculateMouseCoords;Browser.updateCanvasDimensions=GLFW.updateCanvasDimensions;Browser.resizeListeners.push((width,height)=>{if(GLFW.isHiDPIAware()){var canvas=Browser.getCanvas();GLFW.onCanvasResize(canvas.clientWidth,canvas.clientHeight,width,height)}else{GLFW.onCanvasResize(width,height,width,height)}});return 1};var _glfwMakeContextCurrent=winid=>0;var _glfwSetCharCallback=(winid,cbfun)=>GLFW.setCharCallback(winid,cbfun);var _glfwSetCursorEnterCallback=(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.cursorEnterFunc;win.cursorEnterFunc=cbfun;return prevcbfun};var _glfwSetCursorPosCallback=(winid,cbfun)=>GLFW.setCursorPosCallback(winid,cbfun);var _glfwSetDropCallback=(winid,cbfun)=>GLFW.setDropCallback(winid,cbfun);var _glfwSetErrorCallback=cbfun=>{var prevcbfun=GLFW.errorFunc;GLFW.errorFunc=cbfun;return prevcbfun};var _glfwSetKeyCallback=(winid,cbfun)=>GLFW.setKeyCallback(winid,cbfun);var _glfwSetMouseButtonCallback=(winid,cbfun)=>GLFW.setMouseButtonCallback(winid,cbfun);var _glfwSetScrollCallback=(winid,cbfun)=>GLFW.setScrollCallback(winid,cbfun);var _glfwSetWindowContentScaleCallback=(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowContentScaleFunc;win.windowContentScaleFunc=cbfun;return prevcbfun};var _glfwSetWindowFocusCallback=(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowFocusFunc;win.windowFocusFunc=cbfun;return prevcbfun};var _glfwSetWindowIconifyCallback=(winid,cbfun)=>{var win=GLFW.WindowFromId(winid);if(!win)return null;var prevcbfun=win.windowIconifyFunc;win.windowIconifyFunc=cbfun;return prevcbfun};var _glfwSetWindowShouldClose=(winid,value)=>{var win=GLFW.WindowFromId(winid);if(!win)return;win.shouldClose=value};var _glfwSetWindowSize=(winid,width,height)=>GLFW.setWindowSize(winid,width,height);var _glfwSetWindowSizeCallback=(winid,cbfun)=>GLFW.setWindowSizeCallback(winid,cbfun);var _glfwSwapBuffers=winid=>GLFW.swapBuffers(winid);var _glfwTerminate=()=>{window.removeEventListener("gamepadconnected",GLFW.onGamepadConnected,true);window.removeEventListener("gamepaddisconnected",GLFW.onGamepadDisconnected,true);window.removeEventListener("keydown",GLFW.onKeydown,true);window.removeEventListener("keypress",GLFW.onKeyPress,true);window.removeEventListener("keyup",GLFW.onKeyup,true);window.removeEventListener("blur",GLFW.onBlur,true);var canvas=Browser.getCanvas();canvas.removeEventListener("touchmove",GLFW.onMousemove,true);canvas.removeEventListener("touchstart",GLFW.onMouseButtonDown,true);canvas.removeEventListener("touchcancel",GLFW.onMouseButtonUp,true);canvas.removeEventListener("touchend",GLFW.onMouseButtonUp,true);canvas.removeEventListener("mousemove",GLFW.onMousemove,true);canvas.removeEventListener("mousedown",GLFW.onMouseButtonDown,true);canvas.removeEventListener("mouseup",GLFW.onMouseButtonUp,true);canvas.removeEventListener("wheel",GLFW.onMouseWheel,true);canvas.removeEventListener("mousewheel",GLFW.onMouseWheel,true);canvas.removeEventListener("mouseenter",GLFW.onMouseenter,true);canvas.removeEventListener("mouseleave",GLFW.onMouseleave,true);canvas.removeEventListener("drop",GLFW.onDrop,true);canvas.removeEventListener("dragover",GLFW.onDragover,true);if(GLFW.devicePixelRatioMQL)GLFW.devicePixelRatioMQL.removeEventListener("change",GLFW.onDevicePixelRatioChange);canvas.width=canvas.height=1;GLFW.windows=null;GLFW.active=null};var _glfwWindowHint=(target,hint)=>{GLFW.hints[target]=hint};var runAndAbortIfError=func=>{try{return func()}catch(e){abort(e)}};var runtimeKeepalivePush=()=>{runtimeKeepaliveCounter+=1};var runtimeKeepalivePop=()=>{runtimeKeepaliveCounter-=1};var Asyncify={instrumentWasmImports(imports){var importPattern=/^(invoke_.*|__asyncjs__.*)$/;for(let[x,original]of Object.entries(imports)){if(typeof original=="function"){let isAsyncifyImport=original.isAsync||importPattern.test(x)}}},instrumentFunction(original){var wrapper=(...args)=>{Asyncify.exportCallStack.push(original);try{return original(...args)}finally{if(!ABORT){var top=Asyncify.exportCallStack.pop();Asyncify.maybeStopUnwind()}}};Asyncify.funcWrappers.set(original,wrapper);return wrapper},instrumentWasmExports(exports){var ret={};for(let[x,original]of Object.entries(exports)){if(typeof original=="function"){var wrapper=Asyncify.instrumentFunction(original);ret[x]=wrapper}else{ret[x]=original}}return ret},State:{Normal:0,Unwinding:1,Rewinding:2,Disabled:3},state:0,StackSize:4096,currData:null,handleSleepReturnValue:0,exportCallStack:[],callstackFuncToId:new Map,callStackIdToFunc:new Map,funcWrappers:new Map,callStackId:0,asyncPromiseHandlers:null,sleepCallbacks:[],getCallStackId(func){if(!Asyncify.callstackFuncToId.has(func)){var id=Asyncify.callStackId++;Asyncify.callstackFuncToId.set(func,id);Asyncify.callStackIdToFunc.set(id,func)}return Asyncify.callstackFuncToId.get(func)},maybeStopUnwind(){if(Asyncify.currData&&Asyncify.state===Asyncify.State.Unwinding&&Asyncify.exportCallStack.length===0){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_unwind);if(typeof Fibers!="undefined"){Fibers.trampoline()}}},whenDone(){return new Promise((resolve,reject)=>{Asyncify.asyncPromiseHandlers={resolve,reject}})},allocateData(){var ptr=_malloc(12+Asyncify.StackSize);Asyncify.setDataHeader(ptr,ptr+12,Asyncify.StackSize);Asyncify.setDataRewindFunc(ptr);return ptr},setDataHeader(ptr,stack,stackSize){HEAPU32[ptr>>2]=stack;HEAPU32[ptr+4>>2]=stack+stackSize},setDataRewindFunc(ptr){var bottomOfCallStack=Asyncify.exportCallStack[0];var rewindId=Asyncify.getCallStackId(bottomOfCallStack);HEAP32[ptr+8>>2]=rewindId},getDataRewindFunc(ptr){var id=HEAP32[ptr+8>>2];var func=Asyncify.callStackIdToFunc.get(id);return func},doRewind(ptr){var original=Asyncify.getDataRewindFunc(ptr);var func=Asyncify.funcWrappers.get(original);return callUserCallback(func)},handleSleep(startAsync){if(ABORT)return;if(Asyncify.state===Asyncify.State.Normal){var reachedCallback=false;var reachedAfterCallback=false;startAsync((handleSleepReturnValue=0)=>{if(ABORT)return;Asyncify.handleSleepReturnValue=handleSleepReturnValue;reachedCallback=true;if(!reachedAfterCallback){return}Asyncify.state=Asyncify.State.Rewinding;runAndAbortIfError(()=>_asyncify_start_rewind(Asyncify.currData));if(typeof MainLoop!="undefined"&&MainLoop.func){MainLoop.resume()}var asyncWasmReturnValue,isError=false;try{asyncWasmReturnValue=Asyncify.doRewind(Asyncify.currData)}catch(err){asyncWasmReturnValue=err;isError=true}var handled=false;if(!Asyncify.currData){var asyncPromiseHandlers=Asyncify.asyncPromiseHandlers;if(asyncPromiseHandlers){Asyncify.asyncPromiseHandlers=null;(isError?asyncPromiseHandlers.reject:asyncPromiseHandlers.resolve)(asyncWasmReturnValue);handled=true}}if(isError&&!handled){throw asyncWasmReturnValue}});reachedAfterCallback=true;if(!reachedCallback){Asyncify.state=Asyncify.State.Unwinding;Asyncify.currData=Asyncify.allocateData();if(typeof MainLoop!="undefined"&&MainLoop.func){MainLoop.pause()}runAndAbortIfError(()=>_asyncify_start_unwind(Asyncify.currData))}}else if(Asyncify.state===Asyncify.State.Rewinding){Asyncify.state=Asyncify.State.Normal;runAndAbortIfError(_asyncify_stop_rewind);_free(Asyncify.currData);Asyncify.currData=null;Asyncify.sleepCallbacks.forEach(callUserCallback)}else{abort(`invalid state: ${Asyncify.state}`)}return Asyncify.handleSleepReturnValue},handleAsync:startAsync=>Asyncify.handleSleep(async wakeUp=>{wakeUp(await startAsync())})};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;iFS.createPath(...args);var FS_unlink=(...args)=>FS.unlink(...args);var FS_createLazyFile=(...args)=>FS.createLazyFile(...args);var FS_createDevice=(...args)=>FS.createDevice(...args);FS.createPreloadedFile=FS_createPreloadedFile;FS.preloadFile=FS_preloadFile;FS.staticInit();for(let i=0;i<32;++i)tempFixedLengthArray.push(new Array(i));var miniTempWebGLFloatBuffersStorage=new Float32Array(288);for(var i=0;i<=288;++i){miniTempWebGLFloatBuffers[i]=miniTempWebGLFloatBuffersStorage.subarray(0,i)}var miniTempWebGLIntBuffersStorage=new Int32Array(288);for(var i=0;i<=288;++i){miniTempWebGLIntBuffers[i]=miniTempWebGLIntBuffersStorage.subarray(0,i)}Module["requestAnimationFrame"]=MainLoop.requestAnimationFrame;Module["pauseMainLoop"]=MainLoop.pause;Module["resumeMainLoop"]=MainLoop.resume;MainLoop.init();{if(Module["noExitRuntime"])noExitRuntime=Module["noExitRuntime"];if(Module["preloadPlugins"])preloadPlugins=Module["preloadPlugins"];if(Module["print"])out=Module["print"];if(Module["printErr"])err=Module["printErr"];if(Module["wasmBinary"])wasmBinary=Module["wasmBinary"];if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].shift()()}}}Module["addRunDependency"]=addRunDependency;Module["removeRunDependency"]=removeRunDependency;Module["ccall"]=ccall;Module["FS_preloadFile"]=FS_preloadFile;Module["FS_unlink"]=FS_unlink;Module["FS_createPath"]=FS_createPath;Module["FS_createDevice"]=FS_createDevice;Module["FS_createDataFile"]=FS_createDataFile;Module["FS_createLazyFile"]=FS_createLazyFile;var ASM_CONSTS={40694:()=>{if(document.fullscreenElement)return 1},40740:()=>Module.canvas.width,40772:()=>parseInt(Module.canvas.style.width),40820:()=>{document.exitFullscreen()},40847:()=>{setTimeout(function(){Module.requestFullscreen(false,false)},100)},40919:()=>{if(document.fullscreenElement)return 1},40965:()=>Module.canvas.width,40997:()=>screen.width,41022:()=>{document.exitFullscreen()},41049:$0=>{const canvasId=UTF8ToString($0);setTimeout(function(){Module.requestFullscreen(false,true);setTimeout(function(){document.querySelector(canvasId).style.width="unset"},100)},100)},41243:()=>window.innerWidth,41269:()=>window.innerHeight,41296:()=>{if(document.fullscreenElement)return 1},41342:()=>Module.canvas.width,41374:()=>parseInt(Module.canvas.style.width),41422:()=>{if(document.fullscreenElement)return 1},41468:()=>Module.canvas.width,41500:()=>screen.width,41525:()=>window.innerWidth,41551:()=>window.innerHeight,41578:()=>{if(document.fullscreenElement)return 1},41624:()=>Module.canvas.width,41656:()=>screen.width,41681:()=>{document.exitFullscreen()},41708:()=>{if(document.fullscreenElement)return 1},41754:()=>Module.canvas.width,41786:()=>parseInt(Module.canvas.style.width),41834:()=>{document.exitFullscreen()},41861:$0=>{Module.canvas.style.opacity=$0},41899:()=>screen.width,41924:()=>screen.height,41950:()=>window.screenX,41977:()=>window.screenY,42004:()=>window.devicePixelRatio,42040:$0=>{navigator.clipboard.writeText(UTF8ToString($0))},42093:$0=>{Module.canvas.style.cursor=UTF8ToString($0)},42144:()=>{Module.canvas.style.cursor="none"},42181:($0,$1,$2,$3)=>{try{navigator.getGamepads()[$0].vibrationActuator.playEffect("dual-rumble",{startDelay:0,duration:$3,weakMagnitude:$1,strongMagnitude:$2})}catch(e){try{navigator.getGamepads()[$0].hapticActuators[0].pulse($2,$3)}catch(e){}}},42437:$0=>{Module.canvas.style.cursor=UTF8ToString($0)},42488:()=>{if(document.pointerLockElement)return 1},42535:()=>{if(document.fullscreenElement)return 1},42581:()=>window.innerWidth,42607:()=>window.innerHeight};function SetCanvasIdJs(out,outSize){var canvasId="#"+Module.canvas.id;stringToUTF8(canvasId,out,outSize)}var _main,_free,_malloc,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,dynCall_vii,dynCall_viii,dynCall_viff,dynCall_viiiii,dynCall_viiii,dynCall_vidd,dynCall_ii,dynCall_iiii,dynCall_fffi,dynCall_ffi,dynCall_iii,dynCall_viiiiii,dynCall_vi,dynCall_vffff,dynCall_vf,dynCall_viiiiiiii,dynCall_viiiiiiiii,dynCall_i,dynCall_vff,dynCall_v,dynCall_viiiiiii,dynCall_vfi,dynCall_viif,dynCall_vif,dynCall_vifff,dynCall_viffff,dynCall_vfff,dynCall_jiji,dynCall_iidiiii,_asyncify_start_unwind,_asyncify_stop_unwind,_asyncify_start_rewind,_asyncify_stop_rewind,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_main=Module["_main"]=wasmExports["me"];_free=wasmExports["ne"];_malloc=wasmExports["oe"];__emscripten_stack_restore=wasmExports["pe"];__emscripten_stack_alloc=wasmExports["qe"];_emscripten_stack_get_current=wasmExports["re"];dynCall_vii=dynCalls["vii"]=wasmExports["se"];dynCall_viii=dynCalls["viii"]=wasmExports["te"];dynCall_viff=dynCalls["viff"]=wasmExports["ue"];dynCall_viiiii=dynCalls["viiiii"]=wasmExports["ve"];dynCall_viiii=dynCalls["viiii"]=wasmExports["we"];dynCall_vidd=dynCalls["vidd"]=wasmExports["xe"];dynCall_ii=dynCalls["ii"]=wasmExports["ye"];dynCall_iiii=dynCalls["iiii"]=wasmExports["ze"];dynCall_fffi=dynCalls["fffi"]=wasmExports["Ae"];dynCall_ffi=dynCalls["ffi"]=wasmExports["Be"];dynCall_iii=dynCalls["iii"]=wasmExports["Ce"];dynCall_viiiiii=dynCalls["viiiiii"]=wasmExports["De"];dynCall_vi=dynCalls["vi"]=wasmExports["Ee"];dynCall_vffff=dynCalls["vffff"]=wasmExports["Fe"];dynCall_vf=dynCalls["vf"]=wasmExports["Ge"];dynCall_viiiiiiii=dynCalls["viiiiiiii"]=wasmExports["He"];dynCall_viiiiiiiii=dynCalls["viiiiiiiii"]=wasmExports["Ie"];dynCall_i=dynCalls["i"]=wasmExports["Je"];dynCall_vff=dynCalls["vff"]=wasmExports["Ke"];dynCall_v=dynCalls["v"]=wasmExports["Le"];dynCall_viiiiiii=dynCalls["viiiiiii"]=wasmExports["Me"];dynCall_vfi=dynCalls["vfi"]=wasmExports["Ne"];dynCall_viif=dynCalls["viif"]=wasmExports["Oe"];dynCall_vif=dynCalls["vif"]=wasmExports["Pe"];dynCall_vifff=dynCalls["vifff"]=wasmExports["Qe"];dynCall_viffff=dynCalls["viffff"]=wasmExports["Re"];dynCall_vfff=dynCalls["vfff"]=wasmExports["Se"];dynCall_jiji=dynCalls["jiji"]=wasmExports["Te"];dynCall_iidiiii=dynCalls["iidiiii"]=wasmExports["Ue"];_asyncify_start_unwind=wasmExports["Ve"];_asyncify_stop_unwind=wasmExports["We"];_asyncify_start_rewind=wasmExports["Xe"];_asyncify_stop_rewind=wasmExports["Ye"];memory=wasmMemory=wasmExports["ke"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={ta:SetCanvasIdJs,a:___assert_fail,Xa:___syscall_faccessat,J:___syscall_fcntl64,Qa:___syscall_getcwd,Sa:___syscall_ioctl,Ta:___syscall_openat,Wa:_clock_time_get,A:_emscripten_asm_const_double,o:_emscripten_asm_const_int,Ua:_emscripten_date_now,he:_emscripten_get_element_css_size,ua:_emscripten_get_gamepad_status,H:_emscripten_get_now,va:_emscripten_get_num_gamepads,Nd:_emscripten_glActiveTexture,Md:_emscripten_glAttachShader,ce:_emscripten_glBeginQueryEXT,Ld:_emscripten_glBindAttribLocation,Kd:_emscripten_glBindBuffer,Jd:_emscripten_glBindFramebuffer,Id:_emscripten_glBindRenderbuffer,Hd:_emscripten_glBindTexture,Wd:_emscripten_glBindVertexArrayOES,Gd:_emscripten_glBlendColor,Ed:_emscripten_glBlendEquation,Dd:_emscripten_glBlendEquationSeparate,Cd:_emscripten_glBlendFunc,Bd:_emscripten_glBlendFuncSeparate,Ad:_emscripten_glBufferData,zd:_emscripten_glBufferSubData,yd:_emscripten_glCheckFramebufferStatus,xd:_emscripten_glClear,wd:_emscripten_glClearColor,vd:_emscripten_glClearDepthf,ud:_emscripten_glClearStencil,Za:_emscripten_glClipControlEXT,td:_emscripten_glColorMask,sd:_emscripten_glCompileShader,rd:_emscripten_glCompressedTexImage2D,qd:_emscripten_glCompressedTexSubImage2D,pd:_emscripten_glCopyTexImage2D,od:_emscripten_glCopyTexSubImage2D,nd:_emscripten_glCreateProgram,md:_emscripten_glCreateShader,ld:_emscripten_glCullFace,kd:_emscripten_glDeleteBuffers,jd:_emscripten_glDeleteFramebuffers,id:_emscripten_glDeleteProgram,ee:_emscripten_glDeleteQueriesEXT,hd:_emscripten_glDeleteRenderbuffers,gd:_emscripten_glDeleteShader,fd:_emscripten_glDeleteTextures,Vd:_emscripten_glDeleteVertexArraysOES,ed:_emscripten_glDepthFunc,dd:_emscripten_glDepthMask,cd:_emscripten_glDepthRangef,bd:_emscripten_glDetachShader,ad:_emscripten_glDisable,$c:_emscripten_glDisableVertexAttribArray,_c:_emscripten_glDrawArrays,Rd:_emscripten_glDrawArraysInstancedANGLE,Sd:_emscripten_glDrawBuffersWEBGL,Zc:_emscripten_glDrawElements,Pd:_emscripten_glDrawElementsInstancedANGLE,Yc:_emscripten_glEnable,Xc:_emscripten_glEnableVertexAttribArray,be:_emscripten_glEndQueryEXT,Wc:_emscripten_glFinish,Vc:_emscripten_glFlush,Uc:_emscripten_glFramebufferRenderbuffer,Tc:_emscripten_glFramebufferTexture2D,Rc:_emscripten_glFrontFace,Qc:_emscripten_glGenBuffers,Oc:_emscripten_glGenFramebuffers,fe:_emscripten_glGenQueriesEXT,Nc:_emscripten_glGenRenderbuffers,Mc:_emscripten_glGenTextures,Ud:_emscripten_glGenVertexArraysOES,Pc:_emscripten_glGenerateMipmap,Lc:_emscripten_glGetActiveAttrib,Kc:_emscripten_glGetActiveUniform,Jc:_emscripten_glGetAttachedShaders,Ic:_emscripten_glGetAttribLocation,Gc:_emscripten_glGetBooleanv,Fc:_emscripten_glGetBufferParameteriv,Ec:_emscripten_glGetError,Dc:_emscripten_glGetFloatv,Cc:_emscripten_glGetFramebufferAttachmentParameteriv,Bc:_emscripten_glGetIntegerv,zc:_emscripten_glGetProgramInfoLog,Ac:_emscripten_glGetProgramiv,Yd:_emscripten_glGetQueryObjecti64vEXT,_d:_emscripten_glGetQueryObjectivEXT,Xd:_emscripten_glGetQueryObjectui64vEXT,Zd:_emscripten_glGetQueryObjectuivEXT,$d:_emscripten_glGetQueryivEXT,yc:_emscripten_glGetRenderbufferParameteriv,vc:_emscripten_glGetShaderInfoLog,uc:_emscripten_glGetShaderPrecisionFormat,tc:_emscripten_glGetShaderSource,xc:_emscripten_glGetShaderiv,sc:_emscripten_glGetString,rc:_emscripten_glGetTexParameterfv,qc:_emscripten_glGetTexParameteriv,nc:_emscripten_glGetUniformLocation,pc:_emscripten_glGetUniformfv,oc:_emscripten_glGetUniformiv,kc:_emscripten_glGetVertexAttribPointerv,mc:_emscripten_glGetVertexAttribfv,lc:_emscripten_glGetVertexAttribiv,jc:_emscripten_glHint,ic:_emscripten_glIsBuffer,hc:_emscripten_glIsEnabled,gc:_emscripten_glIsFramebuffer,fc:_emscripten_glIsProgram,de:_emscripten_glIsQueryEXT,ec:_emscripten_glIsRenderbuffer,dc:_emscripten_glIsShader,cc:_emscripten_glIsTexture,Td:_emscripten_glIsVertexArrayOES,bc:_emscripten_glLineWidth,ac:_emscripten_glLinkProgram,$b:_emscripten_glPixelStorei,Ya:_emscripten_glPolygonModeWEBGL,_b:_emscripten_glPolygonOffset,_a:_emscripten_glPolygonOffsetClampEXT,ae:_emscripten_glQueryCounterEXT,Zb:_emscripten_glReadPixels,Yb:_emscripten_glReleaseShaderCompiler,Xb:_emscripten_glRenderbufferStorage,Wb:_emscripten_glSampleCoverage,Vb:_emscripten_glScissor,Ub:_emscripten_glShaderBinary,Sb:_emscripten_glShaderSource,Rb:_emscripten_glStencilFunc,Qb:_emscripten_glStencilFuncSeparate,Pb:_emscripten_glStencilMask,Ob:_emscripten_glStencilMaskSeparate,Nb:_emscripten_glStencilOp,Mb:_emscripten_glStencilOpSeparate,Lb:_emscripten_glTexImage2D,Kb:_emscripten_glTexParameterf,Jb:_emscripten_glTexParameterfv,Ib:_emscripten_glTexParameteri,Hb:_emscripten_glTexParameteriv,Gb:_emscripten_glTexSubImage2D,Fb:_emscripten_glUniform1f,Eb:_emscripten_glUniform1fv,Db:_emscripten_glUniform1i,Cb:_emscripten_glUniform1iv,Bb:_emscripten_glUniform2f,Ab:_emscripten_glUniform2fv,zb:_emscripten_glUniform2i,yb:_emscripten_glUniform2iv,xb:_emscripten_glUniform3f,wb:_emscripten_glUniform3fv,vb:_emscripten_glUniform3i,ub:_emscripten_glUniform3iv,tb:_emscripten_glUniform4f,sb:_emscripten_glUniform4fv,rb:_emscripten_glUniform4i,qb:_emscripten_glUniform4iv,pb:_emscripten_glUniformMatrix2fv,nb:_emscripten_glUniformMatrix3fv,mb:_emscripten_glUniformMatrix4fv,lb:_emscripten_glUseProgram,kb:_emscripten_glValidateProgram,jb:_emscripten_glVertexAttrib1f,ib:_emscripten_glVertexAttrib1fv,hb:_emscripten_glVertexAttrib2f,gb:_emscripten_glVertexAttrib2fv,fb:_emscripten_glVertexAttrib3f,eb:_emscripten_glVertexAttrib3fv,cb:_emscripten_glVertexAttrib4f,bb:_emscripten_glVertexAttrib4fv,Od:_emscripten_glVertexAttribDivisorANGLE,ab:_emscripten_glVertexAttribPointer,$a:_emscripten_glViewport,Oa:_emscripten_resize_heap,wa:_emscripten_sample_gamepad_data,aa:_emscripten_set_blur_callback_on_thread,ya:_emscripten_set_canvas_element_size,X:_emscripten_set_click_callback_on_thread,$:_emscripten_set_focus_callback_on_thread,ba:_emscripten_set_fullscreenchange_callback_on_thread,Q:_emscripten_set_gamepadconnected_callback_on_thread,P:_emscripten_set_gamepaddisconnected_callback_on_thread,V:_emscripten_set_mousemove_callback_on_thread,W:_emscripten_set_pointerlockchange_callback_on_thread,Y:_emscripten_set_resize_callback_on_thread,R:_emscripten_set_touchcancel_callback_on_thread,T:_emscripten_set_touchend_callback_on_thread,S:_emscripten_set_touchmove_callback_on_thread,U:_emscripten_set_touchstart_callback_on_thread,_:_emscripten_set_visibilitychange_callback_on_thread,za:_emscripten_set_window_title,Ba:_emscripten_sleep,je:_exit,K:_fd_close,Ra:_fd_read,Pa:_fd_seek,I:_fd_write,O:_glActiveTexture,C:_glAttachShader,e:_glBindAttribLocation,b:_glBindBuffer,h:_glBindTexture,Tb:_glBlendFunc,m:_glBufferData,q:_glBufferSubData,L:_glClear,M:_glClearColor,Va:_glClearDepthf,Ga:_glCompileShader,Ka:_glCompressedTexImage2D,Ea:_glCreateProgram,Ia:_glCreateShader,Hc:_glCullFace,l:_glDeleteBuffers,F:_glDeleteProgram,s:_glDeleteShader,E:_glDeleteTextures,ob:_glDepthFunc,G:_glDetachShader,Sc:_glDisable,p:_glDisableVertexAttribArray,Qd:_glDrawArrays,Fd:_glDrawElements,N:_glEnable,f:_glEnableVertexAttribArray,db:_glFrontFace,n:_glGenBuffers,Ma:_glGenTextures,u:_glGetAttribLocation,wc:_glGetFloatv,Ca:_glGetProgramInfoLog,B:_glGetProgramiv,Fa:_glGetShaderInfoLog,D:_glGetShaderiv,k:_glGetString,t:_glGetUniformLocation,Da:_glLinkProgram,Na:_glPixelStorei,Ja:_glReadPixels,Ha:_glShaderSource,La:_glTexImage2D,v:_glTexParameterf,i:_glTexParameteri,Z:_glUniform1i,ha:_glUniform4f,j:_glUniformMatrix4fv,r:_glUseProgram,g:_glVertexAttribPointer,w:_glViewport,y:_glfwCreateWindow,qa:_glfwDefaultWindowHints,ge:_glfwDestroyWindow,z:_glfwGetPrimaryMonitor,c:_glfwGetTime,pa:_glfwGetVideoModes,ra:_glfwInit,ca:_glfwMakeContextCurrent,ia:_glfwSetCharCallback,da:_glfwSetCursorEnterCallback,fa:_glfwSetCursorPosCallback,la:_glfwSetDropCallback,sa:_glfwSetErrorCallback,ja:_glfwSetKeyCallback,ga:_glfwSetMouseButtonCallback,ea:_glfwSetScrollCallback,ka:_glfwSetWindowContentScaleCallback,ma:_glfwSetWindowFocusCallback,na:_glfwSetWindowIconifyCallback,ie:_glfwSetWindowShouldClose,Aa:_glfwSetWindowSize,oa:_glfwSetWindowSizeCallback,xa:_glfwSwapBuffers,x:_glfwTerminate,d:_glfwWindowHint};function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();Module["onRuntimeInitialized"]?.();var noInitialRun=Module["noInitialRun"]||false;if(!noInitialRun)callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;createWasm();run(); +// include: shell.js +// include: minimum_runtime_check.js +(function() { + // "30.0.0" -> 300000 + function humanReadableVersionToPacked(str) { + str = str.split('-')[0]; // Remove any trailing part from e.g. "12.53.3-alpha" + var vers = str.split('.').slice(0, 3); + while(vers.length < 3) vers.push('00'); + vers = vers.map((n, i, arr) => n.padStart(2, '0')); + return vers.join(''); + } + // 300000 -> "30.0.0" + var packedVersionToHumanReadable = n => [n / 10000 | 0, (n / 100 | 0) % 100, n % 100].join('.'); + + var TARGET_NOT_SUPPORTED = 2147483647; + + // Note: We use a typeof check here instead of optional chaining using + // globalThis because older browsers might not have globalThis defined. + + // We skip the node version checking when running on Bun/Deno since the node + // version they report doesn't seem to be useful. + if (typeof process !== 'undefined' && !process.versions?.bun && typeof Deno == "undefined") { + var currentNodeVersion = process.versions?.node ? humanReadableVersionToPacked(process.versions.node) : TARGET_NOT_SUPPORTED; + if (currentNodeVersion < 180300) { + throw new Error(`This emscripten-generated code requires node v${ packedVersionToHumanReadable(180300) } (detected v${packedVersionToHumanReadable(currentNodeVersion)})`); + } + } + + var userAgent = typeof navigator !== 'undefined' && navigator.userAgent; + if (!userAgent) { + return; + } + + var currentSafariVersion = userAgent.includes("Safari/") && !userAgent.includes("Chrome/") && userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/) ? humanReadableVersionToPacked(userAgent.match(/Version\/(\d+\.?\d*\.?\d*)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentSafariVersion < 150000) { + throw new Error(`This emscripten-generated code requires Safari v${ packedVersionToHumanReadable(150000) } (detected v${currentSafariVersion})`); + } + + var currentFirefoxVersion = userAgent.match(/Firefox\/(\d+(?:\.\d+)?)/) ? parseFloat(userAgent.match(/Firefox\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentFirefoxVersion < 79) { + throw new Error(`This emscripten-generated code requires Firefox v79 (detected v${currentFirefoxVersion})`); + } + + var currentChromeVersion = userAgent.match(/Chrome\/(\d+(?:\.\d+)?)/) ? parseFloat(userAgent.match(/Chrome\/(\d+(?:\.\d+)?)/)[1]) : TARGET_NOT_SUPPORTED; + if (currentChromeVersion < 85) { + throw new Error(`This emscripten-generated code requires Chrome v85 (detected v${currentChromeVersion})`); + } +})(); + +// end include: minimum_runtime_check.js +// The Module object: Our interface to the outside world. We import +// and export values on it. There are various ways Module can be used: +// 1. Not defined. We create it here +// 2. A function parameter, function(moduleArg) => Promise +// 3. pre-run appended it, var Module = {}; ..generated code.. +// 4. External script tag defines var Module. +// We need to check if Module already exists (e.g. case 3 above). +// Substitution will be replaced with actual code on later stage of the build, +// this way Closure Compiler will not mangle it (e.g. case 4. above). +// Note that if you want to run closure, and also to use Module +// after the generated code, you will need to define var Module = {}; +// before the code. Then that object will be used in the code, and you +// can continue to use Module afterwards as well. +var Module = typeof Module != 'undefined' ? Module : {}; + +// Determine the runtime environment we are in. You can customize this by +// setting the ENVIRONMENT setting at compile time (see settings.js). + +// Attempt to auto-detect the environment +var ENVIRONMENT_IS_WEB = !!globalThis.window; +var ENVIRONMENT_IS_WORKER = !!globalThis.WorkerGlobalScope; +// N.b. Electron.js environment is simultaneously a NODE-environment, but +// also a web environment. +var ENVIRONMENT_IS_NODE = globalThis.process?.versions?.node && globalThis.process?.type != 'renderer'; +var ENVIRONMENT_IS_SHELL = !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER; + +// --pre-jses are emitted after the Module integration code, so that they can +// refer to Module (if they choose; they can also define Module) +// include: C:\Users\ethan\AppData\Local\Temp\tmp_dzhsd_5.js + + if (!Module['expectedDataFileDownloads']) Module['expectedDataFileDownloads'] = 0; + Module['expectedDataFileDownloads']++; + (() => { + // Do not attempt to redownload the virtual filesystem data when in a pthread or a Wasm Worker context. + var isPthread = typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD; + var isWasmWorker = typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER; + if (isPthread || isWasmWorker) return; + var isNode = globalThis.process && globalThis.process.versions && globalThis.process.versions.node && globalThis.process.type != 'renderer'; + async function loadPackage(metadata) { + + var PACKAGE_PATH = ''; + if (typeof window === 'object') { + PACKAGE_PATH = window['encodeURIComponent'](window.location.pathname.substring(0, window.location.pathname.lastIndexOf('/')) + '/'); + } else if (typeof process === 'undefined' && typeof location !== 'undefined') { + // web worker + PACKAGE_PATH = encodeURIComponent(location.pathname.substring(0, location.pathname.lastIndexOf('/')) + '/'); + } + var PACKAGE_NAME = 'text_font_loading.data'; + var REMOTE_PACKAGE_BASE = 'text_font_loading.data'; + var REMOTE_PACKAGE_NAME = Module['locateFile'] ? Module['locateFile'](REMOTE_PACKAGE_BASE, '') : REMOTE_PACKAGE_BASE; + var REMOTE_PACKAGE_SIZE = metadata['remote_package_size']; + + async function fetchRemotePackage(packageName, packageSize) { + if (isNode) { + var contents = require('fs').readFileSync(packageName); + return new Uint8Array(contents).buffer; + } + if (!Module['dataFileDownloads']) Module['dataFileDownloads'] = {}; + try { + var response = await fetch(packageName); + } catch (e) { + throw new Error(`Network Error: ${packageName}`, {e}); + } + if (!response.ok) { + throw new Error(`${response.status}: ${response.url}`); + } + + const chunks = []; + const headers = response.headers; + const total = Number(headers.get('Content-Length') || packageSize); + let loaded = 0; + + Module['setStatus'] && Module['setStatus']('Downloading data...'); + const reader = response.body.getReader(); + + while (1) { + var {done, value} = await reader.read(); + if (done) break; + chunks.push(value); + loaded += value.length; + Module['dataFileDownloads'][packageName] = {loaded, total}; + + let totalLoaded = 0; + let totalSize = 0; + + for (const download of Object.values(Module['dataFileDownloads'])) { + totalLoaded += download.loaded; + totalSize += download.total; + } + + Module['setStatus'] && Module['setStatus'](`Downloading data... (${totalLoaded}/${totalSize})`); + } + + const packageData = new Uint8Array(chunks.map((c) => c.length).reduce((a, b) => a + b, 0)); + let offset = 0; + for (const chunk of chunks) { + packageData.set(chunk, offset); + offset += chunk.length; + } + return packageData.buffer; + } + + var fetchPromise; + var fetched = Module['getPreloadedPackage'] && Module['getPreloadedPackage'](REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE); + + if (!fetched) { + // Note that we don't use await here because we want to execute the + // the rest of this function immediately. + fetchPromise = fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE); + } + + async function runWithFS(Module) { + + function assert(check, msg) { + if (!check) throw new Error(msg); + } +Module['FS_createPath']("/", "resources", true, true); + + async function processPackageData(arrayBuffer) { + assert(arrayBuffer, 'Loading data file failed.'); + assert(arrayBuffer.constructor.name === ArrayBuffer.name, 'bad input to processPackageData ' + arrayBuffer.constructor.name); + var byteArray = new Uint8Array(arrayBuffer); + var curr; + // Reuse the bytearray from the XHR as the source for file reads. + for (var file of metadata['files']) { + var name = file['filename']; + var data = byteArray.subarray(file['start'], file['end']); + // canOwn this data in the filesystem, it is a slice into the heap that will never change + Module['FS_createDataFile'](name, null, data, true, true, true); + } + Module['removeRunDependency']('datafile_text_font_loading.data'); + } + Module['addRunDependency']('datafile_text_font_loading.data'); + + if (!Module['preloadResults']) Module['preloadResults'] = {}; + + Module['preloadResults'][PACKAGE_NAME] = {fromCache: false}; + if (!fetched) { + fetched = await fetchPromise; + } + await processPackageData(fetched); + + } + // Detect whether the module JS file has already been loaded. + if (Module['FS_createPath']) { + runWithFS(Module); + } else { + if (!Module['preRun']) Module['preRun'] = []; + Module['preRun'].push(runWithFS); // FS is not initialized yet, wait for it + } + + } + loadPackage({"files": [{"filename": "/resources/pixantiqua.fnt", "start": 0, "end": 21274}, {"filename": "/resources/pixantiqua.png", "start": 21274, "end": 25805}, {"filename": "/resources/pixantiqua.ttf", "start": 25805, "end": 61213}], "remote_package_size": 61213}); + + })(); + +// end include: C:\Users\ethan\AppData\Local\Temp\tmp_dzhsd_5.js +// include: C:\Users\ethan\AppData\Local\Temp\tmpkhlx4t77.js + + // All the pre-js content up to here must remain later on, we need to run + // it. + if ((typeof ENVIRONMENT_IS_WASM_WORKER != 'undefined' && ENVIRONMENT_IS_WASM_WORKER) || (typeof ENVIRONMENT_IS_PTHREAD != 'undefined' && ENVIRONMENT_IS_PTHREAD) || (typeof ENVIRONMENT_IS_AUDIO_WORKLET != 'undefined' && ENVIRONMENT_IS_AUDIO_WORKLET)) Module['preRun'] = []; + var necessaryPreJSTasks = Module['preRun'].slice(); + // end include: C:\Users\ethan\AppData\Local\Temp\tmpkhlx4t77.js +// include: C:\Users\ethan\AppData\Local\Temp\tmp65g32kry.js + + if (!Module['preRun']) throw 'Module.preRun should exist because file support used it; did a pre-js delete it?'; + necessaryPreJSTasks.forEach((task) => { + if (Module['preRun'].indexOf(task) < 0) throw 'All preRun tasks that exist before user pre-js code should remain after; did you replace Module or modify Module.preRun?'; + }); + // end include: C:\Users\ethan\AppData\Local\Temp\tmp65g32kry.js + + +var programArgs = []; +var thisProgram = './this.program'; +var quit_ = (status, toThrow) => { + throw toThrow; +}; + +// In MODULARIZE mode _scriptName needs to be captured already at the very top of the page immediately when the page is parsed, so it is generated there +// before the page load. In non-MODULARIZE modes generate it here. +var _scriptName = globalThis.document?.currentScript?.src; + +if (typeof __filename != 'undefined') { // Node + _scriptName = __filename; +} else +if (ENVIRONMENT_IS_WORKER) { + _scriptName = self.location.href; +} + +// `/` should be present at the end if `scriptDirectory` is not empty +var scriptDirectory = ''; +function locateFile(path) { + if (Module['locateFile']) { + return Module['locateFile'](path, scriptDirectory); + } + return scriptDirectory + path; +} + +// Hooks that are implemented differently in different runtime environments. +var readAsync, readBinary; + +if (ENVIRONMENT_IS_NODE) { + const isNode = globalThis.process?.versions?.node && globalThis.process?.type != 'renderer'; + if (!isNode) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + // These modules will usually be used on Node.js. Load them eagerly to avoid + // the complexity of lazy-loading. + var fs = require('node:fs'); + + scriptDirectory = __dirname + '/'; + +// include: node_shell_read.js +readBinary = (filename) => { + // We need to re-wrap `file://` strings to URLs. + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename); + assert(Buffer.isBuffer(ret)); + return ret; +}; + +readAsync = async (filename, binary = true) => { + // See the comment in the `readBinary` function. + filename = isFileURI(filename) ? new URL(filename) : filename; + var ret = fs.readFileSync(filename, binary ? undefined : 'utf8'); + assert(binary ? Buffer.isBuffer(ret) : typeof ret == 'string'); + return ret; +}; +// end include: node_shell_read.js + if (process.argv.length > 1) { + thisProgram = process.argv[1].replace(/\\/g, '/'); + } + + programArgs = process.argv.slice(2); + + // MODULARIZE will export the module in the proper place outside, we don't need to export here + if (typeof module != 'undefined') { + module['exports'] = Module; + } + + quit_ = (status, toThrow) => { + process.exitCode = status; + throw toThrow; + }; + +} else +if (ENVIRONMENT_IS_SHELL) { + +} else + +// Note that this includes Node.js workers when relevant (pthreads is enabled). +// Node.js workers are detected as a combination of ENVIRONMENT_IS_WORKER and +// ENVIRONMENT_IS_NODE. +if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { + try { + scriptDirectory = new URL('.', _scriptName).href; // includes trailing slash + } catch { + // Must be a `blob:` or `data:` URL (e.g. `blob:http://site.com/etc/etc`), we cannot + // infer anything from them. + } + + if (!(globalThis.window || globalThis.WorkerGlobalScope)) throw new Error('not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)'); + + { +// include: web_or_worker_shell_read.js +if (ENVIRONMENT_IS_WORKER) { + readBinary = (url) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + xhr.responseType = 'arraybuffer'; + xhr.send(null); + return new Uint8Array(/** @type{!ArrayBuffer} */(xhr.response)); + }; + } + + readAsync = async (url) => { + // Fetch has some additional restrictions over XHR, like it can't be used on a file:// url. + // See https://github.com/github/fetch/pull/92#issuecomment-140665932 + // Cordova or Electron apps are typically loaded from a file:// url. + // So use XHR on webview if URL is a file URL. + if (isFileURI(url)) { + return new Promise((resolve, reject) => { + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'arraybuffer'; + xhr.onload = () => { + if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) { // file URLs can return 0 + resolve(xhr.response); + return; + } + reject(xhr.status); + }; + xhr.onerror = reject; + xhr.send(null); + }); + } + var response = await fetch(url, { credentials: 'same-origin' }); + if (response.ok) { + return response.arrayBuffer(); + } + throw new Error(response.status + ' : ' + response.url); + }; +// end include: web_or_worker_shell_read.js + } +} else +{ + throw new Error('environment detection error'); +} + +var out = console.log.bind(console); +var err = console.error.bind(console); + +var IDBFS = 'IDBFS is no longer included by default; build with -lidbfs.js'; +var PROXYFS = 'PROXYFS is no longer included by default; build with -lproxyfs.js'; +var WORKERFS = 'WORKERFS is no longer included by default; build with -lworkerfs.js'; +var FETCHFS = 'FETCHFS is no longer included by default; build with -lfetchfs.js'; +var ICASEFS = 'ICASEFS is no longer included by default; build with -licasefs.js'; +var JSFILEFS = 'JSFILEFS is no longer included by default; build with -ljsfilefs.js'; +var OPFS = 'OPFS is no longer included by default; build with -lopfs.js'; + +var NODEFS = 'NODEFS is no longer included by default; build with -lnodefs.js'; + +// perform assertions in shell.js after we set up out() and err(), as otherwise +// if an assertion fails it cannot print the message + +assert(!ENVIRONMENT_IS_SHELL, 'shell environment detected but not enabled at build time (add `shell` to `-sENVIRONMENT` to enable)'); + +// end include: shell.js + +// include: preamble.js +// === Preamble library stuff === + +// Documentation for the public APIs defined in this file must be updated in: +// site/source/docs/api_reference/preamble.js.rst +// A prebuilt local version of the documentation is available at: +// site/build/text/docs/api_reference/preamble.js.txt +// You can also build docs locally as HTML or other formats in site/ +// An online HTML version (which may be of a different version of Emscripten) +// is up at http://kripken.github.io/emscripten-site/docs/api_reference/preamble.js.html + +var wasmBinary; + +if (!globalThis.WebAssembly) { + err('no native wasm support detected'); +} + +// Wasm globals + +//======================================== +// Runtime essentials +//======================================== + +// whether we are quitting the application. no code should run after this. +// set in exit() and abort() +var ABORT = false; + +// set by exit() and abort(). Passed to 'onExit' handler. +// NOTE: This is also used as the process return code in shell environments +// but only when noExitRuntime is false. +var EXITSTATUS; + +// In STRICT mode, we only define assert() when ASSERTIONS is set. i.e. we +// don't define it at all in release modes. This matches the behaviour of +// MINIMAL_RUNTIME. +// TODO(sbc): Make this the default even without STRICT enabled. +/** @type {function(*, string=)} */ +function assert(condition, text) { + if (!condition) { + abort('Assertion failed' + (text ? ': ' + text : '')); + } +} + +// We used to include malloc/free by default in the past. Show a helpful error in +// builds with assertions. + +/** + * Indicates whether filename is delivered via file protocol (as opposed to http/https) + * @noinline + */ +var isFileURI = (filename) => filename.startsWith('file://'); + +// include: runtime_common.js +// include: runtime_exceptions.js +// Base Emscripten EH error class +class EmscriptenEH {} + +class EmscriptenSjLj extends EmscriptenEH {} + +// end include: runtime_exceptions.js +// include: runtime_debug.js +var runtimeDebug = true; // Switch to false at runtime to disable logging at the right times + +// Used by XXXXX_DEBUG settings to output debug messages. +function dbg(...args) { + if (!runtimeDebug && typeof runtimeDebug != 'undefined') return; + // TODO(sbc): Make this configurable somehow. Its not always convenient for + // logging to show up as warnings. + console.warn(...args); +} + +// Endianness check +(() => { + var h16 = new Int16Array(1); + var h8 = new Int8Array(h16.buffer); + h16[0] = 0x6373; + if (h8[0] !== 0x73 || h8[1] !== 0x63) abort('Runtime error: expected the system to be little-endian! (Run with -sSUPPORT_BIG_ENDIAN to bypass)'); +})(); + +function consumedModuleProp(prop) { + var value = Module[prop]; + var msg = `Attempt to modify \`Module.${prop}\` after it has already been processed. This can happen, for example, when code is injected via '--post-js' rather than '--pre-js'`; + if (Array.isArray(value)) { + value = new Proxy(value, { + set(target, key, val) { + abort(msg); + return false; + }, + defineProperty(target, key, descriptor) { + abort(msg); + return false; + }, + deleteProperty(target, key) { + abort(msg); + return false; + } + }); + } + Object.defineProperty(Module, prop, { + configurable: true, + get() { return value; }, + set() { + abort(msg); + } + }); +} + +function makeInvalidEarlyAccess(name) { + return () => assert(false, `call to '${name}' via reference taken before Wasm module initialization`); + +} + +function ignoredModuleProp(prop) { + if (Object.getOwnPropertyDescriptor(Module, prop)) { + abort(`\`Module.${prop}\` was supplied but \`${prop}\` not included in INCOMING_MODULE_JS_API`); + } +} + +// forcing the filesystem exports a few things by default +function isExportedByForceFilesystem(name) { + return name === 'FS_createPath' || + name === 'FS_createDataFile' || + name === 'FS_createPreloadedFile' || + name === 'FS_preloadFile' || + name === 'FS_unlink' || + name === 'addRunDependency' || + // The old FS has some functionality that WasmFS lacks. + name === 'FS_createLazyFile' || + name === 'FS_createDevice' || + name === 'removeRunDependency'; +} + +/** + * Intercept access to a symbols in the global symbol. This enables us to give + * informative warnings/errors when folks attempt to use symbols they did not + * include in their build, or no symbols that no longer exist. + * + * We don't define this in MODULARIZE mode since in that mode emscripten symbols + * are never placed in the global scope. + */ +function hookGlobalSymbolAccess(sym, func) { + if (!Object.getOwnPropertyDescriptor(globalThis, sym)) { + Object.defineProperty(globalThis, sym, { + configurable: true, + get() { + func(); + return undefined; + } + }); + } +} + +function missingGlobal(sym, msg) { + hookGlobalSymbolAccess(sym, () => { + warnOnce(`\`${sym}\` is no longer defined by emscripten. ${msg}`); + }); +} + +missingGlobal('buffer', 'Please use HEAP8.buffer or wasmMemory.buffer'); +missingGlobal('asm', 'Please use wasmExports instead'); + +function missingLibrarySymbol(sym) { + hookGlobalSymbolAccess(sym, () => { + // Can't `abort()` here because it would break code that does runtime + // checks. e.g. `if (typeof SDL === 'undefined')`. + var msg = `\`${sym}\` is a library symbol and not included by default; add it to your library.js __deps or to DEFAULT_LIBRARY_FUNCS_TO_INCLUDE on the command line`; + // DEFAULT_LIBRARY_FUNCS_TO_INCLUDE requires the name as it appears in + // library.js, which means $name for a JS name with no prefix, or name + // for a JS name like _name. + var librarySymbol = sym; + if (!librarySymbol.startsWith('_')) { + librarySymbol = '$' + sym; + } + msg += ` (e.g. -sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='${librarySymbol}')`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + warnOnce(msg); + }); + + // Any symbol that is not included from the JS library is also (by definition) + // not exported on the Module object. + unexportedRuntimeSymbol(sym); +} + +function unexportedRuntimeSymbol(sym) { + if (!Object.getOwnPropertyDescriptor(Module, sym)) { + Object.defineProperty(Module, sym, { + configurable: true, + get() { + var msg = `'${sym}' was not exported. add it to EXPORTED_RUNTIME_METHODS (see the Emscripten FAQ)`; + if (isExportedByForceFilesystem(sym)) { + msg += '. Alternatively, forcing filesystem support (-sFORCE_FILESYSTEM) can export this for you'; + } + abort(msg); + }, + }); + } +} + +// end include: runtime_debug.js +// include: runtime_stack_check.js +const stackCookie1 = 0x02135467; +const stackCookie2 = 0x89BACDFE; + +// Initializes the stack cookie. Called at the startup of main and at the startup of each thread in pthreads mode. +function writeStackCookie() { + var max = _emscripten_stack_get_end(); + assert((max & 3) == 0); + // If the stack ends at address zero we write our cookies 4 bytes into the + // stack. This prevents interference with SAFE_HEAP and ASAN which also + // monitor writes to address zero. + if (max == 0) { + max += 4; + } + // The stack grow downwards towards _emscripten_stack_get_end. + // We write cookies to the final two words in the stack and detect if they are + // ever overwritten. + HEAPU32[((max)>>2)] = stackCookie1; + HEAPU32[(((max)+(4))>>2)] = stackCookie2; + // Also test the global address 0 for integrity. + HEAPU32[((0)>>2)] = 1668509029; +} + +function u32ToHexString(num) { + return '0x' + (num >>> 0).toString(16).padStart(8, '0'); +} + +function checkStackCookie() { + if (ABORT) return; + var max = _emscripten_stack_get_end(); + // See writeStackCookie(). + if (max == 0) { + max += 4; + } + var val1 = HEAPU32[((max)>>2)]; + var val2 = HEAPU32[(((max)+(4))>>2)]; + if (val1 != stackCookie1 || val2 != stackCookie2) { + abort(`Stack overflow! Stack cookie has been overwritten at ${ptrToString(max)}, expected hex dwords ${u32ToHexString(stackCookie2)} and ${u32ToHexString(stackCookie1)}, but received ${u32ToHexString(val2)} ${u32ToHexString(val1)}`); + } + // Also test the global address 0 for integrity. + if (HEAPU32[((0)>>2)] != 0x63736d65 /* 'emsc' */) { + abort('Runtime error: The application has corrupted its heap memory area (address zero)!'); + } +} +// end include: runtime_stack_check.js +// Memory management + +var runtimeInitialized = false; + + + +function updateMemoryViews() { + // When memory growth is disabled this function should be called exactly once. + assert(!HEAP8, 'updateMemoryViews should only be called once when ALLOW_MEMORY_GROWTH=0'); + var b = wasmMemory.buffer; + HEAP8 = new Int8Array(b); + HEAP16 = new Int16Array(b); + HEAPU8 = new Uint8Array(b); + HEAPU16 = new Uint16Array(b); + HEAP32 = new Int32Array(b); + HEAPU32 = new Uint32Array(b); + HEAPF32 = new Float32Array(b); + HEAPF64 = new Float64Array(b); + HEAP64 = new BigInt64Array(b); + +} + +// include: memoryprofiler.js +// end include: memoryprofiler.js +// end include: runtime_common.js +assert(globalThis.Int32Array && globalThis.Float64Array && Int32Array.prototype.subarray && Int32Array.prototype.set, + 'JS engine does not provide full typed array support'); + +function preRun() { + var preRun = Module['preRun']; + if (preRun) { + if (typeof preRun == 'function') preRun = [preRun]; + onPreRuns.push(...preRun); + } + consumedModuleProp('preRun'); + // Begin ATPRERUNS hooks + callRuntimeCallbacks(onPreRuns); + // End ATPRERUNS hooks +} + +function initRuntime() { + assert(!runtimeInitialized); + runtimeInitialized = true; + + checkStackCookie(); + + // Begin ATINITS hooks + if (!Module['noFSInit'] && !FS.initialized) FS.init(); +TTY.init(); + // End ATINITS hooks + + wasmExports['__wasm_call_ctors'](); + + // Begin ATPOSTCTORS hooks + FS.ignorePermissions = false; + // End ATPOSTCTORS hooks + + checkStackCookie(); +} + +function postRun() { + checkStackCookie(); + + var postRun = Module['postRun']; + if (postRun) { + if (typeof postRun == 'function') postRun = [postRun]; + onPostRuns.push(...postRun); + } + consumedModuleProp('postRun'); + + // Begin ATPOSTRUNS hooks + callRuntimeCallbacks(onPostRuns); + // End ATPOSTRUNS hooks +} + +/** + * @param {string|number=} what + */ +function abort(what) { + Module['onAbort']?.(what); + + what = `Aborted(${what})`; + // TODO(sbc): Should we remove printing and leave it up to whoever + // catches the exception? + err(what); + + ABORT = true; + + if (what.search(/RuntimeError: [Uu]nreachable/) >= 0) { + what += '. "unreachable" may be due to ASYNCIFY_STACK_SIZE not being large enough (try increasing it)'; + } + + // Use a wasm runtime error, because a JS error might be seen as a foreign + // exception, which means we'd run destructors on it. We need the error to + // simply make the program stop. + // FIXME This approach does not work in Wasm EH because it currently does not assume + // all RuntimeErrors are from traps; it decides whether a RuntimeError is from + // a trap or not based on a hidden field within the object. So at the moment + // we don't have a way of throwing a wasm trap from JS. TODO Make a JS API that + // allows this in the wasm spec. + + // Suppress closure compiler warning here. Closure compiler's builtin extern + // definition for WebAssembly.RuntimeError claims it takes no arguments even + // though it can. + // TODO(https://github.com/google/closure-compiler/pull/3913): Remove if/when upstream closure gets fixed. + /** @suppress {checkTypes} */ + var e = new WebAssembly.RuntimeError(what); + + // Throw the error whether or not MODULARIZE is set because abort is used + // in code paths apart from instantiation where an exception is expected + // to be thrown when abort is called. + throw e; +} + +function createExportWrapper(name, func, nargs) { + assert(func); + return (...args) => { + assert(runtimeInitialized, `native function \`${name}\` called before runtime initialization`); + // Only assert for too many arguments. Too few can be valid since the missing arguments will be zero filled. + assert(args.length <= nargs, `native function \`${name}\` called with ${args.length} args but expects ${nargs}`); + return func(...args); + }; +} + +var wasmBinaryFile; + +function findWasmBinary() { + return locateFile('text_font_loading.wasm'); +} + +function getBinarySync(file) { + if (readBinary) { + return readBinary(file); + } + // Throwing a plain string here, even though it not normally advisable since + // this gets turning into an `abort` in instantiateArrayBuffer. + throw 'both async and sync fetching of the wasm failed'; +} + +async function getWasmBinary(binaryFile) { + // If we don't have the binary yet, load it asynchronously using readAsync. + if (!wasmBinary) { + // Fetch the binary using readAsync + try { + var response = await readAsync(binaryFile); + return new Uint8Array(response); + } catch { + // Fall back to getBinarySync below; + } + } + + // Otherwise, getBinarySync should be able to get it synchronously + return getBinarySync(binaryFile); +} + +async function instantiateArrayBuffer(binaryFile, imports) { + try { + var binary = await getWasmBinary(binaryFile); + var instance = await WebAssembly.instantiate(binary, imports); + return instance; + } catch (reason) { + err(`failed to asynchronously prepare wasm: ${reason}`); + + // Warn on some common problems. + if (isFileURI(binaryFile)) { + err(`warning: Loading from a file URI (${binaryFile}) is not supported in most browsers. See https://emscripten.org/docs/getting_started/FAQ.html#how-do-i-run-a-local-webserver-for-testing-why-does-my-program-stall-in-downloading-or-preparing`); + } + abort(reason); + } +} + +async function instantiateAsync(binary, binaryFile, imports) { + if (!binary + // Don't use streaming for file:// delivered objects in a webview, fetch them synchronously. + && !isFileURI(binaryFile) + // Avoid instantiateStreaming() on Node.js environment for now, as while + // Node.js v18.1.0 implements it, it does not have a full fetch() + // implementation yet. + // + // Reference: + // https://github.com/emscripten-core/emscripten/pull/16917 + && !ENVIRONMENT_IS_NODE + ) { + try { + var response = fetch(binaryFile, { credentials: 'same-origin' }); + var instantiationResult = await WebAssembly.instantiateStreaming(response, imports); + return instantiationResult; + } catch (reason) { + // We expect the most common failure cause to be a bad MIME type for the binary, + // in which case falling back to ArrayBuffer instantiation should work. + err(`wasm streaming compile failed: ${reason}`); + err('falling back to ArrayBuffer instantiation'); + // fall back of instantiateArrayBuffer below + }; + } + return instantiateArrayBuffer(binaryFile, imports); +} + +function getWasmImports() { + // instrumenting imports is used in asyncify in two ways: to add assertions + // that check for proper import use, and for JSPI we use them to set up + // the Promise API on the import side. + Asyncify.instrumentWasmImports(wasmImports); + // prepare imports + var imports = { + 'env': wasmImports, + 'wasi_snapshot_preview1': wasmImports, + }; + return imports; +} + +// Create the wasm instance. +// Receives the wasm imports, returns the exports. +async function createWasm() { + // Load the wasm module and create an instance of using native support in the JS engine. + // handle a generated wasm instance, receiving its exports and + // performing other necessary setup + function receiveInstance(instance) { + wasmExports = instance.exports; + + wasmExports = Asyncify.instrumentWasmExports(wasmExports); + + assignWasmExports(wasmExports); + + updateMemoryViews(); + + return wasmExports; + } + + // Prefer streaming instantiation if available. + // Async compilation can be confusing when an error on the page overwrites Module + // (for example, if the order of elements is wrong, and the one defining Module is + // later), so we save Module and check it later. + var trueModule = Module; + function receiveInstantiationResult(result) { + // 'result' is a ResultObject object which has both the module and instance. + // receiveInstance() will swap in the exports (to Module.asm) so they can be called + assert(Module === trueModule, 'the Module object should not be replaced during async compilation - perhaps the order of HTML elements is wrong?'); + trueModule = null; + // TODO: Due to Closure regression https://github.com/google/closure-compiler/issues/3193, the above line no longer optimizes out down to the following line. + // When the regression is fixed, can restore the above PTHREADS-enabled path. + return receiveInstance(result['instance']); + } + + var info = getWasmImports(); + + // User shell pages can write their own Module.instantiateWasm = function(imports, successCallback) callback + // to manually instantiate the Wasm module themselves. This allows pages to + // run the instantiation parallel to any other async startup actions they are + // performing. + // Also pthreads and wasm workers initialize the wasm instance through this + // path. + var instantiateWasm = Module['instantiateWasm']; + if (instantiateWasm) { + return new Promise((resolve) => { + try { + instantiateWasm(info, (inst) => resolve(receiveInstance(inst))); + } catch(e) { + err(`Module.instantiateWasm callback failed with error: ${e}`); + throw e; + } + }); + } + + wasmBinaryFile ??= findWasmBinary(); + var result = await instantiateAsync(wasmBinary, wasmBinaryFile, info); + var exports = receiveInstantiationResult(result); + return exports; +} + +// end include: preamble.js + +// Begin JS library code + + + class ExitStatus { + name = 'ExitStatus'; + constructor(status) { + this.message = `Program terminated with exit(${status})`; + this.status = status; + } + } + + /** @type {!Int32Array} */ + var HEAP32; + + /** @type {!Int8Array} */ + var HEAP8; + + /** @type {!Uint32Array} */ + var HEAPU32; + + var callRuntimeCallbacks = (callbacks) => { + while (callbacks.length > 0) { + // Pass the module as the first argument. + callbacks.shift()(Module); + } + }; + var onPostRuns = []; + var addOnPostRun = (cb) => onPostRuns.push(cb); + + var onPreRuns = []; + var addOnPreRun = (cb) => onPreRuns.push(cb); + + + var dynCalls = { + }; + var dynCallLegacy = (sig, ptr, args) => { + sig = sig.replace(/p/g, 'i') + assert(sig in dynCalls, `bad function pointer type - sig is not in dynCalls: '${sig}'`); + if (args?.length) { + // j (64-bit integer) is fine, and is implemented as a BigInt. Without + // legalization, the number of parameters should match (j is not expanded + // into two i's). + assert(args.length === sig.length - 1); + } else { + assert(sig.length == 1); + } + var f = dynCalls[sig]; + return f(ptr, ...args); + }; + var dynCall = (sig, ptr, args = [], promising = false) => { + assert(ptr, `null function pointer in dynCall`); + assert(!promising, 'async dynCall is not supported in this mode') + var rtn = dynCallLegacy(sig, ptr, args); + + function convert(rtn) { + return rtn; + } + + return convert(rtn); + }; + + var noExitRuntime = true; + + function ptrToString(ptr) { + assert(typeof ptr === 'number', `ptrToString expects a number, got ${typeof ptr}`); + // Convert to 32-bit unsigned value + ptr >>>= 0; + return '0x' + ptr.toString(16).padStart(8, '0'); + } + + var stackRestore = (val) => __emscripten_stack_restore(val); + + var stackSave = () => _emscripten_stack_get_current(); + + var warnOnce = (text) => { + warnOnce.shown ||= {}; + if (!warnOnce.shown[text]) { + warnOnce.shown[text] = 1; + if (ENVIRONMENT_IS_NODE) text = 'warning: ' + text; + err(text); + } + }; + + + + var UTF8Decoder = globalThis.TextDecoder && new TextDecoder(); + + + /** + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number} idx + * @param {number=} maxBytesToRead + * @param {boolean=} ignoreNul + * @return {number} + */ + var findStringEnd = (heapOrArray, idx, maxBytesToRead, ignoreNul) => { + var maxIdx = idx + maxBytesToRead; + if (ignoreNul) return maxIdx; + // TextDecoder needs to know the byte length in advance, it doesn't stop on + // null terminator by itself. + // As a tiny code save trick, compare idx against maxIdx using a negation, + // so that maxBytesToRead=undefined/NaN means Infinity. + while (heapOrArray[idx] && !(idx >= maxIdx)) ++idx; + return idx; + }; + + + /** + * Given a pointer 'idx' to a null-terminated UTF8-encoded string in the given + * array that contains uint8 values, returns a copy of that string as a + * Javascript String object. + * heapOrArray is either a regular array, or a JavaScript typed array view. + * @param {number=} idx + * @param {number=} maxBytesToRead + * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. + * @return {string} + */ + var UTF8ArrayToString = (heapOrArray, idx = 0, maxBytesToRead, ignoreNul) => { + + var endPtr = findStringEnd(heapOrArray, idx, maxBytesToRead, ignoreNul); + + // When using conditional TextDecoder, skip it for short strings as the overhead of the native call is not worth it. + if (endPtr - idx > 16 && heapOrArray.buffer && UTF8Decoder) { + return UTF8Decoder.decode(heapOrArray.subarray(idx, endPtr)); + } + var str = ''; + while (idx < endPtr) { + // For UTF8 byte structure, see: + // http://en.wikipedia.org/wiki/UTF-8#Description + // https://www.ietf.org/rfc/rfc2279.txt + // https://tools.ietf.org/html/rfc3629 + var u0 = heapOrArray[idx++]; + if (!(u0 & 0x80)) { str += String.fromCharCode(u0); continue; } + var u1 = heapOrArray[idx++] & 63; + if ((u0 & 0xE0) == 0xC0) { str += String.fromCharCode(((u0 & 31) << 6) | u1); continue; } + var u2 = heapOrArray[idx++] & 63; + if ((u0 & 0xF0) == 0xE0) { + u0 = ((u0 & 15) << 12) | (u1 << 6) | u2; + } else { + if ((u0 & 0xF8) != 0xF0) warnOnce(`Invalid UTF-8 leading byte ${ptrToString(u0)} encountered when deserializing a UTF-8 string in wasm memory to a JS string!`); + u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (heapOrArray[idx++] & 63); + } + + if (u0 < 0x10000) { + str += String.fromCharCode(u0); + } else { + var ch = u0 - 0x10000; + str += String.fromCharCode(0xD800 | (ch >> 10), 0xDC00 | (ch & 0x3FF)); + } + } + return str; + }; + + /** @type {!Uint8Array} */ + var HEAPU8; + + /** + * Given a pointer 'ptr' to a null-terminated UTF8-encoded string in the + * emscripten HEAP, returns a copy of that string as a Javascript String object. + * + * @param {number} ptr + * @param {number=} maxBytesToRead - An optional length that specifies the + * maximum number of bytes to read. You can omit this parameter to scan the + * string until the first 0 byte. If maxBytesToRead is passed, and the string + * at [ptr, ptr+maxBytesToReadr[ contains a null byte in the middle, then the + * string will cut short at that byte index. + * @param {boolean=} ignoreNul - If true, the function will not stop on a NUL character. + * @return {string} + */ + var UTF8ToString = (ptr, maxBytesToRead, ignoreNul) => { + assert(typeof ptr == 'number', `UTF8ToString expects a number (got ${typeof ptr})`); + return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead, ignoreNul) : ''; + }; + var ___assert_fail = (condition, filename, line, func) => + abort(`Assertion failed: ${UTF8ToString(condition)}, at: ` + [filename ? UTF8ToString(filename) : 'unknown filename', line, func ? UTF8ToString(func) : 'unknown function']); + + var PATH = { + isAbs:(path) => path.charAt(0) === '/', + splitPath:(filename) => { + var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; + return splitPathRe.exec(filename).slice(1); + }, + normalizeArray:(parts, allowAboveRoot) => { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up; up--) { + parts.unshift('..'); + } + } + return parts; + }, + normalize:(path) => { + var isAbsolute = PATH.isAbs(path), + trailingSlash = path.slice(-1) === '/'; + // Normalize the path + path = PATH.normalizeArray(path.split('/').filter((p) => !!p), !isAbsolute).join('/'); + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + return (isAbsolute ? '/' : '') + path; + }, + dirname:(path) => { + var result = PATH.splitPath(path), + root = result[0], + dir = result[1]; + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.slice(0, -1); + } + return root + dir; + }, + basename:(path) => path && path.match(/([^\/]+|\/)\/*$/)[1], +join:(...paths) => PATH.normalize(paths.join('/')), +join2:(l, r) => PATH.normalize(l + '/' + r), +}; + +var initRandomFill = () => { + // This block is not needed on v19+ since crypto.getRandomValues is builtin + if (ENVIRONMENT_IS_NODE) { + var nodeCrypto = require('node:crypto'); + return (view) => (nodeCrypto.randomFillSync(view), 0); + } + + return (view) => (crypto.getRandomValues(view), 0); + }; +var randomFill = (view) => (randomFill = initRandomFill())(view); + + + +var PATH_FS = { +resolve:(...args) => { + var resolvedPath = '', + resolvedAbsolute = false; + for (var i = args.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? args[i] : FS.cwd(); + // Skip empty and invalid entries + if (typeof path != 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + return ''; // an invalid portion invalidates the whole thing + } + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = PATH.isAbs(path); + } + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + resolvedPath = PATH.normalizeArray(resolvedPath.split('/').filter((p) => !!p), !resolvedAbsolute).join('/'); + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; + }, +relative:(from, to) => { + from = PATH_FS.resolve(from).slice(1); + to = PATH_FS.resolve(to).slice(1); + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + return outputParts.join('/'); + }, +}; + + + +var FS_stdin_getChar_buffer = []; + +var lengthBytesUTF8 = (str) => { + var len = 0; + for (var i = 0; i < str.length; ++i) { + // Gotcha: charCodeAt returns a 16-bit word that is a UTF-16 encoded code + // unit, not a Unicode code point of the character! So decode + // UTF16->UTF32->UTF8. + // See http://unicode.org/faq/utf_bom.html#utf16-3 + var c = str.charCodeAt(i); // possibly a lead surrogate + if (c <= 0x7F) { + len++; + } else if (c <= 0x7FF) { + len += 2; + } else if (c >= 0xD800 && c <= 0xDFFF) { + len += 4; ++i; + } else { + len += 3; + } + } + return len; + }; + +var stringToUTF8Array = (str, heap, outIdx, maxBytesToWrite) => { + assert(typeof str === 'string', `stringToUTF8Array expects a string (got ${typeof str})`); + // Parameter maxBytesToWrite is not optional. Negative values, 0, null, + // undefined and false each don't write out any bytes. + if (!(maxBytesToWrite > 0)) + return 0; + + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; // -1 for string null terminator. + for (var i = 0; i < str.length; ++i) { + // For UTF8 byte structure, see http://en.wikipedia.org/wiki/UTF-8#Description + // and https://www.ietf.org/rfc/rfc2279.txt + // and https://tools.ietf.org/html/rfc3629 + var u = str.codePointAt(i); + if (u <= 0x7F) { + if (outIdx >= endIdx) break; + heap[outIdx++] = u; + } else if (u <= 0x7FF) { + if (outIdx + 1 >= endIdx) break; + heap[outIdx++] = 0xC0 | (u >> 6); + heap[outIdx++] = 0x80 | (u & 63); + } else if (u <= 0xFFFF) { + if (outIdx + 2 >= endIdx) break; + heap[outIdx++] = 0xE0 | (u >> 12); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + } else { + if (outIdx + 3 >= endIdx) break; + if (u > 0x10FFFF) warnOnce(`Invalid Unicode code point ${ptrToString(u)} encountered when serializing a JS string to a UTF-8 string in wasm memory! (Valid unicode code points should be in range 0-0x10FFFF).`); + heap[outIdx++] = 0xF0 | (u >> 18); + heap[outIdx++] = 0x80 | ((u >> 12) & 63); + heap[outIdx++] = 0x80 | ((u >> 6) & 63); + heap[outIdx++] = 0x80 | (u & 63); + // Gotcha: if codePoint is over 0xFFFF, it is represented as a surrogate pair in UTF-16. + // We need to manually skip over the second code unit for correct iteration. + i++; + } + } + // Null-terminate the pointer to the buffer. + heap[outIdx] = 0; + return outIdx - startIdx; + }; +/** @type {function(string, boolean=, number=)} */ + var intArrayFromString = (stringy, dontAddNull, length) => { + var len = length > 0 ? length : lengthBytesUTF8(stringy)+1; + var u8array = new Array(len); + var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); + if (dontAddNull) u8array.length = numBytesWritten; + return u8array; + }; + var FS_stdin_getChar = () => { + if (!FS_stdin_getChar_buffer.length) { + var result = null; + if (ENVIRONMENT_IS_NODE) { + // we will read data by chunks of BUFSIZE + var BUFSIZE = 256; + var buf = Buffer.alloc(BUFSIZE); + var bytesRead = 0; + + // For some reason we must suppress a closure warning here, even though + // fd definitely exists on process.stdin, and is even the proper way to + // get the fd of stdin, + // https://github.com/nodejs/help/issues/2136#issuecomment-523649904 + // This started to happen after moving this logic out of library_tty.js, + // so it is related to the surrounding code in some unclear manner. + /** @suppress {missingProperties} */ + var fd = process.stdin.fd; + + try { + bytesRead = fs.readSync(fd, buf, 0, BUFSIZE); + } catch(e) { + // Cross-platform differences: on Windows, reading EOF throws an + // exception, but on other OSes, reading EOF returns 0. Uniformize + // behavior by treating the EOF exception to return 0. + if (e.toString().includes('EOF')) bytesRead = 0; + else throw e; + } + + if (bytesRead > 0) { + result = buf.slice(0, bytesRead).toString('utf-8'); + } + } else + if (globalThis.window?.prompt) { + // Browser. + result = window.prompt('Input: '); // returns null on cancel + if (result !== null) { + result += '\n'; + } + } else + {} + if (!result) { + return null; + } + FS_stdin_getChar_buffer = intArrayFromString(result, true); + } + return FS_stdin_getChar_buffer.shift(); + }; + var TTY = { + ttys:[], + init() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // currently, FS.init does not distinguish if process.stdin is a file or TTY + // // device, it always assumes it's a TTY device. because of this, we're forcing + // // process.stdin to UTF8 encoding to at least make stdin reading compatible + // // with text files until FS.init can be refactored. + // process.stdin.setEncoding('utf8'); + // } + }, + shutdown() { + // https://github.com/emscripten-core/emscripten/pull/1555 + // if (ENVIRONMENT_IS_NODE) { + // // inolen: any idea as to why node -e 'process.stdin.read()' wouldn't exit immediately (with process.stdin being a tty)? + // // isaacs: because now it's reading from the stream, you've expressed interest in it, so that read() kicks off a _read() which creates a ReadReq operation + // // inolen: I thought read() in that case was a synchronous operation that just grabbed some amount of buffered data if it exists? + // // isaacs: it is. but it also triggers a _read() call, which calls readStart() on the handle + // // isaacs: do process.stdin.pause() and i'd think it'd probably close the pending call + // process.stdin.pause(); + // } + }, + register(dev, ops) { + TTY.ttys[dev] = { input: [], output: [], ops: ops }; + FS.registerDevice(dev, TTY.stream_ops); + }, + stream_ops:{ + open(stream) { + var tty = TTY.ttys[stream.node.rdev]; + if (!tty) { + throw new FS.ErrnoError(43); + } + stream.tty = tty; + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + stream.tty.ops.fsync(stream.tty); + }, + fsync(stream) { + stream.tty.ops.fsync(stream.tty); + }, + read(stream, buffer, offset, length, pos /* ignored */) { + if (!stream.tty || !stream.tty.ops.get_char) { + throw new FS.ErrnoError(60); + } + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = stream.tty.ops.get_char(stream.tty); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.atime = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + if (!stream.tty || !stream.tty.ops.put_char) { + throw new FS.ErrnoError(60); + } + try { + for (var i = 0; i < length; i++) { + stream.tty.ops.put_char(stream.tty, buffer[offset+i]); + } + } catch (e) { + throw new FS.ErrnoError(29); + } + if (length) { + stream.node.mtime = stream.node.ctime = Date.now(); + } + return i; + }, + }, + default_tty_ops:{ + get_char(tty) { + return FS_stdin_getChar(); + }, + put_char(tty, val) { + if (val === null || val === 10) { + out(UTF8ArrayToString(tty.output)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); // val == 0 would cut text output off in the middle. + } + }, + fsync(tty) { + if (tty.output?.length > 0) { + out(UTF8ArrayToString(tty.output)); + tty.output = []; + } + }, + ioctl_tcgets(tty) { + // typical setting + return { + c_iflag: 25856, + c_oflag: 5, + c_cflag: 191, + c_lflag: 35387, + c_cc: [ + 0x03, 0x1c, 0x7f, 0x15, 0x04, 0x00, 0x01, 0x00, 0x11, 0x13, 0x1a, 0x00, + 0x12, 0x0f, 0x17, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ] + }; + }, + ioctl_tcsets(tty, optional_actions, data) { + // currently just ignore + return 0; + }, + ioctl_tiocgwinsz(tty) { + return [24, 80]; + }, + }, + default_tty1_ops:{ + put_char(tty, val) { + if (val === null || val === 10) { + err(UTF8ArrayToString(tty.output)); + tty.output = []; + } else { + if (val != 0) tty.output.push(val); + } + }, + fsync(tty) { + if (tty.output?.length > 0) { + err(UTF8ArrayToString(tty.output)); + tty.output = []; + } + }, + }, + }; + + + var mmapAlloc = (size) => { + abort('internal error: mmapAlloc called but `emscripten_builtin_memalign` native symbol not exported'); + }; + + var MEMFS = { + ops_table:null, + mount(mount) { + return MEMFS.createNode(null, '/', 16895, 0); + }, + createNode(parent, name, mode, dev) { + if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { + // not supported + throw new FS.ErrnoError(63); + } + MEMFS.ops_table ||= { + dir: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + lookup: MEMFS.node_ops.lookup, + mknod: MEMFS.node_ops.mknod, + rename: MEMFS.node_ops.rename, + unlink: MEMFS.node_ops.unlink, + rmdir: MEMFS.node_ops.rmdir, + readdir: MEMFS.node_ops.readdir, + symlink: MEMFS.node_ops.symlink + }, + stream: { + llseek: MEMFS.stream_ops.llseek + } + }, + file: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: { + llseek: MEMFS.stream_ops.llseek, + read: MEMFS.stream_ops.read, + write: MEMFS.stream_ops.write, + mmap: MEMFS.stream_ops.mmap, + msync: MEMFS.stream_ops.msync + } + }, + link: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr, + readlink: MEMFS.node_ops.readlink + }, + stream: {} + }, + chrdev: { + node: { + getattr: MEMFS.node_ops.getattr, + setattr: MEMFS.node_ops.setattr + }, + stream: FS.chrdev_stream_ops + } + }; + var node = FS.createNode(parent, name, mode, dev); + if (FS.isDir(node.mode)) { + node.node_ops = MEMFS.ops_table.dir.node; + node.stream_ops = MEMFS.ops_table.dir.stream; + node.contents = {}; + } else if (FS.isFile(node.mode)) { + node.node_ops = MEMFS.ops_table.file.node; + node.stream_ops = MEMFS.ops_table.file.stream; + // The actual number of bytes used in the typed array, as opposed to + // contents.length which gives the whole capacity. + node.usedBytes = 0; + // The byte data of the file is stored in a typed array. + // Note: typed arrays are not resizable like normal JS arrays are, so + // there is a small penalty involved for appending file writes that + // continuously grow a file similar to std::vector capacity vs used. + node.contents = MEMFS.emptyFileContents ??= new Uint8Array(0); + } else if (FS.isLink(node.mode)) { + node.node_ops = MEMFS.ops_table.link.node; + node.stream_ops = MEMFS.ops_table.link.stream; + } else if (FS.isChrdev(node.mode)) { + node.node_ops = MEMFS.ops_table.chrdev.node; + node.stream_ops = MEMFS.ops_table.chrdev.stream; + } + node.atime = node.mtime = node.ctime = Date.now(); + // add the new node to the parent + if (parent) { + parent.contents[name] = node; + parent.atime = parent.mtime = parent.ctime = node.atime; + } + return node; + }, + getFileDataAsTypedArray(node) { + assert(FS.isFile(node.mode), 'getFileDataAsTypedArray called on non-file'); + return node.contents.subarray(0, node.usedBytes); // Make sure to not return excess unused bytes. + }, + expandFileStorage(node, newCapacity) { + var prevCapacity = node.contents.length; + if (prevCapacity >= newCapacity) return; // No need to expand, the storage was already large enough. + // Don't expand strictly to the given requested limit if it's only a very + // small increase, but instead geometrically grow capacity. + // For small filesizes (<1MB), perform size*2 geometric increase, but for + // large sizes, do a much more conservative size*1.125 increase to avoid + // overshooting the allocation cap by a very large margin. + var CAPACITY_DOUBLING_MAX = 1024 * 1024; + newCapacity = Math.max(newCapacity, (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2.0 : 1.125)) >>> 0); + if (prevCapacity) newCapacity = Math.max(newCapacity, 256); // At minimum allocate 256b for each file when expanding. + var oldContents = MEMFS.getFileDataAsTypedArray(node); + node.contents = new Uint8Array(newCapacity); // Allocate new storage. + node.contents.set(oldContents); + }, + resizeFileStorage(node, newSize) { + if (node.usedBytes == newSize) return; + var oldContents = node.contents; + node.contents = new Uint8Array(newSize); // Allocate new storage. + node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))); // Copy old data over to the new storage. + node.usedBytes = newSize; + }, + node_ops:{ + getattr(node) { + var attr = {}; + // device numbers reuse inode numbers. + attr.dev = FS.isChrdev(node.mode) ? node.id : 1; + attr.ino = node.id; + attr.mode = node.mode; + attr.nlink = 1; + attr.uid = 0; + attr.gid = 0; + attr.rdev = node.rdev; + if (FS.isDir(node.mode)) { + attr.size = 4096; + } else if (FS.isFile(node.mode)) { + attr.size = node.usedBytes; + } else if (FS.isLink(node.mode)) { + attr.size = node.link.length; + } else { + attr.size = 0; + } + attr.atime = new Date(node.atime); + attr.mtime = new Date(node.mtime); + attr.ctime = new Date(node.ctime); + // NOTE: In our implementation, st_blocks = Math.ceil(st_size/st_blksize), + // but this is not required by the standard. + attr.blksize = 4096; + attr.blocks = Math.ceil(attr.size / attr.blksize); + return attr; + }, + setattr(node, attr) { + for (const key of ['mode', 'atime', 'mtime', 'ctime']) { + if (attr[key] != null) { + node[key] = attr[key]; + } + } + if (attr.size !== undefined) { + MEMFS.resizeFileStorage(node, attr.size); + } + }, + lookup(parent, name) { + throw new FS.ErrnoError(44); + }, + mknod(parent, name, mode, dev) { + return MEMFS.createNode(parent, name, mode, dev); + }, + rename(old_node, new_dir, new_name) { + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) {} + if (new_node) { + if (FS.isDir(old_node.mode)) { + // if we're overwriting a directory at new_name, make sure it's empty. + for (var i in new_node.contents) { + throw new FS.ErrnoError(55); + } + } + FS.hashRemoveNode(new_node); + } + // do the internal rewiring + delete old_node.parent.contents[old_node.name]; + new_dir.contents[new_name] = old_node; + old_node.name = new_name; + new_dir.ctime = new_dir.mtime = old_node.parent.ctime = old_node.parent.mtime = Date.now(); + }, + unlink(parent, name) { + delete parent.contents[name]; + parent.ctime = parent.mtime = Date.now(); + }, + rmdir(parent, name) { + var node = FS.lookupNode(parent, name); + for (var i in node.contents) { + throw new FS.ErrnoError(55); + } + delete parent.contents[name]; + parent.ctime = parent.mtime = Date.now(); + }, + readdir(node) { + return ['.', '..', ...Object.keys(node.contents)]; + }, + symlink(parent, newname, oldpath) { + var node = MEMFS.createNode(parent, newname, 0o777 | 40960, 0); + node.link = oldpath; + return node; + }, + readlink(node) { + if (!FS.isLink(node.mode)) { + throw new FS.ErrnoError(28); + } + return node.link; + }, + }, + stream_ops:{ + read(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= stream.node.usedBytes) return 0; + var size = Math.min(stream.node.usedBytes - position, length); + assert(size >= 0); + buffer.set(contents.subarray(position, position + size), offset); + return size; + }, + write(stream, buffer, offset, length, position, canOwn) { + assert(buffer.subarray, 'FS.write expects a TypedArray'); + + if (!length) return 0; + var node = stream.node; + node.mtime = node.ctime = Date.now(); + + if (canOwn) { + assert(position === 0, 'canOwn must imply no weird position inside the file'); + node.contents = buffer.subarray(offset, offset + length); + node.usedBytes = length; + } else if (node.usedBytes === 0 && position === 0) { // If this is a simple first write to an empty file, do a fast set since we don't need to care about old data. + node.contents = buffer.slice(offset, offset + length); + node.usedBytes = length; + } else { + MEMFS.expandFileStorage(node, position+length); + // Use typed array write which is available. + node.contents.set(buffer.subarray(offset, offset + length), position); + node.usedBytes = Math.max(node.usedBytes, position + length); + } + return length; + }, + llseek(stream, offset, whence) { + var position = offset; + if (whence === 1) { + position += stream.position; + } else if (whence === 2) { + if (FS.isFile(stream.node.mode)) { + position += stream.node.usedBytes; + } + } + if (position < 0) { + throw new FS.ErrnoError(28); + } + return position; + }, + mmap(stream, length, position, prot, flags) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + var ptr; + var allocated; + var contents = stream.node.contents; + // Only make a new copy when MAP_PRIVATE is specified. + if (!(flags & 2) && contents.buffer === HEAP8.buffer) { + // We can't emulate MAP_SHARED when the file is not backed by the + // buffer we're mapping to (e.g. the HEAP buffer). + allocated = false; + ptr = contents.byteOffset; + } else { + allocated = true; + ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + if (contents) { + // Try to avoid unnecessary slices. + if (position > 0 || position + length < contents.length) { + if (contents.subarray) { + contents = contents.subarray(position, position + length); + } else { + contents = Array.prototype.slice.call(contents, position, position + length); + } + } + HEAP8.set(contents, ptr); + } + } + return { ptr, allocated }; + }, + msync(stream, buffer, offset, length, mmapFlags) { + MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); + // should we check if bytesWritten and length are the same? + return 0; + }, + }, + }; + + var FS_modeStringToFlags = (str) => { + if (typeof str != 'string') return str; + var flagModes = { + 'r': 0, + 'r+': 2, + 'w': 512 | 64 | 1, + 'w+': 512 | 64 | 2, + 'a': 1024 | 64 | 1, + 'a+': 1024 | 64 | 2, + }; + var flags = flagModes[str]; + if (typeof flags == 'undefined') { + throw new Error(`Unknown file open mode: ${str}`); + } + return flags; + }; + + var FS_fileDataToTypedArray = (data) => { + if (typeof data == 'string') { + data = intArrayFromString(data, true); + } + if (!data.subarray) { + data = new Uint8Array(data); + } + return data; + }; + + var FS_getMode = (canRead, canWrite) => { + var mode = 0; + if (canRead) mode |= 292 | 73; + if (canWrite) mode |= 146; + return mode; + }; + + + + + var strError = (errno) => UTF8ToString(_strerror(errno)); + + var ERRNO_CODES = { + 'EPERM': 63, + 'ENOENT': 44, + 'ESRCH': 71, + 'EINTR': 27, + 'EIO': 29, + 'ENXIO': 60, + 'E2BIG': 1, + 'ENOEXEC': 45, + 'EBADF': 8, + 'ECHILD': 12, + 'EAGAIN': 6, + 'EWOULDBLOCK': 6, + 'ENOMEM': 48, + 'EACCES': 2, + 'EFAULT': 21, + 'ENOTBLK': 105, + 'EBUSY': 10, + 'EEXIST': 20, + 'EXDEV': 75, + 'ENODEV': 43, + 'ENOTDIR': 54, + 'EISDIR': 31, + 'EINVAL': 28, + 'ENFILE': 41, + 'EMFILE': 33, + 'ENOTTY': 59, + 'ETXTBSY': 74, + 'EFBIG': 22, + 'ENOSPC': 51, + 'ESPIPE': 70, + 'EROFS': 69, + 'EMLINK': 34, + 'EPIPE': 64, + 'EDOM': 18, + 'ERANGE': 68, + 'ENOMSG': 49, + 'EIDRM': 24, + 'ECHRNG': 106, + 'EL2NSYNC': 156, + 'EL3HLT': 107, + 'EL3RST': 108, + 'ELNRNG': 109, + 'EUNATCH': 110, + 'ENOCSI': 111, + 'EL2HLT': 112, + 'EDEADLK': 16, + 'ENOLCK': 46, + 'EBADE': 113, + 'EBADR': 114, + 'EXFULL': 115, + 'ENOANO': 104, + 'EBADRQC': 103, + 'EBADSLT': 102, + 'EDEADLOCK': 16, + 'EBFONT': 101, + 'ENOSTR': 100, + 'ENODATA': 116, + 'ETIME': 117, + 'ENOSR': 118, + 'ENONET': 119, + 'ENOPKG': 120, + 'EREMOTE': 121, + 'ENOLINK': 47, + 'EADV': 122, + 'ESRMNT': 123, + 'ECOMM': 124, + 'EPROTO': 65, + 'EMULTIHOP': 36, + 'EDOTDOT': 125, + 'EBADMSG': 9, + 'ENOTUNIQ': 126, + 'EBADFD': 127, + 'EREMCHG': 128, + 'ELIBACC': 129, + 'ELIBBAD': 130, + 'ELIBSCN': 131, + 'ELIBMAX': 132, + 'ELIBEXEC': 133, + 'ENOSYS': 52, + 'ENOTEMPTY': 55, + 'ENAMETOOLONG': 37, + 'ELOOP': 32, + 'EOPNOTSUPP': 138, + 'EPFNOSUPPORT': 139, + 'ECONNRESET': 15, + 'ENOBUFS': 42, + 'EAFNOSUPPORT': 5, + 'EPROTOTYPE': 67, + 'ENOTSOCK': 57, + 'ENOPROTOOPT': 50, + 'ESHUTDOWN': 140, + 'ECONNREFUSED': 14, + 'EADDRINUSE': 3, + 'ECONNABORTED': 13, + 'ENETUNREACH': 40, + 'ENETDOWN': 38, + 'ETIMEDOUT': 73, + 'EHOSTDOWN': 142, + 'EHOSTUNREACH': 23, + 'EINPROGRESS': 26, + 'EALREADY': 7, + 'EDESTADDRREQ': 17, + 'EMSGSIZE': 35, + 'EPROTONOSUPPORT': 66, + 'ESOCKTNOSUPPORT': 137, + 'EADDRNOTAVAIL': 4, + 'ENETRESET': 39, + 'EISCONN': 30, + 'ENOTCONN': 53, + 'ETOOMANYREFS': 141, + 'EUSERS': 136, + 'EDQUOT': 19, + 'ESTALE': 72, + 'ENOTSUP': 138, + 'ENOMEDIUM': 148, + 'EILSEQ': 25, + 'EOVERFLOW': 61, + 'ECANCELED': 11, + 'ENOTRECOVERABLE': 56, + 'EOWNERDEAD': 62, + 'ESTRPIPE': 135, + }; + + var asyncLoad = async (url) => { + var arrayBuffer = await readAsync(url); + assert(arrayBuffer, `Loading data file "${url}" failed (no arrayBuffer).`); + return new Uint8Array(arrayBuffer); + }; + + + var FS_createDataFile = (...args) => FS.createDataFile(...args); + + var getUniqueRunDependency = (id) => { + var orig = id; + while (1) { + if (!runDependencyTracking[id]) return id; + id = orig + Math.random(); + } + }; + + var dependenciesPromise = null; + var resolveRunDependencies = async () => dependenciesPromise; + var runDependencies = 0; + + + var dependenciesPromiseResolve = null; + + var runDependencyTracking = { + }; + + var runDependencyWatcher = null; + var removeRunDependency = (id) => { + runDependencies--; + + Module['monitorRunDependencies']?.(runDependencies); + + assert(id, 'removeRunDependency requires an ID'); + assert(runDependencyTracking[id]); + delete runDependencyTracking[id]; + if (!runDependencies) { + if (runDependencyWatcher !== null) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + } + dependenciesPromiseResolve(); + } + }; + + + + + var addRunDependency = (id) => { + if (!runDependencies) { + dependenciesPromise = new Promise((resolve) => dependenciesPromiseResolve = resolve); + } + runDependencies++; + + Module['monitorRunDependencies']?.(runDependencies); + + assert(id, 'addRunDependency requires an ID') + assert(!runDependencyTracking[id]); + runDependencyTracking[id] = 1; + if (runDependencyWatcher === null && globalThis.setInterval) { + // Check for missing dependencies every few seconds + runDependencyWatcher = setInterval(() => { + if (ABORT) { + clearInterval(runDependencyWatcher); + runDependencyWatcher = null; + return; + } + var shown = false; + for (var dep in runDependencyTracking) { + if (!shown) { + shown = true; + err('still waiting on run dependencies:'); + } + err(`dependency: ${dep}`); + } + if (shown) { + err('(end of list)'); + } + }, 10000); + // Prevent this timer from keeping the runtime alive if nothing + // else is. + runDependencyWatcher.unref?.() + } + }; + + + var preloadPlugins = []; + var FS_handledByPreloadPlugin = async (byteArray, fullname) => { + // Ensure plugins are ready. + if (typeof Browser != 'undefined') Browser.init(); + + for (var plugin of preloadPlugins) { + if (plugin['canHandle'](fullname)) { + assert(plugin['handle'].constructor.name === 'AsyncFunction', 'Filesystem plugin handlers must be async functions (See #24914)') + return plugin['handle'](byteArray, fullname); + } + } + // If no plugin handled this file then return the original/unmodified + // byteArray. + return byteArray; + }; + var FS_preloadFile = async (parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish) => { + // TODO we should allow people to just pass in a complete filename instead + // of parent and name being that we just join them anyways + var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; + var dep = getUniqueRunDependency(`cp ${fullname}`); // might have several active requests for the same fullname + addRunDependency(dep); + + try { + var byteArray = url; + if (typeof url == 'string') { + byteArray = await asyncLoad(url); + } + + byteArray = await FS_handledByPreloadPlugin(byteArray, fullname); + preFinish?.(); + if (!dontCreateFile) { + FS_createDataFile(parent, name, byteArray, canRead, canWrite, canOwn); + } + } finally { + removeRunDependency(dep); + } + }; + var FS_createPreloadedFile = (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) => { + FS_preloadFile(parent, name, url, canRead, canWrite, dontCreateFile, canOwn, preFinish).then(onload).catch(onerror); + }; + + var FS = { + root:null, + mounts:[], + devices:{ + }, + streams:[], + nextInode:1, + nameTable:null, + currentPath:"/", + initialized:false, + ignorePermissions:true, + filesystems:null, + syncFSRequests:0, + ErrnoError:class extends Error { + name = 'ErrnoError'; + // We set the `name` property to be able to identify `FS.ErrnoError` + // - the `name` is a standard ECMA-262 property of error objects. Kind of good to have it anyway. + // - when using PROXYFS, an error can come from an underlying FS + // as different FS objects have their own FS.ErrnoError each, + // the test `err instanceof FS.ErrnoError` won't detect an error coming from another filesystem, causing bugs. + // we'll use the reliable test `err.name == "ErrnoError"` instead + constructor(errno) { + super(runtimeInitialized ? strError(errno) : ''); + this.errno = errno; + for (var key in ERRNO_CODES) { + if (ERRNO_CODES[key] === errno) { + this.code = key; + break; + } + } + } + }, + FSStream:class { + shared = {}; + get object() { + return this.node; + } + set object(val) { + this.node = val; + } + get isRead() { + return (this.flags & 2097155) !== 1; + } + get isWrite() { + return (this.flags & 2097155) !== 0; + } + get isAppend() { + return (this.flags & 1024); + } + get flags() { + return this.shared.flags; + } + set flags(val) { + this.shared.flags = val; + } + get position() { + return this.shared.position; + } + set position(val) { + this.shared.position = val; + } + }, + FSNode:class { + node_ops = {}; + stream_ops = {}; + readMode = 292 | 73; + writeMode = 146; + mounted = null; + constructor(parent, name, mode, rdev) { + if (!parent) { + parent = this; // root node sets parent to itself + } + this.parent = parent; + this.mount = parent.mount; + this.id = FS.nextInode++; + this.name = name; + this.mode = mode; + this.rdev = rdev; + this.atime = this.mtime = this.ctime = Date.now(); + } + get read() { + return (this.mode & this.readMode) === this.readMode; + } + set read(val) { + val ? this.mode |= this.readMode : this.mode &= ~this.readMode; + } + get write() { + return (this.mode & this.writeMode) === this.writeMode; + } + set write(val) { + val ? this.mode |= this.writeMode : this.mode &= ~this.writeMode; + } + get isFolder() { + return FS.isDir(this.mode); + } + get isDevice() { + return FS.isChrdev(this.mode); + } + // The per-inode readiness wait-queue. The node carries a Set of listener + // entries {cb}; producers (SOCKFS, PIPEFS) call notifyListeners on a + // readiness transition, and poll()/epoll consume it. It lives on the node + // (not the fd) so dup'd fds share one queue. Only nodes that derive real + // readiness (sockets, pipes, and an epoll's own node) ever use this - + // always-ready types (regular files, ttys) never register or notify. + addListener(cb, exclusive = false) { + var entry = {cb, exclusive}; + var listeners = (this.listeners ??= new Set()); + listeners.add(entry); + return {listeners, entry}; + } + notifyListeners(flags) { + // Iterates the set without copying, which is safe ONLY under a + // load-bearing contract that every internal listener must honour: + // 1. A listener must not run user code synchronously (a poll waiter only + // resolves a Promise; an epoll registration only re-lists + + // re-notifies; the epoll callback only schedules a tick). User code + // runs on a later tick, never inside this loop. + // 2. A listener may delete entries only from ITS OWN waiter, never from + // a sibling node's set that may be mid-iteration. (Deleting an entry + // of the set being iterated here is fine - a Set tolerates removal of + // a not-yet-visited entry mid-iteration; mutating a *different* node's + // set is fine because that set is not being iterated.) + // Violating either gives silently skipped wakeups that are near-impossible + // to reproduce. Any new producer/listener must preserve it. + if (!this.listeners) return; + // Fire every non-exclusive listener. Among EPOLLEXCLUSIVE registrations + // (one fd watched by several epolls) wake only one, rotating round-robin + // per node, to avoid a thundering herd. (Only epoll registrations are ever + // exclusive; poll waiters and a node's own consumers are not.) + var excl; + for (var entry of this.listeners) { + if (entry.exclusive) (excl ||= []).push(entry); + else entry.cb(flags); + } + if (excl) { + var i = (this.exclTurn || 0) % excl.length; + this.exclTurn = i + 1; + excl[i].cb(flags); + } + } + }, + lookupPath(path, opts = {}) { + if (!path) { + throw new FS.ErrnoError(44); + } + opts.follow_mount ??= true + + if (!PATH.isAbs(path)) { + path = FS.cwd() + '/' + path; + } + + // limit max consecutive symlinks to SYMLOOP_MAX. + linkloop: for (var nlinks = 0; nlinks < 40; nlinks++) { + // split the absolute path + var parts = path.split('/').filter((p) => !!p); + + // start at the root + var current = FS.root; + var current_path = '/'; + + for (var i = 0; i < parts.length; i++) { + var islast = (i === parts.length-1); + if (islast && opts.parent) { + // stop resolving + break; + } + + if (parts[i] === '.') { + continue; + } + + if (parts[i] === '..') { + current_path = PATH.dirname(current_path); + if (FS.isRoot(current)) { + path = current_path + '/' + parts.slice(i + 1).join('/'); + // We're making progress here, don't let many consecutive ..'s + // lead to ELOOP + nlinks--; + continue linkloop; + } else { + current = current.parent; + } + continue; + } + + current_path = PATH.join2(current_path, parts[i]); + try { + current = FS.lookupNode(current, parts[i]); + } catch (e) { + // if noent_okay is true, suppress a ENOENT in the last component + // and return an object with an undefined node. This is needed for + // resolving symlinks in the path when creating a file. + if ((e?.errno === 44) && islast && opts.noent_okay) { + return { path: current_path }; + } + throw e; + } + + // jump to the mount's root node if this is a mountpoint + if (FS.isMountpoint(current) && (!islast || opts.follow_mount)) { + current = current.mounted.root; + } + + // by default, lookupPath will not follow a symlink if it is the final path component. + // setting opts.follow = true will override this behavior. + if (FS.isLink(current.mode) && (!islast || opts.follow)) { + if (!current.node_ops.readlink) { + throw new FS.ErrnoError(52); + } + var link = current.node_ops.readlink(current); + if (!PATH.isAbs(link)) { + link = PATH.dirname(current_path) + '/' + link; + } + path = link + '/' + parts.slice(i + 1).join('/'); + continue linkloop; + } + } + return { path: current_path, node: current }; + } + throw new FS.ErrnoError(32); + }, + getPath(node) { + var path; + while (true) { + if (FS.isRoot(node)) { + var mount = node.mount.mountpoint; + if (!path) return mount; + return mount[mount.length-1] !== '/' ? `${mount}/${path}` : mount + path; + } + path = path ? `${node.name}/${path}` : node.name; + node = node.parent; + } + }, + hashName(parentid, name) { + var hash = 0; + + for (var i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return ((parentid + hash) >>> 0) % FS.nameTable.length; + }, + hashAddNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + node.name_next = FS.nameTable[hash]; + FS.nameTable[hash] = node; + }, + hashRemoveNode(node) { + var hash = FS.hashName(node.parent.id, node.name); + if (FS.nameTable[hash] === node) { + FS.nameTable[hash] = node.name_next; + } else { + var current = FS.nameTable[hash]; + while (current) { + if (current.name_next === node) { + current.name_next = node.name_next; + break; + } + current = current.name_next; + } + } + }, + lookupNode(parent, name) { + var errCode = FS.mayLookup(parent); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + var hash = FS.hashName(parent.id, name); + for (var node = FS.nameTable[hash]; node; node = node.name_next) { + var nodeName = node.name; + if (node.parent.id === parent.id && nodeName === name) { + return node; + } + } + // if we failed to find it in the cache, call into the VFS + return FS.lookup(parent, name); + }, + createNode(parent, name, mode, rdev) { + assert(typeof parent == 'object') + var node = new FS.FSNode(parent, name, mode, rdev); + + FS.hashAddNode(node); + + return node; + }, + destroyNode(node) { + FS.hashRemoveNode(node); + }, + isRoot(node) { + return node === node.parent; + }, + isMountpoint(node) { + return !!node.mounted; + }, + isFile(mode) { + return (mode & 61440) === 32768; + }, + isDir(mode) { + return (mode & 61440) === 16384; + }, + isLink(mode) { + return (mode & 61440) === 40960; + }, + isChrdev(mode) { + return (mode & 61440) === 8192; + }, + isBlkdev(mode) { + return (mode & 61440) === 24576; + }, + isFIFO(mode) { + return (mode & 61440) === 4096; + }, + isSocket(mode) { + return (mode & 49152) === 49152; + }, + flagsToPermissionString(flag) { + var perms = ['r', 'w', 'rw'][flag & 3]; + if ((flag & 512)) { + perms += 'w'; + } + return perms; + }, + nodePermissions(node, perms) { + if (FS.ignorePermissions) { + return 0; + } + // return 0 if any user, group or owner bits are set. + if (perms.includes('r') && !(node.mode & 292)) { + return 2; + } + if (perms.includes('w') && !(node.mode & 146)) { + return 2; + } + if (perms.includes('x') && !(node.mode & 73)) { + return 2; + } + return 0; + }, + mayLookup(dir) { + if (!FS.isDir(dir.mode)) return 54; + var errCode = FS.nodePermissions(dir, 'x'); + if (errCode) return errCode; + if (!dir.node_ops.lookup) return 2; + return 0; + }, + mayCreate(dir, name) { + if (!FS.isDir(dir.mode)) { + return 54; + } + try { + var node = FS.lookupNode(dir, name); + return 20; + } catch (e) { + } + return FS.nodePermissions(dir, 'wx'); + }, + mayDelete(dir, name, isdir) { + var node; + try { + node = FS.lookupNode(dir, name); + } catch (e) { + return e.errno; + } + var errCode = FS.nodePermissions(dir, 'wx'); + if (errCode) { + return errCode; + } + if (isdir) { + if (!FS.isDir(node.mode)) { + return 54; + } + if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { + return 10; + } + } else if (FS.isDir(node.mode)) { + return 31; + } + return 0; + }, + mayOpen(node, flags) { + if (!node) { + return 44; + } + if (FS.isLink(node.mode)) { + return 32; + } + var mode = FS.flagsToPermissionString(flags); + if (FS.isDir(node.mode)) { + // opening for write + // TODO: check for O_SEARCH? (== search for dir only) + if (mode !== 'r' || (flags & (512 | 64))) { + return 31; + } + } + return FS.nodePermissions(node, mode); + }, + checkOpExists(op, err) { + if (!op) { + throw new FS.ErrnoError(err); + } + return op; + }, + MAX_OPEN_FDS:4096, + nextfd() { + for (var fd = 0; fd <= FS.MAX_OPEN_FDS; fd++) { + if (!FS.streams[fd]) { + return fd; + } + } + throw new FS.ErrnoError(33); + }, + getStreamChecked(fd) { + var stream = FS.getStream(fd); + if (!stream) { + throw new FS.ErrnoError(8); + } + return stream; + }, + getStream:(fd) => FS.streams[fd], + createStream(stream, fd = -1) { + assert(fd >= -1); + + // clone it, so we can return an instance of FSStream + stream = Object.assign(new FS.FSStream(), stream); + if (fd == -1) { + fd = FS.nextfd(); + } + stream.fd = fd; + FS.streams[fd] = stream; + return stream; + }, + closeStream(fd) { + FS.streams[fd] = null; + }, + dupStream(origStream, fd = -1) { + var stream = FS.createStream(origStream, fd); + stream.stream_ops?.dup?.(stream); + return stream; + }, + doSetAttr(stream, node, attr) { + var setattr = stream?.stream_ops.setattr; + var arg = setattr ? stream : node; + setattr ??= node.node_ops.setattr; + FS.checkOpExists(setattr, 63) + try { + setattr(arg, attr); + } catch (e) { + if (e instanceof RangeError) { + throw new FS.ErrnoError(22); + } + throw e; + } + }, + chrdev_stream_ops:{ + open(stream) { + var device = FS.getDevice(stream.node.rdev); + // override node's stream ops with the device's + stream.stream_ops = device.stream_ops; + // forward the open call + stream.stream_ops.open?.(stream); + }, + llseek() { + throw new FS.ErrnoError(70); + }, + }, + major:(dev) => ((dev) >> 8), + minor:(dev) => ((dev) & 0xff), + makedev:(ma, mi) => ((ma) << 8 | (mi)), + registerDevice(dev, ops) { + FS.devices[dev] = { stream_ops: ops }; + }, + getDevice:(dev) => FS.devices[dev], + getMounts(mount) { + var mounts = []; + var check = [mount]; + + while (check.length) { + var m = check.pop(); + + mounts.push(m); + + check.push(...m.mounts); + } + + return mounts; + }, + syncfs(populate, callback) { + if (typeof populate == 'function') { + callback = populate; + populate = false; + } + + FS.syncFSRequests++; + + if (FS.syncFSRequests > 1) { + err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`); + } + + var mounts = FS.getMounts(FS.root.mount); + var completed = 0; + + function doCallback(errCode) { + assert(FS.syncFSRequests > 0); + FS.syncFSRequests--; + return callback(errCode); + } + + function done(errCode) { + if (errCode) { + if (!done.errored) { + done.errored = true; + return doCallback(errCode); + } + return; + } + if (++completed >= mounts.length) { + doCallback(null); + } + }; + + // sync all mounts + for (var mount of mounts) { + if (mount.type.syncfs) { + mount.type.syncfs(mount, populate, done); + } else { + done(null); + } + } + }, + mount(type, opts, mountpoint) { + if (typeof type == 'string') { + // The filesystem was not included, and instead we have an error + // message stored in the variable. + throw type; + } + var root = mountpoint === '/'; + var pseudo = !mountpoint; + var node; + + if (root && FS.root) { + throw new FS.ErrnoError(10); + } else if (!root && !pseudo) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + mountpoint = lookup.path; // use the absolute path + node = lookup.node; + + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + + if (!FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + } + + var mount = { + type, + opts, + mountpoint, + mounts: [] + }; + + // create a root node for the fs + var mountRoot = type.mount(mount); + mountRoot.mount = mount; + mount.root = mountRoot; + + if (root) { + FS.root = mountRoot; + } else if (node) { + // set as a mountpoint + node.mounted = mount; + + // add the new mount to the current mount's children + if (node.mount) { + node.mount.mounts.push(mount); + } + } + + return mountRoot; + }, + unmount(mountpoint) { + var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); + + if (!FS.isMountpoint(lookup.node)) { + throw new FS.ErrnoError(28); + } + + // destroy the nodes for this mount, and all its child mounts + var node = lookup.node; + var mount = node.mounted; + var mounts = FS.getMounts(mount); + + for (var [hash, current] of Object.entries(FS.nameTable)) { + while (current) { + var next = current.name_next; + + if (mounts.includes(current.mount)) { + FS.destroyNode(current); + } + + current = next; + } + } + + // no longer a mountpoint + node.mounted = null; + + // remove this mount from the child mounts + var idx = node.mount.mounts.indexOf(mount); + assert(idx !== -1); + node.mount.mounts.splice(idx, 1); + }, + lookup(parent, name) { + return parent.node_ops.lookup(parent, name); + }, + mknod(path, mode, dev) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + if (!name) { + throw new FS.ErrnoError(28); + } + if (name === '.' || name === '..') { + throw new FS.ErrnoError(20); + } + var errCode = FS.mayCreate(parent, name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.mknod) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.mknod(parent, name, mode, dev); + }, + statfs(path) { + return FS.statfsNode(FS.lookupPath(path, {follow: true}).node); + }, + statfsStream(stream) { + // We keep a separate statfsStream function because noderawfs overrides + // it. In noderawfs, stream.node is sometimes null. Instead, we need to + // look at stream.path. + return FS.statfsNode(stream.node); + }, + statfsNode(node) { + // NOTE: None of the defaults here are true. We're just returning safe and + // sane values. Currently nodefs and rawfs replace these defaults, + // other file systems leave them alone. + var rtn = { + bsize: 4096, + frsize: 4096, + blocks: 1e6, + bfree: 5e5, + bavail: 5e5, + files: FS.nextInode, + ffree: FS.nextInode - 1, + fsid: 42, + flags: 2, + namelen: 255, + }; + + if (node.node_ops.statfs) { + Object.assign(rtn, node.node_ops.statfs(node.mount.opts.root)); + } + return rtn; + }, + create(path, mode = 0o666) { + mode &= 4095; + mode |= 32768; + return FS.mknod(path, mode, 0); + }, + mkdir(path, mode = 0o777) { + mode &= 511 | 512; + mode |= 16384; + return FS.mknod(path, mode, 0); + }, + mkdirTree(path, mode) { + var dirs = path.split('/'); + var d = ''; + for (var dir of dirs) { + if (!dir) continue; + if (d || PATH.isAbs(path)) d += '/'; + d += dir; + try { + FS.mkdir(d, mode); + } catch(e) { + if (e.errno != 20) throw e; + } + } + }, + mkdev(path, mode, dev) { + if (typeof dev == 'undefined') { + dev = mode; + mode = 0o666; + } + mode |= 8192; + return FS.mknod(path, mode, dev); + }, + symlink(oldpath, newpath) { + if (!PATH_FS.resolve(oldpath)) { + throw new FS.ErrnoError(44); + } + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.symlink) { + throw new FS.ErrnoError(63); + } + return parent.node_ops.symlink(parent, newname, oldpath); + }, + link(oldpath, newpath, flags) { + var lookup = FS.lookupPath(newpath, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var newname = PATH.basename(newpath); + var errCode = FS.mayCreate(parent, newname); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // Hardlinks are only supported by filesystem backends that provide a + // `link` node op (e.g. NODERAWFS backed by the host). NODEFS omits it: + // a host hardlink cannot be confined to the mount root. + if (!parent.node_ops.link) { + throw new FS.ErrnoError(34); + } + return parent.node_ops.link(parent, newname, oldpath, flags); + }, + rename(old_path, new_path) { + var old_dirname = PATH.dirname(old_path); + var new_dirname = PATH.dirname(new_path); + var old_name = PATH.basename(old_path); + var new_name = PATH.basename(new_path); + // parents must exist + var lookup, old_dir, new_dir; + + // let the errors from non existent directories percolate up + lookup = FS.lookupPath(old_path, { parent: true }); + old_dir = lookup.node; + lookup = FS.lookupPath(new_path, { parent: true }); + new_dir = lookup.node; + + if (!old_dir || !new_dir) throw new FS.ErrnoError(44); + // need to be part of the same mount + if (old_dir.mount !== new_dir.mount) { + throw new FS.ErrnoError(75); + } + // source must exist + var old_node = FS.lookupNode(old_dir, old_name); + // old path should not be an ancestor of the new path + var relative = PATH_FS.relative(old_path, new_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(28); + } + // new path should not be an ancestor of the old path + relative = PATH_FS.relative(new_path, old_dirname); + if (relative.charAt(0) !== '.') { + throw new FS.ErrnoError(55); + } + // see if the new path already exists + var new_node; + try { + new_node = FS.lookupNode(new_dir, new_name); + } catch (e) { + // not fatal + } + // early out if nothing needs to change + if (old_node === new_node) { + return; + } + // we'll need to delete the old entry + var isdir = FS.isDir(old_node.mode); + var errCode = FS.mayDelete(old_dir, old_name, isdir); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + // need delete permissions if we'll be overwriting. + // need create permissions if new doesn't already exist. + errCode = new_node ? + FS.mayDelete(new_dir, new_name, isdir) : + FS.mayCreate(new_dir, new_name); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!old_dir.node_ops.rename) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) { + throw new FS.ErrnoError(10); + } + // if we are going to change the parent, check write permissions + if (new_dir !== old_dir) { + errCode = FS.nodePermissions(old_dir, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // remove the node from the lookup hash + FS.hashRemoveNode(old_node); + // do the underlying fs rename + try { + old_dir.node_ops.rename(old_node, new_dir, new_name); + // update old node (we do this here to avoid each backend + // needing to) + old_node.parent = new_dir; + } catch (e) { + throw e; + } finally { + // add the node back to the hash (in case node_ops.rename + // changed its name) + FS.hashAddNode(old_node); + } + }, + rmdir(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, true); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.rmdir) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.rmdir(parent, name); + FS.destroyNode(node); + }, + readdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + var readdir = FS.checkOpExists(node.node_ops.readdir, 54); + return readdir(node); + }, + unlink(path) { + var lookup = FS.lookupPath(path, { parent: true }); + var parent = lookup.node; + if (!parent) { + throw new FS.ErrnoError(44); + } + var name = PATH.basename(path); + var node = FS.lookupNode(parent, name); + var errCode = FS.mayDelete(parent, name, false); + if (errCode) { + // According to POSIX, we should map EISDIR to EPERM, but + // we instead do what Linux does (and we must, as we use + // the musl linux libc). + throw new FS.ErrnoError(errCode); + } + if (!parent.node_ops.unlink) { + throw new FS.ErrnoError(63); + } + if (FS.isMountpoint(node)) { + throw new FS.ErrnoError(10); + } + parent.node_ops.unlink(parent, name); + FS.destroyNode(node); + }, + readlink(path) { + var lookup = FS.lookupPath(path); + var link = lookup.node; + if (!link) { + throw new FS.ErrnoError(44); + } + if (!link.node_ops.readlink) { + throw new FS.ErrnoError(28); + } + return link.node_ops.readlink(link); + }, + stat(path, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + var node = lookup.node; + var getattr = FS.checkOpExists(node.node_ops.getattr, 63); + return getattr(node); + }, + fstat(fd) { + var stream = FS.getStreamChecked(fd); + var node = stream.node; + var getattr = stream.stream_ops.getattr; + var arg = getattr ? stream : node; + getattr ??= node.node_ops.getattr; + FS.checkOpExists(getattr, 63) + return getattr(arg); + }, + lstat(path) { + return FS.stat(path, true); + }, + doChmod(stream, node, mode, dontFollow) { + FS.doSetAttr(stream, node, { + mode: (mode & 4095) | (node.mode & ~4095), + ctime: Date.now(), + dontFollow + }); + }, + chmod(path, mode, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + FS.doChmod(null, node, mode, dontFollow); + }, + lchmod(path, mode) { + FS.chmod(path, mode, true); + }, + fchmod(fd, mode) { + var stream = FS.getStreamChecked(fd); + FS.doChmod(stream, stream.node, mode, false); + }, + doChown(stream, node, dontFollow) { + FS.doSetAttr(stream, node, { + timestamp: Date.now(), + dontFollow + // we ignore the uid / gid for now + }); + }, + chown(path, uid, gid, dontFollow) { + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + node = lookup.node; + } else { + node = path; + } + FS.doChown(null, node, dontFollow); + }, + lchown(path, uid, gid) { + FS.chown(path, uid, gid, true); + }, + fchown(fd, uid, gid) { + var stream = FS.getStreamChecked(fd); + FS.doChown(stream, stream.node, false); + }, + doTruncate(stream, node, len) { + if (FS.isDir(node.mode)) { + throw new FS.ErrnoError(31); + } + if (!FS.isFile(node.mode)) { + throw new FS.ErrnoError(28); + } + var errCode = FS.nodePermissions(node, 'w'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.doSetAttr(stream, node, { + size: len, + timestamp: Date.now() + }); + }, + truncate(path, len) { + if (len < 0) { + throw new FS.ErrnoError(28); + } + var node; + if (typeof path == 'string') { + var lookup = FS.lookupPath(path, { follow: true }); + node = lookup.node; + } else { + node = path; + } + FS.doTruncate(null, node, len); + }, + ftruncate(fd, len) { + var stream = FS.getStreamChecked(fd); + if (len < 0 || (stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(28); + } + FS.doTruncate(stream, stream.node, len); + }, + utime(path, atime, mtime, dontFollow) { + var lookup = FS.lookupPath(path, { follow: !dontFollow }); + FS.doSetAttr(null, lookup.node, { + atime: atime, + mtime: mtime, + dontFollow + }); + }, + open(path, flags, mode = 0o666) { + if (path === '') { + throw new FS.ErrnoError(44); + } + flags = FS_modeStringToFlags(flags); + if ((flags & 64)) { + mode = (mode & 4095) | 32768; + } else { + mode = 0; + } + var node; + var isDirPath; + if (typeof path == 'object') { + node = path; + } else { + isDirPath = path.endsWith('/'); + // noent_okay makes it so that if the final component of the path + // doesn't exist, lookupPath returns `node: undefined`. `path` will be + // updated to point to the target of all symlinks. + var lookup = FS.lookupPath(path, { + follow: !(flags & 131072), + noent_okay: true + }); + node = lookup.node; + path = lookup.path; + } + // perhaps we need to create the node + var created = false; + if ((flags & 64)) { + if (node) { + // if O_CREAT and O_EXCL are set, error out if the node already exists + if ((flags & 128)) { + throw new FS.ErrnoError(20); + } + } else if (isDirPath) { + throw new FS.ErrnoError(31); + } else { + // node doesn't exist, try to create it + // Ignore the permission bits here to ensure we can `open` this new + // file below. We use chmod below to apply the permissions once the + // file is open. + node = FS.mknod(path, mode | 0o777, 0); + created = true; + } + } + if (!node) { + throw new FS.ErrnoError(44); + } + // can't truncate a device + if (FS.isChrdev(node.mode)) { + flags &= ~512; + } + // if asked only for a directory, then this must be one + if ((flags & 65536) && !FS.isDir(node.mode)) { + throw new FS.ErrnoError(54); + } + // check permissions, if this is not a file we just created now (it is ok to + // create and write to a file with read-only permissions; it is read-only + // for later use) + if (!created) { + var errCode = FS.mayOpen(node, flags); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + } + // do truncation if necessary + if ((flags & 512) && !created) { + FS.truncate(node, 0); + } + // we've already handled these, don't pass down to the underlying vfs + flags &= ~(128 | 512 | 131072); + + // register the stream with the filesystem + var stream = FS.createStream({ + node, + path: FS.getPath(node), // we want the absolute path to the node + flags, + seekable: true, + position: 0, + stream_ops: node.stream_ops, + // used by the file family libc calls (fopen, fwrite, ferror, etc.) + ungotten: [], + error: false + }); + // call the new stream's open function + if (stream.stream_ops.open) { + stream.stream_ops.open(stream); + } + if (created) { + FS.chmod(node, mode & 0o777); + } + return stream; + }, + close(stream) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (stream.getdents) stream.getdents = null; // free readdir state + // The fd is going away: wake anything waiting on it (poll/epoll) with + // POLLNVAL so a blocking wait unblocks and an epoll registration is evicted + // on its next derive. Only sockets/pipes/epoll ever carry a wait-queue, so + // for every other stream (incl. nodeless noderawfs stdio) this is a no-op. + stream.node?.notifyListeners(32); + try { + if (stream.stream_ops.close) { + stream.stream_ops.close(stream); + } + } catch (e) { + throw e; + } finally { + FS.closeStream(stream.fd); + } + stream.fd = null; + }, + isClosed(stream) { + return stream.fd === null; + }, + llseek(stream, offset, whence) { + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if (!stream.seekable || !stream.stream_ops.llseek) { + throw new FS.ErrnoError(70); + } + if (whence != 0 && whence != 1 && whence != 2) { + throw new FS.ErrnoError(28); + } + stream.position = stream.stream_ops.llseek(stream, offset, whence); + stream.ungotten = []; + return stream.position; + }, + read(stream, buffer, offset, length, position) { + assert(offset >= 0); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.read) { + throw new FS.ErrnoError(28); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); + if (!seeking) stream.position += bytesRead; + return bytesRead; + }, + write(stream, buffer, offset, length, position, canOwn) { + assert(offset >= 0); + assert(buffer.subarray, 'FS.write expects a TypedArray'); + if (length < 0 || position < 0) { + throw new FS.ErrnoError(28); + } + if (FS.isClosed(stream)) { + throw new FS.ErrnoError(8); + } + if ((stream.flags & 2097155) === 0) { + throw new FS.ErrnoError(8); + } + if (FS.isDir(stream.node.mode)) { + throw new FS.ErrnoError(31); + } + if (!stream.stream_ops.write) { + throw new FS.ErrnoError(28); + } + if (stream.seekable && stream.flags & 1024) { + // seek to the end before writing in append mode + FS.llseek(stream, 0, 2); + } + var seeking = typeof position != 'undefined'; + if (!seeking) { + position = stream.position; + } else if (!stream.seekable) { + throw new FS.ErrnoError(70); + } + var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); + if (!seeking) stream.position += bytesWritten; + return bytesWritten; + }, + mmap(stream, length, position, prot, flags) { + // User requests writing to file (prot & PROT_WRITE != 0). + // Checking if we have permissions to write to the file unless + // MAP_PRIVATE flag is set. According to POSIX spec it is possible + // to write to file opened in read-only mode with MAP_PRIVATE flag, + // as all modifications will be visible only in the memory of + // the current process. + if ((prot & 2) !== 0 + && (flags & 2) === 0 + && (stream.flags & 2097155) !== 2) { + throw new FS.ErrnoError(2); + } + if ((stream.flags & 2097155) === 1) { + throw new FS.ErrnoError(2); + } + if (!stream.stream_ops.mmap) { + throw new FS.ErrnoError(43); + } + if (!length) { + throw new FS.ErrnoError(28); + } + return stream.stream_ops.mmap(stream, length, position, prot, flags); + }, + msync(stream, buffer, offset, length, mmapFlags) { + assert(offset >= 0); + if (!stream.stream_ops.msync) { + return 0; + } + return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags); + }, + ioctl(stream, cmd, arg) { + if (!stream.stream_ops.ioctl) { + throw new FS.ErrnoError(59); + } + return stream.stream_ops.ioctl(stream, cmd, arg); + }, + readFile(path, opts = {}) { + opts.flags = opts.flags ?? 0; + opts.encoding = opts.encoding ?? 'binary'; + if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') { + abort(`Invalid encoding type "${opts.encoding}"`); + } + var stream = FS.open(path, opts.flags); + var stat = FS.stat(path); + var length = stat.size; + var buf = new Uint8Array(length); + FS.read(stream, buf, 0, length, 0); + if (opts.encoding === 'utf8') { + buf = UTF8ArrayToString(buf); + } + FS.close(stream); + return buf; + }, + writeFile(path, data, opts = {}) { + opts.flags = opts.flags ?? 577; + var stream = FS.open(path, opts.flags, opts.mode); + data = FS_fileDataToTypedArray(data); + FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn); + FS.close(stream); + }, + cwd:() => FS.currentPath, + chdir(path) { + var lookup = FS.lookupPath(path, { follow: true }); + if (lookup.node === null) { + throw new FS.ErrnoError(44); + } + if (!FS.isDir(lookup.node.mode)) { + throw new FS.ErrnoError(54); + } + var errCode = FS.nodePermissions(lookup.node, 'x'); + if (errCode) { + throw new FS.ErrnoError(errCode); + } + FS.currentPath = lookup.path; + }, + createDefaultDirectories() { + FS.mkdir('/tmp'); + FS.mkdir('/home'); + FS.mkdir('/home/web_user'); + }, + createDefaultDevices() { + // create /dev + FS.mkdir('/dev'); + // setup /dev/null + FS.registerDevice(FS.makedev(1, 3), { + read: () => 0, + write: (stream, buffer, offset, length, pos) => length, + llseek: () => 0, + }); + FS.mkdev('/dev/null', FS.makedev(1, 3)); + // setup /dev/tty and /dev/tty1 + // stderr needs to print output using err() rather than out() + // so we register a second tty just for it. + TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); + TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); + FS.mkdev('/dev/tty', FS.makedev(5, 0)); + FS.mkdev('/dev/tty1', FS.makedev(6, 0)); + // setup /dev/[u]random + // use a buffer to avoid overhead of individual crypto calls per byte + var randomBuffer = new Uint8Array(1024), randomLeft = 0; + var randomByte = () => { + if (randomLeft === 0) { + randomFill(randomBuffer); + randomLeft = randomBuffer.byteLength; + } + return randomBuffer[--randomLeft]; + }; + FS.createDevice('/dev', 'random', randomByte); + FS.createDevice('/dev', 'urandom', randomByte); + // we're not going to emulate the actual shm device, + // just create the tmp dirs that reside in it commonly + FS.mkdir('/dev/shm'); + FS.mkdir('/dev/shm/tmp'); + }, + createSpecialDirectories() { + // create /proc/self/fd which allows /proc/self/fd/6 => readlink gives the + // name of the stream for fd 6 (see test_unistd_ttyname) + FS.mkdir('/proc'); + var proc_self = FS.mkdir('/proc/self'); + FS.mkdir('/proc/self/fd'); + FS.mount({ + mount() { + var node = FS.createNode(proc_self, 'fd', 16895, 73); + node.stream_ops = { + llseek: MEMFS.stream_ops.llseek, + }; + node.node_ops = { + lookup(parent, name) { + var fd = +name; + var stream = FS.getStreamChecked(fd); + var ret = { + parent: null, + mount: { mountpoint: 'fake' }, + node_ops: { readlink: () => stream.path }, + id: fd + 1, + }; + ret.parent = ret; // make it look like a simple root node + return ret; + }, + readdir() { + return Array.from(FS.streams.entries()) + .filter(([k, v]) => v) + .map(([k, v]) => k.toString()); + } + }; + return node; + } + }, {}, '/proc/self/fd'); + }, + createStandardStreams(input, output, error) { + // TODO deprecate the old functionality of a single + // input / output callback and that utilizes FS.createDevice + // and instead require a unique set of stream ops + + // by default, we symlink the standard streams to the + // default tty devices. however, if the standard streams + // have been overwritten we create a unique device for + // them instead. + if (input) { + FS.createDevice('/dev', 'stdin', input); + } else { + FS.symlink('/dev/tty', '/dev/stdin'); + } + if (output) { + FS.createDevice('/dev', 'stdout', null, output); + } else { + FS.symlink('/dev/tty', '/dev/stdout'); + } + if (error) { + FS.createDevice('/dev', 'stderr', null, error); + } else { + FS.symlink('/dev/tty1', '/dev/stderr'); + } + + // open default streams for the stdin, stdout and stderr devices + var stdin = FS.open('/dev/stdin', 0); + var stdout = FS.open('/dev/stdout', 1); + var stderr = FS.open('/dev/stderr', 1); + assert(stdin.fd === 0, `invalid handle for stdin (${stdin.fd})`); + assert(stdout.fd === 1, `invalid handle for stdout (${stdout.fd})`); + assert(stderr.fd === 2, `invalid handle for stderr (${stderr.fd})`); + }, + staticInit() { + FS.nameTable = new Array(4096); + + FS.mount(MEMFS, {}, '/'); + + FS.createDefaultDirectories(); + FS.createDefaultDevices(); + FS.createSpecialDirectories(); + + FS.filesystems = { + 'MEMFS': MEMFS, + }; + }, + init(input, output, error) { + assert(!FS.initialized, 'FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)'); + FS.initialized = true; + + // Allow Module.stdin etc. to provide defaults, if none explicitly passed to us here + input ??= Module['stdin']; + output ??= Module['stdout']; + error ??= Module['stderr']; + + FS.createStandardStreams(input, output, error); + }, + quit() { + FS.initialized = false; + // force-flush all streams, so we get musl std streams printed out + _fflush(0); + // close all of our streams + for (var stream of FS.streams) { + if (stream) { + FS.close(stream); + } + } + }, + findObject(path, dontResolveLastLink) { + var ret = FS.analyzePath(path, dontResolveLastLink); + if (!ret.exists) { + return null; + } + return ret.object; + }, + analyzePath(path, dontResolveLastLink) { + // operate from within the context of the symlink's target + try { + var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + path = lookup.path; + } catch (e) { + } + var ret = { + isRoot: false, exists: false, error: 0, name: null, path: null, object: null, + parentExists: false, parentPath: null, parentObject: null + }; + try { + var lookup = FS.lookupPath(path, { parent: true }); + ret.parentExists = true; + ret.parentPath = lookup.path; + ret.parentObject = lookup.node; + ret.name = PATH.basename(path); + lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); + ret.exists = true; + ret.path = lookup.path; + ret.object = lookup.node; + ret.name = lookup.node.name; + ret.isRoot = lookup.path === '/'; + } catch (e) { + ret.error = e.errno; + }; + return ret; + }, + createPath(parent, path, canRead, canWrite) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + var parts = path.split('/').reverse(); + while (parts.length) { + var part = parts.pop(); + if (!part) continue; + var current = PATH.join2(parent, part); + try { + FS.mkdir(current); + } catch (e) { + if (e.errno != 20) throw e; + } + parent = current; + } + return current; + }, + createFile(parent, name, properties, canRead, canWrite) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(canRead, canWrite); + return FS.create(path, mode); + }, + createDataFile(parent, name, data, canRead, canWrite, canOwn) { + var path = name; + if (parent) { + parent = typeof parent == 'string' ? parent : FS.getPath(parent); + path = name ? PATH.join2(parent, name) : parent; + } + var mode = FS_getMode(canRead, canWrite); + var node = FS.create(path, mode); + if (data) { + data = FS_fileDataToTypedArray(data); + // make sure we can write to the file + FS.chmod(node, mode | 146); + var stream = FS.open(node, 577); + FS.write(stream, data, 0, data.length, 0, canOwn); + FS.close(stream); + FS.chmod(node, mode); + } + }, + createDevice(parent, name, input, output) { + var path = PATH.join2(typeof parent == 'string' ? parent : FS.getPath(parent), name); + var mode = FS_getMode(!!input, !!output); + FS.createDevice.major ??= 64; + var dev = FS.makedev(FS.createDevice.major++, 0); + // Create a fake device that a set of stream ops to emulate + // the old behavior. + FS.registerDevice(dev, { + open(stream) { + stream.seekable = false; + }, + close(stream) { + // flush any pending line data + if (output?.buffer?.length) { + output(10); + } + }, + read(stream, buffer, offset, length, pos /* ignored */) { + var bytesRead = 0; + for (var i = 0; i < length; i++) { + var result; + try { + result = input(); + } catch (e) { + throw new FS.ErrnoError(29); + } + if (result === undefined && bytesRead === 0) { + throw new FS.ErrnoError(6); + } + if (result === null || result === undefined) break; + bytesRead++; + buffer[offset+i] = result; + } + if (bytesRead) { + stream.node.atime = Date.now(); + } + return bytesRead; + }, + write(stream, buffer, offset, length, pos) { + for (var i = 0; i < length; i++) { + try { + output(buffer[offset+i]); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + if (length) { + stream.node.mtime = stream.node.ctime = Date.now(); + } + return i; + } + }); + return FS.mkdev(path, mode, dev); + }, + forceLoadFile(obj) { + if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; + if (globalThis.XMLHttpRequest) { + abort('Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.'); + } else { // Command-line. + try { + obj.contents = readBinary(obj.url); + } catch (e) { + throw new FS.ErrnoError(29); + } + } + }, + createLazyFile(parent, name, url, canRead, canWrite) { + // Lazy chunked Uint8Array (implements get and length from Uint8Array). + // Actual getting is abstracted away for eventual reuse. + class LazyUint8Array { + lengthKnown = false; + chunks = []; // Loaded chunks. Index is the chunk number + get(idx) { + if (idx > this.length-1 || idx < 0) { + return undefined; + } + var chunkOffset = idx % this.chunkSize; + var chunkNum = (idx / this.chunkSize)|0; + return this.getter(chunkNum)[chunkOffset]; + } + setDataGetter(getter) { + this.getter = getter; + } + cacheLength() { + // Find length + var xhr = new XMLHttpRequest(); + xhr.open('HEAD', url, false); + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort(`Couldn't load ${url}. Status: ${xhr.status}`); + var datalength = Number(xhr.getResponseHeader('Content-length')); + var header; + var hasByteServing = (header = xhr.getResponseHeader('Accept-Ranges')) && header === 'bytes'; + var usesGzip = (header = xhr.getResponseHeader('Content-Encoding')) && header === 'gzip'; + + var chunkSize = 1024*1024; // Chunk size in bytes + + if (!hasByteServing) chunkSize = datalength; + + // Function to get a range from the remote URL. + var doXHR = (from, to) => { + if (from > to) abort(`invalid range (${from}, ${to}) or no bytes requested!`); + if (to > datalength-1) abort(`only ${datalength} bytes available! programmer error!`); + + // TODO: Use mozResponseArrayBuffer, responseStream, etc. if available. + var xhr = new XMLHttpRequest(); + xhr.open('GET', url, false); + if (datalength !== chunkSize) xhr.setRequestHeader('Range', `bytes=${from}-${to}`); + + // Some hints to the browser that we want binary data. + xhr.responseType = 'arraybuffer'; + if (xhr.overrideMimeType) { + xhr.overrideMimeType('text/plain; charset=x-user-defined'); + } + + xhr.send(null); + if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) abort(`Couldn't load ${url}. Status: ${xhr.status}`); + if (xhr.response !== undefined) { + return new Uint8Array(/** @type{Array} */(xhr.response || [])); + } + return intArrayFromString(xhr.responseText ?? '', true); + }; + var lazyArray = this; + lazyArray.setDataGetter((chunkNum) => { + var start = chunkNum * chunkSize; + var end = (chunkNum+1) * chunkSize - 1; // including this byte + end = Math.min(end, datalength-1); // if datalength-1 is selected, this is the last block + if (typeof lazyArray.chunks[chunkNum] == 'undefined') { + lazyArray.chunks[chunkNum] = doXHR(start, end); + } + if (typeof lazyArray.chunks[chunkNum] == 'undefined') abort('doXHR failed!'); + return lazyArray.chunks[chunkNum]; + }); + + if (usesGzip || !datalength) { + // if the server uses gzip or doesn't supply the length, we have to download the whole file to get the (uncompressed) length + chunkSize = datalength = 1; // this will force getter(0)/doXHR do download the whole file + datalength = this.getter(0).length; + chunkSize = datalength; + out('LazyFiles on gzip forces download of the whole file when length is accessed'); + } + + this._length = datalength; + this._chunkSize = chunkSize; + this.lengthKnown = true; + } + get length() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._length; + } + get chunkSize() { + if (!this.lengthKnown) { + this.cacheLength(); + } + return this._chunkSize; + } + } + + if (globalThis.XMLHttpRequest) { + if (!ENVIRONMENT_IS_WORKER) abort('Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'); + var lazyArray = new LazyUint8Array(); + var properties = { isDevice: false, contents: lazyArray }; + } else { + var properties = { isDevice: false, url: url }; + } + + var node = FS.createFile(parent, name, properties, canRead, canWrite); + // This is a total hack, but I want to get this lazy file code out of the + // core of MEMFS. If we want to keep this lazy file concept I feel it should + // be its own thin LAZYFS proxying calls to MEMFS. + if (properties.contents) { + node.contents = properties.contents; + } else if (properties.url) { + node.contents = null; + node.url = properties.url; + } + // Add a function that defers querying the file size until it is asked the first time. + Object.defineProperties(node, { + usedBytes: { + get: function() { return this.contents.length; } + } + }); + // override each stream op with one that tries to force load the lazy file first + var stream_ops = {}; + for (const [key, fn] of Object.entries(node.stream_ops)) { + stream_ops[key] = (...args) => { + FS.forceLoadFile(node); + return fn(...args); + }; + } + function writeChunks(stream, buffer, offset, length, position) { + var contents = stream.node.contents; + if (position >= contents.length) + return 0; + var size = Math.min(contents.length - position, length); + assert(size >= 0); + if (contents.slice) { // normal array + for (var i = 0; i < size; i++) { + buffer[offset + i] = contents[position + i]; + } + } else { + for (var i = 0; i < size; i++) { // LazyUint8Array from sync binary XHR + buffer[offset + i] = contents.get(position + i); + } + } + return size; + } + // use a custom read function + stream_ops.read = (stream, buffer, offset, length, position) => { + FS.forceLoadFile(node); + return writeChunks(stream, buffer, offset, length, position) + }; + // use a custom mmap function + stream_ops.mmap = (stream, length, position, prot, flags) => { + FS.forceLoadFile(node); + var ptr = mmapAlloc(length); + if (!ptr) { + throw new FS.ErrnoError(48); + } + writeChunks(stream, HEAP8, ptr, length, position); + return { ptr, allocated: true }; + }; + node.stream_ops = stream_ops; + return node; + }, + }; + + + + + + /** not-@type {!BigInt64Array} */ + var HEAP64; + var SYSCALLS = { + currentUmask:18, + calculateAt(dirfd, path, allowEmpty) { + if (PATH.isAbs(path)) { + return path; + } + // relative path + var dir; + if (dirfd === -100) { + dir = FS.cwd(); + } else { + var dirstream = SYSCALLS.getStreamFromFD(dirfd); + dir = dirstream.path; + } + if (path.length == 0) { + if (!allowEmpty) { + throw new FS.ErrnoError(44);; + } + return dir; + } + return dir + '/' + path; + }, + writeStat(buf, stat) { + HEAPU32[((buf)>>2)] = stat.dev; + HEAPU32[(((buf)+(4))>>2)] = stat.mode; + HEAPU32[(((buf)+(8))>>2)] = stat.nlink; + HEAPU32[(((buf)+(12))>>2)] = stat.uid; + HEAPU32[(((buf)+(16))>>2)] = stat.gid; + HEAPU32[(((buf)+(20))>>2)] = stat.rdev; + HEAP64[(((buf)+(24))>>3)] = BigInt(stat.size); + HEAP32[(((buf)+(32))>>2)] = 4096; + HEAP32[(((buf)+(36))>>2)] = stat.blocks; + var atime = stat.atime.getTime(); + var mtime = stat.mtime.getTime(); + var ctime = stat.ctime.getTime(); + HEAP64[(((buf)+(40))>>3)] = BigInt(Math.floor(atime / 1000)); + HEAPU32[(((buf)+(48))>>2)] = (atime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(56))>>3)] = BigInt(Math.floor(mtime / 1000)); + HEAPU32[(((buf)+(64))>>2)] = (mtime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(72))>>3)] = BigInt(Math.floor(ctime / 1000)); + HEAPU32[(((buf)+(80))>>2)] = (ctime % 1000) * 1000 * 1000; + HEAP64[(((buf)+(88))>>3)] = BigInt(stat.ino); + return 0; + }, + writeStatFs(buf, stats) { + HEAPU32[(((buf)+(4))>>2)] = stats.bsize; + HEAPU32[(((buf)+(60))>>2)] = stats.bsize; + HEAP64[(((buf)+(8))>>3)] = BigInt(stats.blocks); + HEAP64[(((buf)+(16))>>3)] = BigInt(stats.bfree); + HEAP64[(((buf)+(24))>>3)] = BigInt(stats.bavail); + HEAP64[(((buf)+(32))>>3)] = BigInt(stats.files); + HEAP64[(((buf)+(40))>>3)] = BigInt(stats.ffree); + HEAPU32[(((buf)+(48))>>2)] = stats.fsid; + HEAPU32[(((buf)+(64))>>2)] = stats.flags; // ST_NOSUID + HEAPU32[(((buf)+(56))>>2)] = stats.namelen; + }, + doMsync(addr, stream, len, flags, offset) { + if (!FS.isFile(stream.node.mode)) { + throw new FS.ErrnoError(43); + } + if (flags & 2) { + // MAP_PRIVATE calls need not to be synced back to underlying fs + return 0; + } + var buffer = HEAPU8.subarray(addr, addr + len); + FS.msync(stream, buffer, offset, len, flags); + }, + getStreamFromFD(fd) { + var stream = FS.getStreamChecked(fd); + return stream; + }, + varargs:undefined, + getStr(ptr) { + var ret = UTF8ToString(ptr); + return ret; + }, + }; + function ___syscall_faccessat(dirfd, path, amode, flags) { + try { + + path = SYSCALLS.getStr(path); + assert(!flags || flags == 512); + path = SYSCALLS.calculateAt(dirfd, path); + if (amode & ~7) { + // need a valid mode + return -28; + } + var lookup = FS.lookupPath(path, { follow: true }); + var node = lookup.node; + if (!node) { + return -44; + } + var perms = ''; + if (amode & 4) perms += 'r'; + if (amode & 2) perms += 'w'; + if (amode & 1) perms += 'x'; + if (perms /* otherwise, they've just passed F_OK */ && FS.nodePermissions(node, perms)) { + return -2; + } + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + var syscallGetVarargI = () => { + assert(SYSCALLS.varargs != undefined); + // the `+` prepended here is necessary to convince the JSCompiler that varargs is indeed a number. + var ret = HEAP32[((+SYSCALLS.varargs)>>2)]; + SYSCALLS.varargs += 4; + return ret; + }; + var syscallGetVarargP = syscallGetVarargI; + + + + /** @type {!Int16Array} */ + var HEAP16; + function ___syscall_fcntl64(fd, cmd, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (cmd) { + case 0: { + var arg = syscallGetVarargI(); + if (arg < 0) { + return -28; + } + while (FS.streams[arg]) { + arg++; + } + var newStream; + newStream = FS.dupStream(stream, arg); + return newStream.fd; + } + case 1: + case 2: + return 0; // FD_CLOEXEC makes no sense for a single process. + case 3: + return stream.flags; + case 4: { + var arg = syscallGetVarargI(); + var mask = 289792; + stream.flags = (stream.flags & ~mask) | (arg & mask); + return 0; + } + case 12: { + var arg = syscallGetVarargP(); + var offset = 0; + // We're always unlocked. + HEAP16[(((arg)+(offset))>>1)] = 2; + return 0; + } + case 13: + case 14: + // Pretend that the locking is successful. These are process-level locks, + // and Emscripten programs are a single process. If we supported linking a + // filesystem between programs, we'd need to do more here. + // See https://github.com/emscripten-core/emscripten/issues/23697 + return 0; + } + return -28; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + + + var stringToUTF8 = (str, outPtr, maxBytesToWrite) => { + assert(typeof maxBytesToWrite == 'number', 'stringToUTF8 requires a third parameter that specifies the length of the output buffer'); + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + }; + function ___syscall_getcwd(buf, size) { + try { + + if (size === 0) return -28; + var cwd = FS.cwd(); + var cwdLengthInBytes = lengthBytesUTF8(cwd) + 1; + if (size < cwdLengthInBytes) return -68; + stringToUTF8(cwd, buf, size); + return cwdLengthInBytes; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + + + + + function ___syscall_ioctl(fd, op, varargs) { + SYSCALLS.varargs = varargs; + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + switch (op) { + case 21509: { + if (!stream.tty) return -59; + return 0; + } + case 21505: { + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcgets) { + var termios = stream.tty.ops.ioctl_tcgets(stream); + var argp = syscallGetVarargP(); + HEAP32[((argp)>>2)] = termios.c_iflag || 0; + HEAP32[(((argp)+(4))>>2)] = termios.c_oflag || 0; + HEAP32[(((argp)+(8))>>2)] = termios.c_cflag || 0; + HEAP32[(((argp)+(12))>>2)] = termios.c_lflag || 0; + for (var i = 0; i < 32; i++) { + HEAP8[(argp + i)+(17)] = termios.c_cc[i] || 0; + } + return 0; + } + return 0; + } + case 21510: + case 21511: + case 21512: { + if (!stream.tty) return -59; + return 0; // no-op, not actually adjusting terminal settings + } + case 21506: + case 21507: + case 21508: { + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tcsets) { + var argp = syscallGetVarargP(); + var c_iflag = HEAP32[((argp)>>2)]; + var c_oflag = HEAP32[(((argp)+(4))>>2)]; + var c_cflag = HEAP32[(((argp)+(8))>>2)]; + var c_lflag = HEAP32[(((argp)+(12))>>2)]; + var c_cc = [] + for (var i = 0; i < 32; i++) { + c_cc.push(HEAP8[(argp + i)+(17)]); + } + return stream.tty.ops.ioctl_tcsets(stream.tty, op, { c_iflag, c_oflag, c_cflag, c_lflag, c_cc }); + } + return 0; // no-op, not actually adjusting terminal settings + } + case 21519: { + if (!stream.tty) return -59; + var argp = syscallGetVarargP(); + HEAP32[((argp)>>2)] = 0; + return 0; + } + case 21520: { + if (!stream.tty) return -59; + return -28; // not supported + } + case 21537: + case 21531: { + var argp = syscallGetVarargP(); + return FS.ioctl(stream, op, argp); + } + case 21523: { + // TODO: in theory we should write to the winsize struct that gets + // passed in, but for now musl doesn't read anything on it + if (!stream.tty) return -59; + if (stream.tty.ops.ioctl_tiocgwinsz) { + var winsize = stream.tty.ops.ioctl_tiocgwinsz(stream.tty); + var argp = syscallGetVarargP(); + HEAP16[((argp)>>1)] = winsize[0]; + HEAP16[(((argp)+(2))>>1)] = winsize[1]; + } + return 0; + } + case 21524: { + // TODO: technically, this ioctl call should change the window size. + // but, since emscripten doesn't have any concept of a terminal window + // yet, we'll just silently throw it away as we do TIOCGWINSZ + if (!stream.tty) return -59; + return 0; + } + case 21515: { + if (!stream.tty) return -59; + return 0; + } + default: return -28; // not supported + } + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + + function ___syscall_openat(dirfd, path, flags, varargs) { + SYSCALLS.varargs = varargs; + try { + + path = SYSCALLS.getStr(path); + path = SYSCALLS.calculateAt(dirfd, path); + var mode = varargs ? syscallGetVarargI() : 0; + if (flags & 64) { + mode &= ~SYSCALLS.currentUmask; + } + return FS.open(path, flags, mode).fd; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return -e.errno; + } + } + + + var __abort_js = () => + abort('native code called abort()'); + + var _emscripten_get_now = () => performance.now(); + + var _emscripten_date_now = () => Date.now(); + + var nowIsMonotonic = 1; + + var checkWasiClock = (clock_id) => clock_id >= 0 && clock_id <= 3; + + var INT53_MAX = 9007199254740992; + + var INT53_MIN = -9007199254740992; + var bigintToI53Checked = (num) => (num < INT53_MIN || num > INT53_MAX) ? NaN : Number(num); + + function _clock_time_get(clk_id, ignored_precision, ptime) { + ignored_precision = bigintToI53Checked(ignored_precision); + + + if (!checkWasiClock(clk_id)) { + return 28; + } + var now; + // all wasi clocks but realtime are monotonic + if (clk_id === 0) { + now = _emscripten_date_now(); + } else if (nowIsMonotonic) { + now = _emscripten_get_now(); + } else { + return 52; + } + // "now" is in ms, and wasi times are in ns. + var nsec = Math.round(now * 1000 * 1000); + HEAP64[((ptime)>>3)] = BigInt(nsec); + return 0; + ; + } + + var readEmAsmArgsArray = []; + + + + + /** @type {!Float64Array} */ + var HEAPF64; + + var readEmAsmArgs = (sigPtr, buf) => { + // Nobody should have mutated _readEmAsmArgsArray underneath us to be something else than an array. + assert(Array.isArray(readEmAsmArgsArray)); + // The input buffer is allocated on the stack, so it must be stack-aligned. + assert(buf % 16 == 0); + readEmAsmArgsArray.length = 0; + var ch; + // Most arguments are i32s, so shift the buffer pointer so it is a plain + // index into HEAP32. + while (ch = HEAPU8[sigPtr++]) { + var chr = String.fromCharCode(ch); + var validChars = ['d', 'f', 'i', 'p']; + // In WASM_BIGINT mode we support passing i64 values as bigint. + validChars.push('j'); + assert(validChars.includes(chr), `Invalid character ${ch}("${chr}") in readEmAsmArgs! Use only [${validChars}], and do not specify "v" for void return argument.`); + // Floats are always passed as doubles, so all types except for 'i' + // are 8 bytes and require alignment. + var wide = (ch != 105); + wide &= (ch != 112); + buf += wide && (buf % 8) ? 4 : 0; + readEmAsmArgsArray.push( + // Special case for pointers under wasm64 or CAN_ADDRESS_2GB mode. + ch == 112 ? HEAPU32[((buf)>>2)] : + ch == 106 ? HEAP64[((buf)>>3)] : + ch == 105 ? + HEAP32[((buf)>>2)] : + HEAPF64[((buf)>>3)] + ); + buf += wide ? 8 : 4; + } + return readEmAsmArgsArray; + }; + var runEmAsmFunction = (code, sigPtr, argbuf) => { + var args = readEmAsmArgs(sigPtr, argbuf); + assert(ASM_CONSTS.hasOwnProperty(code), `No EM_ASM constant found at address ${code}. The loaded WebAssembly file is likely out of sync with the generated JavaScript.`); + return ASM_CONSTS[code](...args); + }; + var _emscripten_asm_const_double = (code, sigPtr, argbuf) => { + return runEmAsmFunction(code, sigPtr, argbuf); + }; + + var _emscripten_asm_const_int = (code, sigPtr, argbuf) => { + return runEmAsmFunction(code, sigPtr, argbuf); + }; + + + var maybeCStringToJsString = (cString) => { + // 'cString > 2' checks if the input is a number, and isn't of the special + // values we accept here, EMSCRIPTEN_EVENT_TARGET_* (which map to 0, 1, 2). + // In other words, if cString > 2 then it's a pointer to a valid place in + // memory, and points to a C string. + return cString > 2 ? UTF8ToString(cString) : cString; + }; + + /** @type {Object} */ + var specialHTMLTargets = [0, globalThis.document ?? 0, globalThis.window ?? 0]; + var findEventTarget = (target) => { + target = maybeCStringToJsString(target); + var domElement = specialHTMLTargets[target] || globalThis.document?.querySelector(target); + return domElement; + }; + + var getBoundingClientRect = (e) => specialHTMLTargets.indexOf(e) < 0 ? e.getBoundingClientRect() : {'left':0,'top':0}; + + var _emscripten_get_element_css_size = (target, width, height) => { + target = findEventTarget(target); + if (!target) return -4; + + var rect = getBoundingClientRect(target); + HEAPF64[((width)>>3)] = rect.width; + HEAPF64[((height)>>3)] = rect.height; + + return 0; + }; + + var onExits = []; + var addOnExit = (cb) => onExits.push(cb); + var JSEvents = { + removeAllEventListeners() { + while (JSEvents.eventHandlers.length) { + JSEvents._removeHandler(JSEvents.eventHandlers.length - 1); + } + JSEvents.deferredCalls = []; + }, + inEventHandler:0, + deferredCalls:[], + deferCall(targetFunction, precedence, argsList) { + function arraysHaveEqualContent(arrA, arrB) { + if (arrA.length != arrB.length) return false; + + for (var i in arrA) { + if (arrA[i] != arrB[i]) return false; + } + return true; + } + // Test if the given call was already queued, and if so, don't add it again. + for (var call of JSEvents.deferredCalls) { + if (call.targetFunction == targetFunction && arraysHaveEqualContent(call.argsList, argsList)) { + return; + } + } + JSEvents.deferredCalls.push({ + targetFunction, + precedence, + argsList + }); + + JSEvents.deferredCalls.sort((x,y) => x.precedence - y.precedence); + }, + removeDeferredCalls(targetFunction) { + JSEvents.deferredCalls = JSEvents.deferredCalls.filter((call) => call.targetFunction != targetFunction); + }, + canPerformEventHandlerRequests() { + // Browsers that support navigator.userActivation.isActive: https://developer.mozilla.org/en-US/docs/Web/API/UserActivation/isActive + if (navigator.userActivation) { + // Verify against transient activation status from UserActivation API + // whether it is possible to perform a request here without needing to defer. See + // https://developer.mozilla.org/en-US/docs/Web/Security/User_activation#transient_activation + // and https://caniuse.com/mdn-api_useractivation + return navigator.userActivation.isActive; + } + + return JSEvents.inEventHandler && JSEvents.currentEventHandler.allowsDeferredCalls; + }, + runDeferredCalls() { + if (!JSEvents.canPerformEventHandlerRequests()) { + return; + } + var deferredCalls = JSEvents.deferredCalls; + JSEvents.deferredCalls = []; + for (var call of deferredCalls) { + call.targetFunction(...call.argsList); + } + }, + eventHandlers:[], + removeAllHandlersOnTarget:(target, eventTypeString) => { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == target && + (!eventTypeString || eventTypeString == JSEvents.eventHandlers[i].eventTypeString)) { + JSEvents._removeHandler(i--); + } + } + }, + _removeHandler(i) { + var h = JSEvents.eventHandlers[i]; + h.target.removeEventListener(h.eventTypeString, h.eventListenerFunc, h.useCapture); + JSEvents.eventHandlers.splice(i, 1); + }, + registerOrRemoveHandler(eventHandler) { + if (!eventHandler.target) { + err('registerOrRemoveHandler: the target element for event handler registration does not exist, when processing the following event handler registration:'); + console.dir(eventHandler); + return -4; + } + if (eventHandler.callbackfunc) { + eventHandler.eventListenerFunc = function(event) { + // Increment nesting count for the event handler. + ++JSEvents.inEventHandler; + JSEvents.currentEventHandler = eventHandler; + // Process any old deferred calls the user has placed. + JSEvents.runDeferredCalls(); + // Process the actual event, calls back to user C code handler. + eventHandler.handlerFunc(event); + // Process any new deferred calls that were placed right now from this event handler. + JSEvents.runDeferredCalls(); + // Out of event handler - restore nesting count. + --JSEvents.inEventHandler; + }; + + eventHandler.target.addEventListener(eventHandler.eventTypeString, + eventHandler.eventListenerFunc, + eventHandler.useCapture); + JSEvents.eventHandlers.push(eventHandler); + } else { + for (var i = 0; i < JSEvents.eventHandlers.length; ++i) { + if (JSEvents.eventHandlers[i].target == eventHandler.target + && JSEvents.eventHandlers[i].eventTypeString == eventHandler.eventTypeString) { + JSEvents._removeHandler(i--); + } + } + } + return 0; + }, + removeSingleHandler(eventHandler) { + let success = false; + for (let i = 0; i < JSEvents.eventHandlers.length; ++i) { + const handler = JSEvents.eventHandlers[i]; + if (handler.target === eventHandler.target + && handler.eventTypeId === eventHandler.eventTypeId + && handler.callbackfunc === eventHandler.callbackfunc + && handler.userData === eventHandler.userData) { + // in some very rare cases (ex: Safari / fullscreen events), there is more than 1 handler (eventTypeString is different) + JSEvents._removeHandler(i--); + success = true; + } + } + return success ? 0 : -5; + }, + getNodeNameForTarget(target) { + if (target == window) return '#window'; + if (target == screen) return '#screen'; + return target?.nodeName ?? ''; + }, + fullscreenEnabled() { + return document.fullscreenEnabled + // Safari 13.0.3 on macOS Catalina 10.15.1 still ships with prefixed webkitFullscreenEnabled. + // TODO: If Safari at some point ships with unprefixed version, update the version check above. + ?? document.webkitFullscreenEnabled + ; + }, + }; + + + + + var fillGamepadEventData = (eventStruct, e) => { + HEAPF64[((eventStruct)>>3)] = e.timestamp; + for (var i = 0; i < e.axes.length; ++i) { + HEAPF64[(((eventStruct+i*8)+(16))>>3)] = e.axes[i]; + } + for (var i = 0; i < e.buttons.length; ++i) { + HEAP8[(eventStruct+i)+(1040)] = e.buttons[i].pressed; + HEAPF64[(((eventStruct+i*8)+(528))>>3)] = e.buttons[i].value; + } + HEAP8[(eventStruct)+(1104)] = e.connected; + HEAP32[(((eventStruct)+(1108))>>2)] = e.index; + HEAP32[(((eventStruct)+(8))>>2)] = e.axes.length; + HEAP32[(((eventStruct)+(12))>>2)] = e.buttons.length; + stringToUTF8(e.id, eventStruct + 1112, 64); + stringToUTF8(e.mapping, eventStruct + 1176, 64); + }; + var _emscripten_get_gamepad_status = (index, gamepadState) => { + assert(JSEvents.lastGamepadState, 'emscripten_get_gamepad_status() called before emscripten_sample_gamepad_data()'); + // INVALID_PARAM is returned on a Gamepad index that never was there. + if (index < 0 || index >= JSEvents.lastGamepadState.length) return -5; + + // NO_DATA is returned on a Gamepad index that was removed. + // For previously disconnected gamepads there should be an empty slot (null/undefined/false) at the index. + // This is because gamepads must keep their original position in the array. + // For example, removing the first of two gamepads produces [null/undefined/false, gamepad]. + if (!JSEvents.lastGamepadState[index]) return -7; + + fillGamepadEventData(gamepadState, JSEvents.lastGamepadState[index]); + return 0; + }; + + + var _emscripten_get_num_gamepads = () => { + assert(JSEvents.lastGamepadState, 'emscripten_get_num_gamepads() called before emscripten_sample_gamepad_data()'); + // N.B. Do not call emscripten_get_num_gamepads() unless having first called emscripten_sample_gamepad_data(), and that has returned EMSCRIPTEN_RESULT_SUCCESS. + // Otherwise the following line will throw an exception. + return JSEvents.lastGamepadState.length; + }; + + var GLctx; + + var webgl_enable_ANGLE_instanced_arrays = (ctx) => { + // Extension available in WebGL 1 from Firefox 26 and Google Chrome 30 onwards. Core feature in WebGL 2. + var ext = ctx.getExtension('ANGLE_instanced_arrays'); + // Because this extension is a core function in WebGL 2, assign the extension entry points in place of + // where the core functions will reside in WebGL 2. This way the calling code can call these without + // having to dynamically branch depending if running against WebGL 1 or WebGL 2. + if (ext) { + ctx['vertexAttribDivisor'] = (index, divisor) => ext['vertexAttribDivisorANGLE'](index, divisor); + ctx['drawArraysInstanced'] = (mode, first, count, primcount) => ext['drawArraysInstancedANGLE'](mode, first, count, primcount); + ctx['drawElementsInstanced'] = (mode, count, type, indices, primcount) => ext['drawElementsInstancedANGLE'](mode, count, type, indices, primcount); + return 1; + } + }; + + var webgl_enable_OES_vertex_array_object = (ctx) => { + // Extension available in WebGL 1 from Firefox 25 and WebKit 536.28/desktop Safari 6.0.3 onwards. Core feature in WebGL 2. + var ext = ctx.getExtension('OES_vertex_array_object'); + if (ext) { + ctx['createVertexArray'] = () => ext['createVertexArrayOES'](); + ctx['deleteVertexArray'] = (vao) => ext['deleteVertexArrayOES'](vao); + ctx['bindVertexArray'] = (vao) => ext['bindVertexArrayOES'](vao); + ctx['isVertexArray'] = (vao) => ext['isVertexArrayOES'](vao); + return 1; + } + }; + + var webgl_enable_WEBGL_draw_buffers = (ctx) => { + // Extension available in WebGL 1 from Firefox 28 onwards. Core feature in WebGL 2. + var ext = ctx.getExtension('WEBGL_draw_buffers'); + if (ext) { + ctx['drawBuffers'] = (n, bufs) => ext['drawBuffersWEBGL'](n, bufs); + return 1; + } + }; + + var webgl_enable_EXT_polygon_offset_clamp = (ctx) => + !!(ctx.extPolygonOffsetClamp = ctx.getExtension('EXT_polygon_offset_clamp')); + + var webgl_enable_EXT_clip_control = (ctx) => + !!(ctx.extClipControl = ctx.getExtension('EXT_clip_control')); + + var webgl_enable_WEBGL_polygon_mode = (ctx) => + !!(ctx.webglPolygonMode = ctx.getExtension('WEBGL_polygon_mode')); + + var webgl_enable_WEBGL_multi_draw = (ctx) => + // Closure is expected to be allowed to minify the '.multiDrawWebgl' property, so not accessing it quoted. + !!(ctx.multiDrawWebgl = ctx.getExtension('WEBGL_multi_draw')); + + var getEmscriptenSupportedExtensions = (ctx) => { + // Restrict the list of advertised extensions to those that we actually + // support. + var supportedExtensions = [ + // WebGL 1 extensions + 'ANGLE_instanced_arrays', + 'EXT_blend_minmax', + 'EXT_disjoint_timer_query', + 'EXT_frag_depth', + 'EXT_shader_texture_lod', + 'EXT_sRGB', + 'OES_element_index_uint', + 'OES_fbo_render_mipmap', + 'OES_standard_derivatives', + 'OES_texture_float', + 'OES_texture_half_float', + 'OES_texture_half_float_linear', + 'OES_vertex_array_object', + 'WEBGL_color_buffer_float', + 'WEBGL_depth_texture', + 'WEBGL_draw_buffers', + // WebGL 1 and WebGL 2 extensions + 'EXT_clip_control', + 'EXT_color_buffer_half_float', + 'EXT_depth_clamp', + 'EXT_float_blend', + 'EXT_polygon_offset_clamp', + 'EXT_texture_compression_bptc', + 'EXT_texture_compression_rgtc', + 'EXT_texture_filter_anisotropic', + 'KHR_parallel_shader_compile', + 'OES_texture_float_linear', + 'WEBGL_blend_func_extended', + 'WEBGL_compressed_texture_astc', + 'WEBGL_compressed_texture_etc', + 'WEBGL_compressed_texture_etc1', + 'WEBGL_compressed_texture_s3tc', + 'WEBGL_compressed_texture_s3tc_srgb', + 'WEBGL_debug_renderer_info', + 'WEBGL_debug_shaders', + 'WEBGL_lose_context', + 'WEBGL_multi_draw', + 'WEBGL_polygon_mode' + ]; + // .getSupportedExtensions() can return null if context is lost, so coerce to empty array. + return ctx.getSupportedExtensions()?.filter(ext => supportedExtensions.includes(ext)) ?? []; + }; + + + + + var GL = { + counter:1, + buffers:[], + programs:[], + framebuffers:[], + renderbuffers:[], + textures:[], + shaders:[], + vaos:[], + contexts:[], + offscreenCanvases:{ + }, + queries:[], + stringCache:{ + }, + unpackAlignment:4, + unpackRowLength:0, + recordError:(errorCode) => { + if (!GL.lastError) { + GL.lastError = errorCode; + } + }, + getNewId:(table) => { + var ret = GL.counter++; + for (var i = table.length; i < ret; i++) { + table[i] = null; + } + return ret; + }, + genObject:(n, buffers, createFunction, objectTable + ) => { + for (var i = 0; i < n; i++) { + var buffer = GLctx[createFunction](); + var id = buffer && GL.getNewId(objectTable); + if (buffer) { + buffer.name = id; + objectTable[id] = buffer; + } else { + GL.recordError(0x502 /* GL_INVALID_OPERATION */); + } + HEAP32[(((buffers)+(i*4))>>2)] = id; + } + }, + getSource:(shader, count, string, length) => { + var source = ''; + for (var i = 0; i < count; ++i) { + var len = length ? HEAPU32[(((length)+(i*4))>>2)] : undefined; + source += UTF8ToString(HEAPU32[(((string)+(i*4))>>2)], len); + } + return source; + }, + createContext:(/** @type {HTMLCanvasElement} */ canvas, webGLContextAttributes) => { + + // BUG: Workaround Safari WebGL issue: After successfully acquiring WebGL + // context on a canvas, calling .getContext() will always return that + // context independent of which 'webgl' or 'webgl2' + // context version was passed. See: + // https://webkit.org/b/222758 + // and: + // https://github.com/emscripten-core/emscripten/issues/13295. + // TODO: Once the bug is fixed and shipped in Safari, adjust the Safari + // version field in above check. + if (!canvas.getContextSafariWebGL2Fixed) { + canvas.getContextSafariWebGL2Fixed = canvas.getContext; + /** @type {function(this:HTMLCanvasElement, string, (Object|null)=): (Object|null)} */ + function fixedGetContext(ver, attrs) { + var gl = canvas.getContextSafariWebGL2Fixed(ver, attrs); + return ((ver == 'webgl') == (gl instanceof WebGLRenderingContext)) ? gl : null; + } + canvas.getContext = fixedGetContext; + } + + var ctx = + canvas.getContext('webgl', webGLContextAttributes); + + if (!ctx) return 0; + + var handle = GL.registerContext(ctx, webGLContextAttributes); + + return handle; + }, + registerContext:(ctx, webGLContextAttributes) => { + // without pthreads a context is just an integer ID + var handle = GL.getNewId(GL.contexts); + + var context = { + handle, + attributes: webGLContextAttributes, + version: webGLContextAttributes.majorVersion, + GLctx: ctx + }; + + // Store the created context object so that we can access the context + // given a canvas without having to pass the parameters again. + if (ctx.canvas) ctx.canvas.GLctxObject = context; + GL.contexts[handle] = context; + if (typeof webGLContextAttributes.enableExtensionsByDefault == 'undefined' || webGLContextAttributes.enableExtensionsByDefault) { + GL.initExtensions(context); + } + + return handle; + }, + makeContextCurrent:(contextHandle) => { + + // Active Emscripten GL layer context object. + GL.currentContext = GL.contexts[contextHandle]; + // Active WebGL context object. + Module['ctx'] = GLctx = GL.currentContext?.GLctx; + return !(contextHandle && !GLctx); + }, + getContext:(contextHandle) => { + return GL.contexts[contextHandle]; + }, + deleteContext:(contextHandle) => { + if (GL.currentContext === GL.contexts[contextHandle]) { + GL.currentContext = null; + } + if (typeof JSEvents == 'object') { + // Release all JS event handlers on the DOM element that the GL context is + // associated with since the context is now deleted. + JSEvents.removeAllHandlersOnTarget(GL.contexts[contextHandle].GLctx.canvas); + } + // Make sure the canvas object no longer refers to the context object so + // there are no GC surprises. + if (GL.contexts[contextHandle]?.GLctx.canvas) { + GL.contexts[contextHandle].GLctx.canvas.GLctxObject = undefined; + } + GL.contexts[contextHandle] = null; + }, + initExtensions:(context) => { + // If this function is called without a specific context object, init the + // extensions of the currently active context. + context ||= GL.currentContext; + + if (context.initExtensionsDone) return; + context.initExtensionsDone = true; + + var GLctx = context.GLctx; + + // Detect the presence of a few extensions manually, since the GL interop + // layer itself will need to know if they exist. + + // Extensions that are available in both WebGL 1 and WebGL 2 + webgl_enable_WEBGL_multi_draw(GLctx); + webgl_enable_EXT_polygon_offset_clamp(GLctx); + webgl_enable_EXT_clip_control(GLctx); + webgl_enable_WEBGL_polygon_mode(GLctx); + // Extensions that are only available in WebGL 1 (the calls will be no-ops + // if called on a WebGL 2 context active) + webgl_enable_ANGLE_instanced_arrays(GLctx); + webgl_enable_OES_vertex_array_object(GLctx); + webgl_enable_WEBGL_draw_buffers(GLctx); + { + GLctx.disjointTimerQueryExt = GLctx.getExtension('EXT_disjoint_timer_query'); + } + + for (var ext of getEmscriptenSupportedExtensions(GLctx)) { + // WEBGL_lose_context, WEBGL_debug_renderer_info and WEBGL_debug_shaders + // are not enabled by default. + if (!ext.includes('lose_context') && !ext.includes('debug')) { + // Call .getExtension() to enable that extension permanently. + GLctx.getExtension(ext); + } + } + }, + }; + var _emscripten_glActiveTexture = (x0) => GLctx.activeTexture(x0); + + var _emscripten_glAttachShader = (program, shader) => { + GLctx.attachShader(GL.programs[program], GL.shaders[shader]); + }; + + var _emscripten_glBeginQueryEXT = (target, id) => { + GLctx.disjointTimerQueryExt['beginQueryEXT'](target, GL.queries[id]); + }; + + + var _emscripten_glBindAttribLocation = (program, index, name) => { + GLctx.bindAttribLocation(GL.programs[program], index, UTF8ToString(name)); + }; + + var _emscripten_glBindBuffer = (target, buffer) => { + + GLctx.bindBuffer(target, GL.buffers[buffer]); + }; + + var _emscripten_glBindFramebuffer = (target, framebuffer) => { + + GLctx.bindFramebuffer(target, GL.framebuffers[framebuffer]); + + }; + + var _emscripten_glBindRenderbuffer = (target, renderbuffer) => { + GLctx.bindRenderbuffer(target, GL.renderbuffers[renderbuffer]); + }; + + var _emscripten_glBindTexture = (target, texture) => { + GLctx.bindTexture(target, GL.textures[texture]); + }; + + + var _emscripten_glBindVertexArray = (vao) => { + GLctx.bindVertexArray(GL.vaos[vao]); + }; + var _glBindVertexArray = _emscripten_glBindVertexArray; + var _emscripten_glBindVertexArrayOES = _glBindVertexArray; + + var _emscripten_glBlendColor = (x0, x1, x2, x3) => GLctx.blendColor(x0, x1, x2, x3); + + var _emscripten_glBlendEquation = (x0) => GLctx.blendEquation(x0); + + var _emscripten_glBlendEquationSeparate = (x0, x1) => GLctx.blendEquationSeparate(x0, x1); + + var _emscripten_glBlendFunc = (x0, x1) => GLctx.blendFunc(x0, x1); + + var _emscripten_glBlendFuncSeparate = (x0, x1, x2, x3) => GLctx.blendFuncSeparate(x0, x1, x2, x3); + + + var _emscripten_glBufferData = (target, size, data, usage) => { + + // N.b. here first form specifies a heap subarray, second form an integer + // size, so the ?: code here is polymorphic. It is advised to avoid + // randomly mixing both uses in calling code, to avoid any potential JS + // engine JIT issues. + GLctx.bufferData(target, data ? HEAPU8.subarray(data, data+size) : size, usage); + }; + + + var webglBufferSubData = (target, offset, size, data, src = HEAPU8) => { + GLctx.bufferSubData(target, offset, src.subarray(data, data + size)); + }; + + var _emscripten_glBufferSubData = (target, offset, size, data) => webglBufferSubData(target, offset, size, data); + + var _emscripten_glCheckFramebufferStatus = (x0) => GLctx.checkFramebufferStatus(x0); + + var _emscripten_glClear = (x0) => GLctx.clear(x0); + + var _emscripten_glClearColor = (x0, x1, x2, x3) => GLctx.clearColor(x0, x1, x2, x3); + + var _emscripten_glClearDepthf = (x0) => GLctx.clearDepth(x0); + + var _emscripten_glClearStencil = (x0) => GLctx.clearStencil(x0); + + var _emscripten_glClipControlEXT = (origin, depth) => { + GLctx.extClipControl['clipControlEXT'](origin, depth); + }; + + var _emscripten_glColorMask = (red, green, blue, alpha) => { + GLctx.colorMask(!!red, !!green, !!blue, !!alpha); + }; + + var _emscripten_glCompileShader = (shader) => { + GLctx.compileShader(GL.shaders[shader]); + }; + + + var _emscripten_glCompressedTexImage2D = (target, level, internalFormat, width, height, border, imageSize, data) => { + // `data` may be null here, which means "allocate uninitialized space but + // don't upload" in GLES parlance, but `compressedTexImage2D` requires the + // final data parameter, so we simply pass a heap view starting at zero + // effectively uploading whatever happens to be near address zero. See + // https://github.com/emscripten-core/emscripten/issues/19300. + GLctx.compressedTexImage2D(target, level, internalFormat, width, height, border, HEAPU8.subarray(data, data + imageSize)); + }; + + + var _emscripten_glCompressedTexSubImage2D = (target, level, xoffset, yoffset, width, height, format, imageSize, data) => { + GLctx.compressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, HEAPU8.subarray(data, data + imageSize)); + }; + + var _emscripten_glCopyTexImage2D = (x0, x1, x2, x3, x4, x5, x6, x7) => GLctx.copyTexImage2D(x0, x1, x2, x3, x4, x5, x6, x7); + + var _emscripten_glCopyTexSubImage2D = (x0, x1, x2, x3, x4, x5, x6, x7) => GLctx.copyTexSubImage2D(x0, x1, x2, x3, x4, x5, x6, x7); + + var _emscripten_glCreateProgram = () => { + var id = GL.getNewId(GL.programs); + var program = GLctx.createProgram(); + // Store additional information needed for each shader program: + program.name = id; + // Lazy cache results of + // glGetProgramiv(GL_ACTIVE_UNIFORM_MAX_LENGTH/GL_ACTIVE_ATTRIBUTE_MAX_LENGTH/GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH) + program.maxUniformLength = program.maxAttributeLength = program.maxUniformBlockNameLength = 0; + program.uniformIdCounter = 1; + GL.programs[id] = program; + return id; + }; + + var _emscripten_glCreateShader = (shaderType) => { + var id = GL.getNewId(GL.shaders); + GL.shaders[id] = GLctx.createShader(shaderType); + + return id; + }; + + var _emscripten_glCullFace = (x0) => GLctx.cullFace(x0); + + + var _emscripten_glDeleteBuffers = (n, buffers) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((buffers)+(i*4))>>2)]; + var buffer = GL.buffers[id]; + + // From spec: "glDeleteBuffers silently ignores 0's and names that do not + // correspond to existing buffer objects." + if (!buffer) continue; + + GLctx.deleteBuffer(buffer); + buffer.name = 0; + GL.buffers[id] = null; + + } + }; + + + var _emscripten_glDeleteFramebuffers = (n, framebuffers) => { + for (var i = 0; i < n; ++i) { + var id = HEAP32[(((framebuffers)+(i*4))>>2)]; + var framebuffer = GL.framebuffers[id]; + if (!framebuffer) continue; // GL spec: "glDeleteFramebuffers silently ignores 0s and names that do not correspond to existing framebuffer objects". + GLctx.deleteFramebuffer(framebuffer); + framebuffer.name = 0; + GL.framebuffers[id] = null; + } + }; + + var _emscripten_glDeleteProgram = (id) => { + if (!id) return; + var program = GL.programs[id]; + if (!program) { + // glDeleteProgram actually signals an error when deleting a nonexisting + // object, unlike some other GL delete functions. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + GLctx.deleteProgram(program); + program.name = 0; + GL.programs[id] = null; + }; + + + var _emscripten_glDeleteQueriesEXT = (n, ids) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((ids)+(i*4))>>2)]; + var query = GL.queries[id]; + if (!query) continue; // GL spec: "unused names in ids are ignored, as is the name zero." + GLctx.disjointTimerQueryExt['deleteQueryEXT'](query); + GL.queries[id] = null; + } + }; + + + var _emscripten_glDeleteRenderbuffers = (n, renderbuffers) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((renderbuffers)+(i*4))>>2)]; + var renderbuffer = GL.renderbuffers[id]; + if (!renderbuffer) continue; // GL spec: "glDeleteRenderbuffers silently ignores 0s and names that do not correspond to existing renderbuffer objects". + GLctx.deleteRenderbuffer(renderbuffer); + renderbuffer.name = 0; + GL.renderbuffers[id] = null; + } + }; + + var _emscripten_glDeleteShader = (id) => { + if (!id) return; + var shader = GL.shaders[id]; + if (!shader) { + // glDeleteShader actually signals an error when deleting a nonexisting + // object, unlike some other GL delete functions. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + GLctx.deleteShader(shader); + GL.shaders[id] = null; + }; + + + var _emscripten_glDeleteTextures = (n, textures) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((textures)+(i*4))>>2)]; + var texture = GL.textures[id]; + // GL spec: "glDeleteTextures silently ignores 0s and names that do not + // correspond to existing textures". + if (!texture) continue; + GLctx.deleteTexture(texture); + texture.name = 0; + GL.textures[id] = null; + } + }; + + + + var _emscripten_glDeleteVertexArrays = (n, vaos) => { + for (var i = 0; i < n; i++) { + var id = HEAP32[(((vaos)+(i*4))>>2)]; + GLctx.deleteVertexArray(GL.vaos[id]); + GL.vaos[id] = null; + } + }; + var _glDeleteVertexArrays = _emscripten_glDeleteVertexArrays; + var _emscripten_glDeleteVertexArraysOES = _glDeleteVertexArrays; + + var _emscripten_glDepthFunc = (x0) => GLctx.depthFunc(x0); + + var _emscripten_glDepthMask = (flag) => { + GLctx.depthMask(!!flag); + }; + + var _emscripten_glDepthRangef = (x0, x1) => GLctx.depthRange(x0, x1); + + var _emscripten_glDetachShader = (program, shader) => { + GLctx.detachShader(GL.programs[program], GL.shaders[shader]); + }; + + var _emscripten_glDisable = (x0) => GLctx.disable(x0); + + var _emscripten_glDisableVertexAttribArray = (index) => { + GLctx.disableVertexAttribArray(index); + }; + + var _emscripten_glDrawArrays = (mode, first, count) => { + + GLctx.drawArrays(mode, first, count); + + }; + + + var _emscripten_glDrawArraysInstanced = (mode, first, count, primcount) => { + GLctx.drawArraysInstanced(mode, first, count, primcount); + }; + var _glDrawArraysInstanced = _emscripten_glDrawArraysInstanced; + var _emscripten_glDrawArraysInstancedANGLE = _glDrawArraysInstanced; + + + var tempFixedLengthArray = []; + + + var _emscripten_glDrawBuffers = (n, bufs) => { + + var bufArray = tempFixedLengthArray[n]; + for (var i = 0; i < n; i++) { + bufArray[i] = HEAP32[(((bufs)+(i*4))>>2)]; + } + + GLctx.drawBuffers(bufArray); + }; + var _glDrawBuffers = _emscripten_glDrawBuffers; + var _emscripten_glDrawBuffersWEBGL = _glDrawBuffers; + + + var _emscripten_glDrawElements = (mode, count, type, indices) => { + + GLctx.drawElements(mode, count, type, indices); + + }; + + + var _emscripten_glDrawElementsInstanced = (mode, count, type, indices, primcount) => { + GLctx.drawElementsInstanced(mode, count, type, indices, primcount); + }; + var _glDrawElementsInstanced = _emscripten_glDrawElementsInstanced; + var _emscripten_glDrawElementsInstancedANGLE = _glDrawElementsInstanced; + + var _emscripten_glEnable = (x0) => GLctx.enable(x0); + + var _emscripten_glEnableVertexAttribArray = (index) => { + GLctx.enableVertexAttribArray(index); + }; + + var _emscripten_glEndQueryEXT = (target) => { + GLctx.disjointTimerQueryExt['endQueryEXT'](target); + }; + + var _emscripten_glFinish = () => GLctx.finish(); + + var _emscripten_glFlush = () => GLctx.flush(); + + var _emscripten_glFramebufferRenderbuffer = (target, attachment, renderbuffertarget, renderbuffer) => { + GLctx.framebufferRenderbuffer(target, attachment, renderbuffertarget, + GL.renderbuffers[renderbuffer]); + }; + + var _emscripten_glFramebufferTexture2D = (target, attachment, textarget, texture, level) => { + GLctx.framebufferTexture2D(target, attachment, textarget, + GL.textures[texture], level); + }; + + var _emscripten_glFrontFace = (x0) => GLctx.frontFace(x0); + + var _emscripten_glGenBuffers = (n, buffers) => { + GL.genObject(n, buffers, 'createBuffer', GL.buffers + ); + }; + + var _emscripten_glGenFramebuffers = (n, ids) => { + GL.genObject(n, ids, 'createFramebuffer', GL.framebuffers + ); + }; + + + var _emscripten_glGenQueriesEXT = (n, ids) => { + for (var i = 0; i < n; i++) { + var query = GLctx.disjointTimerQueryExt['createQueryEXT'](); + if (!query) { + GL.recordError(0x502 /* GL_INVALID_OPERATION */); + while (i < n) HEAP32[(((ids)+(i++*4))>>2)] = 0; + return; + } + var id = GL.getNewId(GL.queries); + query.name = id; + GL.queries[id] = query; + HEAP32[(((ids)+(i*4))>>2)] = id; + } + }; + + var _emscripten_glGenRenderbuffers = (n, renderbuffers) => { + GL.genObject(n, renderbuffers, 'createRenderbuffer', GL.renderbuffers + ); + }; + + var _emscripten_glGenTextures = (n, textures) => { + GL.genObject(n, textures, 'createTexture', GL.textures + ); + }; + + + var _emscripten_glGenVertexArrays = (n, arrays) => { + GL.genObject(n, arrays, 'createVertexArray', GL.vaos + ); + }; + var _glGenVertexArrays = _emscripten_glGenVertexArrays; + var _emscripten_glGenVertexArraysOES = _glGenVertexArrays; + + var _emscripten_glGenerateMipmap = (x0) => GLctx.generateMipmap(x0); + + + + var __glGetActiveAttribOrUniform = (funcName, program, index, bufSize, length, size, type, name) => { + program = GL.programs[program]; + var info = GLctx[funcName](program, index); + if (info) { + // If an error occurs, nothing will be written to length, size and type and name. + var numBytesWrittenExclNull = name && stringToUTF8(info.name, name, bufSize); + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + if (size) HEAP32[((size)>>2)] = info.size; + if (type) HEAP32[((type)>>2)] = info.type; + } + }; + + var _emscripten_glGetActiveAttrib = (program, index, bufSize, length, size, type, name) => + __glGetActiveAttribOrUniform('getActiveAttrib', program, index, bufSize, length, size, type, name); + + + var _emscripten_glGetActiveUniform = (program, index, bufSize, length, size, type, name) => + __glGetActiveAttribOrUniform('getActiveUniform', program, index, bufSize, length, size, type, name); + + + var _emscripten_glGetAttachedShaders = (program, maxCount, count, shaders) => { + var result = GLctx.getAttachedShaders(GL.programs[program]); + var len = result.length; + if (len > maxCount) { + len = maxCount; + } + HEAP32[((count)>>2)] = len; + for (var i = 0; i < len; ++i) { + var id = GL.shaders.indexOf(result[i]); + HEAP32[(((shaders)+(i*4))>>2)] = id; + } + }; + + + var _emscripten_glGetAttribLocation = (program, name) => + GLctx.getAttribLocation(GL.programs[program], UTF8ToString(name)); + + + var readI53FromI64 = (ptr) => { + return HEAPU32[((ptr)>>2)] + HEAP32[(((ptr)+(4))>>2)] * 4294967296; + }; + + var readI53FromU64 = (ptr) => { + return HEAPU32[((ptr)>>2)] + HEAPU32[(((ptr)+(4))>>2)] * 4294967296; + }; + + var writeI53ToI64 = (ptr, num) => { + HEAPU32[((ptr)>>2)] = num; + var lower = HEAPU32[((ptr)>>2)]; + HEAPU32[(((ptr)+(4))>>2)] = (num - lower)/4294967296; + var deserialized = (num >= 0) ? readI53FromU64(ptr) : readI53FromI64(ptr); + var offset = ((ptr)>>2); + if (deserialized != num) warnOnce(`writeI53ToI64() out of range: serialized JS Number ${num} to Wasm heap as bytes lo=${ptrToString(HEAPU32[offset])}, hi=${ptrToString(HEAPU32[offset+1])}, which deserializes back to ${deserialized} instead!`); + }; + + + + + /** @type {!Float32Array} */ + var HEAPF32; + var emscriptenWebGLGet = (name_, p, type) => { + // Guard against user passing a null pointer. + // Note that GLES2 spec does not say anything about how passing a null + // pointer should be treated. Testing on desktop core GL 3, the application + // crashes on glGetIntegerv to a null pointer, but better to report an error + // instead of doing anything random. + if (!p) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var ret = undefined; + switch (name_) { // Handle a few trivial GLES values + case 0x8DFA: // GL_SHADER_COMPILER + ret = 1; + break; + case 0x8DF8: // GL_SHADER_BINARY_FORMATS + if (type != 0 && type != 1) { + GL.recordError(0x500); // GL_INVALID_ENUM + } + // Do not write anything to the out pointer, since no binary formats are + // supported. + return; + case 0x8DF9: // GL_NUM_SHADER_BINARY_FORMATS + ret = 0; + break; + case 0x86A2: // GL_NUM_COMPRESSED_TEXTURE_FORMATS + // WebGL doesn't have GL_NUM_COMPRESSED_TEXTURE_FORMATS (it's obsolete + // since GL_COMPRESSED_TEXTURE_FORMATS returns a JS array that can be + // queried for length), so implement it ourselves to allow C++ GLES2 + // code to get the length. + var formats = GLctx.getParameter(0x86A3 /*GL_COMPRESSED_TEXTURE_FORMATS*/); + ret = formats ? formats.length : 0; + break; + + } + + if (ret === undefined) { + var result = GLctx.getParameter(name_); + switch (typeof result) { + case 'number': + ret = result; + break; + case 'boolean': + ret = result ? 1 : 0; + break; + case 'string': + GL.recordError(0x500); // GL_INVALID_ENUM + return; + case 'object': + if (result === null) { + // null is a valid result for some (e.g., which buffer is bound - + // perhaps nothing is bound), but otherwise can mean an invalid + // name_, which we need to report as an error + switch (name_) { + case 0x8894: // ARRAY_BUFFER_BINDING + case 0x8B8D: // CURRENT_PROGRAM + case 0x8895: // ELEMENT_ARRAY_BUFFER_BINDING + case 0x8CA6: // FRAMEBUFFER_BINDING or DRAW_FRAMEBUFFER_BINDING + case 0x8CA7: // RENDERBUFFER_BINDING + case 0x8069: // TEXTURE_BINDING_2D + case 0x85B5: // WebGL 2 GL_VERTEX_ARRAY_BINDING, or WebGL 1 extension OES_vertex_array_object GL_VERTEX_ARRAY_BINDING_OES + case 0x8514: { // TEXTURE_BINDING_CUBE_MAP + ret = 0; + break; + } + default: { + GL.recordError(0x500); // GL_INVALID_ENUM + return; + } + } + } else if (result instanceof Float32Array || + result instanceof Uint32Array || + result instanceof Int32Array || + result instanceof Array) { + for (var i = 0; i < result.length; ++i) { + switch (type) { + case 0: HEAP32[(((p)+(i*4))>>2)] = result[i]; break; + case 2: HEAPF32[(((p)+(i*4))>>2)] = result[i]; break; + case 4: HEAP8[(p)+(i)] = result[i] ? 1 : 0; break; + } + } + return; + } else { + try { + ret = result.name | 0; + } catch(e) { + GL.recordError(0x500); // GL_INVALID_ENUM + err(`GL_INVALID_ENUM in glGet${type}v: Unknown object returned from WebGL getParameter(${name_})! (error: ${e})`); + return; + } + } + break; + default: + GL.recordError(0x500); // GL_INVALID_ENUM + err(`GL_INVALID_ENUM in glGet${type}v: Native code calling glGet${type}v(${name_}) and it returns ${result} of type ${typeof(result)}!`); + return; + } + } + + switch (type) { + case 1: writeI53ToI64(p, ret); break; + case 0: HEAP32[((p)>>2)] = ret; break; + case 2: HEAPF32[((p)>>2)] = ret; break; + case 4: HEAP8[p] = ret ? 1 : 0; break; + } + }; + + var _emscripten_glGetBooleanv = (name_, p) => emscriptenWebGLGet(name_, p, 4); + + + var _emscripten_glGetBufferParameteriv = (target, value, data) => { + if (!data) { + // GLES2 specification does not specify how to behave if data is a null + // pointer. Since calling this function does not make sense if data == + // null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((data)>>2)] = GLctx.getBufferParameter(target, value); + }; + + var _emscripten_glGetError = () => { + var error = GLctx.getError() || GL.lastError; + GL.lastError = 0/*GL_NO_ERROR*/; + return error; + }; + + + var _emscripten_glGetFloatv = (name_, p) => emscriptenWebGLGet(name_, p, 2); + + + var _emscripten_glGetFramebufferAttachmentParameteriv = (target, attachment, pname, params) => { + var result = GLctx.getFramebufferAttachmentParameter(target, attachment, pname); + if (result instanceof WebGLRenderbuffer || + result instanceof WebGLTexture) { + result = result.name | 0; + } + HEAP32[((params)>>2)] = result; + }; + + + var _emscripten_glGetIntegerv = (name_, p) => emscriptenWebGLGet(name_, p, 0); + + + var _emscripten_glGetProgramInfoLog = (program, maxLength, length, infoLog) => { + var log = GLctx.getProgramInfoLog(GL.programs[program]); + if (log === null) log = '(unknown error)'; + var numBytesWrittenExclNull = (maxLength > 0 && infoLog) ? stringToUTF8(log, infoLog, maxLength) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + }; + + + var _emscripten_glGetProgramiv = (program, pname, p) => { + if (!p) { + // GLES2 specification does not specify how to behave if p is a null + // pointer. Since calling this function does not make sense if p == null, + // issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + + if (program >= GL.counter) { + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + + program = GL.programs[program]; + + if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH + var log = GLctx.getProgramInfoLog(program); + if (log === null) log = '(unknown error)'; + HEAP32[((p)>>2)] = log.length + 1; + } else if (pname == 0x8B87 /* GL_ACTIVE_UNIFORM_MAX_LENGTH */) { + if (!program.maxUniformLength) { + var numActiveUniforms = GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/); + for (var i = 0; i < numActiveUniforms; ++i) { + program.maxUniformLength = Math.max(program.maxUniformLength, GLctx.getActiveUniform(program, i).name.length+1); + } + } + HEAP32[((p)>>2)] = program.maxUniformLength; + } else if (pname == 0x8B8A /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */) { + if (!program.maxAttributeLength) { + var numActiveAttributes = GLctx.getProgramParameter(program, 0x8B89/*GL_ACTIVE_ATTRIBUTES*/); + for (var i = 0; i < numActiveAttributes; ++i) { + program.maxAttributeLength = Math.max(program.maxAttributeLength, GLctx.getActiveAttrib(program, i).name.length+1); + } + } + HEAP32[((p)>>2)] = program.maxAttributeLength; + } else if (pname == 0x8A35 /* GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH */) { + if (!program.maxUniformBlockNameLength) { + var numActiveUniformBlocks = GLctx.getProgramParameter(program, 0x8A36/*GL_ACTIVE_UNIFORM_BLOCKS*/); + for (var i = 0; i < numActiveUniformBlocks; ++i) { + program.maxUniformBlockNameLength = Math.max(program.maxUniformBlockNameLength, GLctx.getActiveUniformBlockName(program, i).length+1); + } + } + HEAP32[((p)>>2)] = program.maxUniformBlockNameLength; + } else { + HEAP32[((p)>>2)] = GLctx.getProgramParameter(program, pname); + } + }; + + + var _emscripten_glGetQueryObjecti64vEXT = (id, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var query = GL.queries[id]; + var param; + { + param = GLctx.disjointTimerQueryExt['getQueryObjectEXT'](query, pname); + } + var ret; + if (typeof param == 'boolean') { + ret = param ? 1 : 0; + } else { + ret = param; + } + writeI53ToI64(params, ret); + }; + + + var _emscripten_glGetQueryObjectivEXT = (id, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var query = GL.queries[id]; + var param = GLctx.disjointTimerQueryExt['getQueryObjectEXT'](query, pname); + var ret; + if (typeof param == 'boolean') { + ret = param ? 1 : 0; + } else { + ret = param; + } + HEAP32[((params)>>2)] = ret; + }; + + + var _glGetQueryObjecti64vEXT = _emscripten_glGetQueryObjecti64vEXT; + var _emscripten_glGetQueryObjectui64vEXT = _glGetQueryObjecti64vEXT; + + + var _glGetQueryObjectivEXT = _emscripten_glGetQueryObjectivEXT; + var _emscripten_glGetQueryObjectuivEXT = _glGetQueryObjectivEXT; + + + var _emscripten_glGetQueryivEXT = (target, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if p == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.disjointTimerQueryExt['getQueryEXT'](target, pname); + }; + + + var _emscripten_glGetRenderbufferParameteriv = (target, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null pointer. Since calling this function does not make sense + // if params == null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.getRenderbufferParameter(target, pname); + }; + + + + var _emscripten_glGetShaderInfoLog = (shader, maxLength, length, infoLog) => { + var log = GLctx.getShaderInfoLog(GL.shaders[shader]); + if (log === null) log = '(unknown error)'; + var numBytesWrittenExclNull = (maxLength > 0 && infoLog) ? stringToUTF8(log, infoLog, maxLength) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + }; + + + var _emscripten_glGetShaderPrecisionFormat = (shaderType, precisionType, range, precision) => { + var result = GLctx.getShaderPrecisionFormat(shaderType, precisionType); + HEAP32[((range)>>2)] = result.rangeMin; + HEAP32[(((range)+(4))>>2)] = result.rangeMax; + HEAP32[((precision)>>2)] = result.precision; + }; + + + var _emscripten_glGetShaderSource = (shader, bufSize, length, source) => { + var result = GLctx.getShaderSource(GL.shaders[shader]); + if (!result) return; // If an error occurs, nothing will be written to length or source. + var numBytesWrittenExclNull = (bufSize > 0 && source) ? stringToUTF8(result, source, bufSize) : 0; + if (length) HEAP32[((length)>>2)] = numBytesWrittenExclNull; + }; + + + var _emscripten_glGetShaderiv = (shader, pname, p) => { + if (!p) { + // GLES2 specification does not specify how to behave if p is a null + // pointer. Since calling this function does not make sense if p == null, + // issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + if (pname == 0x8B84) { // GL_INFO_LOG_LENGTH + var log = GLctx.getShaderInfoLog(GL.shaders[shader]); + if (log === null) log = '(unknown error)'; + // The GLES2 specification says that if the shader has an empty info log, + // a value of 0 is returned. Otherwise the log has a null char appended. + // (An empty string is falsey, so we can just check that instead of + // looking at log.length.) + var logLength = log ? log.length + 1 : 0; + HEAP32[((p)>>2)] = logLength; + } else if (pname == 0x8B88) { // GL_SHADER_SOURCE_LENGTH + var source = GLctx.getShaderSource(GL.shaders[shader]); + // source may be a null, or the empty string, both of which are falsey + // values that we report a 0 length for. + var sourceLength = source ? source.length + 1 : 0; + HEAP32[((p)>>2)] = sourceLength; + } else { + HEAP32[((p)>>2)] = GLctx.getShaderParameter(GL.shaders[shader], pname); + } + }; + + + + var stringToNewUTF8 = (str) => { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) stringToUTF8(str, ret, size); + return ret; + }; + + + var webglGetExtensions = () => { + var exts = getEmscriptenSupportedExtensions(GLctx); + exts = exts.concat(exts.map((e) => 'GL_' + e)); + return exts; + }; + + var _emscripten_glGetString = (name_) => { + var ret = GL.stringCache[name_]; + if (!ret) { + switch (name_) { + case 0x1F03 /* GL_EXTENSIONS */: + ret = stringToNewUTF8(webglGetExtensions().join(' ')); + break; + case 0x1F00 /* GL_VENDOR */: + case 0x1F01 /* GL_RENDERER */: + case 0x9245 /* UNMASKED_VENDOR_WEBGL */: + case 0x9246 /* UNMASKED_RENDERER_WEBGL */: + var s = GLctx.getParameter(name_); + if (!s) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + } + ret = s ? stringToNewUTF8(s) : 0; + break; + + case 0x1F02 /* GL_VERSION */: + var webGLVersion = GLctx.getParameter(0x1F02 /*GL_VERSION*/); + // return GLES version string corresponding to the version of the WebGL context + var glVersion = `OpenGL ES 2.0 (${webGLVersion})`; + ret = stringToNewUTF8(glVersion); + break; + case 0x8B8C /* GL_SHADING_LANGUAGE_VERSION */: + var glslVersion = GLctx.getParameter(0x8B8C /*GL_SHADING_LANGUAGE_VERSION*/); + // extract the version number 'N.M' from the string 'WebGL GLSL ES N.M ...' + var ver_re = /^WebGL GLSL ES ([0-9]\.[0-9][0-9]?)(?:$| .*)/; + var ver_num = glslVersion.match(ver_re); + if (ver_num !== null) { + if (ver_num[1].length == 3) ver_num[1] = ver_num[1] + '0'; // ensure minor version has 2 digits + glslVersion = `OpenGL ES GLSL ES ${ver_num[1]} (${glslVersion})`; + } + ret = stringToNewUTF8(glslVersion); + break; + default: + GL.recordError(0x500/*GL_INVALID_ENUM*/); + // fall through + } + GL.stringCache[name_] = ret; + } + return ret; + }; + + + var _emscripten_glGetTexParameterfv = (target, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null + // pointer. Since calling this function does not make sense if p == null, + // issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAPF32[((params)>>2)] = GLctx.getTexParameter(target, pname); + }; + + + var _emscripten_glGetTexParameteriv = (target, pname, params) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null + // pointer. Since calling this function does not make sense if p == null, + // issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((params)>>2)] = GLctx.getTexParameter(target, pname); + }; + + /** @suppress {checkTypes} */ + var jstoi_q = (str) => parseInt(str); + + /** @noinline */ + var webglGetLeftBracePos = (name) => name.slice(-1) == ']' && name.lastIndexOf('['); + + var webglPrepareUniformLocationsBeforeFirstUse = (program) => { + var uniformLocsById = program.uniformLocsById, // Maps GLuint -> WebGLUniformLocation + uniformSizeAndIdsByName = program.uniformSizeAndIdsByName, // Maps name -> [uniform array length, GLuint] + i, j; + + // On the first time invocation of glGetUniformLocation on this shader program: + // initialize cache data structures and discover which uniforms are arrays. + if (!uniformLocsById) { + // maps GLint integer locations to WebGLUniformLocations + program.uniformLocsById = uniformLocsById = {}; + // maps integer locations back to uniform name strings, so that we can lazily fetch uniform array locations + program.uniformArrayNamesById = {}; + + var numActiveUniforms = GLctx.getProgramParameter(program, 0x8B86/*GL_ACTIVE_UNIFORMS*/); + for (i = 0; i < numActiveUniforms; ++i) { + var u = GLctx.getActiveUniform(program, i); + var nm = u.name; + var sz = u.size; + var lb = webglGetLeftBracePos(nm); + var arrayName = lb > 0 ? nm.slice(0, lb) : nm; + + // Assign a new location. + var id = program.uniformIdCounter; + program.uniformIdCounter += sz; + // Eagerly get the location of the uniformArray[0] base element. + // The remaining indices >0 will be left for lazy evaluation to + // improve performance. Those may never be needed to fetch, if the + // application fills arrays always in full starting from the first + // element of the array. + uniformSizeAndIdsByName[arrayName] = [sz, id]; + + // Store placeholder integers in place that highlight that these + // >0 index locations are array indices pending population. + for (j = 0; j < sz; ++j) { + uniformLocsById[id] = j; + program.uniformArrayNamesById[id++] = arrayName; + } + } + } + }; + + + + var _emscripten_glGetUniformLocation = (program, name) => { + + name = UTF8ToString(name); + + if (program = GL.programs[program]) { + webglPrepareUniformLocationsBeforeFirstUse(program); + var uniformLocsById = program.uniformLocsById; // Maps GLuint -> WebGLUniformLocation + var arrayIndex = 0; + var uniformBaseName = name; + + // Invariant: when populating integer IDs for uniform locations, we must + // maintain the precondition that arrays reside in contiguous addresses, + // i.e. for a 'vec4 colors[10];', colors[4] must be at location + // colors[0]+4. However, user might call glGetUniformLocation(program, + // "colors") for an array, so we cannot discover based on the user input + // arguments whether the uniform we are dealing with is an array. The only + // way to discover which uniforms are arrays is to enumerate over all the + // active uniforms in the program. + var leftBrace = webglGetLeftBracePos(name); + + // If user passed an array accessor "[index]", parse the array index off the accessor. + if (leftBrace > 0) { + arrayIndex = jstoi_q(name.slice(leftBrace + 1)) >>> 0; // "index]", coerce parseInt(']') with >>>0 to treat "foo[]" as "foo[0]" and foo[-1] as unsigned out-of-bounds. + uniformBaseName = name.slice(0, leftBrace); + } + + // Have we cached the location of this uniform before? + // A pair [array length, GLint of the uniform location] + var sizeAndId = program.uniformSizeAndIdsByName[uniformBaseName]; + + // If a uniform with this name exists, and if its index is within the + // array limits (if it's even an array), query the WebGLlocation, or + // return an existing cached location. + if (sizeAndId && arrayIndex < sizeAndId[0]) { + arrayIndex += sizeAndId[1]; // Add the base location of the uniform to the array index offset. + if ((uniformLocsById[arrayIndex] = uniformLocsById[arrayIndex] || GLctx.getUniformLocation(program, name))) { + return arrayIndex; + } + } + } + else { + // N.b. we are currently unable to distinguish between GL program IDs that + // never existed vs GL program IDs that have been deleted, so report + // GL_INVALID_VALUE in both cases. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + } + return -1; + }; + + + var webglGetProgramUniformLocation = (program, location) => { + + if (program) { + var webglLoc = program.uniformLocsById[location]; + // program.uniformLocsById[location] stores either an integer, or a + // WebGLUniformLocation. + // If an integer, we have not yet bound the location, so do it now. The + // integer value specifies the array index we should bind to. + if (typeof webglLoc == 'number') { + program.uniformLocsById[location] = webglLoc = GLctx.getUniformLocation(program, program.uniformArrayNamesById[location] + (webglLoc > 0 ? `[${webglLoc}]` : '')); + } + // Else an already cached WebGLUniformLocation, return it. + return webglLoc; + } else { + GL.recordError(0x502/*GL_INVALID_OPERATION*/); + } + }; + + + + + /** @suppress{checkTypes} */ + var emscriptenWebGLGetUniform = (program, location, params, type) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null + // pointer. Since calling this function does not make sense if params == + // null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + program = GL.programs[program]; + webglPrepareUniformLocationsBeforeFirstUse(program); + var data = GLctx.getUniform(program, webglGetProgramUniformLocation(program, location)); + if (typeof data == 'number' || typeof data == 'boolean') { + switch (type) { + case 0: HEAP32[((params)>>2)] = data; break; + case 2: HEAPF32[((params)>>2)] = data; break; + } + } else { + for (var i = 0; i < data.length; i++) { + switch (type) { + case 0: HEAP32[(((params)+(i*4))>>2)] = data[i]; break; + case 2: HEAPF32[(((params)+(i*4))>>2)] = data[i]; break; + } + } + } + }; + + var _emscripten_glGetUniformfv = (program, location, params) => { + emscriptenWebGLGetUniform(program, location, params, 2); + }; + + + var _emscripten_glGetUniformiv = (program, location, params) => { + emscriptenWebGLGetUniform(program, location, params, 0); + }; + + + var _emscripten_glGetVertexAttribPointerv = (index, pname, pointer) => { + if (!pointer) { + // GLES2 specification does not specify how to behave if pointer is a null + // pointer. Since calling this function does not make sense if pointer == + // null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + HEAP32[((pointer)>>2)] = GLctx.getVertexAttribOffset(index, pname); + }; + + + + /** @suppress{checkTypes} */ + var emscriptenWebGLGetVertexAttrib = (index, pname, params, type) => { + if (!params) { + // GLES2 specification does not specify how to behave if params is a null + // pointer. Since calling this function does not make sense if params == + // null, issue a GL error to notify user about it. + GL.recordError(0x501 /* GL_INVALID_VALUE */); + return; + } + var data = GLctx.getVertexAttrib(index, pname); + if (pname == 0x889F/*VERTEX_ATTRIB_ARRAY_BUFFER_BINDING*/) { + HEAP32[((params)>>2)] = data && data["name"]; + } else if (typeof data == 'number' || typeof data == 'boolean') { + switch (type) { + case 0: HEAP32[((params)>>2)] = data; break; + case 2: HEAPF32[((params)>>2)] = data; break; + case 5: HEAP32[((params)>>2)] = Math.fround(data); break; + } + } else { + for (var i = 0; i < data.length; i++) { + switch (type) { + case 0: HEAP32[(((params)+(i*4))>>2)] = data[i]; break; + case 2: HEAPF32[(((params)+(i*4))>>2)] = data[i]; break; + case 5: HEAP32[(((params)+(i*4))>>2)] = Math.fround(data[i]); break; + } + } + } + }; + + var _emscripten_glGetVertexAttribfv = (index, pname, params) => { + // N.B. This function may only be called if the vertex attribute was + // specified using the function glVertexAttrib*f(), otherwise the results + // are undefined. (GLES3 spec 6.1.12) + emscriptenWebGLGetVertexAttrib(index, pname, params, 2); + }; + + + var _emscripten_glGetVertexAttribiv = (index, pname, params) => { + // N.B. This function may only be called if the vertex attribute was + // specified using the function glVertexAttrib*f(), otherwise the results + // are undefined. (GLES3 spec 6.1.12) + emscriptenWebGLGetVertexAttrib(index, pname, params, 5); + }; + + var _emscripten_glHint = (x0, x1) => GLctx.hint(x0, x1); + + var _emscripten_glIsBuffer = (buffer) => { + var b = GL.buffers[buffer]; + if (!b) return 0; + return GLctx.isBuffer(b); + }; + + var _emscripten_glIsEnabled = (x0) => GLctx.isEnabled(x0); + + var _emscripten_glIsFramebuffer = (framebuffer) => { + var fb = GL.framebuffers[framebuffer]; + if (!fb) return 0; + return GLctx.isFramebuffer(fb); + }; + + var _emscripten_glIsProgram = (program) => { + program = GL.programs[program]; + if (!program) return 0; + return GLctx.isProgram(program); + }; + + var _emscripten_glIsQueryEXT = (id) => { + var query = GL.queries[id]; + if (!query) return 0; + return GLctx.disjointTimerQueryExt['isQueryEXT'](query); + }; + + var _emscripten_glIsRenderbuffer = (renderbuffer) => { + var rb = GL.renderbuffers[renderbuffer]; + if (!rb) return 0; + return GLctx.isRenderbuffer(rb); + }; + + var _emscripten_glIsShader = (shader) => { + var s = GL.shaders[shader]; + if (!s) return 0; + return GLctx.isShader(s); + }; + + var _emscripten_glIsTexture = (id) => { + var texture = GL.textures[id]; + if (!texture) return 0; + return GLctx.isTexture(texture); + }; + + + var _emscripten_glIsVertexArray = (array) => { + + var vao = GL.vaos[array]; + if (!vao) return 0; + return GLctx.isVertexArray(vao); + }; + var _glIsVertexArray = _emscripten_glIsVertexArray; + var _emscripten_glIsVertexArrayOES = _glIsVertexArray; + + var _emscripten_glLineWidth = (x0) => GLctx.lineWidth(x0); + + var _emscripten_glLinkProgram = (program) => { + program = GL.programs[program]; + GLctx.linkProgram(program); + // Invalidate earlier computed uniform->ID mappings, those have now become stale + program.uniformLocsById = 0; // Mark as null-like so that glGetUniformLocation() knows to populate this again. + program.uniformSizeAndIdsByName = {}; + + }; + + var _emscripten_glPixelStorei = (pname, param) => { + if (pname == 3317) { + GL.unpackAlignment = param; + } else if (pname == 3314) { + GL.unpackRowLength = param; + } + GLctx.pixelStorei(pname, param); + }; + + var _emscripten_glPolygonModeWEBGL = (face, mode) => { + GLctx.webglPolygonMode['polygonModeWEBGL'](face, mode); + }; + + var _emscripten_glPolygonOffset = (x0, x1) => GLctx.polygonOffset(x0, x1); + + var _emscripten_glPolygonOffsetClampEXT = (factor, units, clamp) => { + GLctx.extPolygonOffsetClamp['polygonOffsetClampEXT'](factor, units, clamp); + }; + + var _emscripten_glQueryCounterEXT = (id, target) => { + GLctx.disjointTimerQueryExt['queryCounterEXT'](GL.queries[id], target); + }; + + var computeUnpackAlignedImageSize = (width, height, sizePerPixel) => { + function roundedToNextMultipleOf(x, y) { + return (x + y - 1) & -y; + } + var plainRowSize = (GL.unpackRowLength || width) * sizePerPixel; + var alignedRowSize = roundedToNextMultipleOf(plainRowSize, GL.unpackAlignment); + return height * alignedRowSize; + }; + + var colorChannelsInGlTextureFormat = (format) => { + // Micro-optimizations for size: map format to size by subtracting smallest + // enum value (0x1902) from all values first. Also omit the most common + // size value (1) from the list, which is assumed by formats not on the + // list. + var colorChannels = { + // 0x1902 /* GL_DEPTH_COMPONENT */ - 0x1902: 1, + // 0x1906 /* GL_ALPHA */ - 0x1902: 1, + 5: 3, + 6: 4, + // 0x1909 /* GL_LUMINANCE */ - 0x1902: 1, + 8: 2, + 29502: 3, + 29504: 4, + }; + return colorChannels[format - 0x1902]||1; + }; + + + + /** @type {!Uint16Array} */ + var HEAPU16; + + + + var heapObjectForWebGLType = (type) => { + // Micro-optimization for size: Subtract lowest GL enum number (0x1400/* GL_BYTE */) from type to compare + // smaller values for the heap, for shorter generated code size. + // Also the type HEAPU16 is not tested for explicitly, but any unrecognized type will return out HEAPU16. + // (since most types are HEAPU16) + type -= 0x1400; + + if (type == 1) return HEAPU8; + + if (type == 4) return HEAP32; + + if (type == 6) return HEAPF32; + + if (type == 5 + || type == 28922 + ) + return HEAPU32; + + return HEAPU16; + }; + + var toTypedArrayIndex = (pointer, heap) => + pointer >>> (31 - Math.clz32(heap.BYTES_PER_ELEMENT)); + + var emscriptenWebGLGetTexPixelData = (type, format, width, height, pixels) => { + var heap = heapObjectForWebGLType(type); + var sizePerPixel = colorChannelsInGlTextureFormat(format) * heap.BYTES_PER_ELEMENT; + var bytes = computeUnpackAlignedImageSize(width, height, sizePerPixel); + return heap.subarray(toTypedArrayIndex(pixels, heap), toTypedArrayIndex(pixels + bytes, heap)); + }; + + var _emscripten_glReadPixels = (x, y, width, height, format, type, pixels) => { + var pixelData = emscriptenWebGLGetTexPixelData(type, format, width, height, pixels); + if (!pixelData) { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + return; + } + GLctx.readPixels(x, y, width, height, format, type, pixelData); + }; + + var _emscripten_glReleaseShaderCompiler = () => { + // NOP (as allowed by GLES 2.0 spec) + }; + + var _emscripten_glRenderbufferStorage = (x0, x1, x2, x3) => GLctx.renderbufferStorage(x0, x1, x2, x3); + + var _emscripten_glSampleCoverage = (value, invert) => { + GLctx.sampleCoverage(value, !!invert); + }; + + var _emscripten_glScissor = (x0, x1, x2, x3) => GLctx.scissor(x0, x1, x2, x3); + + var _emscripten_glShaderBinary = (count, shaders, binaryformat, binary, length) => { + GL.recordError(0x500/*GL_INVALID_ENUM*/); + }; + + var _emscripten_glShaderSource = (shader, count, string, length) => { + var source = GL.getSource(shader, count, string, length); + + GLctx.shaderSource(GL.shaders[shader], source); + }; + + var _emscripten_glStencilFunc = (x0, x1, x2) => GLctx.stencilFunc(x0, x1, x2); + + var _emscripten_glStencilFuncSeparate = (x0, x1, x2, x3) => GLctx.stencilFuncSeparate(x0, x1, x2, x3); + + var _emscripten_glStencilMask = (x0) => GLctx.stencilMask(x0); + + var _emscripten_glStencilMaskSeparate = (x0, x1) => GLctx.stencilMaskSeparate(x0, x1); + + var _emscripten_glStencilOp = (x0, x1, x2) => GLctx.stencilOp(x0, x1, x2); + + var _emscripten_glStencilOpSeparate = (x0, x1, x2, x3) => GLctx.stencilOpSeparate(x0, x1, x2, x3); + + + var _emscripten_glTexImage2D = (target, level, internalFormat, width, height, border, format, type, pixels) => { + var pixelData = pixels ? emscriptenWebGLGetTexPixelData(type, format, width, height, pixels) : null; + GLctx.texImage2D(target, level, internalFormat, width, height, border, format, type, pixelData); + }; + + var _emscripten_glTexParameterf = (x0, x1, x2) => GLctx.texParameterf(x0, x1, x2); + + + var _emscripten_glTexParameterfv = (target, pname, params) => { + var param = HEAPF32[((params)>>2)]; + GLctx.texParameterf(target, pname, param); + }; + + var _emscripten_glTexParameteri = (x0, x1, x2) => GLctx.texParameteri(x0, x1, x2); + + + var _emscripten_glTexParameteriv = (target, pname, params) => { + var param = HEAP32[((params)>>2)]; + GLctx.texParameteri(target, pname, param); + }; + + + var _emscripten_glTexSubImage2D = (target, level, xoffset, yoffset, width, height, format, type, pixels) => { + var pixelData = pixels ? emscriptenWebGLGetTexPixelData(type, format, width, height, pixels) : null; + GLctx.texSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixelData); + }; + + + var webglGetUniformLocation = (location) => { + + return webglGetProgramUniformLocation(GLctx.currentProgram, location); + }; + + var _emscripten_glUniform1f = (location, v0) => { + GLctx.uniform1f(webglGetUniformLocation(location), v0); + }; + + + var miniTempWebGLFloatBuffers = []; + + + var _emscripten_glUniform1fv = (location, count, value) => { + + if (count <= 288) { + // avoid allocation when uploading few enough uniforms + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; ++i) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*4)>>2)); + } + GLctx.uniform1fv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform1i = (location, v0) => { + GLctx.uniform1i(webglGetUniformLocation(location), v0); + }; + + + var miniTempWebGLIntBuffers = []; + + + var _emscripten_glUniform1iv = (location, count, value) => { + + if (count <= 288) { + // avoid allocation when uploading few enough uniforms + var view = miniTempWebGLIntBuffers[count]; + for (var i = 0; i < count; ++i) { + view[i] = HEAP32[(((value)+(4*i))>>2)]; + } + } else + { + var view = HEAP32.subarray((((value)>>2)), ((value+count*4)>>2)); + } + GLctx.uniform1iv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform2f = (location, v0, v1) => { + GLctx.uniform2f(webglGetUniformLocation(location), v0, v1); + }; + + + + + var _emscripten_glUniform2fv = (location, count, value) => { + + if (count <= 144) { + // avoid allocation when uploading few enough uniforms + count *= 2; + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; i += 2) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*8)>>2)); + } + GLctx.uniform2fv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform2i = (location, v0, v1) => { + GLctx.uniform2i(webglGetUniformLocation(location), v0, v1); + }; + + + + + var _emscripten_glUniform2iv = (location, count, value) => { + + if (count <= 144) { + // avoid allocation when uploading few enough uniforms + count *= 2; + var view = miniTempWebGLIntBuffers[count]; + for (var i = 0; i < count; i += 2) { + view[i] = HEAP32[(((value)+(4*i))>>2)]; + view[i+1] = HEAP32[(((value)+(4*i+4))>>2)]; + } + } else + { + var view = HEAP32.subarray((((value)>>2)), ((value+count*8)>>2)); + } + GLctx.uniform2iv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform3f = (location, v0, v1, v2) => { + GLctx.uniform3f(webglGetUniformLocation(location), v0, v1, v2); + }; + + + + + var _emscripten_glUniform3fv = (location, count, value) => { + + if (count <= 96) { + // avoid allocation when uploading few enough uniforms + count *= 3; + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; i += 3) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*12)>>2)); + } + GLctx.uniform3fv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform3i = (location, v0, v1, v2) => { + GLctx.uniform3i(webglGetUniformLocation(location), v0, v1, v2); + }; + + + + + var _emscripten_glUniform3iv = (location, count, value) => { + + if (count <= 96) { + // avoid allocation when uploading few enough uniforms + count *= 3; + var view = miniTempWebGLIntBuffers[count]; + for (var i = 0; i < count; i += 3) { + view[i] = HEAP32[(((value)+(4*i))>>2)]; + view[i+1] = HEAP32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAP32[(((value)+(4*i+8))>>2)]; + } + } else + { + var view = HEAP32.subarray((((value)>>2)), ((value+count*12)>>2)); + } + GLctx.uniform3iv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform4f = (location, v0, v1, v2, v3) => { + GLctx.uniform4f(webglGetUniformLocation(location), v0, v1, v2, v3); + }; + + + + + var _emscripten_glUniform4fv = (location, count, value) => { + + if (count <= 72) { + // avoid allocation when uploading few enough uniforms + var view = miniTempWebGLFloatBuffers[4*count]; + // hoist the heap out of the loop for size and for pthreads+growth. + var heap = HEAPF32; + value = ((value)>>2); + count *= 4; + for (var i = 0; i < count; i += 4) { + var dst = value + i; + view[i] = heap[dst]; + view[i + 1] = heap[dst + 1]; + view[i + 2] = heap[dst + 2]; + view[i + 3] = heap[dst + 3]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*16)>>2)); + } + GLctx.uniform4fv(webglGetUniformLocation(location), view); + }; + + + var _emscripten_glUniform4i = (location, v0, v1, v2, v3) => { + GLctx.uniform4i(webglGetUniformLocation(location), v0, v1, v2, v3); + }; + + + + + var _emscripten_glUniform4iv = (location, count, value) => { + + if (count <= 72) { + // avoid allocation when uploading few enough uniforms + count *= 4; + var view = miniTempWebGLIntBuffers[count]; + for (var i = 0; i < count; i += 4) { + view[i] = HEAP32[(((value)+(4*i))>>2)]; + view[i+1] = HEAP32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAP32[(((value)+(4*i+8))>>2)]; + view[i+3] = HEAP32[(((value)+(4*i+12))>>2)]; + } + } else + { + var view = HEAP32.subarray((((value)>>2)), ((value+count*16)>>2)); + } + GLctx.uniform4iv(webglGetUniformLocation(location), view); + }; + + + + + var _emscripten_glUniformMatrix2fv = (location, count, transpose, value) => { + + if (count <= 72) { + // avoid allocation when uploading few enough uniforms + count *= 4; + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; i += 4) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; + view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*16)>>2)); + } + GLctx.uniformMatrix2fv(webglGetUniformLocation(location), !!transpose, view); + }; + + + + + var _emscripten_glUniformMatrix3fv = (location, count, transpose, value) => { + + if (count <= 32) { + // avoid allocation when uploading few enough uniforms + count *= 9; + var view = miniTempWebGLFloatBuffers[count]; + for (var i = 0; i < count; i += 9) { + view[i] = HEAPF32[(((value)+(4*i))>>2)]; + view[i+1] = HEAPF32[(((value)+(4*i+4))>>2)]; + view[i+2] = HEAPF32[(((value)+(4*i+8))>>2)]; + view[i+3] = HEAPF32[(((value)+(4*i+12))>>2)]; + view[i+4] = HEAPF32[(((value)+(4*i+16))>>2)]; + view[i+5] = HEAPF32[(((value)+(4*i+20))>>2)]; + view[i+6] = HEAPF32[(((value)+(4*i+24))>>2)]; + view[i+7] = HEAPF32[(((value)+(4*i+28))>>2)]; + view[i+8] = HEAPF32[(((value)+(4*i+32))>>2)]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*36)>>2)); + } + GLctx.uniformMatrix3fv(webglGetUniformLocation(location), !!transpose, view); + }; + + + + + var _emscripten_glUniformMatrix4fv = (location, count, transpose, value) => { + + if (count <= 18) { + // avoid allocation when uploading few enough uniforms + var view = miniTempWebGLFloatBuffers[16*count]; + // hoist the heap out of the loop for size and for pthreads+growth. + var heap = HEAPF32; + value = ((value)>>2); + count *= 16; + for (var i = 0; i < count; i += 16) { + var dst = value + i; + view[i] = heap[dst]; + view[i + 1] = heap[dst + 1]; + view[i + 2] = heap[dst + 2]; + view[i + 3] = heap[dst + 3]; + view[i + 4] = heap[dst + 4]; + view[i + 5] = heap[dst + 5]; + view[i + 6] = heap[dst + 6]; + view[i + 7] = heap[dst + 7]; + view[i + 8] = heap[dst + 8]; + view[i + 9] = heap[dst + 9]; + view[i + 10] = heap[dst + 10]; + view[i + 11] = heap[dst + 11]; + view[i + 12] = heap[dst + 12]; + view[i + 13] = heap[dst + 13]; + view[i + 14] = heap[dst + 14]; + view[i + 15] = heap[dst + 15]; + } + } else + { + var view = HEAPF32.subarray((((value)>>2)), ((value+count*64)>>2)); + } + GLctx.uniformMatrix4fv(webglGetUniformLocation(location), !!transpose, view); + }; + + var _emscripten_glUseProgram = (program) => { + program = GL.programs[program]; + GLctx.useProgram(program); + // Record the currently active program so that we can access the uniform + // mapping table of that program. + GLctx.currentProgram = program; + }; + + var _emscripten_glValidateProgram = (program) => { + GLctx.validateProgram(GL.programs[program]); + }; + + var _emscripten_glVertexAttrib1f = (x0, x1) => GLctx.vertexAttrib1f(x0, x1); + + + var _emscripten_glVertexAttrib1fv = (index, v) => { + + GLctx.vertexAttrib1f(index, HEAPF32[v>>2]); + }; + + var _emscripten_glVertexAttrib2f = (x0, x1, x2) => GLctx.vertexAttrib2f(x0, x1, x2); + + + var _emscripten_glVertexAttrib2fv = (index, v) => { + + GLctx.vertexAttrib2f(index, HEAPF32[v>>2], HEAPF32[v+4>>2]); + }; + + var _emscripten_glVertexAttrib3f = (x0, x1, x2, x3) => GLctx.vertexAttrib3f(x0, x1, x2, x3); + + + var _emscripten_glVertexAttrib3fv = (index, v) => { + + GLctx.vertexAttrib3f(index, HEAPF32[v>>2], HEAPF32[v+4>>2], HEAPF32[v+8>>2]); + }; + + var _emscripten_glVertexAttrib4f = (x0, x1, x2, x3, x4) => GLctx.vertexAttrib4f(x0, x1, x2, x3, x4); + + + var _emscripten_glVertexAttrib4fv = (index, v) => { + + GLctx.vertexAttrib4f(index, HEAPF32[v>>2], HEAPF32[v+4>>2], HEAPF32[v+8>>2], HEAPF32[v+12>>2]); + }; + + + var _emscripten_glVertexAttribDivisor = (index, divisor) => { + GLctx.vertexAttribDivisor(index, divisor); + }; + var _glVertexAttribDivisor = _emscripten_glVertexAttribDivisor; + var _emscripten_glVertexAttribDivisorANGLE = _glVertexAttribDivisor; + + var _emscripten_glVertexAttribPointer = (index, size, type, normalized, stride, ptr) => { + GLctx.vertexAttribPointer(index, size, type, !!normalized, stride, ptr); + }; + + var _emscripten_glViewport = (x0, x1, x2, x3) => GLctx.viewport(x0, x1, x2, x3); + + var abortOnCannotGrowMemory = (requestedSize) => { + abort(`Cannot enlarge memory arrays to size ${requestedSize} bytes (OOM). Either (1) compile with -sINITIAL_MEMORY=X with X higher than the current value ${HEAP8.length}, (2) compile with -sALLOW_MEMORY_GROWTH which allows increasing the size at runtime, or (3) if you want malloc to return NULL (0) instead of this abort, compile with -sABORTING_MALLOC=0`); + }; + + var _emscripten_resize_heap = (requestedSize) => { + var oldSize = HEAPU8.length; + // With CAN_ADDRESS_2GB or MEMORY64, pointers are already unsigned. + requestedSize >>>= 0; + abortOnCannotGrowMemory(requestedSize); + }; + + /** @suppress {checkTypes} */ + var _emscripten_sample_gamepad_data = () => { + try { + if (navigator.getGamepads) return (JSEvents.lastGamepadState = navigator.getGamepads()) + ? 0 : -1; + } catch(e) { + err(`navigator.getGamepads() exists, but failed to execute with exception ${e}. Disabling Gamepad access.`); + navigator.getGamepads = null; // Disable getGamepads() so that it won't be attempted to be used again. + } + return -1; + }; + + + + + var registerFocusEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 256; + JSEvents.focusEvent ||= _malloc(eventSize); + + var focusEventHandlerFunc = (e) => { + var nodeName = JSEvents.getNodeNameForTarget(e.target); + var id = e.target.id ?? ''; + + var focusEvent = JSEvents.focusEvent; + stringToUTF8(nodeName, focusEvent + 0, 128); + stringToUTF8(id, focusEvent + 128, 128); + + if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, focusEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: findEventTarget(target), + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: focusEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + var _emscripten_set_blur_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerFocusEventCallback(target, userData, useCapture, callbackfunc, 12, 'blur', targetThread); + + var findCanvasEventTarget = findEventTarget; + var _emscripten_set_canvas_element_size = (target, width, height) => { + var canvas = findCanvasEventTarget(target); + if (!canvas) return -4; + canvas.width = width; + canvas.height = height; + return 0; + }; + + + + + + + var fillMouseEventData = (eventStruct, e, target) => { + assert(eventStruct % 4 == 0); + HEAPF64[((eventStruct)>>3)] = e.timeStamp; + var idx = ((eventStruct)>>2); + HEAP32[idx + 2] = e.screenX; + HEAP32[idx + 3] = e.screenY; + HEAP32[idx + 4] = e.clientX; + HEAP32[idx + 5] = e.clientY; + HEAP8[eventStruct + 24] = e.ctrlKey; + HEAP8[eventStruct + 25] = e.shiftKey; + HEAP8[eventStruct + 26] = e.altKey; + HEAP8[eventStruct + 27] = e.metaKey; + HEAP16[idx*2 + 14] = e.button; + HEAP16[idx*2 + 15] = e.buttons; + HEAP32[idx + 8] = e.movementX; + HEAP32[idx + 9] = e.movementY; + + // Note: rect contains doubles (truncated to placate SAFE_HEAP, which is the same behaviour when writing to HEAP32 anyway) + var rect = getBoundingClientRect(target); + HEAP32[idx + 10] = e.clientX - (rect.left | 0); + HEAP32[idx + 11] = e.clientY - (rect.top | 0); + }; + + + var registerMouseEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 64; + JSEvents.mouseEvent ||= _malloc(eventSize); + target = findEventTarget(target); + + var mouseEventHandlerFunc = (e) => { + // TODO: Make this access thread safe, or this could update live while app is reading it. + fillMouseEventData(JSEvents.mouseEvent, e, target); + + if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, JSEvents.mouseEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + allowsDeferredCalls: eventTypeString != 'mousemove' && eventTypeString != 'mouseenter' && eventTypeString != 'mouseleave', // Mouse move events do not allow fullscreen/pointer lock requests to be handled in them! + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: mouseEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + var _emscripten_set_click_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerMouseEventCallback(target, userData, useCapture, callbackfunc, 4, 'click', targetThread); + + var _emscripten_set_focus_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerFocusEventCallback(target, userData, useCapture, callbackfunc, 13, 'focus', targetThread); + + + + + + function getFullscreenElement() { + return document.fullscreenElement + ?? document.webkitFullscreenElement + ; + } + + + var fillFullscreenChangeEventData = (eventStruct) => { + var fullscreenElement = getFullscreenElement(); + var isFullscreen = !!fullscreenElement; + // Assigning a boolean to HEAP32 with expected type coercion. + /** @suppress{checkTypes} */ + HEAP8[eventStruct] = isFullscreen; + HEAP8[(eventStruct)+(1)] = JSEvents.fullscreenEnabled(); + // If transitioning to fullscreen, report info about the element that is now fullscreen. + // If transitioning to windowed mode, report info about the element that just was fullscreen. + var reportedElement = isFullscreen ? fullscreenElement : JSEvents.previousFullscreenElement; + var nodeName = JSEvents.getNodeNameForTarget(reportedElement); + var id = reportedElement?.id ?? ''; + stringToUTF8(nodeName, eventStruct + 2, 128); + stringToUTF8(id, eventStruct + 130, 128); + HEAP32[(((eventStruct)+(260))>>2)] = reportedElement?.clientWidth ?? 0; + HEAP32[(((eventStruct)+(264))>>2)] = reportedElement?.clientHeight ?? 0; + HEAP32[(((eventStruct)+(268))>>2)] = screen.width; + HEAP32[(((eventStruct)+(272))>>2)] = screen.height; + if (isFullscreen) { + JSEvents.previousFullscreenElement = fullscreenElement; + } + }; + + var registerFullscreenChangeEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 276; + JSEvents.fullscreenChangeEvent ||= _malloc(eventSize); + + var fullscreenChangeEventHandlerFunc = (e) => { + var fullscreenChangeEvent = JSEvents.fullscreenChangeEvent; + fillFullscreenChangeEventData(fullscreenChangeEvent); + + if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, fullscreenChangeEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: fullscreenChangeEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + + var _emscripten_set_fullscreenchange_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => { + if (!JSEvents.fullscreenEnabled()) return -1; + target = findEventTarget(target); + if (!target) return -4; + + // TODO: When this block is removed, also change test/test_html5_remove_event_listener.c test expectation on emscripten_set_fullscreenchange_callback(). + registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, 'webkitfullscreenchange', targetThread); + + return registerFullscreenChangeEventCallback(target, userData, useCapture, callbackfunc, 19, 'fullscreenchange', targetThread); + }; + + + + + var registerGamepadEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 1240; + JSEvents.gamepadEvent ||= _malloc(eventSize); + + var gamepadEventHandlerFunc = (e) => { + var gamepadEvent = JSEvents.gamepadEvent; + fillGamepadEventData(gamepadEvent, e['gamepad']); + + if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, gamepadEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target: findEventTarget(target), + allowsDeferredCalls: true, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: gamepadEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + + var _emscripten_set_gamepadconnected_callback_on_thread = (userData, useCapture, callbackfunc, targetThread) => { + if (_emscripten_sample_gamepad_data()) return -1; + return registerGamepadEventCallback(2, userData, useCapture, callbackfunc, 26, 'gamepadconnected', targetThread); + }; + + + var _emscripten_set_gamepaddisconnected_callback_on_thread = (userData, useCapture, callbackfunc, targetThread) => { + if (_emscripten_sample_gamepad_data()) return -1; + return registerGamepadEventCallback(2, userData, useCapture, callbackfunc, 27, 'gamepaddisconnected', targetThread); + }; + + var _emscripten_set_mousemove_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerMouseEventCallback(target, userData, useCapture, callbackfunc, 8, 'mousemove', targetThread); + + + + + + var fillPointerlockChangeEventData = (eventStruct) => { + var pointerLockElement = document.pointerLockElement; + var isPointerlocked = !!pointerLockElement; + // Assigning a boolean to HEAP32 with expected type coercion. + /** @suppress{checkTypes} */ + HEAP8[eventStruct] = isPointerlocked; + var nodeName = JSEvents.getNodeNameForTarget(pointerLockElement); + var id = pointerLockElement?.id ?? ''; + stringToUTF8(nodeName, eventStruct + 1, 128); + stringToUTF8(id, eventStruct + 129, 128); + }; + + var registerPointerlockChangeEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 257; + JSEvents.pointerlockChangeEvent ||= _malloc(eventSize); + + var pointerlockChangeEventHandlerFunc = (e) => { + var pointerlockChangeEvent = JSEvents.pointerlockChangeEvent; + fillPointerlockChangeEventData(pointerlockChangeEvent); + + if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, pointerlockChangeEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: pointerlockChangeEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + + var _emscripten_set_pointerlockchange_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => { + if (!document.body?.requestPointerLock) { + return -1; + } + + target = findEventTarget(target); + if (!target) return -4; + return registerPointerlockChangeEventCallback(target, userData, useCapture, callbackfunc, 20, 'pointerlockchange', targetThread); + }; + + + + + var registerUiEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 36; + JSEvents.uiEvent ||= _malloc(eventSize); + + target = findEventTarget(target); + + var uiEventHandlerFunc = (e) => { + if (e.target != target) { + // Never take ui events such as scroll via a 'bubbled' route, but always from the direct element that + // was targeted. Otherwise e.g. if app logs a message in response to a page scroll, the Emscripten log + // message box could cause to scroll, generating a new (bubbled) scroll message, causing a new log print, + // causing a new scroll, etc.. + return; + } + var b = document.body; // Take document.body to a variable, Closure compiler does not outline access to it on its own. + if (!b) { + // During a page unload 'body' can be null, with "Cannot read property 'clientWidth' of null" being thrown + return; + } + var uiEvent = JSEvents.uiEvent; + HEAP32[((uiEvent)>>2)] = 0; // always zero for resize and scroll + HEAP32[(((uiEvent)+(4))>>2)] = b.clientWidth; + HEAP32[(((uiEvent)+(8))>>2)] = b.clientHeight; + HEAP32[(((uiEvent)+(12))>>2)] = innerWidth; + HEAP32[(((uiEvent)+(16))>>2)] = innerHeight; + HEAP32[(((uiEvent)+(20))>>2)] = outerWidth; + HEAP32[(((uiEvent)+(24))>>2)] = outerHeight; + HEAP32[(((uiEvent)+(28))>>2)] = pageXOffset | 0; // scroll offsets are float + HEAP32[(((uiEvent)+(32))>>2)] = pageYOffset | 0; + if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, uiEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: uiEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + var _emscripten_set_resize_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerUiEventCallback(target, userData, useCapture, callbackfunc, 10, 'resize', targetThread); + + + + + + + + var registerTouchEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 1552; + JSEvents.touchEvent ||= _malloc(eventSize); + + target = findEventTarget(target); + + var touchEventHandlerFunc = (e) => { + assert(e); + var t, touches = {}, et = e.touches; + // To ease marshalling different kinds of touches that browser reports (all touches are listed in e.touches, + // only changed touches in e.changedTouches, and touches on target at a.targetTouches), mark a boolean in + // each Touch object so that we can later loop only once over all touches we see to marshall over to Wasm. + + for (let t of et) { + // Browser might recycle the generated Touch objects between each frame (Firefox on Android), so reset any + // changed/target states we may have set from previous frame. + t.isChanged = t.onTarget = 0; + touches[t.identifier] = t; + } + // Mark which touches are part of the changedTouches list. + for (let t of e.changedTouches) { + t.isChanged = 1; + touches[t.identifier] = t; + } + // Mark which touches are part of the targetTouches list. + for (let t of e.targetTouches) { + touches[t.identifier].onTarget = 1; + } + + var touchEvent = JSEvents.touchEvent; + HEAPF64[((touchEvent)>>3)] = e.timeStamp; + HEAP8[touchEvent + 12] = e.ctrlKey; + HEAP8[touchEvent + 13] = e.shiftKey; + HEAP8[touchEvent + 14] = e.altKey; + HEAP8[touchEvent + 15] = e.metaKey; + var idx = touchEvent + 16; + var targetRect = getBoundingClientRect(target); + var numTouches = 0; + for (let t of Object.values(touches)) { + var idx32 = ((idx)>>2); // Pre-shift the ptr to index to HEAP32 to save code size + HEAP32[idx32 + 0] = t.identifier; + HEAP32[idx32 + 1] = t.screenX; + HEAP32[idx32 + 2] = t.screenY; + HEAP32[idx32 + 3] = t.clientX; + HEAP32[idx32 + 4] = t.clientY; + HEAP32[idx32 + 5] = t.pageX; + HEAP32[idx32 + 6] = t.pageY; + HEAP8[idx + 28] = t.isChanged; + HEAP8[idx + 29] = t.onTarget; + HEAP32[idx32 + 8] = t.clientX - (targetRect.left | 0); + HEAP32[idx32 + 9] = t.clientY - (targetRect.top | 0); + + idx += 48; + + if (++numTouches > 31) { + break; + } + } + HEAP32[(((touchEvent)+(8))>>2)] = numTouches; + + if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, touchEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + allowsDeferredCalls: eventTypeString == 'touchstart' || eventTypeString == 'touchend', + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: touchEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + var _emscripten_set_touchcancel_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerTouchEventCallback(target, userData, useCapture, callbackfunc, 25, 'touchcancel', targetThread); + + var _emscripten_set_touchend_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerTouchEventCallback(target, userData, useCapture, callbackfunc, 23, 'touchend', targetThread); + + var _emscripten_set_touchmove_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerTouchEventCallback(target, userData, useCapture, callbackfunc, 24, 'touchmove', targetThread); + + var _emscripten_set_touchstart_callback_on_thread = (target, userData, useCapture, callbackfunc, targetThread) => + registerTouchEventCallback(target, userData, useCapture, callbackfunc, 22, 'touchstart', targetThread); + + + + var fillVisibilityChangeEventData = (eventStruct) => { + var visibilityStates = [ 'hidden', 'visible', 'prerender', 'unloaded' ]; + var visibilityState = visibilityStates.indexOf(document.visibilityState); + + // Assigning a boolean to HEAP32 with expected type coercion. + /** @suppress{checkTypes} */ + HEAP8[eventStruct] = document.hidden; + HEAP32[(((eventStruct)+(4))>>2)] = visibilityState; + }; + + var registerVisibilityChangeEventCallback = (target, userData, useCapture, callbackfunc, eventTypeId, eventTypeString, targetThread) => { + var eventSize = 8; + JSEvents.visibilityChangeEvent ||= _malloc(eventSize); + + var visibilityChangeEventHandlerFunc = (e) => { + var visibilityChangeEvent = JSEvents.visibilityChangeEvent; + fillVisibilityChangeEventData(visibilityChangeEvent); + + if (((a1, a2, a3) => dynCall_iiii(callbackfunc, a1, a2, a3))(eventTypeId, visibilityChangeEvent, userData)) e.preventDefault(); + }; + + var eventHandler = { + target, + eventTypeString, + eventTypeId, + userData, + callbackfunc, + handlerFunc: visibilityChangeEventHandlerFunc, + useCapture + }; + return JSEvents.registerOrRemoveHandler(eventHandler); + }; + + var _emscripten_set_visibilitychange_callback_on_thread = (userData, useCapture, callbackfunc, targetThread) => { + if (!specialHTMLTargets[1]) { + return -4; + } + return registerVisibilityChangeEventCallback(specialHTMLTargets[1], userData, useCapture, callbackfunc, 21, 'visibilitychange', targetThread); + }; + + var handleException = (e) => { + // Certain exception types we do not treat as errors since they are used for + // internal control flow. + // 1. ExitStatus, which is thrown by exit() + // 2. "unwind", which is thrown by emscripten_unwind_to_js_event_loop() and others + // that wish to return to JS event loop. + if (e instanceof ExitStatus || e == 'unwind') { + return EXITSTATUS; + } + checkStackCookie(); + if (e instanceof WebAssembly.RuntimeError) { + if (_emscripten_stack_get_current() <= 0) { + err('Stack overflow detected. You can try increasing -sSTACK_SIZE (currently set to 65536)'); + } + } + quit_(1, e); + }; + + + var runtimeKeepaliveCounter = 0; + var keepRuntimeAlive = () => noExitRuntime || runtimeKeepaliveCounter > 0; + var _proc_exit = (code) => { + EXITSTATUS = code; + if (!keepRuntimeAlive()) { + Module['onExit']?.(code); + ABORT = true; + } + quit_(code, new ExitStatus(code)); + }; + + + /** @param {boolean|number=} implicit */ + var exitJS = (status, implicit) => { + EXITSTATUS = status; + + checkUnflushedContent(); + + // if exit() was called explicitly, warn the user if the runtime isn't actually being shut down + if (keepRuntimeAlive() && !implicit) { + var msg = `program exited (with status: ${status}), but keepRuntimeAlive() is set (counter=${runtimeKeepaliveCounter}) due to an async operation, so halting execution but not exiting the runtime or preventing further async execution (you can use emscripten_force_exit, if you want to force a true shutdown)`; + err(msg); + } + + _proc_exit(status); + }; + var _exit = exitJS; + + + var maybeExit = () => { + if (!keepRuntimeAlive()) { + try { + _exit(EXITSTATUS); + } catch (e) { + handleException(e); + } + } + }; + var callUserCallback = (func) => { + if (ABORT) { + err('user callback triggered after runtime exited or application aborted. Ignoring.'); + return; + } + try { + return func(); + } catch (e) { + handleException(e); + } finally { + maybeExit(); + } + }; + + + /** @param {number=} timeout */ + var safeSetTimeout = (func, timeout) => { + + return setTimeout(() => { + + callUserCallback(func); + }, timeout); + }; + + + + + + var Browser = { + useWebGL:false, + isFullscreen:false, + pointerLock:false, + moduleContextCreatedCallbacks:[], + preloadedImages:{ + }, + preloadedAudios:{ + }, + getCanvas:() => Module['canvas'], + init() { + if (Browser.initted) return; + Browser.initted = true; + + // Support for plugins that can process preloaded files. You can add more of these to + // your app by creating and appending to preloadPlugins. + // + // Each plugin is asked if it can handle a file based on the file's name. If it can, + // it is given the file's raw data. When it is done, it calls a callback with the file's + // (possibly modified) data. For example, a plugin might decompress a file, or it + // might create some side data structure for use later (like an Image element, etc.). + + var imagePlugin = {}; + imagePlugin['canHandle'] = (name) => { + return !Module['noImageDecoding'] && /\.(jpg|jpeg|png|bmp|webp)$/i.test(name); + }; + imagePlugin['handle'] = async (byteArray, name) => { + var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); + if (b.size !== byteArray.length) { // Safari bug #118630 + // Safari's Blob can only take an ArrayBuffer + b = new Blob([(new Uint8Array(byteArray)).buffer], { type: Browser.getMimetype(name) }); + } + var url = URL.createObjectURL(b); + return new Promise((resolve, reject) => { + var img = new Image(); + img.onload = () => { + assert(img.complete, `Image ${name} could not be decoded`); + var canvas = /** @type {!HTMLCanvasElement} */ (document.createElement('canvas')); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext('2d'); + ctx.drawImage(img, 0, 0); + Browser.preloadedImages[name] = canvas; + URL.revokeObjectURL(url); + resolve(byteArray); + }; + img.onerror = (event) => { + err(`Image ${url} could not be decoded`); + reject(); + }; + img.src = url; + }); + }; + preloadPlugins.push(imagePlugin); + + var audioPlugin = {}; + audioPlugin['canHandle'] = (name) => { + return !Module['noAudioDecoding'] && name.slice(-4) in { '.ogg': 1, '.wav': 1, '.mp3': 1 }; + }; + audioPlugin['handle'] = async (byteArray, name) => { + return new Promise((resolve, reject) => { + var done = false; + function finish(audio) { + if (done) return; + done = true; + Browser.preloadedAudios[name] = audio; + resolve(byteArray); + } + var b = new Blob([byteArray], { type: Browser.getMimetype(name) }); + var url = URL.createObjectURL(b); // XXX we never revoke this! + var audio = new Audio(); + audio.addEventListener('canplaythrough', () => finish(audio)); // use addEventListener due to chromium bug 124926 + audio.onerror = (event) => { + if (done) return; + err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`); + function encode64(data) { + var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var PAD = '='; + var ret = ''; + var leftchar = 0; + var leftbits = 0; + for (var i = 0; i < data.length; i++) { + leftchar = (leftchar << 8) | data[i]; + leftbits += 8; + while (leftbits >= 6) { + var curr = (leftchar >> (leftbits-6)) & 0x3f; + leftbits -= 6; + ret += BASE[curr]; + } + } + if (leftbits == 2) { + ret += BASE[(leftchar&3) << 4]; + ret += PAD + PAD; + } else if (leftbits == 4) { + ret += BASE[(leftchar&0xf) << 2]; + ret += PAD; + } + return ret; + } + audio.src = 'data:audio/x-' + name.slice(-3) + ';base64,' + encode64(byteArray); + finish(audio); // we don't wait for confirmation this worked - but it's worth trying + }; + audio.src = url; + // workaround for chrome bug 124926 - we do not always get oncanplaythrough or onerror + safeSetTimeout(() => { + finish(audio); // try to use it even though it is not necessarily ready to play + }, 10000); + }); + }; + preloadPlugins.push(audioPlugin); + + // Canvas event setup + + function pointerLockChange() { + var canvas = Browser.getCanvas(); + Browser.pointerLock = document.pointerLockElement === canvas; + } + var canvas = Browser.getCanvas(); + if (canvas) { + // forced aspect ratio can be enabled by defining 'forcedAspectRatio' on Module + // Module['forcedAspectRatio'] = 4 / 3; + + document.addEventListener('pointerlockchange', pointerLockChange); + + if (Module['elementPointerLock']) { + canvas.addEventListener('click', (ev) => { + if (!Browser.pointerLock && Browser.getCanvas().requestPointerLock) { + Browser.getCanvas().requestPointerLock(); + ev.preventDefault(); + } + }); + } + } + }, + createContext(/** @type {HTMLCanvasElement} */ canvas, useWebGL, setInModule, webGLContextAttributes) { + if (useWebGL && Module['ctx'] && canvas == Browser.getCanvas()) return Module['ctx']; // no need to recreate GL context if it's already been created for this canvas. + + var ctx; + var contextHandle; + if (useWebGL) { + // For GLES2/desktop GL compatibility, adjust a few defaults to be different to WebGL defaults, so that they align better with the desktop defaults. + var contextAttributes = { + antialias: false, + alpha: false, + majorVersion: 1, + }; + + if (webGLContextAttributes) { + for (var attribute in webGLContextAttributes) { + contextAttributes[attribute] = webGLContextAttributes[attribute]; + } + } + + // This check of existence of GL is here to satisfy Closure compiler, which yells if variable GL is referenced below but GL object is not + // actually compiled in because application is not doing any GL operations. TODO: Ideally if GL is not being used, this function + // Browser.createContext() should not even be emitted. + if (typeof GL != 'undefined') { + contextHandle = GL.createContext(canvas, contextAttributes); + if (contextHandle) { + ctx = GL.getContext(contextHandle).GLctx; + } + } + } else { + ctx = canvas.getContext('2d'); + } + + if (!ctx) return null; + + if (setInModule) { + if (!useWebGL) assert(typeof GLctx == 'undefined', 'cannot set in module if GLctx is used, but we are a non-GL context that would replace it'); + Module['ctx'] = ctx; + if (useWebGL) GL.makeContextCurrent(contextHandle); + Browser.useWebGL = useWebGL; + Browser.moduleContextCreatedCallbacks.forEach((callback) => callback()); + Browser.init(); + } + return ctx; + }, + fullscreenHandlersInstalled:false, + lockPointer:undefined, + resizeCanvas:undefined, + requestFullscreen(lockPointer, resizeCanvas) { + Browser.lockPointer = lockPointer; + Browser.resizeCanvas = resizeCanvas; + if (typeof Browser.lockPointer == 'undefined') Browser.lockPointer = true; + if (typeof Browser.resizeCanvas == 'undefined') Browser.resizeCanvas = false; + + var canvas = Browser.getCanvas(); + function fullscreenChange() { + Browser.isFullscreen = false; + var canvasContainer = canvas.parentNode; + if (getFullscreenElement() === canvasContainer) { + canvas.exitFullscreen = Browser.exitFullscreen; + if (Browser.lockPointer) canvas.requestPointerLock(); + Browser.isFullscreen = true; + if (Browser.resizeCanvas) { + Browser.setFullscreenCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + } + } else { + // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen + canvasContainer.parentNode.insertBefore(canvas, canvasContainer); + canvasContainer.parentNode.removeChild(canvasContainer); + + if (Browser.resizeCanvas) { + Browser.setWindowedCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + } + } + } + + if (!Browser.fullscreenHandlersInstalled) { + Browser.fullscreenHandlersInstalled = true; + document.addEventListener('fullscreenchange', fullscreenChange); + document.addEventListener('webkitfullscreenchange', fullscreenChange); + } + + // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root + var canvasContainer = document.createElement('div'); + canvas.parentNode.insertBefore(canvasContainer, canvas); + canvasContainer.appendChild(canvas); + + // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size) + // Safari didn't support Element.requestFullscreen until 16.4 + // See: https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen + /** @suppress {checkTypes} */ + canvasContainer.requestFullscreen ??= (canvasContainer['webkitRequestFullscreen'] ? () => canvasContainer['webkitRequestFullscreen'](Element.ALLOW_KEYBOARD_INPUT) : null) ?? + (canvasContainer['webkitRequestFullScreen'] ? () => canvasContainer['webkitRequestFullScreen'](Element.ALLOW_KEYBOARD_INPUT) : null); + + canvasContainer.requestFullscreen(); + }, + exitFullscreen() { + // This is workaround for chrome. Trying to exit from fullscreen + // not in fullscreen state will cause 'TypeError: Document not active' + // in chrome. See https://github.com/emscripten-core/emscripten/pull/8236 + if (!Browser.isFullscreen) { + return false; + } + + var CFS = document.exitFullscreen ?? document['webkitCancelFullScreen']; + CFS.apply(document, []); + return true; + }, + safeSetTimeout(func, timeout) { + // Legacy function, this is used by the SDL2 port so we need to keep it + // around at least until that is updated. + // See https://github.com/libsdl-org/SDL/pull/6304 + return safeSetTimeout(func, timeout); + }, + getMimetype(name) { + return { + 'jpg': 'image/jpeg', + 'jpeg': 'image/jpeg', + 'png': 'image/png', + 'bmp': 'image/bmp', + 'ogg': 'audio/ogg', + 'wav': 'audio/wav', + 'mp3': 'audio/mpeg' + }[name.slice(name.lastIndexOf('.')+1)]; + }, + getUserMedia(func) { + return navigator.mediaDevices.getUserMedia(func); + }, + getMouseWheelDelta(event) { + var delta = 0; + switch (event.type) { + case 'DOMMouseScroll': + // 3 lines make up a step + delta = event.detail / 3; + break; + case 'mousewheel': + // 120 units make up a step + delta = event.wheelDelta / 120; + break; + case 'wheel': + delta = event.deltaY + switch (event.deltaMode) { + case 0: + // DOM_DELTA_PIXEL: 100 pixels make up a step + delta /= 100; + break; + case 1: + // DOM_DELTA_LINE: 3 lines make up a step + delta /= 3; + break; + case 2: + // DOM_DELTA_PAGE: A page makes up 80 steps + delta *= 80; + break; + default: + abort('unrecognized mouse wheel delta mode: ' + event.deltaMode); + } + break; + default: + abort('unrecognized mouse wheel event: ' + event.type); + } + return delta; + }, + mouseX:0, + mouseY:0, + mouseMovementX:0, + mouseMovementY:0, + touches:{ + }, + lastTouches:{ + }, + calculateMouseCoords(pageX, pageY) { + // Calculate the movement based on the changes + // in the coordinates. + var canvas = Browser.getCanvas(); + var rect = canvas.getBoundingClientRect(); + + var adjustedX = pageX - (window.scrollX + rect.left); + var adjustedY = pageY - (window.scrollY + rect.top); + + // the canvas might be CSS-scaled compared to its backbuffer; + // SDL-using content will want mouse coordinates in terms + // of backbuffer units. + adjustedX = adjustedX * (canvas.width / rect.width); + adjustedY = adjustedY * (canvas.height / rect.height); + + return { x: adjustedX, y: adjustedY }; + }, + setMouseCoords(pageX, pageY) { + const {x, y} = Browser.calculateMouseCoords(pageX, pageY); + Browser.mouseMovementX = x - Browser.mouseX; + Browser.mouseMovementY = y - Browser.mouseY; + Browser.mouseX = x; + Browser.mouseY = y; + }, + calculateMouseEvent(event) { // event should be mousemove, mousedown or mouseup + if (Browser.pointerLock) { + // When the pointer is locked, calculate the coordinates + // based on the movement of the mouse. + Browser.mouseMovementX = event.movementX; + Browser.mouseMovementY = event.movementY; + + // add the mouse delta to the current absolute mouse position + Browser.mouseX += Browser.mouseMovementX; + Browser.mouseY += Browser.mouseMovementY; + } else { + if (event.type === 'touchstart' || event.type === 'touchend' || event.type === 'touchmove') { + var touch = event.touch; + if (touch === undefined) { + return; // the 'touch' property is only defined in SDL + + } + var coords = Browser.calculateMouseCoords(touch.pageX, touch.pageY); + + if (event.type === 'touchstart') { + Browser.lastTouches[touch.identifier] = coords; + Browser.touches[touch.identifier] = coords; + } else if (event.type === 'touchend' || event.type === 'touchmove') { + var last = Browser.touches[touch.identifier]; + last ||= coords; + Browser.lastTouches[touch.identifier] = last; + Browser.touches[touch.identifier] = coords; + } + return; + } + + Browser.setMouseCoords(event.pageX, event.pageY); + } + }, + resizeListeners:[], + updateResizeListeners() { + var canvas = Browser.getCanvas(); + Browser.resizeListeners.forEach((listener) => listener(canvas.width, canvas.height)); + }, + setCanvasSize(width, height, noUpdates) { + var canvas = Browser.getCanvas(); + Browser.updateCanvasDimensions(canvas, width, height); + if (!noUpdates) Browser.updateResizeListeners(); + }, + windowedWidth:0, + windowedHeight:0, + setFullscreenCanvasSize() { + // check if SDL is available + if (typeof SDL != 'undefined') { + var flags = HEAPU32[((SDL.screen)>>2)]; + flags = flags | 0x00800000; // set SDL_FULLSCREEN flag + HEAP32[((SDL.screen)>>2)] = flags; + } + Browser.updateCanvasDimensions(Browser.getCanvas()); + Browser.updateResizeListeners(); + }, + setWindowedCanvasSize() { + // check if SDL is available + if (typeof SDL != 'undefined') { + var flags = HEAPU32[((SDL.screen)>>2)]; + flags = flags & ~0x00800000; // clear SDL_FULLSCREEN flag + HEAP32[((SDL.screen)>>2)] = flags; + } + Browser.updateCanvasDimensions(Browser.getCanvas()); + Browser.updateResizeListeners(); + }, + updateCanvasDimensions(canvas, wNative, hNative) { + if (wNative && hNative) { + canvas.widthNative = wNative; + canvas.heightNative = hNative; + } else { + wNative = canvas.widthNative; + hNative = canvas.heightNative; + } + var w = wNative; + var h = hNative; + if ((getFullscreenElement() === canvas.parentNode) && (typeof screen != 'undefined')) { + var factor = Math.min(screen.width / w, screen.height / h); + w = Math.round(w * factor); + h = Math.round(h * factor); + } + if (Browser.resizeCanvas) { + if (canvas.width != w) canvas.width = w; + if (canvas.height != h) canvas.height = h; + if (typeof canvas.style != 'undefined') { + canvas.style.removeProperty( 'width'); + canvas.style.removeProperty('height'); + } + } else { + if (canvas.width != wNative) canvas.width = wNative; + if (canvas.height != hNative) canvas.height = hNative; + if (typeof canvas.style != 'undefined') { + if (w != wNative || h != hNative) { + canvas.style.setProperty( 'width', w + 'px', 'important'); + canvas.style.setProperty('height', h + 'px', 'important'); + } else { + canvas.style.removeProperty( 'width'); + canvas.style.removeProperty('height'); + } + } + } + }, + }; + + var _emscripten_set_window_title = (title) => document.title = UTF8ToString(title); + + var _emscripten_sleep = function(ms) { + let innerFunc = () => new Promise((resolve) => setTimeout(resolve, ms)); + return Asyncify.handleAsync(innerFunc); + } + ; + _emscripten_sleep.isAsync = true; + + + function _fd_close(fd) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + FS.close(stream); + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + + /** @param {number=} offset */ + var doReadv = (stream, iov, iovcnt, offset) => { + var ret = 0; + for (var i = 0; i < iovcnt; i++) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + iov += 8; + try { + var curr = FS.read(stream, HEAP8, ptr, len, offset); + } catch (e) { + // On a non-blocking stream a subsequent read may would-block after we + // already gathered data. POSIX readv is a single gather-read: return + // what we have rather than failing the whole call. + if (ret > 0 && e instanceof FS.ErrnoError && + (e.errno == 6 || e.errno == 6)) { + break; + } + throw e; + } + if (curr < 0) return -1; + ret += curr; + if (curr < len) break; // nothing more to read + if (typeof offset != 'undefined') { + offset += curr; + } + } + return ret; + }; + + + function _fd_read(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doReadv(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + + + function _fd_seek(fd, offset, whence, newOffset) { + offset = bigintToI53Checked(offset); + + + try { + + if (isNaN(offset)) return 22; + var stream = SYSCALLS.getStreamFromFD(fd); + FS.llseek(stream, offset, whence); + HEAP64[((newOffset)>>3)] = BigInt(stream.position); + if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; // reset readdir state + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + ; + } + + + + /** @param {number=} offset */ + var doWritev = (stream, iov, iovcnt, offset) => { + // Gather all iovecs into one contiguous buffer and issue a single + // FS.write, matching POSIX writev's single gather-write semantics (as + // __syscall_sendmsg already does). Per-iovec writes fragment a stream + // socket send into multiple segments, breaking stream byte semantics. + if (iovcnt == 1) { + // Single iovec: write directly from HEAP8, no gather buffer needed. + return FS.write(stream, HEAP8, HEAPU32[((iov)>>2)], HEAPU32[(((iov)+(4))>>2)], offset); + } + var total = 0; + for (var i = 0, p = iov; i < iovcnt; i++, p += 8) { + total += HEAPU32[(((p)+(4))>>2)]; + } + var view = new Uint8Array(total); + var voff = 0; + for (var i = 0; i < iovcnt; i++, iov += 8) { + var ptr = HEAPU32[((iov)>>2)]; + var len = HEAPU32[(((iov)+(4))>>2)]; + view.set(HEAPU8.subarray(ptr, ptr + len), voff); + voff += len; + } + return FS.write(stream, view, 0, total, offset); + }; + + + function _fd_write(fd, iov, iovcnt, pnum) { + try { + + var stream = SYSCALLS.getStreamFromFD(fd); + var num = doWritev(stream, iov, iovcnt); + HEAPU32[((pnum)>>2)] = num; + return 0; + } catch (e) { + if (typeof FS == 'undefined' || !(e.name === 'ErrnoError')) throw e; + return e.errno; + } + } + + + var _glActiveTexture = _emscripten_glActiveTexture; + + var _glAttachShader = _emscripten_glAttachShader; + + var _glBindAttribLocation = _emscripten_glBindAttribLocation; + + var _glBindBuffer = _emscripten_glBindBuffer; + + var _glBindTexture = _emscripten_glBindTexture; + + var _glBlendFunc = _emscripten_glBlendFunc; + + var _glBufferData = _emscripten_glBufferData; + + var _glBufferSubData = _emscripten_glBufferSubData; + + var _glClear = _emscripten_glClear; + + var _glClearColor = _emscripten_glClearColor; + + var _glClearDepthf = _emscripten_glClearDepthf; + + var _glCompileShader = _emscripten_glCompileShader; + + var _glCompressedTexImage2D = _emscripten_glCompressedTexImage2D; + + var _glCreateProgram = _emscripten_glCreateProgram; + + var _glCreateShader = _emscripten_glCreateShader; + + var _glCullFace = _emscripten_glCullFace; + + var _glDeleteBuffers = _emscripten_glDeleteBuffers; + + var _glDeleteProgram = _emscripten_glDeleteProgram; + + var _glDeleteShader = _emscripten_glDeleteShader; + + var _glDeleteTextures = _emscripten_glDeleteTextures; + + var _glDepthFunc = _emscripten_glDepthFunc; + + var _glDetachShader = _emscripten_glDetachShader; + + var _glDisable = _emscripten_glDisable; + + var _glDisableVertexAttribArray = _emscripten_glDisableVertexAttribArray; + + var _glDrawArrays = _emscripten_glDrawArrays; + + var _glDrawElements = _emscripten_glDrawElements; + + var _glEnable = _emscripten_glEnable; + + var _glEnableVertexAttribArray = _emscripten_glEnableVertexAttribArray; + + var _glFrontFace = _emscripten_glFrontFace; + + var _glGenBuffers = _emscripten_glGenBuffers; + + var _glGenTextures = _emscripten_glGenTextures; + + var _glGetAttribLocation = _emscripten_glGetAttribLocation; + + var _glGetFloatv = _emscripten_glGetFloatv; + + var _glGetProgramInfoLog = _emscripten_glGetProgramInfoLog; + + var _glGetProgramiv = _emscripten_glGetProgramiv; + + var _glGetShaderInfoLog = _emscripten_glGetShaderInfoLog; + + var _glGetShaderiv = _emscripten_glGetShaderiv; + + var _glGetString = _emscripten_glGetString; + + var _glGetUniformLocation = _emscripten_glGetUniformLocation; + + var _glLinkProgram = _emscripten_glLinkProgram; + + var _glPixelStorei = _emscripten_glPixelStorei; + + var _glReadPixels = _emscripten_glReadPixels; + + var _glShaderSource = _emscripten_glShaderSource; + + var _glTexImage2D = _emscripten_glTexImage2D; + + var _glTexParameterf = _emscripten_glTexParameterf; + + var _glTexParameteri = _emscripten_glTexParameteri; + + var _glUniform1i = _emscripten_glUniform1i; + + var _glUniform4f = _emscripten_glUniform4f; + + var _glUniformMatrix4fv = _emscripten_glUniformMatrix4fv; + + var _glUseProgram = _emscripten_glUseProgram; + + var _glVertexAttribPointer = _emscripten_glVertexAttribPointer; + + var _glViewport = _emscripten_glViewport; + + + + + /** @constructor */ + function GLFW_Window(id, width, height, framebufferWidth, framebufferHeight, title, monitor, share) { + this.id = id; + this.x = 0; + this.y = 0; + this.fullscreen = false; // Used to determine if app is in fullscreen mode + this.storedX = 0; // Used to store X before fullscreen + this.storedY = 0; // Used to store Y before fullscreen + this.width = width; + this.height = height; + this.framebufferWidth = framebufferWidth; + this.framebufferHeight = framebufferHeight; + this.storedWidth = width; // Used to store width before fullscreen + this.storedHeight = height; // Used to store height before fullscreen + this.title = title; + this.monitor = monitor; + this.share = share; + this.attributes = {...GLFW.hints}; + this.inputModes = { + 0x00033001:0x00034001, // GLFW_CURSOR (GLFW_CURSOR_NORMAL) + 0x00033002:0, // GLFW_STICKY_KEYS + 0x00033003:0, // GLFW_STICKY_MOUSE_BUTTONS + }; + this.buttons = 0; + this.keys = new Array(); + this.domKeys = new Array(); + this.shouldClose = 0; + this.title = null; + this.windowPosFunc = 0; // GLFWwindowposfun + this.windowSizeFunc = 0; // GLFWwindowsizefun + this.windowCloseFunc = 0; // GLFWwindowclosefun + this.windowRefreshFunc = 0; // GLFWwindowrefreshfun + this.windowFocusFunc = 0; // GLFWwindowfocusfun + this.windowIconifyFunc = 0; // GLFWwindowiconifyfun + this.windowMaximizeFunc = 0; // GLFWwindowmaximizefun + this.framebufferSizeFunc = 0; // GLFWframebuffersizefun + this.windowContentScaleFunc = 0; // GLFWwindowcontentscalefun + this.mouseButtonFunc = 0; // GLFWmousebuttonfun + this.cursorPosFunc = 0; // GLFWcursorposfun + this.cursorEnterFunc = 0; // GLFWcursorenterfun + this.scrollFunc = 0; // GLFWscrollfun + this.dropFunc = 0; // GLFWdropfun + this.keyFunc = 0; // GLFWkeyfun + this.charFunc = 0; // GLFWcharfun + this.userptr = 0; + } + + + + + var _emscripten_set_main_loop_timing = (mode, value) => { + MainLoop.timingMode = mode; + MainLoop.timingValue = value; + + if (!MainLoop.func) { + err('emscripten_set_main_loop_timing: Cannot set timing mode for main loop since a main loop does not exist! Call emscripten_set_main_loop first to set one up.'); + return 1; // Return non-zero on failure, can't set timing mode when there is no main loop. + } + + if (!MainLoop.running) { + + MainLoop.running = true; + } + if (mode == 0) { + MainLoop.scheduler = function MainLoop_scheduler_setTimeout() { + var timeUntilNextTick = Math.max(0, MainLoop.tickStartTime + value - _emscripten_get_now())|0; + setTimeout(MainLoop.runner, timeUntilNextTick); // doing this each time means that on exception, we stop + }; + } else if (mode == 1) { + MainLoop.scheduler = function MainLoop_scheduler_rAF() { + MainLoop.requestAnimationFrame(MainLoop.runner); + }; + } else { + assert(mode == 2); + if (!MainLoop.setImmediate) { + if (globalThis.scheduler) { + // Some modern browsers implement scheduler.postTask, but not all. + MainLoop.setImmediate = scheduler.postTask.bind(scheduler); + } else if (globalThis.setImmediate) { + MainLoop.setImmediate = setImmediate; + } else { + // Emulate setImmediate. (note: not a complete polyfill, we don't emulate clearImmediate() to keep code size to minimum, since not needed) + var setImmediates = []; + var emscriptenMainLoopMessageId = 'setimmediate'; + /** @param {Event} event */ + var MainLoop_setImmediate_messageHandler = (event) => { + if (event.data === emscriptenMainLoopMessageId) { + event.stopPropagation(); + setImmediates.shift()(); + } + }; + addEventListener('message', MainLoop_setImmediate_messageHandler, true); + MainLoop.setImmediate = /** @type{function(function(): ?, ...?): number} */((func) => { + setImmediates.push(func); + if (ENVIRONMENT_IS_WORKER) { + // The postMessge API in a Worker, sends message to the main + // thread and does not support the `targetOrigin` (*) argument. + postMessage(emscriptenMainLoopMessageId); + } else { + postMessage(emscriptenMainLoopMessageId, '*'); + } + }); + } + } + MainLoop.scheduler = function MainLoop_scheduler_setImmediate() { + MainLoop.setImmediate(MainLoop.runner); + }; + } + return 0; + }; + + + + /** + * @param {number=} arg + * @param {boolean=} noSetTiming + */ + var setMainLoop = (iterFunc, fps, simulateInfiniteLoop, arg, noSetTiming) => { + assert(!MainLoop.func, 'emscripten_set_main_loop: there can only be one main loop function at once') + MainLoop.func = iterFunc; + MainLoop.arg = arg; + + var thisMainLoopId = MainLoop.currentlyRunningMainloop; + function checkIsRunning() { + if (thisMainLoopId < MainLoop.currentlyRunningMainloop) { + + maybeExit(); + return false; + } + return true; + } + + // We create the loop runner here but it is not actually running until + // _emscripten_set_main_loop_timing is called (which might happen at a + // later time). This member signifies that the current runner has not + // yet been started so that we can call runtimeKeepalivePush when it + // gets its timing set for the first time. + MainLoop.running = false; + MainLoop.runner = function MainLoop_runner() { + if (ABORT) return; + if (MainLoop.queue.length > 0) { + var start = Date.now(); + var blocker = MainLoop.queue.shift(); + blocker.func(blocker.arg); + if (MainLoop.remainingBlockers) { + var remaining = MainLoop.remainingBlockers; + var next = remaining%1 == 0 ? remaining-1 : Math.floor(remaining); + if (blocker.counted) { + MainLoop.remainingBlockers = next; + } else { + // not counted, but move the progress along a tiny bit + next = next + 0.5; // do not steal all the next one's progress + MainLoop.remainingBlockers = (8*remaining + next)/9; + } + } + MainLoop.updateStatus(); + + // catches pause/resume main loop from blocker execution + if (!checkIsRunning()) return; + + setTimeout(MainLoop.runner, 0); + return; + } + + // catch pauses from non-main loop sources + if (!checkIsRunning()) return; + + // Implement very basic swap interval control + MainLoop.currentFrameNumber = MainLoop.currentFrameNumber + 1 | 0; + if (MainLoop.timingMode == 1 && MainLoop.timingValue > 1 && MainLoop.currentFrameNumber % MainLoop.timingValue != 0) { + // Not the scheduled time to render this frame - skip. + MainLoop.scheduler(); + return; + } else if (MainLoop.timingMode == 0) { + MainLoop.tickStartTime = _emscripten_get_now(); + if (Module['ctx']) { + warnOnce('Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!'); + } + } + + MainLoop.runIter(iterFunc); + + // catch pauses from the main loop itself + if (!checkIsRunning()) return; + + MainLoop.scheduler(); + } + + if (!noSetTiming) { + if (fps > 0) { + _emscripten_set_main_loop_timing(0, 1000.0 / fps); + } else { + // Do rAF by rendering each frame (no decimating) + _emscripten_set_main_loop_timing(1, 1); + } + + MainLoop.scheduler(); + } + + if (simulateInfiniteLoop) { + throw 'unwind'; + } + }; + + + var MainLoop = { + running:false, + scheduler:null, + currentlyRunningMainloop:0, + func:null, + arg:0, + timingMode:0, + timingValue:0, + currentFrameNumber:0, + queue:[], + preMainLoop:[], + postMainLoop:[], + pause() { + MainLoop.scheduler = null; + // Incrementing this signals the previous main loop that it's now become old, and it must return. + MainLoop.currentlyRunningMainloop++; + }, + resume() { + MainLoop.currentlyRunningMainloop++; + var timingMode = MainLoop.timingMode; + var timingValue = MainLoop.timingValue; + var func = MainLoop.func; + MainLoop.func = null; + // do not set timing and call scheduler, we will do it on the next lines + setMainLoop(func, 0, false, MainLoop.arg, true); + _emscripten_set_main_loop_timing(timingMode, timingValue); + MainLoop.scheduler(); + }, + updateStatus() { + if (Module['setStatus']) { + var message = Module['statusMessage'] || 'Please wait...'; + var remaining = MainLoop.remainingBlockers ?? 0; + var expected = MainLoop.expectedBlockers ?? 0; + if (remaining) { + if (remaining < expected) { + Module['setStatus'](`{message} ({expected - remaining}/{expected})`); + } else { + Module['setStatus'](message); + } + } else { + Module['setStatus'](''); + } + } + }, + init() { + }, + runIter(func) { + if (ABORT) return; + for (var pre of MainLoop.preMainLoop) { + if (pre() === false) { + return; // |return false| skips a frame + } + } + callUserCallback(func); + for (var post of MainLoop.postMainLoop) { + post(); + } + checkStackCookie(); + }, + nextRAF:0, + fakeRequestAnimationFrame(func) { + // try to keep 60fps between calls to here + var now = Date.now(); + if (MainLoop.nextRAF === 0) { + MainLoop.nextRAF = now + 1000/60; + } else { + while (now + 2 >= MainLoop.nextRAF) { // fudge a little, to avoid timer jitter causing us to do lots of delay:0 + MainLoop.nextRAF += 1000/60; + } + } + var delay = Math.max(MainLoop.nextRAF - now, 0); + setTimeout(func, delay); + }, + requestAnimationFrame(func) { + if (globalThis.requestAnimationFrame) { + requestAnimationFrame(func); + } else { + MainLoop.fakeRequestAnimationFrame(func); + } + }, + }; + + + + + + + + + + + var GLFW = { + WindowFromId:(id) => { + if (id <= 0 || !GLFW.windows) return null; + return GLFW.windows[id - 1]; + }, + joystickFunc:0, + errorFunc:0, + monitorFunc:0, + active:null, + scale:null, + windows:null, + monitors:null, + monitorString:null, + versionString:null, + initialTime:null, + extensions:null, + devicePixelRatioMQL:null, + hints:null, + primaryTouchId:null, + defaultHints:{ + 131073:0, + 131074:0, + 131075:1, + 131076:1, + 131077:1, + 131082:0, + 135169:8, + 135170:8, + 135171:8, + 135172:8, + 135173:24, + 135174:8, + 135175:0, + 135176:0, + 135177:0, + 135178:0, + 135179:0, + 135180:0, + 135181:0, + 135182:0, + 135183:0, + 139265:196609, + 139266:1, + 139267:0, + 139268:0, + 139269:0, + 139270:0, + 139271:0, + 139272:0, + 139276:0, + }, + DOMToGLFWKeyCode:(keycode) => { + switch (keycode) { + // these keycodes are only defined for GLFW3, assume they are the same for GLFW2 + case 0x20:return 32; // DOM_VK_SPACE -> GLFW_KEY_SPACE + case 0xDE:return 39; // DOM_VK_QUOTE -> GLFW_KEY_APOSTROPHE + case 0xBC:return 44; // DOM_VK_COMMA -> GLFW_KEY_COMMA + case 0xAD:return 45; // DOM_VK_HYPHEN_MINUS -> GLFW_KEY_MINUS + case 0xBD:return 45; // DOM_VK_MINUS -> GLFW_KEY_MINUS + case 0xBE:return 46; // DOM_VK_PERIOD -> GLFW_KEY_PERIOD + case 0xBF:return 47; // DOM_VK_SLASH -> GLFW_KEY_SLASH + case 0x30:return 48; // DOM_VK_0 -> GLFW_KEY_0 + case 0x31:return 49; // DOM_VK_1 -> GLFW_KEY_1 + case 0x32:return 50; // DOM_VK_2 -> GLFW_KEY_2 + case 0x33:return 51; // DOM_VK_3 -> GLFW_KEY_3 + case 0x34:return 52; // DOM_VK_4 -> GLFW_KEY_4 + case 0x35:return 53; // DOM_VK_5 -> GLFW_KEY_5 + case 0x36:return 54; // DOM_VK_6 -> GLFW_KEY_6 + case 0x37:return 55; // DOM_VK_7 -> GLFW_KEY_7 + case 0x38:return 56; // DOM_VK_8 -> GLFW_KEY_8 + case 0x39:return 57; // DOM_VK_9 -> GLFW_KEY_9 + case 0x3B:return 59; // DOM_VK_SEMICOLON -> GLFW_KEY_SEMICOLON + case 0x3D:return 61; // DOM_VK_EQUALS -> GLFW_KEY_EQUAL + case 0xBB:return 61; // DOM_VK_EQUALS -> GLFW_KEY_EQUAL + case 0x41:return 65; // DOM_VK_A -> GLFW_KEY_A + case 0x42:return 66; // DOM_VK_B -> GLFW_KEY_B + case 0x43:return 67; // DOM_VK_C -> GLFW_KEY_C + case 0x44:return 68; // DOM_VK_D -> GLFW_KEY_D + case 0x45:return 69; // DOM_VK_E -> GLFW_KEY_E + case 0x46:return 70; // DOM_VK_F -> GLFW_KEY_F + case 0x47:return 71; // DOM_VK_G -> GLFW_KEY_G + case 0x48:return 72; // DOM_VK_H -> GLFW_KEY_H + case 0x49:return 73; // DOM_VK_I -> GLFW_KEY_I + case 0x4A:return 74; // DOM_VK_J -> GLFW_KEY_J + case 0x4B:return 75; // DOM_VK_K -> GLFW_KEY_K + case 0x4C:return 76; // DOM_VK_L -> GLFW_KEY_L + case 0x4D:return 77; // DOM_VK_M -> GLFW_KEY_M + case 0x4E:return 78; // DOM_VK_N -> GLFW_KEY_N + case 0x4F:return 79; // DOM_VK_O -> GLFW_KEY_O + case 0x50:return 80; // DOM_VK_P -> GLFW_KEY_P + case 0x51:return 81; // DOM_VK_Q -> GLFW_KEY_Q + case 0x52:return 82; // DOM_VK_R -> GLFW_KEY_R + case 0x53:return 83; // DOM_VK_S -> GLFW_KEY_S + case 0x54:return 84; // DOM_VK_T -> GLFW_KEY_T + case 0x55:return 85; // DOM_VK_U -> GLFW_KEY_U + case 0x56:return 86; // DOM_VK_V -> GLFW_KEY_V + case 0x57:return 87; // DOM_VK_W -> GLFW_KEY_W + case 0x58:return 88; // DOM_VK_X -> GLFW_KEY_X + case 0x59:return 89; // DOM_VK_Y -> GLFW_KEY_Y + case 0x5a:return 90; // DOM_VK_Z -> GLFW_KEY_Z + case 0xDB:return 91; // DOM_VK_OPEN_BRACKET -> GLFW_KEY_LEFT_BRACKET + case 0xDC:return 92; // DOM_VK_BACKSLASH -> GLFW_KEY_BACKSLASH + case 0xDD:return 93; // DOM_VK_CLOSE_BRACKET -> GLFW_KEY_RIGHT_BRACKET + case 0xC0:return 96; // DOM_VK_BACK_QUOTE -> GLFW_KEY_GRAVE_ACCENT + + case 0x1B:return 256; // DOM_VK_ESCAPE -> GLFW_KEY_ESCAPE + case 0x0D:return 257; // DOM_VK_RETURN -> GLFW_KEY_ENTER + case 0x09:return 258; // DOM_VK_TAB -> GLFW_KEY_TAB + case 0x08:return 259; // DOM_VK_BACK -> GLFW_KEY_BACKSPACE + case 0x2D:return 260; // DOM_VK_INSERT -> GLFW_KEY_INSERT + case 0x2E:return 261; // DOM_VK_DELETE -> GLFW_KEY_DELETE + case 0x27:return 262; // DOM_VK_RIGHT -> GLFW_KEY_RIGHT + case 0x25:return 263; // DOM_VK_LEFT -> GLFW_KEY_LEFT + case 0x28:return 264; // DOM_VK_DOWN -> GLFW_KEY_DOWN + case 0x26:return 265; // DOM_VK_UP -> GLFW_KEY_UP + case 0x21:return 266; // DOM_VK_PAGE_UP -> GLFW_KEY_PAGE_UP + case 0x22:return 267; // DOM_VK_PAGE_DOWN -> GLFW_KEY_PAGE_DOWN + case 0x24:return 268; // DOM_VK_HOME -> GLFW_KEY_HOME + case 0x23:return 269; // DOM_VK_END -> GLFW_KEY_END + case 0x14:return 280; // DOM_VK_CAPS_LOCK -> GLFW_KEY_CAPS_LOCK + case 0x91:return 281; // DOM_VK_SCROLL_LOCK -> GLFW_KEY_SCROLL_LOCK + case 0x90:return 282; // DOM_VK_NUM_LOCK -> GLFW_KEY_NUM_LOCK + case 0x2C:return 283; // DOM_VK_SNAPSHOT -> GLFW_KEY_PRINT_SCREEN + case 0x13:return 284; // DOM_VK_PAUSE -> GLFW_KEY_PAUSE + case 0x70:return 290; // DOM_VK_F1 -> GLFW_KEY_F1 + case 0x71:return 291; // DOM_VK_F2 -> GLFW_KEY_F2 + case 0x72:return 292; // DOM_VK_F3 -> GLFW_KEY_F3 + case 0x73:return 293; // DOM_VK_F4 -> GLFW_KEY_F4 + case 0x74:return 294; // DOM_VK_F5 -> GLFW_KEY_F5 + case 0x75:return 295; // DOM_VK_F6 -> GLFW_KEY_F6 + case 0x76:return 296; // DOM_VK_F7 -> GLFW_KEY_F7 + case 0x77:return 297; // DOM_VK_F8 -> GLFW_KEY_F8 + case 0x78:return 298; // DOM_VK_F9 -> GLFW_KEY_F9 + case 0x79:return 299; // DOM_VK_F10 -> GLFW_KEY_F10 + case 0x7A:return 300; // DOM_VK_F11 -> GLFW_KEY_F11 + case 0x7B:return 301; // DOM_VK_F12 -> GLFW_KEY_F12 + case 0x7C:return 302; // DOM_VK_F13 -> GLFW_KEY_F13 + case 0x7D:return 303; // DOM_VK_F14 -> GLFW_KEY_F14 + case 0x7E:return 304; // DOM_VK_F15 -> GLFW_KEY_F15 + case 0x7F:return 305; // DOM_VK_F16 -> GLFW_KEY_F16 + case 0x80:return 306; // DOM_VK_F17 -> GLFW_KEY_F17 + case 0x81:return 307; // DOM_VK_F18 -> GLFW_KEY_F18 + case 0x82:return 308; // DOM_VK_F19 -> GLFW_KEY_F19 + case 0x83:return 309; // DOM_VK_F20 -> GLFW_KEY_F20 + case 0x84:return 310; // DOM_VK_F21 -> GLFW_KEY_F21 + case 0x85:return 311; // DOM_VK_F22 -> GLFW_KEY_F22 + case 0x86:return 312; // DOM_VK_F23 -> GLFW_KEY_F23 + case 0x87:return 313; // DOM_VK_F24 -> GLFW_KEY_F24 + case 0x88:return 314; // 0x88 (not used?) -> GLFW_KEY_F25 + case 0x60:return 320; // DOM_VK_NUMPAD0 -> GLFW_KEY_KP_0 + case 0x61:return 321; // DOM_VK_NUMPAD1 -> GLFW_KEY_KP_1 + case 0x62:return 322; // DOM_VK_NUMPAD2 -> GLFW_KEY_KP_2 + case 0x63:return 323; // DOM_VK_NUMPAD3 -> GLFW_KEY_KP_3 + case 0x64:return 324; // DOM_VK_NUMPAD4 -> GLFW_KEY_KP_4 + case 0x65:return 325; // DOM_VK_NUMPAD5 -> GLFW_KEY_KP_5 + case 0x66:return 326; // DOM_VK_NUMPAD6 -> GLFW_KEY_KP_6 + case 0x67:return 327; // DOM_VK_NUMPAD7 -> GLFW_KEY_KP_7 + case 0x68:return 328; // DOM_VK_NUMPAD8 -> GLFW_KEY_KP_8 + case 0x69:return 329; // DOM_VK_NUMPAD9 -> GLFW_KEY_KP_9 + case 0x6E:return 330; // DOM_VK_DECIMAL -> GLFW_KEY_KP_DECIMAL + case 0x6F:return 331; // DOM_VK_DIVIDE -> GLFW_KEY_KP_DIVIDE + case 0x6A:return 332; // DOM_VK_MULTIPLY -> GLFW_KEY_KP_MULTIPLY + case 0x6D:return 333; // DOM_VK_SUBTRACT -> GLFW_KEY_KP_SUBTRACT + case 0x6B:return 334; // DOM_VK_ADD -> GLFW_KEY_KP_ADD + // case 0x0D:return 335; // DOM_VK_RETURN -> GLFW_KEY_KP_ENTER (DOM_KEY_LOCATION_RIGHT) + // case 0x61:return 336; // DOM_VK_EQUALS -> GLFW_KEY_KP_EQUAL (DOM_KEY_LOCATION_RIGHT) + case 0x10:return 340; // DOM_VK_SHIFT -> GLFW_KEY_LEFT_SHIFT + case 0x11:return 341; // DOM_VK_CONTROL -> GLFW_KEY_LEFT_CONTROL + case 0x12:return 342; // DOM_VK_ALT -> GLFW_KEY_LEFT_ALT + case 0x5B:return 343; // DOM_VK_WIN -> GLFW_KEY_LEFT_SUPER + case 0xE0:return 343; // DOM_VK_META -> GLFW_KEY_LEFT_SUPER + // case 0x10:return 344; // DOM_VK_SHIFT -> GLFW_KEY_RIGHT_SHIFT (DOM_KEY_LOCATION_RIGHT) + // case 0x11:return 345; // DOM_VK_CONTROL -> GLFW_KEY_RIGHT_CONTROL (DOM_KEY_LOCATION_RIGHT) + // case 0x12:return 346; // DOM_VK_ALT -> GLFW_KEY_RIGHT_ALT (DOM_KEY_LOCATION_RIGHT) + // case 0x5B:return 347; // DOM_VK_WIN -> GLFW_KEY_RIGHT_SUPER (DOM_KEY_LOCATION_RIGHT) + case 0x5D:return 348; // DOM_VK_CONTEXT_MENU -> GLFW_KEY_MENU + // XXX: GLFW_KEY_WORLD_1, GLFW_KEY_WORLD_2 what are these? + default:return -1; // GLFW_KEY_UNKNOWN + }; + }, + getModBits:(win) => { + var mod = 0; + if (win.keys[340]) mod |= 0x0001; // GLFW_MOD_SHIFT + if (win.keys[341]) mod |= 0x0002; // GLFW_MOD_CONTROL + if (win.keys[342]) mod |= 0x0004; // GLFW_MOD_ALT + if (win.keys[343] || win.keys[348]) mod |= 0x0008; // GLFW_MOD_SUPER + // add caps and num lock keys? only if lock_key_mod is set + return mod; + }, + onKeyPress:(event) => { + if (!GLFW.active || !GLFW.active.charFunc) return; + if (event.ctrlKey || event.metaKey) return; + + // correct unicode charCode is only available with onKeyPress event + var charCode = event.charCode; + if (charCode == 0 || (charCode >= 0x00 && charCode <= 0x1F)) return; + + ((a1, a2) => dynCall_vii(GLFW.active.charFunc, a1, a2))(GLFW.active.id, charCode); + }, + onKeyChanged:(keyCode, status) => { + if (!GLFW.active) return; + + var key = GLFW.DOMToGLFWKeyCode(keyCode); + if (key == -1) return; + + var repeat = status && GLFW.active.keys[key]; + GLFW.active.keys[key] = status; + GLFW.active.domKeys[keyCode] = status; + + if (GLFW.active.keyFunc) { + if (repeat) status = 2; // GLFW_REPEAT + ((a1, a2, a3, a4, a5) => dynCall_viiiii(GLFW.active.keyFunc, a1, a2, a3, a4, a5))(GLFW.active.id, key, keyCode, status, GLFW.getModBits(GLFW.active)); + } + }, + onGamepadConnected:(event) => { + GLFW.refreshJoysticks(); + }, + onGamepadDisconnected:(event) => { + GLFW.refreshJoysticks(); + }, + onKeydown:(event) => { + GLFW.onKeyChanged(event.keyCode, 1); // GLFW_PRESS or GLFW_REPEAT + + // This logic comes directly from the sdl implementation. We cannot + // call preventDefault on all keydown events otherwise onKeyPress will + // not get called + if (event.key == 'Backspace' || event.key == 'Tab') { + event.preventDefault(); + } + }, + onKeyup:(event) => { + GLFW.onKeyChanged(event.keyCode, 0); // GLFW_RELEASE + }, + onBlur:(event) => { + if (!GLFW.active) return; + + for (var i = 0; i < GLFW.active.domKeys.length; ++i) { + if (GLFW.active.domKeys[i]) { + GLFW.onKeyChanged(i, 0); // GLFW_RELEASE + } + } + }, + onMousemove:(event) => { + if (!GLFW.active) return; + + if (event.type === 'touchmove') { + // Handling for touch events that are being converted to mouse input. + + // Don't let the browser fire a duplicate mouse event. + event.preventDefault(); + + let primaryChanged = false; + for (let i of event.changedTouches) { + // If our chosen primary touch moved, update Browser mouse coords + if (GLFW.primaryTouchId === i.identifier) { + Browser.setMouseCoords(i.pageX, i.pageY); + primaryChanged = true; + break; + } + } + + if (!primaryChanged) { + // Do not send mouse events if some touch other than the primary triggered this. + return; + } + + } else { + // Handling for non-touch mouse input events. + Browser.calculateMouseEvent(event); + } + + if (event.target != Browser.getCanvas() || !GLFW.active.cursorPosFunc) return; + + if (GLFW.active.cursorPosFunc) { + ((a1, a2, a3) => dynCall_vidd(GLFW.active.cursorPosFunc, a1, a2, a3))(GLFW.active.id, Browser.mouseX, Browser.mouseY); + } + }, + DOMToGLFWMouseButton:(event) => { + // DOM and glfw have different button codes. + // See http://www.w3schools.com/jsref/event_button.asp. + var eventButton = event['button']; + if (eventButton > 0) { + if (eventButton == 1) { + eventButton = 2; + } else { + eventButton = 1; + } + } + return eventButton; + }, + onMouseenter:(event) => { + if (!GLFW.active) return; + + if (event.target != Browser.getCanvas()) return; + + if (GLFW.active.cursorEnterFunc) { + ((a1, a2) => dynCall_vii(GLFW.active.cursorEnterFunc, a1, a2))(GLFW.active.id, 1); + } + }, + onMouseleave:(event) => { + if (!GLFW.active) return; + + if (event.target != Browser.getCanvas()) return; + + if (GLFW.active.cursorEnterFunc) { + ((a1, a2) => dynCall_vii(GLFW.active.cursorEnterFunc, a1, a2))(GLFW.active.id, 0); + } + }, + onMouseButtonChanged:(event, status) => { + if (!GLFW.active) return; + + if (event.target != Browser.getCanvas()) return; + + // Is this from a touch event? + const isTouchType = event.type === 'touchstart' || event.type === 'touchend' || event.type === 'touchcancel'; + + // Only emulating mouse left-click behavior for touches. + let eventButton = 0; + if (isTouchType) { + // Handling for touch events that are being converted to mouse input. + + // Don't let the browser fire a duplicate mouse event. + event.preventDefault(); + + let primaryChanged = false; + + // Set a primary touch if we have none. + if (GLFW.primaryTouchId === null && event.type === 'touchstart' && event.targetTouches.length > 0) { + // Pick the first touch that started in the canvas and treat it as primary. + const chosenTouch = event.targetTouches[0]; + GLFW.primaryTouchId = chosenTouch.identifier; + + Browser.setMouseCoords(chosenTouch.pageX, chosenTouch.pageY); + primaryChanged = true; + } else if (event.type === 'touchend' || event.type === 'touchcancel') { + // Clear the primary touch if it ended. + for (let i of event.changedTouches) { + // If our chosen primary touch ended, remove it. + if (GLFW.primaryTouchId === i.identifier) { + GLFW.primaryTouchId = null; + primaryChanged = true; + break; + } + } + } + + if (!primaryChanged) { + // Do not send mouse events if some touch other than the primary triggered this. + return; + } + + } else { + // Handling for non-touch mouse input events. + Browser.calculateMouseEvent(event); + eventButton = GLFW.DOMToGLFWMouseButton(event); + } + + if (status == 1) { // GLFW_PRESS + GLFW.active.buttons |= (1 << eventButton); + try { + event.target.setCapture(); + } catch (e) {} + } else { // GLFW_RELEASE + GLFW.active.buttons &= ~(1 << eventButton); + } + + // Send mouse event to GLFW. + if (GLFW.active.mouseButtonFunc) { + ((a1, a2, a3, a4) => dynCall_viiii(GLFW.active.mouseButtonFunc, a1, a2, a3, a4))(GLFW.active.id, eventButton, status, GLFW.getModBits(GLFW.active)); + } + }, + onMouseButtonDown:(event) => { + if (!GLFW.active) return; + GLFW.onMouseButtonChanged(event, 1); // GLFW_PRESS + }, + onMouseButtonUp:(event) => { + if (!GLFW.active) return; + GLFW.onMouseButtonChanged(event, 0); // GLFW_RELEASE + }, + onMouseWheel:(event) => { + // Note the minus sign that flips browser wheel direction (positive direction scrolls page down) to native wheel direction (positive direction is mouse wheel up) + var delta = -Browser.getMouseWheelDelta(event); + delta = (delta == 0) ? 0 : (delta > 0 ? Math.max(delta, 1) : Math.min(delta, -1)); // Quantize to integer so that minimum scroll is at least +/- 1. + GLFW.wheelPos += delta; + + if (!GLFW.active || !GLFW.active.scrollFunc || event.target != Browser.getCanvas()) return; + var sx = 0; + var sy = delta; + if (event.type == 'mousewheel') { + sx = event.wheelDeltaX; + } else { + sx = event.deltaX; + } + + ((a1, a2, a3) => dynCall_vidd(GLFW.active.scrollFunc, a1, a2, a3))(GLFW.active.id, sx, sy); + + event.preventDefault(); + }, + onCanvasResize:(width, height, framebufferWidth, framebufferHeight) => { + if (!GLFW.active) return; + + var resizeNeeded = false; + + // If the client is requesting fullscreen mode + if (getFullscreenElement()) { + if (!GLFW.active.fullscreen) { + resizeNeeded = width != screen.width || height != screen.height; + GLFW.active.storedX = GLFW.active.x; + GLFW.active.storedY = GLFW.active.y; + GLFW.active.storedWidth = GLFW.active.width; + GLFW.active.storedHeight = GLFW.active.height; + GLFW.active.x = GLFW.active.y = 0; + GLFW.active.width = screen.width; + GLFW.active.height = screen.height; + GLFW.active.fullscreen = true; + } + // If the client is reverting from fullscreen mode + } else if (GLFW.active.fullscreen == true) { + resizeNeeded = width != GLFW.active.storedWidth || height != GLFW.active.storedHeight; + GLFW.active.x = GLFW.active.storedX; + GLFW.active.y = GLFW.active.storedY; + GLFW.active.width = GLFW.active.storedWidth; + GLFW.active.height = GLFW.active.storedHeight; + GLFW.active.fullscreen = false; + } + + if (resizeNeeded) { + // width or height is changed (fullscreen / exit fullscreen) which will call this listener back + // with proper framebufferWidth/framebufferHeight + Browser.setCanvasSize(GLFW.active.width, GLFW.active.height); + } else if (GLFW.active.width != width || + GLFW.active.height != height || + GLFW.active.framebufferWidth != framebufferWidth || + GLFW.active.framebufferHeight != framebufferHeight) { + GLFW.active.width = width; + GLFW.active.height = height; + GLFW.active.framebufferWidth = framebufferWidth; + GLFW.active.framebufferHeight = framebufferHeight; + GLFW.onWindowSizeChanged(); + GLFW.onFramebufferSizeChanged(); + } + }, + onWindowSizeChanged:() => { + if (!GLFW.active) return; + + if (GLFW.active.windowSizeFunc) { + ((a1, a2, a3) => dynCall_viii(GLFW.active.windowSizeFunc, a1, a2, a3))(GLFW.active.id, GLFW.active.width, GLFW.active.height); + } + }, + onFramebufferSizeChanged:() => { + if (!GLFW.active) return; + + if (GLFW.active.framebufferSizeFunc) { + ((a1, a2, a3) => dynCall_viii(GLFW.active.framebufferSizeFunc, a1, a2, a3))(GLFW.active.id, GLFW.active.framebufferWidth, GLFW.active.framebufferHeight); + } + }, + onWindowContentScaleChanged:(scale) => { + GLFW.scale = scale; + if (!GLFW.active) return; + + if (GLFW.active.windowContentScaleFunc) { + ((a1, a2, a3) => dynCall_viff(GLFW.active.windowContentScaleFunc, a1, a2, a3))(GLFW.active.id, GLFW.scale, GLFW.scale); + } + }, + getTime:() => _emscripten_get_now() / 1000, + setWindowTitle:(winid, title) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + + win.title = title; + if (GLFW.active.id == win.id) { + _emscripten_set_window_title(title); + } + }, + setJoystickCallback:(cbfun) => { + var prevcbfun = GLFW.joystickFunc; + GLFW.joystickFunc = cbfun; + GLFW.refreshJoysticks(); + return prevcbfun; + }, + joys:{ + }, + lastGamepadState:[], + lastGamepadStateFrame:null, + refreshJoysticks:() => { + // Produce a new Gamepad API sample if we are ticking a new game frame, or if not using emscripten_set_main_loop() at all to drive animation. + if (MainLoop.currentFrameNumber !== GLFW.lastGamepadStateFrame || !MainLoop.currentFrameNumber) { + GLFW.lastGamepadState = navigator.getGamepads?.() ?? []; + GLFW.lastGamepadStateFrame = MainLoop.currentFrameNumber; + + for (var joy = 0; joy < GLFW.lastGamepadState.length; ++joy) { + var gamepad = GLFW.lastGamepadState[joy]; + + if (gamepad) { + if (!GLFW.joys[joy]) { + out('glfw joystick connected:',joy); + GLFW.joys[joy] = { + id: stringToNewUTF8(gamepad.id), + buttonsCount: gamepad.buttons.length, + axesCount: gamepad.axes.length, + buttons: _malloc(gamepad.buttons.length), + axes: _malloc(gamepad.axes.length*4), + }; + + if (GLFW.joystickFunc) { + ((a1, a2) => dynCall_vii(GLFW.joystickFunc, a1, a2))(joy, 0x00040001); // GLFW_CONNECTED + } + } + + var data = GLFW.joys[joy]; + + for (var i = 0; i < gamepad.buttons.length; ++i) { + HEAP8[data.buttons + i] = gamepad.buttons[i].pressed; + } + + for (var i = 0; i < gamepad.axes.length; ++i) { + HEAPF32[((data.axes + i*4)>>2)] = gamepad.axes[i]; + } + } else { + if (GLFW.joys[joy]) { + out('glfw joystick disconnected',joy); + + if (GLFW.joystickFunc) { + ((a1, a2) => dynCall_vii(GLFW.joystickFunc, a1, a2))(joy, 0x00040002); // GLFW_DISCONNECTED + } + + _free(GLFW.joys[joy].id); + _free(GLFW.joys[joy].buttons); + _free(GLFW.joys[joy].axes); + + delete GLFW.joys[joy]; + } + } + } + } + }, + setKeyCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.keyFunc; + win.keyFunc = cbfun; + return prevcbfun; + }, + setCharCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.charFunc; + win.charFunc = cbfun; + return prevcbfun; + }, + setMouseButtonCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.mouseButtonFunc; + win.mouseButtonFunc = cbfun; + return prevcbfun; + }, + setCursorPosCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.cursorPosFunc; + win.cursorPosFunc = cbfun; + return prevcbfun; + }, + setScrollCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.scrollFunc; + win.scrollFunc = cbfun; + return prevcbfun; + }, + setDropCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.dropFunc; + win.dropFunc = cbfun; + return prevcbfun; + }, + onDrop:(event) => { + if (!GLFW.active || !GLFW.active.dropFunc) return; + if (!event.dataTransfer || !event.dataTransfer.files || event.dataTransfer.files.length == 0) return; + + event.preventDefault(); + + var drop_dir = '.glfw_dropped_files'; + var filenames = _malloc(event.dataTransfer.files.length * 4); + var filenamesArray = []; + for (var i = 0; i < event.dataTransfer.files.length; ++i) { + var path = `/${drop_dir}/${event.dataTransfer.files[i].name.replace(/\//g, '_')}`; + var filename = stringToNewUTF8(path); + filenamesArray.push(filename); + HEAPU32[(((filenames)+(i*4))>>2)] = filename; + } + + // Read and save the files to emscripten's FS + var written = 0; + FS.createPath('/', drop_dir); + + function save(file, in_path, numfiles) { + var path = '/' + drop_dir + in_path + '/' + file.name.replace(/\//g, '_'); + var reader = new FileReader(); + reader.onloadend = (e) => { + if (reader.readyState != 2) { // not DONE + ++written; + err(`failed to read dropped file: ${in_path}/${file.name}: ${reader.error}`); + return; + } + + var data = e.target.result; + FS.writeFile(path, new Uint8Array(data)); + if (++written === numfiles) { + ((a1, a2, a3) => dynCall_viii(GLFW.active.dropFunc, a1, a2, a3))(GLFW.active.id, filenamesArray.length, filenames); + + for (var i = 0; i < filenamesArray.length; ++i) { + _free(filenamesArray[i]); + } + _free(filenames); + } + }; + reader.readAsArrayBuffer(file); + } + + let filesQ = []; + function finalize() { + var count = filesQ.length; + for (var i = 0; i < count; ++i) { + save(filesQ[i].file, filesQ[i].path, count); + } + } + + if (DataTransferItem.prototype.webkitGetAsEntry) { + let entriesTree = {}; + function markDone(fullpath, recursive) { + if (entriesTree[fullpath].subpaths.length != 0) return; + delete entriesTree[fullpath]; + let parentpath = fullpath.substring(0, fullpath.lastIndexOf('/')); + if (!entriesTree.hasOwnProperty(parentpath)) { + if (Object.keys(entriesTree).length == 0) finalize(); + return; + } + const fpIndex = entriesTree[parentpath].subpaths.indexOf(fullpath); + if (fpIndex > -1) entriesTree[parentpath].subpaths.splice(fpIndex, 1); + if (recursive) markDone(parentpath, true); + if (Object.keys(entriesTree).length == 0) finalize(); + } + function processEntry(entry) { + let fp = entry.fullPath; + let pp = fp.substring(0, fp.lastIndexOf('/')); + entriesTree[fp] = { subpaths: [] }; + if (entry.isFile) { + entry.file((f) => { filesQ.push({ file: f, path: pp }); markDone(fp, false); }) + } else if (entry.isDirectory) { + if (entriesTree.hasOwnProperty(pp)) entriesTree[pp].subpaths.push(fp); + FS.createPath('/' + drop_dir + pp, entry.name); + var reader = entry.createReader(); + var rRead = function (dirEntries) { + if (dirEntries.length == 0) { + markDone(fp, true); + return; + } + for (const ent of dirEntries) processEntry(ent); + reader.readEntries(rRead); + }; + reader.readEntries(rRead); + } + } + for (const item of event.dataTransfer.items) { + processEntry(item.webkitGetAsEntry()); + } + } else { + // fallback for browsers that does not support webkitGetAsEntry + for (const file of event.dataTransfer.files) { + filesQ.push({ file: file, path: '' }); + } + finalize(); + } + + return false; + }, + onDragover:(event) => { + if (!GLFW.active || !GLFW.active.dropFunc) return; + + event.preventDefault(); + return false; + }, + setWindowSizeCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowSizeFunc; + win.windowSizeFunc = cbfun; + + return prevcbfun; + }, + setWindowCloseCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowCloseFunc; + win.windowCloseFunc = cbfun; + return prevcbfun; + }, + setWindowRefreshCallback:(winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowRefreshFunc; + win.windowRefreshFunc = cbfun; + return prevcbfun; + }, + onClickRequestPointerLock:(e) => { + var canvas = Browser.getCanvas(); + if (!Browser.pointerLock && canvas.requestPointerLock) { + canvas.requestPointerLock(); + e.preventDefault(); + } + }, + setInputMode:(winid, mode, value) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + + switch (mode) { + case 0x00033001: { // GLFW_CURSOR + var canvas = Browser.getCanvas(); + switch (value) { + case 0x00034001: { // GLFW_CURSOR_NORMAL + win.inputModes[mode] = value; + canvas.removeEventListener('click', GLFW.onClickRequestPointerLock, true); + document.exitPointerLock(); + break; + } + case 0x00034002: { // GLFW_CURSOR_HIDDEN + err('glfwSetInputMode called with GLFW_CURSOR_HIDDEN value not implemented'); + break; + } + case 0x00034003: { // GLFW_CURSOR_DISABLED + win.inputModes[mode] = value; + canvas.addEventListener('click', GLFW.onClickRequestPointerLock, true); + canvas.requestPointerLock(); + break; + } + default: { + err(`glfwSetInputMode called with unknown value parameter value: ${value}`); + break; + } + } + break; + } + case 0x00033002: { // GLFW_STICKY_KEYS + err('glfwSetInputMode called with GLFW_STICKY_KEYS mode not implemented'); + break; + } + case 0x00033003: { // GLFW_STICKY_MOUSE_BUTTONS + err('glfwSetInputMode called with GLFW_STICKY_MOUSE_BUTTONS mode not implemented'); + break; + } + case 0x00033004: { // GLFW_LOCK_KEY_MODS + err('glfwSetInputMode called with GLFW_LOCK_KEY_MODS mode not implemented'); + break; + } + case 0x00033005: { // GLFW_RAW_MOUSE_MOTION + err('glfwSetInputMode called with GLFW_RAW_MOUSE_MOTION mode not implemented'); + break; + } + default: { + err(`glfwSetInputMode called with unknown mode parameter value: ${mode}`); + break; + } + } + }, + getKey:(winid, key) => { + var win = GLFW.WindowFromId(winid); + if (!win) return 0; + return win.keys[key]; + }, + getMouseButton:(winid, button) => { + var win = GLFW.WindowFromId(winid); + if (!win) return 0; + return (win.buttons & (1 << button)) > 0; + }, + getCursorPos:(winid, x, y) => { + HEAPF64[((x)>>3)] = Browser.mouseX; + HEAPF64[((y)>>3)] = Browser.mouseY; + }, + getMousePos:(winid, x, y) => { + HEAP32[((x)>>2)] = Browser.mouseX; + HEAP32[((y)>>2)] = Browser.mouseY; + }, + setCursorPos:(winid, x, y) => { + }, + getWindowPos:(winid, x, y) => { + var wx = 0; + var wy = 0; + + var win = GLFW.WindowFromId(winid); + if (win) { + wx = win.x; + wy = win.y; + } + + if (x) { + HEAP32[((x)>>2)] = wx; + } + + if (y) { + HEAP32[((y)>>2)] = wy; + } + }, + setWindowPos:(winid, x, y) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + win.x = x; + win.y = y; + }, + getWindowSize:(winid, width, height) => { + var ww = 0; + var wh = 0; + + var win = GLFW.WindowFromId(winid); + if (win) { + ww = win.width; + wh = win.height; + } + + if (width) { + HEAP32[((width)>>2)] = ww; + } + + if (height) { + HEAP32[((height)>>2)] = wh; + } + }, + setWindowSize:(winid, width, height) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + + if (GLFW.active.id == win.id) { + Browser.setCanvasSize(width, height); // triggers the listener (onCanvasResize) + windowSizeFunc + } + }, + defaultWindowHints:() => { + GLFW.hints = {...GLFW.defaultHints}; + }, + createWindow:(width, height, title, monitor, share) => { + var i, id; + for (i = 0; i < GLFW.windows.length && GLFW.windows[i] !== null; i++) { + // no-op + } + if (i > 0) abort('glfwCreateWindow only supports one window at time currently'); + + // id for window + id = i + 1; + + // not valid + if (width <= 0 || height <= 0) return 0; + + if (monitor) { + Browser.requestFullscreen(); + } else { + Browser.setCanvasSize(width, height); + } + + // Create context when there are no existing alive windows + for (i = 0; i < GLFW.windows.length && GLFW.windows[i] == null; i++) { + // no-op + } + + const canvas = Browser.getCanvas(); + + var useWebGL = GLFW.hints[0x00022001] > 0; // Use WebGL when we are told to based on GLFW_CLIENT_API + if (i == GLFW.windows.length) { + if (useWebGL) { + var contextAttributes = { + antialias: (GLFW.hints[0x0002100D] > 1), // GLFW_SAMPLES + depth: (GLFW.hints[0x00021005] > 0), // GLFW_DEPTH_BITS + stencil: (GLFW.hints[0x00021006] > 0), // GLFW_STENCIL_BITS + alpha: (GLFW.hints[0x00021004] > 0) // GLFW_ALPHA_BITS + } + Browser.createContext(canvas, /*useWebGL=*/true, /*setInModule=*/true, contextAttributes); + } else { + Browser.init(); + } + } + + // If context creation failed, do not return a valid window + if (!Module['ctx'] && useWebGL) return 0; + + // Initializes the framebuffer size from the canvas + var win = new GLFW_Window(id, width, height, canvas.width, canvas.height, title, monitor, share); + + // Set window to array + if (id - 1 == GLFW.windows.length) { + GLFW.windows.push(win); + } else { + GLFW.windows[id - 1] = win; + } + + GLFW.active = win; + GLFW.adjustCanvasDimensions(); + return win.id; + }, + destroyWindow:(winid) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + + if (win.windowCloseFunc) { + ((a1) => dynCall_vi(win.windowCloseFunc, a1))(win.id); + } + + GLFW.windows[win.id - 1] = null; + if (GLFW.active.id == win.id) { + GLFW.active = null; + } + + // Destroy context when no alive windows + for (win of GLFW.windows) { + if (win !== null) return; + } + + delete Module['ctx']; + }, + swapBuffers:(winid) => { + }, + requestFullscreen(lockPointer, resizeCanvas) { + Browser.lockPointer = lockPointer; + Browser.resizeCanvas = resizeCanvas; + if (typeof Browser.lockPointer == 'undefined') Browser.lockPointer = true; + if (typeof Browser.resizeCanvas == 'undefined') Browser.resizeCanvas = false; + + var canvas = Browser.getCanvas(); + function fullscreenChange() { + Browser.isFullscreen = false; + var canvasContainer = canvas.parentNode; + if (getFullscreenElement() === canvasContainer) { + canvas.exitFullscreen = Browser.exitFullscreen; + if (Browser.lockPointer) canvas.requestPointerLock(); + Browser.isFullscreen = true; + if (Browser.resizeCanvas) { + Browser.setFullscreenCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + Browser.updateResizeListeners(); + } + } else { + // remove the full screen specific parent of the canvas again to restore the HTML structure from before going full screen + canvasContainer.parentNode.insertBefore(canvas, canvasContainer); + canvasContainer.parentNode.removeChild(canvasContainer); + + if (Browser.resizeCanvas) { + Browser.setWindowedCanvasSize(); + } else { + Browser.updateCanvasDimensions(canvas); + Browser.updateResizeListeners(); + } + } + } + + if (!Browser.fullscreenHandlersInstalled) { + Browser.fullscreenHandlersInstalled = true; + document.addEventListener('fullscreenchange', fullscreenChange); + document.addEventListener('webkitfullscreenchange', fullscreenChange); + } + + // create a new parent to ensure the canvas has no siblings. this allows browsers to optimize full screen performance when its parent is the full screen root + var canvasContainer = document.createElement('div'); + canvas.parentNode.insertBefore(canvasContainer, canvas); + canvasContainer.appendChild(canvas); + + // use parent of canvas as full screen root to allow aspect ratio correction (Firefox stretches the root to screen size) + // Safari didn't Element.requestFullscreen support until 16.4 + // See: https://developer.mozilla.org/en-US/docs/Web/API/Element/requestFullscreen + /** @suppress {checkTypes} */ + canvasContainer.requestFullscreen ??= (canvasContainer.webkitRequestFullscreen ? () => canvasContainer.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT) : null) ?? + (canvasContainer.webkitRequestFullScreen ? () => canvasContainer.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT) : null); + + canvasContainer.requestFullscreen(); + }, + updateCanvasDimensions(canvas, wNative, hNative) { + const scale = GLFW.getHiDPIScale(); + + if (wNative && hNative) { + canvas.widthNative = wNative; + canvas.heightNative = hNative; + } else { + wNative = canvas.widthNative; + hNative = canvas.heightNative; + } + var w = wNative; + var h = hNative; + if ((getFullscreenElement() === canvas.parentNode) && (typeof screen != 'undefined')) { + var factor = Math.min(screen.width / w, screen.height / h); + w = Math.round(w * factor); + h = Math.round(h * factor); + } + if (Browser.resizeCanvas) { + wNative = w; + hNative = h; + } + const wNativeScaled = Math.floor(wNative * scale); + const hNativeScaled = Math.floor(hNative * scale); + if (canvas.width != wNativeScaled) canvas.width = wNativeScaled; + if (canvas.height != hNativeScaled) canvas.height = hNativeScaled; + if (typeof canvas.style != 'undefined') { + if (!GLFW.isCSSScalingEnabled()) { + canvas.style.setProperty( 'width', wNative + 'px', 'important'); + canvas.style.setProperty('height', hNative + 'px', 'important'); + } else { + canvas.style.removeProperty( 'width'); + canvas.style.removeProperty('height'); + } + } + }, + calculateMouseCoords(pageX, pageY) { + // Calculate the movement based on the changes + // in the coordinates. + const rect = Browser.getCanvas().getBoundingClientRect(); + + var adjustedX = pageX - (window.scrollX + rect.left); + var adjustedY = pageY - (window.scrollY + rect.top); + + // getBoundingClientRect() returns dimension affected by CSS, so as a result: + // - when CSS scaling is enabled, this will fix the mouse coordinates to match the width/height of the window + // - otherwise the CSS width/height are forced to the width/height of the GLFW window (see updateCanvasDimensions), + // so there is no need to adjust the position + if (GLFW.isCSSScalingEnabled() && GLFW.active) { + adjustedX = adjustedX * (GLFW.active.width / rect.width); + adjustedY = adjustedY * (GLFW.active.height / rect.height); + } + + return { x: adjustedX, y: adjustedY }; + }, + setWindowAttrib:(winid, attrib, value) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + const isHiDPIAware = GLFW.isHiDPIAware(); + win.attributes[attrib] = value; + if (isHiDPIAware !== GLFW.isHiDPIAware()) + GLFW.adjustCanvasDimensions(); + }, + getDevicePixelRatio() { + return (typeof devicePixelRatio == 'number' && devicePixelRatio) || 1.0; + }, + isHiDPIAware() { + if (GLFW.active) + return GLFW.active.attributes[0x0002200C] > 0; // GLFW_SCALE_TO_MONITOR + else + return false; + }, + isCSSScalingEnabled() { + return !GLFW.isHiDPIAware(); + }, + adjustCanvasDimensions() { + if (GLFW.active) { + Browser.updateCanvasDimensions(Browser.getCanvas(), GLFW.active.width, GLFW.active.height); + Browser.updateResizeListeners(); + } + }, + getHiDPIScale() { + return GLFW.isHiDPIAware() ? GLFW.scale : 1.0; + }, + onDevicePixelRatioChange() { + GLFW.onWindowContentScaleChanged(GLFW.getDevicePixelRatio()); + GLFW.adjustCanvasDimensions(); + }, + GLFW2ParamToGLFW3Param:(param) => { + var table = { + 0x00030001:0, // GLFW_MOUSE_CURSOR + 0x00030002:0, // GLFW_STICKY_KEYS + 0x00030003:0, // GLFW_STICKY_MOUSE_BUTTONS + 0x00030004:0, // GLFW_SYSTEM_KEYS + 0x00030005:0, // GLFW_KEY_REPEAT + 0x00030006:0, // GLFW_AUTO_POLL_EVENTS + 0x00020001:0, // GLFW_OPENED + 0x00020002:0, // GLFW_ACTIVE + 0x00020003:0, // GLFW_ICONIFIED + 0x00020004:0, // GLFW_ACCELERATED + 0x00020005:0x00021001, // GLFW_RED_BITS + 0x00020006:0x00021002, // GLFW_GREEN_BITS + 0x00020007:0x00021003, // GLFW_BLUE_BITS + 0x00020008:0x00021004, // GLFW_ALPHA_BITS + 0x00020009:0x00021005, // GLFW_DEPTH_BITS + 0x0002000A:0x00021006, // GLFW_STENCIL_BITS + 0x0002000B:0x0002100F, // GLFW_REFRESH_RATE + 0x0002000C:0x00021007, // GLFW_ACCUM_RED_BITS + 0x0002000D:0x00021008, // GLFW_ACCUM_GREEN_BITS + 0x0002000E:0x00021009, // GLFW_ACCUM_BLUE_BITS + 0x0002000F:0x0002100A, // GLFW_ACCUM_ALPHA_BITS + 0x00020010:0x0002100B, // GLFW_AUX_BUFFERS + 0x00020011:0x0002100C, // GLFW_STEREO + 0x00020012:0, // GLFW_WINDOW_NO_RESIZE + 0x00020013:0x0002100D, // GLFW_FSAA_SAMPLES + 0x00020014:0x00022002, // GLFW_OPENGL_VERSION_MAJOR + 0x00020015:0x00022003, // GLFW_OPENGL_VERSION_MINOR + 0x00020016:0x00022006, // GLFW_OPENGL_FORWARD_COMPAT + 0x00020017:0x00022007, // GLFW_OPENGL_DEBUG_CONTEXT + 0x00020018:0x00022008, // GLFW_OPENGL_PROFILE + }; + return table[param]; + }, + }; + var _glfwCreateWindow = (width, height, title, monitor, share) => GLFW.createWindow(width, height, title, monitor, share); + + var _glfwDefaultWindowHints = () => GLFW.defaultWindowHints(); + + var _glfwDestroyWindow = (winid) => GLFW.destroyWindow(winid); + + var _glfwGetPrimaryMonitor = () => 1; + + var _glfwGetTime = () => GLFW.getTime() - GLFW.initialTime; + + + var _glfwGetVideoModes = (monitor, count) => { + HEAP32[((count)>>2)] = 0; + return 0; + }; + + var _glfwInit = () => { + if (GLFW.windows) return 1; // GL_TRUE + + GLFW.initialTime = GLFW.getTime(); + GLFW.defaultWindowHints(); + GLFW.windows = new Array() + GLFW.active = null; + GLFW.scale = GLFW.getDevicePixelRatio(); + + window.addEventListener('gamepadconnected', GLFW.onGamepadConnected, true); + window.addEventListener('gamepaddisconnected', GLFW.onGamepadDisconnected, true); + window.addEventListener('keydown', GLFW.onKeydown, true); + window.addEventListener('keypress', GLFW.onKeyPress, true); + window.addEventListener('keyup', GLFW.onKeyup, true); + window.addEventListener('blur', GLFW.onBlur, true); + + // watch for devicePixelRatio changes + GLFW.devicePixelRatioMQL = window.matchMedia('(resolution: ' + GLFW.getDevicePixelRatio() + 'dppx)'); + GLFW.devicePixelRatioMQL.addEventListener('change', GLFW.onDevicePixelRatioChange); + + var canvas = Browser.getCanvas(); + canvas.addEventListener('touchmove', GLFW.onMousemove, true); + canvas.addEventListener('touchstart', GLFW.onMouseButtonDown, true); + canvas.addEventListener('touchcancel', GLFW.onMouseButtonUp, true); + canvas.addEventListener('touchend', GLFW.onMouseButtonUp, true); + canvas.addEventListener('mousemove', GLFW.onMousemove, true); + canvas.addEventListener('mousedown', GLFW.onMouseButtonDown, true); + canvas.addEventListener('mouseup', GLFW.onMouseButtonUp, true); + canvas.addEventListener('wheel', GLFW.onMouseWheel, true); + canvas.addEventListener('mousewheel', GLFW.onMouseWheel, true); + canvas.addEventListener('mouseenter', GLFW.onMouseenter, true); + canvas.addEventListener('mouseleave', GLFW.onMouseleave, true); + canvas.addEventListener('drop', GLFW.onDrop, true); + canvas.addEventListener('dragover', GLFW.onDragover, true); + + // Overriding implementation to account for HiDPI + Browser.requestFullscreen = GLFW.requestFullscreen; + Browser.calculateMouseCoords = GLFW.calculateMouseCoords; + Browser.updateCanvasDimensions = GLFW.updateCanvasDimensions; + + Browser.resizeListeners.push((width, height) => { + if (GLFW.isHiDPIAware()) { + var canvas = Browser.getCanvas(); + GLFW.onCanvasResize(canvas.clientWidth, canvas.clientHeight, width, height); + } else { + GLFW.onCanvasResize(width, height, width, height); + } + }); + + return 1; // GL_TRUE + }; + + var _glfwMakeContextCurrent = (winid) => 0; + + var _glfwSetCharCallback = (winid, cbfun) => GLFW.setCharCallback(winid, cbfun); + + var _glfwSetCursorEnterCallback = (winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.cursorEnterFunc; + win.cursorEnterFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetCursorPosCallback = (winid, cbfun) => GLFW.setCursorPosCallback(winid, cbfun); + + var _glfwSetDropCallback = (winid, cbfun) => GLFW.setDropCallback(winid, cbfun); + + var _glfwSetErrorCallback = (cbfun) => { + var prevcbfun = GLFW.errorFunc; + GLFW.errorFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetKeyCallback = (winid, cbfun) => GLFW.setKeyCallback(winid, cbfun); + + var _glfwSetMouseButtonCallback = (winid, cbfun) => GLFW.setMouseButtonCallback(winid, cbfun); + + var _glfwSetScrollCallback = (winid, cbfun) => GLFW.setScrollCallback(winid, cbfun); + + var _glfwSetWindowContentScaleCallback = (winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowContentScaleFunc; + win.windowContentScaleFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetWindowFocusCallback = (winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowFocusFunc; + win.windowFocusFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetWindowIconifyCallback = (winid, cbfun) => { + var win = GLFW.WindowFromId(winid); + if (!win) return null; + var prevcbfun = win.windowIconifyFunc; + win.windowIconifyFunc = cbfun; + return prevcbfun; + }; + + var _glfwSetWindowShouldClose = (winid, value) => { + var win = GLFW.WindowFromId(winid); + if (!win) return; + win.shouldClose = value; + }; + + var _glfwSetWindowSize = (winid, width, height) => GLFW.setWindowSize(winid, width, height); + + var _glfwSetWindowSizeCallback = (winid, cbfun) => GLFW.setWindowSizeCallback(winid, cbfun); + + var _glfwSwapBuffers = (winid) => GLFW.swapBuffers(winid); + + var _glfwTerminate = () => { + window.removeEventListener('gamepadconnected', GLFW.onGamepadConnected, true); + window.removeEventListener('gamepaddisconnected', GLFW.onGamepadDisconnected, true); + window.removeEventListener('keydown', GLFW.onKeydown, true); + window.removeEventListener('keypress', GLFW.onKeyPress, true); + window.removeEventListener('keyup', GLFW.onKeyup, true); + window.removeEventListener('blur', GLFW.onBlur, true); + var canvas = Browser.getCanvas(); + canvas.removeEventListener('touchmove', GLFW.onMousemove, true); + canvas.removeEventListener('touchstart', GLFW.onMouseButtonDown, true); + canvas.removeEventListener('touchcancel', GLFW.onMouseButtonUp, true); + canvas.removeEventListener('touchend', GLFW.onMouseButtonUp, true); + canvas.removeEventListener('mousemove', GLFW.onMousemove, true); + canvas.removeEventListener('mousedown', GLFW.onMouseButtonDown, true); + canvas.removeEventListener('mouseup', GLFW.onMouseButtonUp, true); + canvas.removeEventListener('wheel', GLFW.onMouseWheel, true); + canvas.removeEventListener('mousewheel', GLFW.onMouseWheel, true); + canvas.removeEventListener('mouseenter', GLFW.onMouseenter, true); + canvas.removeEventListener('mouseleave', GLFW.onMouseleave, true); + canvas.removeEventListener('drop', GLFW.onDrop, true); + canvas.removeEventListener('dragover', GLFW.onDragover, true); + + if (GLFW.devicePixelRatioMQL) + GLFW.devicePixelRatioMQL.removeEventListener('change', GLFW.onDevicePixelRatioChange); + + canvas.width = canvas.height = 1; + GLFW.windows = null; + GLFW.active = null; + }; + + var _glfwWindowHint = (target, hint) => { + GLFW.hints[target] = hint; + }; + + + + + var runAndAbortIfError = (func) => { + try { + return func(); + } catch (e) { + abort(e); + } + }; + + + var createNamedFunction = (name, func) => Object.defineProperty(func, 'name', { value: name }); + + var runtimeKeepalivePush = () => { + runtimeKeepaliveCounter += 1; + }; + + var runtimeKeepalivePop = () => { + assert(runtimeKeepaliveCounter > 0); + runtimeKeepaliveCounter -= 1; + }; + + + + + var Asyncify = { + instrumentWasmImports(imports) { + var importPattern = /^(invoke_.*|__asyncjs__.*)$/; + + for (let [x, original] of Object.entries(imports)) { + if (typeof original == 'function') { + let isAsyncifyImport = original.isAsync || importPattern.test(x); + imports[x] = (...args) => { + var originalAsyncifyState = Asyncify.state; + try { + return original(...args); + } finally { + // Only asyncify-declared imports are allowed to change the + // state. + // Changing the state from normal to disabled is allowed (in any + // function) as that is what shutdown does (and we don't have an + // explicit list of shutdown imports). + var changedToDisabled = + originalAsyncifyState === Asyncify.State.Normal && + Asyncify.state === Asyncify.State.Disabled; + // invoke_* functions are allowed to change the state if we do + // not ignore indirect calls. + var ignoredInvoke = x.startsWith('invoke_') && + true; + if (Asyncify.state !== originalAsyncifyState && + !isAsyncifyImport && + !changedToDisabled && + !ignoredInvoke) { + abort(`import ${x} was not in ASYNCIFY_IMPORTS, but changed the state`); + } + } + }; + } + } + }, + instrumentFunction(original) { + var wrapper = (...args) => { + Asyncify.exportCallStack.push(original); + try { + return original(...args); + } finally { + if (!ABORT) { + var top = Asyncify.exportCallStack.pop(); + assert(top === original); + Asyncify.maybeStopUnwind(); + } + } + }; + Asyncify.funcWrappers.set(original, wrapper); + wrapper = createNamedFunction(`__asyncify_wrapper_${original.name}`, wrapper); + return wrapper; + }, + instrumentWasmExports(exports) { + var ret = {}; + for (let [x, original] of Object.entries(exports)) { + if (typeof original == 'function') { + var wrapper = Asyncify.instrumentFunction(original); + ret[x] = wrapper; + } else { + ret[x] = original; + } + } + return ret; + }, + State:{ + Normal:0, + Unwinding:1, + Rewinding:2, + Disabled:3, + }, + state:0, + StackSize:4096, + currData:null, + handleSleepReturnValue:0, + exportCallStack:[], + callstackFuncToId:new Map, + callStackIdToFunc:new Map, + funcWrappers:new Map, + callStackId:0, + asyncPromiseHandlers:null, + sleepCallbacks:[], + getCallStackId(func) { + assert(func); + if (!Asyncify.callstackFuncToId.has(func)) { + var id = Asyncify.callStackId++; + Asyncify.callstackFuncToId.set(func, id); + Asyncify.callStackIdToFunc.set(id, func); + } + return Asyncify.callstackFuncToId.get(func); + }, + maybeStopUnwind() { + if (Asyncify.currData && + Asyncify.state === Asyncify.State.Unwinding && + Asyncify.exportCallStack.length === 0) { + // We just finished unwinding. + // Be sure to set the state before calling any other functions to avoid + // possible infinite recursion here (For example in debug pthread builds + // the dbg() function itself can call back into WebAssembly to get the + // current pthread_self() pointer). + Asyncify.state = Asyncify.State.Normal; + + // Keep the runtime alive so that a re-wind can be done later. + runAndAbortIfError(_asyncify_stop_unwind); + if (typeof Fibers != 'undefined') { + Fibers.trampoline(); + } + } + }, + whenDone() { + assert(Asyncify.currData, 'tried to wait for an async operation when none is in progress'); + assert(!Asyncify.asyncPromiseHandlers, 'cannot have multiple async operations in flight at once'); + return new Promise((resolve, reject) => { + Asyncify.asyncPromiseHandlers = { resolve, reject }; + }); + }, + allocateData() { + // An asyncify data structure has three fields: + // 0 current stack pos + // 4 max stack pos + // 8 id of function at bottom of the call stack (callStackIdToFunc[id] == wasm func) + // + // The Asyncify ABI only interprets the first two fields, the rest is for the runtime. + // We also embed a stack in the same memory region here, right next to the structure. + // This struct is also defined as asyncify_data_t in emscripten/fiber.h + var ptr = _malloc(12 + Asyncify.StackSize); + Asyncify.setDataHeader(ptr, ptr + 12, Asyncify.StackSize); + Asyncify.setDataRewindFunc(ptr); + return ptr; + }, + setDataHeader(ptr, stack, stackSize) { + HEAPU32[((ptr)>>2)] = stack; + HEAPU32[(((ptr)+(4))>>2)] = stack + stackSize; + }, + setDataRewindFunc(ptr) { + var bottomOfCallStack = Asyncify.exportCallStack[0]; + assert(bottomOfCallStack, 'exportCallStack is empty'); + var rewindId = Asyncify.getCallStackId(bottomOfCallStack); + HEAP32[(((ptr)+(8))>>2)] = rewindId; + }, + getDataRewindFunc(ptr) { + var id = HEAP32[(((ptr)+(8))>>2)]; + var func = Asyncify.callStackIdToFunc.get(id); + assert(func, `id ${id} not found in callStackIdToFunc`); + return func; + }, + doRewind(ptr) { + var original = Asyncify.getDataRewindFunc(ptr); + var func = Asyncify.funcWrappers.get(original); + assert(original); + assert(func); + // Once we have rewound and the stack we no longer need to artificially + // keep the runtime alive. + + return callUserCallback(func); + }, + handleSleep(startAsync) { + assert(Asyncify.state !== Asyncify.State.Disabled, 'handleSleep called after Asyncify was shut down'); + if (ABORT) return; + if (Asyncify.state === Asyncify.State.Normal) { + // Prepare to sleep. Call startAsync, and see what happens: + // if the code decided to call our callback synchronously, + // then no async operation was in fact begun, and we don't + // need to do anything. + var reachedCallback = false; + var reachedAfterCallback = false; + startAsync((handleSleepReturnValue = 0) => { + // old emterpretify API supported other stuff + assert(['undefined', 'number', 'boolean', 'bigint'].includes(typeof handleSleepReturnValue), `invalid type for handleSleepReturnValue: '${typeof handleSleepReturnValue}'`); + if (ABORT) return; + Asyncify.handleSleepReturnValue = handleSleepReturnValue; + reachedCallback = true; + if (!reachedAfterCallback) { + // We are happening synchronously, so no need for async. + return; + } + // This async operation did not happen synchronously, so we did + // unwind. In that case there can be no compiled code on the stack, + // as it might break later operations (we can rewind ok now, but if + // we unwind again, we would unwind through the extra compiled code + // too). + assert(!Asyncify.exportCallStack.length, 'waking up (starting to rewind) must be done from JS, without compiled code on the stack'); + Asyncify.state = Asyncify.State.Rewinding; + runAndAbortIfError(() => _asyncify_start_rewind(Asyncify.currData)); + if (typeof MainLoop != 'undefined' && MainLoop.func) { + MainLoop.resume(); + } + var asyncWasmReturnValue, isError = false; + try { + asyncWasmReturnValue = Asyncify.doRewind(Asyncify.currData); + } catch (err) { + asyncWasmReturnValue = err; + isError = true; + } + // Track whether the return value was handled by any promise handlers. + var handled = false; + if (!Asyncify.currData) { + // All asynchronous execution has finished. + // `asyncWasmReturnValue` now contains the final + // return value of the exported async WASM function. + // + // Note: `asyncWasmReturnValue` is distinct from + // `Asyncify.handleSleepReturnValue`. + // `Asyncify.handleSleepReturnValue` contains the return + // value of the last C function to have executed + // `Asyncify.handleSleep()`, whereas `asyncWasmReturnValue` + // contains the return value of the exported WASM function + // that may have called C functions that + // call `Asyncify.handleSleep()`. + var asyncPromiseHandlers = Asyncify.asyncPromiseHandlers; + if (asyncPromiseHandlers) { + Asyncify.asyncPromiseHandlers = null; + (isError ? asyncPromiseHandlers.reject : asyncPromiseHandlers.resolve)(asyncWasmReturnValue); + handled = true; + } + } + if (isError && !handled) { + // If there was an error and it was not handled by now, we have no choice but to + // rethrow that error into the global scope where it can be caught only by + // `onerror` or `onunhandledpromiserejection`. + throw asyncWasmReturnValue; + } + }); + reachedAfterCallback = true; + if (!reachedCallback) { + // A true async operation was begun; start a sleep. + Asyncify.state = Asyncify.State.Unwinding; + // TODO: reuse, don't alloc/free every sleep + Asyncify.currData = Asyncify.allocateData(); + if (typeof MainLoop != 'undefined' && MainLoop.func) { + MainLoop.pause(); + } + runAndAbortIfError(() => _asyncify_start_unwind(Asyncify.currData)); + } + } else if (Asyncify.state === Asyncify.State.Rewinding) { + // Stop a resume. + Asyncify.state = Asyncify.State.Normal; + runAndAbortIfError(_asyncify_stop_rewind); + _free(Asyncify.currData); + Asyncify.currData = null; + // Call all sleep callbacks now that the sleep-resume is all done. + Asyncify.sleepCallbacks.forEach(callUserCallback); + } else { + abort(`invalid state: ${Asyncify.state}`); + } + return Asyncify.handleSleepReturnValue; + }, + handleAsync:(startAsync) => Asyncify.handleSleep(async (wakeUp) => { + // TODO: add error handling as a second param when handleSleep implements it. + wakeUp(await startAsync()); + }), + }; + + + + + + + + + /** + * @param {number} ptr + * @param {number} value + * @param {string} type + */ + function setValue(ptr, value, type = 'i8') { + if (type.endsWith('*')) type = '*'; + switch (type) { + case 'i1': HEAP8[ptr] = value; break; + case 'i8': HEAP8[ptr] = value; break; + case 'i16': HEAP16[((ptr)>>1)] = value; break; + case 'i32': HEAP32[((ptr)>>2)] = value; break; + case 'i64': HEAP64[((ptr)>>3)] = BigInt(value); break; + case 'float': HEAPF32[((ptr)>>2)] = value; break; + case 'double': HEAPF64[((ptr)>>3)] = value; break; + case '*': HEAPU32[((ptr)>>2)] = value; break; + default: abort(`invalid type for setValue: ${type}`); + } + } + + + + + + + var requestFullscreen = Browser.requestFullscreen; + + var FS_createPath = (...args) => FS.createPath(...args); + + + + var FS_unlink = (...args) => FS.unlink(...args); + + var FS_createLazyFile = (...args) => FS.createLazyFile(...args); + + var FS_createDevice = (...args) => FS.createDevice(...args); + + + + FS.createPreloadedFile = FS_createPreloadedFile; + FS.preloadFile = FS_preloadFile; + FS.staticInit();; +for (let i = 0; i < 32; ++i) tempFixedLengthArray.push(new Array(i));; +var miniTempWebGLFloatBuffersStorage = new Float32Array(288); + // Create GL_POOL_TEMP_BUFFERS_SIZE+1 temporary buffers, for uploads of size 0 through GL_POOL_TEMP_BUFFERS_SIZE inclusive + for (/**@suppress{duplicate}*/var i = 0; i <= 288; ++i) { + miniTempWebGLFloatBuffers[i] = miniTempWebGLFloatBuffersStorage.subarray(0, i); + }; +var miniTempWebGLIntBuffersStorage = new Int32Array(288); + // Create GL_POOL_TEMP_BUFFERS_SIZE+1 temporary buffers, for uploads of size 0 through GL_POOL_TEMP_BUFFERS_SIZE inclusive + for (/**@suppress{duplicate}*/var i = 0; i <= 288; ++i) { + miniTempWebGLIntBuffers[i] = miniTempWebGLIntBuffersStorage.subarray(0, i); + }; + + Module['requestAnimationFrame'] = MainLoop.requestAnimationFrame; + Module['pauseMainLoop'] = MainLoop.pause; + Module['resumeMainLoop'] = MainLoop.resume; + MainLoop.init();; +// End JS library code + +// include: postlibrary.js +// This file is included after the automatically-generated JS library code +// but before the wasm module is created. + +{ + + // Begin ATMODULES hooks + if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime']; + +if (Module['print']) out = Module['print']; +if (Module['printErr']) err = Module['printErr']; + // End ATMODULES hooks + + checkIncomingModuleAPI(); + + if (Module['arguments']) programArgs = Module['arguments']; + if (Module['thisProgram']) thisProgram = Module['thisProgram']; + + // Assertions on removed incoming Module JS APIs. + assert(typeof Module['memoryInitializerPrefixURL'] == 'undefined', 'Module.memoryInitializerPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['pthreadMainPrefixURL'] == 'undefined', 'Module.pthreadMainPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['cdInitializerPrefixURL'] == 'undefined', 'Module.cdInitializerPrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['filePackagePrefixURL'] == 'undefined', 'Module.filePackagePrefixURL option was removed, use Module.locateFile instead'); + assert(typeof Module['read'] == 'undefined', 'Module.read option was removed'); + assert(typeof Module['readAsync'] == 'undefined', 'Module.readAsync option was removed (modify readAsync in JS)'); + assert(typeof Module['readBinary'] == 'undefined', 'Module.readBinary option was removed (modify readBinary in JS)'); + assert(typeof Module['setWindowTitle'] == 'undefined', 'Module.setWindowTitle option was removed (modify emscripten_set_window_title in JS)'); + assert(typeof Module['TOTAL_MEMORY'] == 'undefined', 'Module.TOTAL_MEMORY has been renamed Module.INITIAL_MEMORY'); + assert(typeof Module['ENVIRONMENT'] == 'undefined', 'Module.ENVIRONMENT has been deprecated. To force the environment, use the ENVIRONMENT compile-time option (for example, -sENVIRONMENT=web or -sENVIRONMENT=node)'); + assert(typeof Module['STACK_SIZE'] == 'undefined', 'STACK_SIZE can no longer be set at runtime. Use -sSTACK_SIZE at link time') + // If memory is defined in wasm, the user can't provide it, or set INITIAL_MEMORY + assert(typeof Module['wasmMemory'] == 'undefined', 'Use of `wasmMemory` detected. Use -sIMPORTED_MEMORY to define wasmMemory externally'); + assert(typeof Module['INITIAL_MEMORY'] == 'undefined', 'Detected runtime INITIAL_MEMORY setting. Use -sIMPORTED_MEMORY to define wasmMemory dynamically'); + + var preInit = Module['preInit']; + if (preInit) { + if (typeof preInit == 'function') Module['preInit'] = preInit = [preInit]; + // Written as a loop so that preInit functions that themselves add more + // preInit functions. Is this actually needed? + while (preInit.length > 0) { + preInit.shift()(); + } + } + consumedModuleProp('preInit'); +} + +// Begin runtime exports + Module['addRunDependency'] = addRunDependency; + Module['removeRunDependency'] = removeRunDependency; + Module['requestFullscreen'] = requestFullscreen; + Module['FS_preloadFile'] = FS_preloadFile; + Module['FS_unlink'] = FS_unlink; + Module['FS_createPath'] = FS_createPath; + Module['FS_createDevice'] = FS_createDevice; + Module['FS_createDataFile'] = FS_createDataFile; + Module['FS_createLazyFile'] = FS_createLazyFile; + var missingLibrarySymbols = [ + 'writeI53ToI64Clamped', + 'writeI53ToI64Signaling', + 'writeI53ToU64Clamped', + 'writeI53ToU64Signaling', + 'convertI32PairToI53', + 'convertI32PairToI53Checked', + 'convertU32PairToI53', + 'stackAlloc', + 'getTempRet0', + 'setTempRet0', + 'zeroMemory', + 'getHeapMax', + 'growMemory', + 'withStackSave', + 'inetPton4', + 'inetNtop4', + 'inetPton6', + 'inetNtop6', + 'readSockaddr', + 'writeSockaddr', + 'runMainThreadEmAsm', + 'getExecutableName', + 'autoResumeAudioContext', + 'getDynCaller', + 'asmjsMangle', + 'alignMemory', + 'HandleAllocator', + 'addOnInit', + 'addOnPostCtor', + 'addOnPreMain', + 'STACK_SIZE', + 'STACK_ALIGN', + 'POINTER_SIZE', + 'ASSERTIONS', + 'ccall', + 'cwrap', + 'convertJsFunctionToWasm', + 'getEmptyTableSlot', + 'updateTableMap', + 'getFunctionAddress', + 'addFunction', + 'removeFunction', + 'getValue', + 'intArrayToString', + 'AsciiToString', + 'stringToAscii', + 'UTF16ToString', + 'stringToUTF16', + 'lengthBytesUTF16', + 'UTF32ToString', + 'stringToUTF32', + 'lengthBytesUTF32', + 'stringToUTF8OnStack', + 'writeArrayToMemory', + 'registerKeyEventCallback', + 'registerWheelEventCallback', + 'fillDeviceOrientationEventData', + 'registerDeviceOrientationEventCallback', + 'fillDeviceMotionEventData', + 'registerDeviceMotionEventCallback', + 'screenOrientation', + 'fillOrientationChangeEventData', + 'registerOrientationChangeEventCallback', + 'callCanvasResizedCallback', + 'JSEvents_requestFullscreen', + 'JSEvents_resizeCanvasForFullscreen', + 'registerRestoreOldStyle', + 'hideEverythingExceptGivenElement', + 'restoreHiddenElements', + 'setLetterbox', + 'currentFullscreenStrategy', + 'softFullscreenResizeWebGLRenderTarget', + 'doRequestFullscreen', + 'registerPointerlockErrorEventCallback', + 'requestPointerLock', + 'registerBeforeUnloadEventCallback', + 'fillBatteryEventData', + 'registerBatteryEventCallback', + 'setCanvasElementSize', + 'getCanvasElementSize', + 'jsStackTrace', + 'getCallstack', + 'convertPCtoSourceLocation', + 'getEnvStrings', + 'wasiRightsToMuslOFlags', + 'wasiOFlagsToMuslOFlags', + 'setImmediateWrapped', + 'safeRequestAnimationFrame', + 'clearImmediateWrapped', + 'registerPostMainLoop', + 'registerPreMainLoop', + 'getPromise', + 'makePromise', + 'addPromise', + 'idsToPromises', + 'makePromiseCallback', + 'ExceptionInfo', + 'findMatchingCatch', + 'incrementUncaughtExceptionCount', + 'decrementUncaughtExceptionCount', + 'Browser_asyncPrepareDataCounter', + 'isLeapYear', + 'ydayFromDate', + 'arraySum', + 'addDays', + 'getSocketFromFD', + 'getSocketAddress', + 'FS_mkdirTree', + '_setNetworkCallback', + 'writeGLArray', + 'registerWebGlEventCallback', + 'writeStringToMemory', + 'writeAsciiToMemory', + 'allocateUTF8', + 'allocateUTF8OnStack', + 'demangle', + 'stackTrace', + 'getNativeTypeSize', +]; +missingLibrarySymbols.forEach(missingLibrarySymbol) + + var unexportedSymbols = [ + 'run', + 'out', + 'err', + 'callMain', + 'abort', + 'wasmExports', + 'writeStackCookie', + 'checkStackCookie', + 'writeI53ToI64', + 'readI53FromI64', + 'readI53FromU64', + 'INT53_MAX', + 'INT53_MIN', + 'bigintToI53Checked', + 'HEAP8', + 'HEAPU8', + 'HEAP16', + 'HEAPU16', + 'HEAP32', + 'HEAPU32', + 'HEAPF32', + 'HEAPF64', + 'HEAP64', + 'HEAPU64', + 'stackSave', + 'stackRestore', + 'createNamedFunction', + 'ptrToString', + 'exitJS', + 'abortOnCannotGrowMemory', + 'ENV', + 'ERRNO_CODES', + 'strError', + 'DNS', + 'Protocols', + 'Sockets', + 'timers', + 'warnOnce', + 'readEmAsmArgsArray', + 'readEmAsmArgs', + 'runEmAsmFunction', + 'jstoi_q', + 'dynCallLegacy', + 'dynCall', + 'handleException', + 'keepRuntimeAlive', + 'runtimeKeepalivePush', + 'runtimeKeepalivePop', + 'callUserCallback', + 'maybeExit', + 'asyncLoad', + 'mmapAlloc', + 'wasmTable', + 'wasmMemory', + 'getUniqueRunDependency', + 'noExitRuntime', + 'addOnPreRun', + 'addOnExit', + 'addOnPostRun', + 'freeTableIndexes', + 'functionsInTableMap', + 'setValue', + 'PATH', + 'PATH_FS', + 'UTF8Decoder', + 'UTF8ArrayToString', + 'UTF8ToString', + 'stringToUTF8Array', + 'stringToUTF8', + 'lengthBytesUTF8', + 'intArrayFromString', + 'UTF16Decoder', + 'stringToNewUTF8', + 'JSEvents', + 'specialHTMLTargets', + 'maybeCStringToJsString', + 'findEventTarget', + 'findCanvasEventTarget', + 'getBoundingClientRect', + 'fillMouseEventData', + 'registerMouseEventCallback', + 'registerUiEventCallback', + 'registerFocusEventCallback', + 'fillFullscreenChangeEventData', + 'registerFullscreenChangeEventCallback', + 'restoreOldWindowedStyle', + 'fillPointerlockChangeEventData', + 'registerPointerlockChangeEventCallback', + 'fillVisibilityChangeEventData', + 'registerVisibilityChangeEventCallback', + 'registerTouchEventCallback', + 'fillGamepadEventData', + 'registerGamepadEventCallback', + 'UNWIND_CACHE', + 'ExitStatus', + 'checkWasiClock', + 'doReadv', + 'doWritev', + 'initRandomFill', + 'randomFill', + 'safeSetTimeout', + 'emSetImmediate', + 'emClearImmediate_deps', + 'emClearImmediate', + 'promiseMap', + 'uncaughtExceptionCount', + 'exceptionCaught', + 'Browser', + 'setCanvasSize', + 'getUserMedia', + 'createContext', + 'getPreloadedImageData__data', + 'wget', + 'MONTH_DAYS_REGULAR', + 'MONTH_DAYS_LEAP', + 'MONTH_DAYS_REGULAR_CUMULATIVE', + 'MONTH_DAYS_LEAP_CUMULATIVE', + 'SYSCALLS', + 'preloadPlugins', + 'FS_createPreloadedFile', + 'FS_modeStringToFlags', + 'FS_getMode', + 'FS_fileDataToTypedArray', + 'FS_stdin_getChar_buffer', + 'FS_stdin_getChar', + 'FS_readFile', + 'FS', + 'FS_root', + 'FS_mounts', + 'FS_devices', + 'FS_streams', + 'FS_nextInode', + 'FS_nameTable', + 'FS_currentPath', + 'FS_initialized', + 'FS_ignorePermissions', + 'FS_filesystems', + 'FS_syncFSRequests', + 'FS_lookupPath', + 'FS_getPath', + 'FS_hashName', + 'FS_hashAddNode', + 'FS_hashRemoveNode', + 'FS_lookupNode', + 'FS_createNode', + 'FS_destroyNode', + 'FS_isRoot', + 'FS_isMountpoint', + 'FS_isFile', + 'FS_isDir', + 'FS_isLink', + 'FS_isChrdev', + 'FS_isBlkdev', + 'FS_isFIFO', + 'FS_isSocket', + 'FS_flagsToPermissionString', + 'FS_nodePermissions', + 'FS_mayLookup', + 'FS_mayCreate', + 'FS_mayDelete', + 'FS_mayOpen', + 'FS_checkOpExists', + 'FS_nextfd', + 'FS_getStreamChecked', + 'FS_getStream', + 'FS_createStream', + 'FS_closeStream', + 'FS_dupStream', + 'FS_doSetAttr', + 'FS_chrdev_stream_ops', + 'FS_major', + 'FS_minor', + 'FS_makedev', + 'FS_registerDevice', + 'FS_getDevice', + 'FS_getMounts', + 'FS_syncfs', + 'FS_mount', + 'FS_unmount', + 'FS_lookup', + 'FS_mknod', + 'FS_statfs', + 'FS_statfsStream', + 'FS_statfsNode', + 'FS_create', + 'FS_mkdir', + 'FS_mkdev', + 'FS_symlink', + 'FS_link', + 'FS_rename', + 'FS_rmdir', + 'FS_readdir', + 'FS_readlink', + 'FS_stat', + 'FS_fstat', + 'FS_lstat', + 'FS_doChmod', + 'FS_chmod', + 'FS_lchmod', + 'FS_fchmod', + 'FS_doChown', + 'FS_chown', + 'FS_lchown', + 'FS_fchown', + 'FS_doTruncate', + 'FS_truncate', + 'FS_ftruncate', + 'FS_utime', + 'FS_open', + 'FS_close', + 'FS_isClosed', + 'FS_llseek', + 'FS_read', + 'FS_write', + 'FS_mmap', + 'FS_msync', + 'FS_ioctl', + 'FS_writeFile', + 'FS_cwd', + 'FS_chdir', + 'FS_createDefaultDirectories', + 'FS_createDefaultDevices', + 'FS_createSpecialDirectories', + 'FS_createStandardStreams', + 'FS_staticInit', + 'FS_init', + 'FS_quit', + 'FS_findObject', + 'FS_analyzePath', + 'FS_createFile', + 'FS_forceLoadFile', + 'MEMFS', + 'TTY', + 'PIPEFS', + 'SOCKFS', + 'tempFixedLengthArray', + 'miniTempWebGLFloatBuffers', + 'miniTempWebGLIntBuffers', + 'heapObjectForWebGLType', + 'toTypedArrayIndex', + 'webgl_enable_ANGLE_instanced_arrays', + 'webgl_enable_OES_vertex_array_object', + 'webgl_enable_WEBGL_draw_buffers', + 'webgl_enable_WEBGL_multi_draw', + 'webgl_enable_EXT_polygon_offset_clamp', + 'webgl_enable_EXT_clip_control', + 'webgl_enable_WEBGL_polygon_mode', + 'GL', + 'emscriptenWebGLGet', + 'computeUnpackAlignedImageSize', + 'colorChannelsInGlTextureFormat', + 'emscriptenWebGLGetTexPixelData', + 'emscriptenWebGLGetUniform', + 'webglGetProgramUniformLocation', + 'webglGetUniformLocation', + 'webglPrepareUniformLocationsBeforeFirstUse', + 'webglGetLeftBracePos', + 'emscriptenWebGLGetVertexAttrib', + '__glGetActiveAttribOrUniform', + 'AL', + 'GLUT', + 'EGL', + 'GLEW', + 'IDBStore', + 'runAndAbortIfError', + 'Asyncify', + 'Fibers', + 'SDL', + 'SDL_gfx', + 'GLFW_Window', + 'GLFW', + 'print', + 'printErr', + 'jstoi_s', +]; +unexportedSymbols.forEach(unexportedRuntimeSymbol); + + // End runtime exports + // Begin JS library exports + // End JS library exports + +// end include: postlibrary.js + +function checkIncomingModuleAPI() { + ignoredModuleProp('fetchSettings'); + ignoredModuleProp('logReadFiles'); + ignoredModuleProp('loadSplitModule'); + ignoredModuleProp('onMalloc'); + ignoredModuleProp('onRealloc'); + ignoredModuleProp('onFree'); + ignoredModuleProp('onSbrkGrow'); + ignoredModuleProp('onCOSCacheHit'); + ignoredModuleProp('onCOSCacheMiss'); + ignoredModuleProp('onCOSStore'); + ignoredModuleProp('GL_MAX_TEXTURE_IMAGE_UNITS'); + ignoredModuleProp('SDL_canPlayWithWebAudio'); + ignoredModuleProp('SDL_numSimultaneouslyQueuedBuffers'); + ignoredModuleProp('freePreloadedMediaOnUse'); + ignoredModuleProp('preinitializedWebGLContext'); + ignoredModuleProp('keyboardListeningElement'); + ignoredModuleProp('doNotCaptureKeyboard'); + ignoredModuleProp('extraStackTrace'); + ignoredModuleProp('preloadPlugins'); + ignoredModuleProp('preMainLoop'); + ignoredModuleProp('postMainLoop'); + ignoredModuleProp('forcedAspectRatio'); + ignoredModuleProp('mainScriptUrlOrBlob'); + ignoredModuleProp('onFullScreen'); + ignoredModuleProp('INITIAL_MEMORY'); + ignoredModuleProp('wasmMemory'); + ignoredModuleProp('wasmBinary'); +} +var ASM_CONSTS = { + 107662: () => { if (document.fullscreenElement) return 1; }, + 107708: () => { return Module.canvas.width; }, + 107740: () => { return parseInt(Module.canvas.style.width); }, + 107788: () => { document.exitFullscreen(); }, + 107815: () => { setTimeout(function(){ Module.requestFullscreen(false, false); }, 100); }, + 107887: () => { if (document.fullscreenElement) return 1; }, + 107933: () => { return Module.canvas.width; }, + 107965: () => { return screen.width; }, + 107990: () => { document.exitFullscreen(); }, + 108017: ($0) => { const canvasId = UTF8ToString($0); setTimeout(function() { Module.requestFullscreen(false, true); setTimeout(function() { document.querySelector(canvasId).style.width="unset"; }, 100); }, 100); }, + 108211: () => { return window.innerWidth; }, + 108237: () => { return window.innerHeight; }, + 108264: () => { if (document.fullscreenElement) return 1; }, + 108310: () => { return Module.canvas.width; }, + 108342: () => { return parseInt(Module.canvas.style.width); }, + 108390: () => { if (document.fullscreenElement) return 1; }, + 108436: () => { return Module.canvas.width; }, + 108468: () => { return screen.width; }, + 108493: () => { return window.innerWidth; }, + 108519: () => { return window.innerHeight; }, + 108546: () => { if (document.fullscreenElement) return 1; }, + 108592: () => { return Module.canvas.width; }, + 108624: () => { return screen.width; }, + 108649: () => { document.exitFullscreen(); }, + 108676: () => { if (document.fullscreenElement) return 1; }, + 108722: () => { return Module.canvas.width; }, + 108754: () => { return parseInt(Module.canvas.style.width); }, + 108802: () => { document.exitFullscreen(); }, + 108829: ($0) => { Module.canvas.style.opacity = $0; }, + 108867: () => { return screen.width; }, + 108892: () => { return screen.height; }, + 108918: () => { return window.screenX; }, + 108945: () => { return window.screenY; }, + 108972: () => { return window.devicePixelRatio; }, + 109008: ($0) => { navigator.clipboard.writeText(UTF8ToString($0)); }, + 109061: ($0) => { Module.canvas.style.cursor = UTF8ToString($0); }, + 109112: () => { Module.canvas.style.cursor = 'none'; }, + 109149: ($0, $1, $2, $3) => { try { navigator.getGamepads()[$0].vibrationActuator.playEffect('dual-rumble', { startDelay: 0, duration: $3, weakMagnitude: $1, strongMagnitude: $2 }); } catch (e) { try { navigator.getGamepads()[$0].hapticActuators[0].pulse($2, $3); } catch (e) { } } }, + 109405: ($0) => { Module.canvas.style.cursor = UTF8ToString($0); }, + 109456: () => { if (document.pointerLockElement) return 1; }, + 109503: () => { if (document.fullscreenElement) return 1; }, + 109549: () => { return window.innerWidth; }, + 109575: () => { return window.innerHeight; } +}; +function SetCanvasIdJs(out,outSize) { var canvasId = "#" + Module.canvas.id; stringToUTF8(canvasId, out, outSize); } +function __asyncjs__RequestClipboardData() { return Asyncify.handleAsync(async () => { if (navigator.clipboard && window.isSecureContext) { let items = await navigator.clipboard.read(); for (const item of items) { if (item.types.includes("text/plain")) { const blob = await item.getType("text/plain"); const text = await blob.text(); window._lastClipboardString = text; } else if (item.types.find(t => t.startsWith("image/"))) { const blob = await item.getType(item.types.find(t => t.startsWith("image/"))); const bitmap = await createImageBitmap(blob); const canvas = document.createElement('canvas'); canvas.width = bitmap.width; canvas.height = bitmap.height; const ctx = canvas.getContext('2d'); ctx.drawImage(bitmap, 0, 0); const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height).data; window._lastImgWidth = canvas.width; window._lastImgHeight = canvas.height; window._lastImgData = imgData; } } } else console.warn("Clipboard read() requires HTTPS/Localhost"); }); } +function GetLastPastedText() { var str = window._lastClipboardString || ""; var length = lengthBytesUTF8(str) + 1; if (length > 1) { var ptr = _malloc(length); stringToUTF8(str, ptr, length); return ptr; } return 0; } +function GetLastPastedImage(width,height) { if (window._lastImgData) { const data = window._lastImgData; if (data.length > 0) { const ptr = _malloc(data.length); HEAPU8.set(data, ptr); if (width) setValue(width, window._lastImgWidth, 'i32'); if (height) setValue(height, window._lastImgHeight, 'i32'); window._lastImgData = null; return ptr; } } return 0; } + +// Imports from the Wasm binary. +var _main = Module['_main'] = makeInvalidEarlyAccess('_main'); +var _fflush = makeInvalidEarlyAccess('_fflush'); +var _free = makeInvalidEarlyAccess('_free'); +var _malloc = makeInvalidEarlyAccess('_malloc'); +var _emscripten_stack_get_end = makeInvalidEarlyAccess('_emscripten_stack_get_end'); +var _emscripten_stack_get_base = makeInvalidEarlyAccess('_emscripten_stack_get_base'); +var _strerror = makeInvalidEarlyAccess('_strerror'); +var _emscripten_stack_init = makeInvalidEarlyAccess('_emscripten_stack_init'); +var _emscripten_stack_get_free = makeInvalidEarlyAccess('_emscripten_stack_get_free'); +var __emscripten_stack_restore = makeInvalidEarlyAccess('__emscripten_stack_restore'); +var __emscripten_stack_alloc = makeInvalidEarlyAccess('__emscripten_stack_alloc'); +var _emscripten_stack_get_current = makeInvalidEarlyAccess('_emscripten_stack_get_current'); +var dynCall_vii = makeInvalidEarlyAccess('dynCall_vii'); +var dynCall_viii = makeInvalidEarlyAccess('dynCall_viii'); +var dynCall_viff = makeInvalidEarlyAccess('dynCall_viff'); +var dynCall_viiiii = makeInvalidEarlyAccess('dynCall_viiiii'); +var dynCall_viiii = makeInvalidEarlyAccess('dynCall_viiii'); +var dynCall_vidd = makeInvalidEarlyAccess('dynCall_vidd'); +var dynCall_ii = makeInvalidEarlyAccess('dynCall_ii'); +var dynCall_iiii = makeInvalidEarlyAccess('dynCall_iiii'); +var dynCall_fffi = makeInvalidEarlyAccess('dynCall_fffi'); +var dynCall_ffi = makeInvalidEarlyAccess('dynCall_ffi'); +var dynCall_viiiiii = makeInvalidEarlyAccess('dynCall_viiiiii'); +var dynCall_iii = makeInvalidEarlyAccess('dynCall_iii'); +var dynCall_vi = makeInvalidEarlyAccess('dynCall_vi'); +var dynCall_vffff = makeInvalidEarlyAccess('dynCall_vffff'); +var dynCall_vf = makeInvalidEarlyAccess('dynCall_vf'); +var dynCall_viiiiiiii = makeInvalidEarlyAccess('dynCall_viiiiiiii'); +var dynCall_viiiiiiiii = makeInvalidEarlyAccess('dynCall_viiiiiiiii'); +var dynCall_i = makeInvalidEarlyAccess('dynCall_i'); +var dynCall_vff = makeInvalidEarlyAccess('dynCall_vff'); +var dynCall_v = makeInvalidEarlyAccess('dynCall_v'); +var dynCall_viiiiiii = makeInvalidEarlyAccess('dynCall_viiiiiii'); +var dynCall_vfi = makeInvalidEarlyAccess('dynCall_vfi'); +var dynCall_viif = makeInvalidEarlyAccess('dynCall_viif'); +var dynCall_vif = makeInvalidEarlyAccess('dynCall_vif'); +var dynCall_vifff = makeInvalidEarlyAccess('dynCall_vifff'); +var dynCall_viffff = makeInvalidEarlyAccess('dynCall_viffff'); +var dynCall_vfff = makeInvalidEarlyAccess('dynCall_vfff'); +var dynCall_jiji = makeInvalidEarlyAccess('dynCall_jiji'); +var dynCall_iidiiiii = makeInvalidEarlyAccess('dynCall_iidiiiii'); +var _asyncify_start_unwind = makeInvalidEarlyAccess('_asyncify_start_unwind'); +var _asyncify_stop_unwind = makeInvalidEarlyAccess('_asyncify_stop_unwind'); +var _asyncify_start_rewind = makeInvalidEarlyAccess('_asyncify_start_rewind'); +var _asyncify_stop_rewind = makeInvalidEarlyAccess('_asyncify_stop_rewind'); +var memory = makeInvalidEarlyAccess('memory'); +var __indirect_function_table = makeInvalidEarlyAccess('__indirect_function_table'); +var wasmMemory = makeInvalidEarlyAccess('wasmMemory'); + +function assignWasmExports(wasmExports) { + assert(typeof wasmExports['main'] != 'undefined', 'missing Wasm export: main'); + assert(typeof wasmExports['fflush'] != 'undefined', 'missing Wasm export: fflush'); + assert(typeof wasmExports['free'] != 'undefined', 'missing Wasm export: free'); + assert(typeof wasmExports['malloc'] != 'undefined', 'missing Wasm export: malloc'); + assert(typeof wasmExports['emscripten_stack_get_end'] != 'undefined', 'missing Wasm export: emscripten_stack_get_end'); + assert(typeof wasmExports['emscripten_stack_get_base'] != 'undefined', 'missing Wasm export: emscripten_stack_get_base'); + assert(typeof wasmExports['strerror'] != 'undefined', 'missing Wasm export: strerror'); + assert(typeof wasmExports['emscripten_stack_init'] != 'undefined', 'missing Wasm export: emscripten_stack_init'); + assert(typeof wasmExports['emscripten_stack_get_free'] != 'undefined', 'missing Wasm export: emscripten_stack_get_free'); + assert(typeof wasmExports['_emscripten_stack_restore'] != 'undefined', 'missing Wasm export: _emscripten_stack_restore'); + assert(typeof wasmExports['_emscripten_stack_alloc'] != 'undefined', 'missing Wasm export: _emscripten_stack_alloc'); + assert(typeof wasmExports['emscripten_stack_get_current'] != 'undefined', 'missing Wasm export: emscripten_stack_get_current'); + assert(typeof wasmExports['dynCall_vii'] != 'undefined', 'missing Wasm export: dynCall_vii'); + assert(typeof wasmExports['dynCall_viii'] != 'undefined', 'missing Wasm export: dynCall_viii'); + assert(typeof wasmExports['dynCall_viff'] != 'undefined', 'missing Wasm export: dynCall_viff'); + assert(typeof wasmExports['dynCall_viiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiii'); + assert(typeof wasmExports['dynCall_viiii'] != 'undefined', 'missing Wasm export: dynCall_viiii'); + assert(typeof wasmExports['dynCall_vidd'] != 'undefined', 'missing Wasm export: dynCall_vidd'); + assert(typeof wasmExports['dynCall_ii'] != 'undefined', 'missing Wasm export: dynCall_ii'); + assert(typeof wasmExports['dynCall_iiii'] != 'undefined', 'missing Wasm export: dynCall_iiii'); + assert(typeof wasmExports['dynCall_fffi'] != 'undefined', 'missing Wasm export: dynCall_fffi'); + assert(typeof wasmExports['dynCall_ffi'] != 'undefined', 'missing Wasm export: dynCall_ffi'); + assert(typeof wasmExports['dynCall_viiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiii'); + assert(typeof wasmExports['dynCall_iii'] != 'undefined', 'missing Wasm export: dynCall_iii'); + assert(typeof wasmExports['dynCall_vi'] != 'undefined', 'missing Wasm export: dynCall_vi'); + assert(typeof wasmExports['dynCall_vffff'] != 'undefined', 'missing Wasm export: dynCall_vffff'); + assert(typeof wasmExports['dynCall_vf'] != 'undefined', 'missing Wasm export: dynCall_vf'); + assert(typeof wasmExports['dynCall_viiiiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiiiii'); + assert(typeof wasmExports['dynCall_viiiiiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiiiiii'); + assert(typeof wasmExports['dynCall_i'] != 'undefined', 'missing Wasm export: dynCall_i'); + assert(typeof wasmExports['dynCall_vff'] != 'undefined', 'missing Wasm export: dynCall_vff'); + assert(typeof wasmExports['dynCall_v'] != 'undefined', 'missing Wasm export: dynCall_v'); + assert(typeof wasmExports['dynCall_viiiiiii'] != 'undefined', 'missing Wasm export: dynCall_viiiiiii'); + assert(typeof wasmExports['dynCall_vfi'] != 'undefined', 'missing Wasm export: dynCall_vfi'); + assert(typeof wasmExports['dynCall_viif'] != 'undefined', 'missing Wasm export: dynCall_viif'); + assert(typeof wasmExports['dynCall_vif'] != 'undefined', 'missing Wasm export: dynCall_vif'); + assert(typeof wasmExports['dynCall_vifff'] != 'undefined', 'missing Wasm export: dynCall_vifff'); + assert(typeof wasmExports['dynCall_viffff'] != 'undefined', 'missing Wasm export: dynCall_viffff'); + assert(typeof wasmExports['dynCall_vfff'] != 'undefined', 'missing Wasm export: dynCall_vfff'); + assert(typeof wasmExports['dynCall_jiji'] != 'undefined', 'missing Wasm export: dynCall_jiji'); + assert(typeof wasmExports['dynCall_iidiiiii'] != 'undefined', 'missing Wasm export: dynCall_iidiiiii'); + assert(typeof wasmExports['asyncify_start_unwind'] != 'undefined', 'missing Wasm export: asyncify_start_unwind'); + assert(typeof wasmExports['asyncify_stop_unwind'] != 'undefined', 'missing Wasm export: asyncify_stop_unwind'); + assert(typeof wasmExports['asyncify_start_rewind'] != 'undefined', 'missing Wasm export: asyncify_start_rewind'); + assert(typeof wasmExports['asyncify_stop_rewind'] != 'undefined', 'missing Wasm export: asyncify_stop_rewind'); + assert(typeof wasmExports['memory'] != 'undefined', 'missing Wasm export: memory'); + assert(typeof wasmExports['__indirect_function_table'] != 'undefined', 'missing Wasm export: __indirect_function_table'); + _main = Module['_main'] = createExportWrapper('main', wasmExports['main'], 2); + _fflush = createExportWrapper('fflush', wasmExports['fflush'], 1); + _free = createExportWrapper('free', wasmExports['free'], 1); + _malloc = createExportWrapper('malloc', wasmExports['malloc'], 1); + _emscripten_stack_get_end = wasmExports['emscripten_stack_get_end']; + _emscripten_stack_get_base = wasmExports['emscripten_stack_get_base']; + _strerror = createExportWrapper('strerror', wasmExports['strerror'], 1); + _emscripten_stack_init = wasmExports['emscripten_stack_init']; + _emscripten_stack_get_free = wasmExports['emscripten_stack_get_free']; + __emscripten_stack_restore = wasmExports['_emscripten_stack_restore']; + __emscripten_stack_alloc = wasmExports['_emscripten_stack_alloc']; + _emscripten_stack_get_current = wasmExports['emscripten_stack_get_current']; + dynCall_vii = dynCalls['vii'] = createExportWrapper('dynCall_vii', wasmExports['dynCall_vii'], 3); + dynCall_viii = dynCalls['viii'] = createExportWrapper('dynCall_viii', wasmExports['dynCall_viii'], 4); + dynCall_viff = dynCalls['viff'] = createExportWrapper('dynCall_viff', wasmExports['dynCall_viff'], 4); + dynCall_viiiii = dynCalls['viiiii'] = createExportWrapper('dynCall_viiiii', wasmExports['dynCall_viiiii'], 6); + dynCall_viiii = dynCalls['viiii'] = createExportWrapper('dynCall_viiii', wasmExports['dynCall_viiii'], 5); + dynCall_vidd = dynCalls['vidd'] = createExportWrapper('dynCall_vidd', wasmExports['dynCall_vidd'], 4); + dynCall_ii = dynCalls['ii'] = createExportWrapper('dynCall_ii', wasmExports['dynCall_ii'], 2); + dynCall_iiii = dynCalls['iiii'] = createExportWrapper('dynCall_iiii', wasmExports['dynCall_iiii'], 4); + dynCall_fffi = dynCalls['fffi'] = createExportWrapper('dynCall_fffi', wasmExports['dynCall_fffi'], 4); + dynCall_ffi = dynCalls['ffi'] = createExportWrapper('dynCall_ffi', wasmExports['dynCall_ffi'], 3); + dynCall_viiiiii = dynCalls['viiiiii'] = createExportWrapper('dynCall_viiiiii', wasmExports['dynCall_viiiiii'], 7); + dynCall_iii = dynCalls['iii'] = createExportWrapper('dynCall_iii', wasmExports['dynCall_iii'], 3); + dynCall_vi = dynCalls['vi'] = createExportWrapper('dynCall_vi', wasmExports['dynCall_vi'], 2); + dynCall_vffff = dynCalls['vffff'] = createExportWrapper('dynCall_vffff', wasmExports['dynCall_vffff'], 5); + dynCall_vf = dynCalls['vf'] = createExportWrapper('dynCall_vf', wasmExports['dynCall_vf'], 2); + dynCall_viiiiiiii = dynCalls['viiiiiiii'] = createExportWrapper('dynCall_viiiiiiii', wasmExports['dynCall_viiiiiiii'], 9); + dynCall_viiiiiiiii = dynCalls['viiiiiiiii'] = createExportWrapper('dynCall_viiiiiiiii', wasmExports['dynCall_viiiiiiiii'], 10); + dynCall_i = dynCalls['i'] = createExportWrapper('dynCall_i', wasmExports['dynCall_i'], 1); + dynCall_vff = dynCalls['vff'] = createExportWrapper('dynCall_vff', wasmExports['dynCall_vff'], 3); + dynCall_v = dynCalls['v'] = createExportWrapper('dynCall_v', wasmExports['dynCall_v'], 1); + dynCall_viiiiiii = dynCalls['viiiiiii'] = createExportWrapper('dynCall_viiiiiii', wasmExports['dynCall_viiiiiii'], 8); + dynCall_vfi = dynCalls['vfi'] = createExportWrapper('dynCall_vfi', wasmExports['dynCall_vfi'], 3); + dynCall_viif = dynCalls['viif'] = createExportWrapper('dynCall_viif', wasmExports['dynCall_viif'], 4); + dynCall_vif = dynCalls['vif'] = createExportWrapper('dynCall_vif', wasmExports['dynCall_vif'], 3); + dynCall_vifff = dynCalls['vifff'] = createExportWrapper('dynCall_vifff', wasmExports['dynCall_vifff'], 5); + dynCall_viffff = dynCalls['viffff'] = createExportWrapper('dynCall_viffff', wasmExports['dynCall_viffff'], 6); + dynCall_vfff = dynCalls['vfff'] = createExportWrapper('dynCall_vfff', wasmExports['dynCall_vfff'], 4); + dynCall_jiji = dynCalls['jiji'] = createExportWrapper('dynCall_jiji', wasmExports['dynCall_jiji'], 4); + dynCall_iidiiiii = dynCalls['iidiiiii'] = createExportWrapper('dynCall_iidiiiii', wasmExports['dynCall_iidiiiii'], 8); + _asyncify_start_unwind = createExportWrapper('asyncify_start_unwind', wasmExports['asyncify_start_unwind'], 1); + _asyncify_stop_unwind = createExportWrapper('asyncify_stop_unwind', wasmExports['asyncify_stop_unwind'], 0); + _asyncify_start_rewind = createExportWrapper('asyncify_start_rewind', wasmExports['asyncify_start_rewind'], 1); + _asyncify_stop_rewind = createExportWrapper('asyncify_stop_rewind', wasmExports['asyncify_stop_rewind'], 0); + memory = wasmMemory = wasmExports['memory']; + __indirect_function_table = wasmExports['__indirect_function_table']; +} + +var wasmImports = { + /** @export */ + SetCanvasIdJs, + /** @export */ + __assert_fail: ___assert_fail, + /** @export */ + __syscall_faccessat: ___syscall_faccessat, + /** @export */ + __syscall_fcntl64: ___syscall_fcntl64, + /** @export */ + __syscall_getcwd: ___syscall_getcwd, + /** @export */ + __syscall_ioctl: ___syscall_ioctl, + /** @export */ + __syscall_openat: ___syscall_openat, + /** @export */ + _abort_js: __abort_js, + /** @export */ + clock_time_get: _clock_time_get, + /** @export */ + emscripten_asm_const_double: _emscripten_asm_const_double, + /** @export */ + emscripten_asm_const_int: _emscripten_asm_const_int, + /** @export */ + emscripten_date_now: _emscripten_date_now, + /** @export */ + emscripten_get_element_css_size: _emscripten_get_element_css_size, + /** @export */ + emscripten_get_gamepad_status: _emscripten_get_gamepad_status, + /** @export */ + emscripten_get_now: _emscripten_get_now, + /** @export */ + emscripten_get_num_gamepads: _emscripten_get_num_gamepads, + /** @export */ + emscripten_glActiveTexture: _emscripten_glActiveTexture, + /** @export */ + emscripten_glAttachShader: _emscripten_glAttachShader, + /** @export */ + emscripten_glBeginQueryEXT: _emscripten_glBeginQueryEXT, + /** @export */ + emscripten_glBindAttribLocation: _emscripten_glBindAttribLocation, + /** @export */ + emscripten_glBindBuffer: _emscripten_glBindBuffer, + /** @export */ + emscripten_glBindFramebuffer: _emscripten_glBindFramebuffer, + /** @export */ + emscripten_glBindRenderbuffer: _emscripten_glBindRenderbuffer, + /** @export */ + emscripten_glBindTexture: _emscripten_glBindTexture, + /** @export */ + emscripten_glBindVertexArrayOES: _emscripten_glBindVertexArrayOES, + /** @export */ + emscripten_glBlendColor: _emscripten_glBlendColor, + /** @export */ + emscripten_glBlendEquation: _emscripten_glBlendEquation, + /** @export */ + emscripten_glBlendEquationSeparate: _emscripten_glBlendEquationSeparate, + /** @export */ + emscripten_glBlendFunc: _emscripten_glBlendFunc, + /** @export */ + emscripten_glBlendFuncSeparate: _emscripten_glBlendFuncSeparate, + /** @export */ + emscripten_glBufferData: _emscripten_glBufferData, + /** @export */ + emscripten_glBufferSubData: _emscripten_glBufferSubData, + /** @export */ + emscripten_glCheckFramebufferStatus: _emscripten_glCheckFramebufferStatus, + /** @export */ + emscripten_glClear: _emscripten_glClear, + /** @export */ + emscripten_glClearColor: _emscripten_glClearColor, + /** @export */ + emscripten_glClearDepthf: _emscripten_glClearDepthf, + /** @export */ + emscripten_glClearStencil: _emscripten_glClearStencil, + /** @export */ + emscripten_glClipControlEXT: _emscripten_glClipControlEXT, + /** @export */ + emscripten_glColorMask: _emscripten_glColorMask, + /** @export */ + emscripten_glCompileShader: _emscripten_glCompileShader, + /** @export */ + emscripten_glCompressedTexImage2D: _emscripten_glCompressedTexImage2D, + /** @export */ + emscripten_glCompressedTexSubImage2D: _emscripten_glCompressedTexSubImage2D, + /** @export */ + emscripten_glCopyTexImage2D: _emscripten_glCopyTexImage2D, + /** @export */ + emscripten_glCopyTexSubImage2D: _emscripten_glCopyTexSubImage2D, + /** @export */ + emscripten_glCreateProgram: _emscripten_glCreateProgram, + /** @export */ + emscripten_glCreateShader: _emscripten_glCreateShader, + /** @export */ + emscripten_glCullFace: _emscripten_glCullFace, + /** @export */ + emscripten_glDeleteBuffers: _emscripten_glDeleteBuffers, + /** @export */ + emscripten_glDeleteFramebuffers: _emscripten_glDeleteFramebuffers, + /** @export */ + emscripten_glDeleteProgram: _emscripten_glDeleteProgram, + /** @export */ + emscripten_glDeleteQueriesEXT: _emscripten_glDeleteQueriesEXT, + /** @export */ + emscripten_glDeleteRenderbuffers: _emscripten_glDeleteRenderbuffers, + /** @export */ + emscripten_glDeleteShader: _emscripten_glDeleteShader, + /** @export */ + emscripten_glDeleteTextures: _emscripten_glDeleteTextures, + /** @export */ + emscripten_glDeleteVertexArraysOES: _emscripten_glDeleteVertexArraysOES, + /** @export */ + emscripten_glDepthFunc: _emscripten_glDepthFunc, + /** @export */ + emscripten_glDepthMask: _emscripten_glDepthMask, + /** @export */ + emscripten_glDepthRangef: _emscripten_glDepthRangef, + /** @export */ + emscripten_glDetachShader: _emscripten_glDetachShader, + /** @export */ + emscripten_glDisable: _emscripten_glDisable, + /** @export */ + emscripten_glDisableVertexAttribArray: _emscripten_glDisableVertexAttribArray, + /** @export */ + emscripten_glDrawArrays: _emscripten_glDrawArrays, + /** @export */ + emscripten_glDrawArraysInstancedANGLE: _emscripten_glDrawArraysInstancedANGLE, + /** @export */ + emscripten_glDrawBuffersWEBGL: _emscripten_glDrawBuffersWEBGL, + /** @export */ + emscripten_glDrawElements: _emscripten_glDrawElements, + /** @export */ + emscripten_glDrawElementsInstancedANGLE: _emscripten_glDrawElementsInstancedANGLE, + /** @export */ + emscripten_glEnable: _emscripten_glEnable, + /** @export */ + emscripten_glEnableVertexAttribArray: _emscripten_glEnableVertexAttribArray, + /** @export */ + emscripten_glEndQueryEXT: _emscripten_glEndQueryEXT, + /** @export */ + emscripten_glFinish: _emscripten_glFinish, + /** @export */ + emscripten_glFlush: _emscripten_glFlush, + /** @export */ + emscripten_glFramebufferRenderbuffer: _emscripten_glFramebufferRenderbuffer, + /** @export */ + emscripten_glFramebufferTexture2D: _emscripten_glFramebufferTexture2D, + /** @export */ + emscripten_glFrontFace: _emscripten_glFrontFace, + /** @export */ + emscripten_glGenBuffers: _emscripten_glGenBuffers, + /** @export */ + emscripten_glGenFramebuffers: _emscripten_glGenFramebuffers, + /** @export */ + emscripten_glGenQueriesEXT: _emscripten_glGenQueriesEXT, + /** @export */ + emscripten_glGenRenderbuffers: _emscripten_glGenRenderbuffers, + /** @export */ + emscripten_glGenTextures: _emscripten_glGenTextures, + /** @export */ + emscripten_glGenVertexArraysOES: _emscripten_glGenVertexArraysOES, + /** @export */ + emscripten_glGenerateMipmap: _emscripten_glGenerateMipmap, + /** @export */ + emscripten_glGetActiveAttrib: _emscripten_glGetActiveAttrib, + /** @export */ + emscripten_glGetActiveUniform: _emscripten_glGetActiveUniform, + /** @export */ + emscripten_glGetAttachedShaders: _emscripten_glGetAttachedShaders, + /** @export */ + emscripten_glGetAttribLocation: _emscripten_glGetAttribLocation, + /** @export */ + emscripten_glGetBooleanv: _emscripten_glGetBooleanv, + /** @export */ + emscripten_glGetBufferParameteriv: _emscripten_glGetBufferParameteriv, + /** @export */ + emscripten_glGetError: _emscripten_glGetError, + /** @export */ + emscripten_glGetFloatv: _emscripten_glGetFloatv, + /** @export */ + emscripten_glGetFramebufferAttachmentParameteriv: _emscripten_glGetFramebufferAttachmentParameteriv, + /** @export */ + emscripten_glGetIntegerv: _emscripten_glGetIntegerv, + /** @export */ + emscripten_glGetProgramInfoLog: _emscripten_glGetProgramInfoLog, + /** @export */ + emscripten_glGetProgramiv: _emscripten_glGetProgramiv, + /** @export */ + emscripten_glGetQueryObjecti64vEXT: _emscripten_glGetQueryObjecti64vEXT, + /** @export */ + emscripten_glGetQueryObjectivEXT: _emscripten_glGetQueryObjectivEXT, + /** @export */ + emscripten_glGetQueryObjectui64vEXT: _emscripten_glGetQueryObjectui64vEXT, + /** @export */ + emscripten_glGetQueryObjectuivEXT: _emscripten_glGetQueryObjectuivEXT, + /** @export */ + emscripten_glGetQueryivEXT: _emscripten_glGetQueryivEXT, + /** @export */ + emscripten_glGetRenderbufferParameteriv: _emscripten_glGetRenderbufferParameteriv, + /** @export */ + emscripten_glGetShaderInfoLog: _emscripten_glGetShaderInfoLog, + /** @export */ + emscripten_glGetShaderPrecisionFormat: _emscripten_glGetShaderPrecisionFormat, + /** @export */ + emscripten_glGetShaderSource: _emscripten_glGetShaderSource, + /** @export */ + emscripten_glGetShaderiv: _emscripten_glGetShaderiv, + /** @export */ + emscripten_glGetString: _emscripten_glGetString, + /** @export */ + emscripten_glGetTexParameterfv: _emscripten_glGetTexParameterfv, + /** @export */ + emscripten_glGetTexParameteriv: _emscripten_glGetTexParameteriv, + /** @export */ + emscripten_glGetUniformLocation: _emscripten_glGetUniformLocation, + /** @export */ + emscripten_glGetUniformfv: _emscripten_glGetUniformfv, + /** @export */ + emscripten_glGetUniformiv: _emscripten_glGetUniformiv, + /** @export */ + emscripten_glGetVertexAttribPointerv: _emscripten_glGetVertexAttribPointerv, + /** @export */ + emscripten_glGetVertexAttribfv: _emscripten_glGetVertexAttribfv, + /** @export */ + emscripten_glGetVertexAttribiv: _emscripten_glGetVertexAttribiv, + /** @export */ + emscripten_glHint: _emscripten_glHint, + /** @export */ + emscripten_glIsBuffer: _emscripten_glIsBuffer, + /** @export */ + emscripten_glIsEnabled: _emscripten_glIsEnabled, + /** @export */ + emscripten_glIsFramebuffer: _emscripten_glIsFramebuffer, + /** @export */ + emscripten_glIsProgram: _emscripten_glIsProgram, + /** @export */ + emscripten_glIsQueryEXT: _emscripten_glIsQueryEXT, + /** @export */ + emscripten_glIsRenderbuffer: _emscripten_glIsRenderbuffer, + /** @export */ + emscripten_glIsShader: _emscripten_glIsShader, + /** @export */ + emscripten_glIsTexture: _emscripten_glIsTexture, + /** @export */ + emscripten_glIsVertexArrayOES: _emscripten_glIsVertexArrayOES, + /** @export */ + emscripten_glLineWidth: _emscripten_glLineWidth, + /** @export */ + emscripten_glLinkProgram: _emscripten_glLinkProgram, + /** @export */ + emscripten_glPixelStorei: _emscripten_glPixelStorei, + /** @export */ + emscripten_glPolygonModeWEBGL: _emscripten_glPolygonModeWEBGL, + /** @export */ + emscripten_glPolygonOffset: _emscripten_glPolygonOffset, + /** @export */ + emscripten_glPolygonOffsetClampEXT: _emscripten_glPolygonOffsetClampEXT, + /** @export */ + emscripten_glQueryCounterEXT: _emscripten_glQueryCounterEXT, + /** @export */ + emscripten_glReadPixels: _emscripten_glReadPixels, + /** @export */ + emscripten_glReleaseShaderCompiler: _emscripten_glReleaseShaderCompiler, + /** @export */ + emscripten_glRenderbufferStorage: _emscripten_glRenderbufferStorage, + /** @export */ + emscripten_glSampleCoverage: _emscripten_glSampleCoverage, + /** @export */ + emscripten_glScissor: _emscripten_glScissor, + /** @export */ + emscripten_glShaderBinary: _emscripten_glShaderBinary, + /** @export */ + emscripten_glShaderSource: _emscripten_glShaderSource, + /** @export */ + emscripten_glStencilFunc: _emscripten_glStencilFunc, + /** @export */ + emscripten_glStencilFuncSeparate: _emscripten_glStencilFuncSeparate, + /** @export */ + emscripten_glStencilMask: _emscripten_glStencilMask, + /** @export */ + emscripten_glStencilMaskSeparate: _emscripten_glStencilMaskSeparate, + /** @export */ + emscripten_glStencilOp: _emscripten_glStencilOp, + /** @export */ + emscripten_glStencilOpSeparate: _emscripten_glStencilOpSeparate, + /** @export */ + emscripten_glTexImage2D: _emscripten_glTexImage2D, + /** @export */ + emscripten_glTexParameterf: _emscripten_glTexParameterf, + /** @export */ + emscripten_glTexParameterfv: _emscripten_glTexParameterfv, + /** @export */ + emscripten_glTexParameteri: _emscripten_glTexParameteri, + /** @export */ + emscripten_glTexParameteriv: _emscripten_glTexParameteriv, + /** @export */ + emscripten_glTexSubImage2D: _emscripten_glTexSubImage2D, + /** @export */ + emscripten_glUniform1f: _emscripten_glUniform1f, + /** @export */ + emscripten_glUniform1fv: _emscripten_glUniform1fv, + /** @export */ + emscripten_glUniform1i: _emscripten_glUniform1i, + /** @export */ + emscripten_glUniform1iv: _emscripten_glUniform1iv, + /** @export */ + emscripten_glUniform2f: _emscripten_glUniform2f, + /** @export */ + emscripten_glUniform2fv: _emscripten_glUniform2fv, + /** @export */ + emscripten_glUniform2i: _emscripten_glUniform2i, + /** @export */ + emscripten_glUniform2iv: _emscripten_glUniform2iv, + /** @export */ + emscripten_glUniform3f: _emscripten_glUniform3f, + /** @export */ + emscripten_glUniform3fv: _emscripten_glUniform3fv, + /** @export */ + emscripten_glUniform3i: _emscripten_glUniform3i, + /** @export */ + emscripten_glUniform3iv: _emscripten_glUniform3iv, + /** @export */ + emscripten_glUniform4f: _emscripten_glUniform4f, + /** @export */ + emscripten_glUniform4fv: _emscripten_glUniform4fv, + /** @export */ + emscripten_glUniform4i: _emscripten_glUniform4i, + /** @export */ + emscripten_glUniform4iv: _emscripten_glUniform4iv, + /** @export */ + emscripten_glUniformMatrix2fv: _emscripten_glUniformMatrix2fv, + /** @export */ + emscripten_glUniformMatrix3fv: _emscripten_glUniformMatrix3fv, + /** @export */ + emscripten_glUniformMatrix4fv: _emscripten_glUniformMatrix4fv, + /** @export */ + emscripten_glUseProgram: _emscripten_glUseProgram, + /** @export */ + emscripten_glValidateProgram: _emscripten_glValidateProgram, + /** @export */ + emscripten_glVertexAttrib1f: _emscripten_glVertexAttrib1f, + /** @export */ + emscripten_glVertexAttrib1fv: _emscripten_glVertexAttrib1fv, + /** @export */ + emscripten_glVertexAttrib2f: _emscripten_glVertexAttrib2f, + /** @export */ + emscripten_glVertexAttrib2fv: _emscripten_glVertexAttrib2fv, + /** @export */ + emscripten_glVertexAttrib3f: _emscripten_glVertexAttrib3f, + /** @export */ + emscripten_glVertexAttrib3fv: _emscripten_glVertexAttrib3fv, + /** @export */ + emscripten_glVertexAttrib4f: _emscripten_glVertexAttrib4f, + /** @export */ + emscripten_glVertexAttrib4fv: _emscripten_glVertexAttrib4fv, + /** @export */ + emscripten_glVertexAttribDivisorANGLE: _emscripten_glVertexAttribDivisorANGLE, + /** @export */ + emscripten_glVertexAttribPointer: _emscripten_glVertexAttribPointer, + /** @export */ + emscripten_glViewport: _emscripten_glViewport, + /** @export */ + emscripten_resize_heap: _emscripten_resize_heap, + /** @export */ + emscripten_sample_gamepad_data: _emscripten_sample_gamepad_data, + /** @export */ + emscripten_set_blur_callback_on_thread: _emscripten_set_blur_callback_on_thread, + /** @export */ + emscripten_set_canvas_element_size: _emscripten_set_canvas_element_size, + /** @export */ + emscripten_set_click_callback_on_thread: _emscripten_set_click_callback_on_thread, + /** @export */ + emscripten_set_focus_callback_on_thread: _emscripten_set_focus_callback_on_thread, + /** @export */ + emscripten_set_fullscreenchange_callback_on_thread: _emscripten_set_fullscreenchange_callback_on_thread, + /** @export */ + emscripten_set_gamepadconnected_callback_on_thread: _emscripten_set_gamepadconnected_callback_on_thread, + /** @export */ + emscripten_set_gamepaddisconnected_callback_on_thread: _emscripten_set_gamepaddisconnected_callback_on_thread, + /** @export */ + emscripten_set_mousemove_callback_on_thread: _emscripten_set_mousemove_callback_on_thread, + /** @export */ + emscripten_set_pointerlockchange_callback_on_thread: _emscripten_set_pointerlockchange_callback_on_thread, + /** @export */ + emscripten_set_resize_callback_on_thread: _emscripten_set_resize_callback_on_thread, + /** @export */ + emscripten_set_touchcancel_callback_on_thread: _emscripten_set_touchcancel_callback_on_thread, + /** @export */ + emscripten_set_touchend_callback_on_thread: _emscripten_set_touchend_callback_on_thread, + /** @export */ + emscripten_set_touchmove_callback_on_thread: _emscripten_set_touchmove_callback_on_thread, + /** @export */ + emscripten_set_touchstart_callback_on_thread: _emscripten_set_touchstart_callback_on_thread, + /** @export */ + emscripten_set_visibilitychange_callback_on_thread: _emscripten_set_visibilitychange_callback_on_thread, + /** @export */ + emscripten_set_window_title: _emscripten_set_window_title, + /** @export */ + emscripten_sleep: _emscripten_sleep, + /** @export */ + exit: _exit, + /** @export */ + fd_close: _fd_close, + /** @export */ + fd_read: _fd_read, + /** @export */ + fd_seek: _fd_seek, + /** @export */ + fd_write: _fd_write, + /** @export */ + glActiveTexture: _glActiveTexture, + /** @export */ + glAttachShader: _glAttachShader, + /** @export */ + glBindAttribLocation: _glBindAttribLocation, + /** @export */ + glBindBuffer: _glBindBuffer, + /** @export */ + glBindTexture: _glBindTexture, + /** @export */ + glBlendFunc: _glBlendFunc, + /** @export */ + glBufferData: _glBufferData, + /** @export */ + glBufferSubData: _glBufferSubData, + /** @export */ + glClear: _glClear, + /** @export */ + glClearColor: _glClearColor, + /** @export */ + glClearDepthf: _glClearDepthf, + /** @export */ + glCompileShader: _glCompileShader, + /** @export */ + glCompressedTexImage2D: _glCompressedTexImage2D, + /** @export */ + glCreateProgram: _glCreateProgram, + /** @export */ + glCreateShader: _glCreateShader, + /** @export */ + glCullFace: _glCullFace, + /** @export */ + glDeleteBuffers: _glDeleteBuffers, + /** @export */ + glDeleteProgram: _glDeleteProgram, + /** @export */ + glDeleteShader: _glDeleteShader, + /** @export */ + glDeleteTextures: _glDeleteTextures, + /** @export */ + glDepthFunc: _glDepthFunc, + /** @export */ + glDetachShader: _glDetachShader, + /** @export */ + glDisable: _glDisable, + /** @export */ + glDisableVertexAttribArray: _glDisableVertexAttribArray, + /** @export */ + glDrawArrays: _glDrawArrays, + /** @export */ + glDrawElements: _glDrawElements, + /** @export */ + glEnable: _glEnable, + /** @export */ + glEnableVertexAttribArray: _glEnableVertexAttribArray, + /** @export */ + glFrontFace: _glFrontFace, + /** @export */ + glGenBuffers: _glGenBuffers, + /** @export */ + glGenTextures: _glGenTextures, + /** @export */ + glGetAttribLocation: _glGetAttribLocation, + /** @export */ + glGetFloatv: _glGetFloatv, + /** @export */ + glGetProgramInfoLog: _glGetProgramInfoLog, + /** @export */ + glGetProgramiv: _glGetProgramiv, + /** @export */ + glGetShaderInfoLog: _glGetShaderInfoLog, + /** @export */ + glGetShaderiv: _glGetShaderiv, + /** @export */ + glGetString: _glGetString, + /** @export */ + glGetUniformLocation: _glGetUniformLocation, + /** @export */ + glLinkProgram: _glLinkProgram, + /** @export */ + glPixelStorei: _glPixelStorei, + /** @export */ + glReadPixels: _glReadPixels, + /** @export */ + glShaderSource: _glShaderSource, + /** @export */ + glTexImage2D: _glTexImage2D, + /** @export */ + glTexParameterf: _glTexParameterf, + /** @export */ + glTexParameteri: _glTexParameteri, + /** @export */ + glUniform1i: _glUniform1i, + /** @export */ + glUniform4f: _glUniform4f, + /** @export */ + glUniformMatrix4fv: _glUniformMatrix4fv, + /** @export */ + glUseProgram: _glUseProgram, + /** @export */ + glVertexAttribPointer: _glVertexAttribPointer, + /** @export */ + glViewport: _glViewport, + /** @export */ + glfwCreateWindow: _glfwCreateWindow, + /** @export */ + glfwDefaultWindowHints: _glfwDefaultWindowHints, + /** @export */ + glfwDestroyWindow: _glfwDestroyWindow, + /** @export */ + glfwGetPrimaryMonitor: _glfwGetPrimaryMonitor, + /** @export */ + glfwGetTime: _glfwGetTime, + /** @export */ + glfwGetVideoModes: _glfwGetVideoModes, + /** @export */ + glfwInit: _glfwInit, + /** @export */ + glfwMakeContextCurrent: _glfwMakeContextCurrent, + /** @export */ + glfwSetCharCallback: _glfwSetCharCallback, + /** @export */ + glfwSetCursorEnterCallback: _glfwSetCursorEnterCallback, + /** @export */ + glfwSetCursorPosCallback: _glfwSetCursorPosCallback, + /** @export */ + glfwSetDropCallback: _glfwSetDropCallback, + /** @export */ + glfwSetErrorCallback: _glfwSetErrorCallback, + /** @export */ + glfwSetKeyCallback: _glfwSetKeyCallback, + /** @export */ + glfwSetMouseButtonCallback: _glfwSetMouseButtonCallback, + /** @export */ + glfwSetScrollCallback: _glfwSetScrollCallback, + /** @export */ + glfwSetWindowContentScaleCallback: _glfwSetWindowContentScaleCallback, + /** @export */ + glfwSetWindowFocusCallback: _glfwSetWindowFocusCallback, + /** @export */ + glfwSetWindowIconifyCallback: _glfwSetWindowIconifyCallback, + /** @export */ + glfwSetWindowShouldClose: _glfwSetWindowShouldClose, + /** @export */ + glfwSetWindowSize: _glfwSetWindowSize, + /** @export */ + glfwSetWindowSizeCallback: _glfwSetWindowSizeCallback, + /** @export */ + glfwSwapBuffers: _glfwSwapBuffers, + /** @export */ + glfwTerminate: _glfwTerminate, + /** @export */ + glfwWindowHint: _glfwWindowHint +}; + + +// include: postamble.js +// === Auto-generated postamble setup entry stuff === + +var calledRun; + +function callMain() { + assert(runDependencies == 0, 'cannot call main when async dependencies remain! (listen on Module["onRuntimeInitialized"])'); + assert(typeof onPreRuns === 'undefined' || onPreRuns.length == 0, 'cannot call main when preRun functions remain to be called'); + + var entryFunction = _main; + + var argc = 0; + var argv = 0; + + try { + + var ret = entryFunction(argc, argv); + + // if we're not running an evented main loop, it's time to exit + exitJS(ret, /* implicit = */ true); + return ret; + } catch (e) { + return handleException(e); + } +} + +function stackCheckInit() { + // This is normally called automatically during __wasm_call_ctors but need to + // get these values before even running any of the ctors so we call it redundantly + // here. + _emscripten_stack_init(); + // TODO(sbc): Move writeStackCookie to native to to avoid this. + writeStackCookie(); +} + +async function run() { + assert(!calledRun); + calledRun = true; + + stackCheckInit(); + + preRun(); + + if (runDependencies) { + await resolveRunDependencies(); + } + + var setStatus = Module['setStatus']; + if (setStatus) { + setStatus('Running...'); + // Yield to the event loop to allow the browser to paint "Running..." + await new Promise((resolve) => setTimeout(resolve, 1)); + // Then we want to clear the status text, but only after the rest of this function runs. + setTimeout(setStatus, 1, ''); + } + + if (ABORT) return; + + initRuntime(); + + // No ATMAINS hooks + + Module['onRuntimeInitialized']?.(); + consumedModuleProp('onRuntimeInitialized'); + + var noInitialRun = Module['noInitialRun'] || false; + if (!noInitialRun) callMain(); + + postRun(); +} + +function checkUnflushedContent() { + // Compiler settings do not allow exiting the runtime, so flushing + // the streams is not possible. but in ASSERTIONS mode we check + // if there was something to flush, and if so tell the user they + // should request that the runtime be exitable. + // Normally we would not even include flush() at all, but in ASSERTIONS + // builds we do so just for this check, and here we see if there is any + // content to flush, that is, we check if there would have been + // something a non-ASSERTIONS build would have not seen. + // How we flush the streams depends on whether we are in SYSCALLS_REQUIRE_FILESYSTEM=0 + // mode (which has its own special function for this; otherwise, all + // the code is inside libc) + var oldOut = out; + var oldErr = err; + var has = false; + out = err = (x) => { + has = true; + } + try { // it doesn't matter if it fails + _fflush(0); + // also flush in the JS FS layer + for (var name of ['stdout', 'stderr']) { + var info = FS.analyzePath('/dev/' + name); + if (!info) return; + var stream = info.object; + var rdev = stream.rdev; + var tty = TTY.ttys[rdev]; + if (tty?.output?.length) { + has = true; + } + } + } catch(e) {} + out = oldOut; + err = oldErr; + if (has) { + warnOnce('stdio streams had content in them that was not flushed. you should set EXIT_RUNTIME to 1 (see the Emscripten FAQ), or make sure to emit a newline when you printf etc.'); + } +} + +var wasmExports; + +// With async instantation wasmExports is assigned asynchronously when the +// instance is received. +createWasm().then(() => run()); + +// end include: postamble.js + diff --git a/examples/text/text_font_loading.wasm b/examples/text/text_font_loading.wasm index 693e3ecd6f13fca3a615239c454c511f4e576b65..b9e6498e46d1cbed4cd40ede9be84eeb32a7e268 100644 GIT binary patch literal 588048 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%0Afh?91&qYgL7Rp@gKcpH#_y4Q}(( zVQ-J055_<2eH=#&&2vL6*JG}THtvIEXy*Bp9U1e4;>LKS9hP6BhjC=}x(iZvc)WW* z2y>IW{^6PTg8ZjC`gBD8(-B*NU$}=#4dwQ!%rSU8lTb@;qh{*{?4S zN$C+VS=1xtl3owUwLaSGQRI@D9>q+W9v$Y-ojbP@OBaTSIo*4d%oq1%*B+(wDGdAQ zOpmhp;>vgF(J?9yML88N~vl;4!i7|^45J}4p9t49}piJ0lJ8NWoVOOMT?@&i!5SWuNNf?8}Qs6c1Q z!g@Ivn$<F z4qbnz4n=Vt2IlI}H|jyOzBKAV#JZyg-8c@6>#!;N!H@bO3+o%#VN>>lAN4~P);+Gn zrtAkl>W3_>wB&rPXg9RFC#CQB9#oT*cwnbWy+TFNOr>6#jY_443h4^;uhiIqxTvYr zYqHTUl^RL}WopwU5!utY)K zfCYAr*8UX#1oTc(ws%tKofHkEXl`mhZx0%FT(}M)^U+|JMt`ODn;QMC*mnk?N~Qc;%_MO~6c!9R!fJz{6w4Wc49tlLy4azAr2iaNQlOD6#Q;t-M6hPx`S9J8ig9yA?ZHt`Ey9aXV!$)%Ngs zv4)Zq$l-S9{EEA?)p0doAZ8C>9H5#Ep<)8%LQyecRj8QI$j;JhQ0d(Pf_lOV?|~@v z5|)Bm!V2#td&pi5&`b7ag$K$&R(K!TUG{0Pe+oVM6QlpN2HfHqbch zcwvz2D}%5Yx8KSFTtZYXY_R?}!Yj zpd4H5k|{DY18%Mmlwz79$Y4q!=wd7WNM!7pAJmx10(5B#vNY8|so{FEDDGOw4y+m2 zC`kv>qI8Iq%l(BCOjU7H!Nh;}&gv)=&CKzXnb++LU&7ly}Zk=Haa0is|M~V_Es# z5XG8H6qrn`db}`AaGLnJ=IDkQhvV zjP&QeeC|VVF#SH#U-=oexRF^lGHP_vL#Z0*C2UNdMr=4?g4$(<_nw z(U%{6h##g`ApMgsKlzYCOfN_JXJ3ByA&i(_hV(DK{Nh6`wJYr=gT$LeFKG1y?Z)t86IIEWu3V<2y}t(IzQLKsT_FNQ7au3@Tl6_&Xp z>t*M$%sJOSp8qZUeeozzNQqvesWo?yozw_fTQbvvv@C_P@rg`PCX_>4j$ z8l{ojEFA7C9PUmG*`Owz)i%ZZFlBkxiwzdsg#yci*;K3LxhyvoIF}7S{|G9}WI0ME z=Rd)TY&g|#z=^DKr?8}O9O689C940*F>;*z7yCG59xunc!Y8m7<%AeZfJ4_4!_Pki z_9-E{UZ!Lr^k8v}YN}%CJXOh5Mfp5U;UqSi9P2R%(-lr!GX_LX;wdZ;H1OPYhDr<= zfG6`5mNa78iU+W#V5^NboT^Y_CeK*i=ch3_izl-Pf5YXzCFp{_*6~;bP1t2FI9E{ zk3;+D#lD?kaC|B=09{PzLPBv^dOn~Fe0#FN0jit~=oN%sKqwA6F9dX^Z%;8el#x>a zT|_93KNU|om(*Zq$(5neu z%+t<3dXaC>Fg)!%1JId-UPI`$JnihGXZ!X{!_&?)0i8kUb%ZYAX;L3O)wgFELC#r# zPSuzI*AwcFFKKq*dFA!sL(H!mRVL7mKgk(Od4%a^%uPI`M4V%Ab}4fJaD1}N0VwL` z8d-*eb^siU;KUJMP-f3FIDV9Q066Zr%K<2i=Np_x%6tGEW8Cckl(Od-98StP063ml z?f?{@=NefKt^>fa!#xhbb>KWB_u!Ns0LKaUIsgUy0)sP6Spa}z0=no$l6#@SX}K%} zz>WV32cSqkANne|696~#_d5XBmJ5vBk2695+^9d`09-UKbcdlA0^kPxK?mS!aFKya zk6Z+R8|#%0Krw%@ftQb53;>2XMRyWq;a2f5L;{BS5&BQKVSWU|98dpMJQsyvhm;QJ zAoM84xqH?hh2r^f9&K`*Ve?w8+&Dks2rdP|OAK72F*) zQw}g2fJ+TrqvTQm+&HgsfT;jnX5bnnmjU3$`Dq7O0>I@4u2FJ10B)S0aexZ}xWd3S zO0EFFjq|e(a0UQZ8hF6Sl>oSLe$D}YhWdDw5f}ik0>F*)^A4~WUtDeA{UTQb;Kum{ z2Uq~WVgt_?Sqy+1XEV};Kuo72bd4Q5(EDSSpt9?=T{tH1_0L^xIW1B0Jw2})d8^D*c%MI9^?i9+&I6+ zafT1V>(MyF-{7@qoZm={^ExH#a^w7_f=>ap&9~@2;O6t&O5S$kyk5!rXq?}11ed;? zvNsxe2VM*y=*Ib72UrBaQX}s|N&w)-8SYu=pVv4FKFYzwZE30l3)+46Zi= z;Kum_2Ur5YEk-_oOaZ`+^M?*_Apo};`4A2f0Jw4f$N|m(;5H*4!2<#SH_jhBz|ZKo z+l_n-CkX)DIDg^*i}A%BMm~X)1ORTFKXrfw04y`|sgh*?xN-i>0cHYlr;*R#=Kz2k z=g%GBd(gPc$mei-0Kkp&7Y=X*zPQ`S7x01rz>V{l4lo~p!dNFigN^W`~c$`DnMJ!Zar$idmFhmAaJ?DM`n56#%+vfEY}S!L`CzPtc^*vKPB z9>rIW8F|RaV`iRx+{oj`zUa$~(0?H^jjRUz3HLpR_DKj9W7qn!7Wyt`Ewo$*;~+i_ zNnz|uzP#kyXCO`>AMow74$c914%6S*mwkEJx6dQ)+ZTWVGaRK}gv`K{Mh(_t0vr2^ zFR%FaB}gkwTfkp-Sjcs+U{)IYsxPnl7Jl65lh;thx33#Pwws|ZyG`5 zP2|311c0|d;cX*t8~d6sulaU8rm~UsfWL#UFwFpe7g81T%FMOzIZW?6+T`C4Fh`7i z-Iv#W`ynP0W(L0e$ic~bAA|9YeZ!YGeEW&3)u-Ti@HR?)hS>sU2L8{%y2h^aWu0%o zKx=*brNh8^`xSW6*f)K7)3;xPVZnj;_8ZjFx8J%_oW$Q5`Oet4e0j^a-y8YX$oDAq zgAo+`0Tg~T@}seD`|`GLf5Ln)@)O`cqvw44i=+6f!$sNhn~~p)UGK|!-%btWS0ht{ z`F0u>D5#f!PY+~zVBhiO9cY9BDb5H4kr^m;av;+JIXReTPYL9dz`pCtyU^bP0g+Py zpBZp`P7ByyvjRb67IIGy*gt0k9G^1-LF7#2o)riHX93sQft(%K_k4NJx3dGbe2%LP z1>W31<_7kCU*7layg=pzg6k}He!v-XPQYF}HxNY5Meccl0B{~KE(l~nU_bEX1K%zT z1V|SGettkMzrcNaVZioZ6bK?00d{e~_FfW@&Z0mNS%ln61KjeEOM&sSKrRdHhrWF1 z+sgw1lFI?VA|Ov)>FRuy!+3Qdh+GZWVu$e>SI27uLF8KGUKa=e*8$^_K$ZmdBVRu9 z?e&2G$@PHW5D1Xo0Qil8pu#r>bM4YV(6LJqyD8udyxH~dErB3%3%(2m}>+0PqI`0kb`b8m5JVnDp~qY`9}igN)qxBd> z_@wLHr`&+92?UWffIl4w08az{OhBT~qFLZbK%N7mD|rq?-Maak;%GnbM(+jmDOeMQ zUUWp)2AroaAs)y}$bH%M%`2{guLgq1tH^yV5CC2Ssn<~n3<%o(h9kNTqX85s^JX9* z^d^Y9H5qFPnD#B#rnk}6fxL}E>mBpF-{v%Ir5on>F0qU@;M59;YRvPhxDsJ5cvwZ zUk3uf*FgG>#f z1+0M)N16s}(WE=dVKyaX*> zS}p@or(d0{x!zr#qO`vvC5T*sLRY3Jd#_4S=3Si-FpqDxYO50`-G^^WKbDM920l({h_Aao;$I^FFQO+-sm6!>zB_+5_Z-6=ujZa|h}bhRu8QKuK4 zs`>dnuJ-q)1d)4D=srhuMT)Zc{*)kcKXM;Pu~!~+6`DG>1&8V6LQ`AMoJKQ1Mqd=X7C>1Z#trHfgLdo0C^kp zLd)AA>U8BWF@Z|EAh$o_HS7F^L-b`z5cv{?zH&srcHR3;N)Y)5 zx!lpyjmAirRSYxxC4osN&@;`3i! zNB#zh0`Y@FQ`2nIv@{uMdRh>fo}O<{O0$A9(&Xur(}Kv!$UP-30GyJZXHQKFK0Gx& z*Un5+BAu2NL{3AQS!n^GS?R3V=S*6L&eC$0cJ_d?wVbJ)J>YDef#2x=qxJoN@fp1~ za<54q0<)Mi7!&)9j zR*`*#v{z|ag_N<6Li#$|k7)tqG0=Wo%j1CcwX1bF4?MdXv=bcnznBCY7RjGV;i6=g zF`m%!1nBg)PilEm52Ehc=06$dU_m~6O3PCyJJ7DtvIa9DQ|x1+!HoB`mZvfHt@atH zcz6*AX1r&$Jd3g`@!4|_?RtoP9t)_3Juk2?Kv|dyrSt5^s1IuaeDw+uW5M=oj=UJ4*3S;CE<$GfDV=N z>>F4+fhA+tX<3KwhTAux3$g~DeM`$*fR);}u^MQb4taGHo+W-2oJ!WymidmBcYwLo zzN_V34d1jP`yO;1E$^Y$??cscpMT&g_yH;iq#tVe(B*!lQTk&o2tP*YPqcgj8o>N1 z6jPKi_A@P?Xv|6j0PxcdL9<=3bZzp*7#eL=`Wo@u^J^Icy|_hmY~3yeL<2l^SlAe?~`C&M4r zp5n_X02bL(eL=>l$e-!UOdms*vZwiSn$J<3<;yJJ@yh8uG(N+ZGw@Nyp6LrR&h&@d zvwS(r$DqPi%=1Dz5S;DH*~p5HeIWrcHNc0u1bl+9U`@eSZPx%_W`i`=0AJ?#Wtgtf z;V}FmRO}xHAs$@__hhc0kl{Xk#PSm;V?vs@jGgDpJm5Ua&i7?LniG1~pq1zNat6rc$4s*c7ayph?95BclsQgTyfiw;SOjo9VNWhQ(i2V@tsFY@~5MERSPz!1NrXak3$g`F1YTbCJeriaZMA1k>}7 zeh%qXzMaqXe5BVR{RoT|OrL}Ft4KeLJpBK`aGo9BfZkM3z%MjG|olj zL6|X^UWoL^NI&4)^O-&$>CchIS(`5x`XSF{FY?_9DT4T@*#ZJ5BhS2`|e5~BYTxE2(Ln+t9`lJ=a3i_ zTI|bWSLhlRy4Dwj*P_sMC{eEIvA4vR>wH-P=cQ7RzuuSY!2}KV248OA%n0m_zTAj0 z)x+#kUzU>bLytbmt3L!+F#_QTN;mm(6TYO^6P8X+om+gl1+D}^Ko&n3&RI+MBJ5; z2NA)GAwC$VQVSywA<~PHhY=}f-JF&EMZK?-&57#CJZE?q6D{<|kOUcV!^lm4t<~@=EXST+?FWXdz zY2F;Mo(u6BgA0owlBPPzez*%W_CJ5*0QPIn&y{NwrSGjUM#85T_rB=U>(1rKwDi{C zdT+4)(1J>vC1xhh;t?qV5clGxcs_5h;k+7oTxm+-h*>%xZkftHqKn|2RS~&n8TVKPHUU+#k5o0-P(sdL_+(Mj;!_oH#~ch_uE7Ub z=ja?7yGNu^fORV@UaO$68-{4!iJ1a#e;FqGH_$c9(WP$|d_!@Ais9{E&vWisT=PcBs4^4cu@7E~tDqw@%fM5MnDE#{=r_@kc?jQ^ zD5GN(3eh_Yh2WhM~G6BFGQf5$4a$~ZLoMCf|+&vjxK=o z5rV!nPU>V_1Kfo8kV?JmRH?lfGoFNSn8(X_Vr~TH2{M65=qd!vP0}b$4fGIV=20fT^D6>HZ_`unitX-;UdyJpebhn|b4JI|lfQR)l;;g$yAE^zpfT@pmk;N6Qz)@cd>bt^|M|Mq6U&u!f9Chc%L!9u^sfhe`NF81|7dh$|^HMe3b+8ZTlLwqv zi*nR2g@1u!M_;Dkvm=+G)a8!ot01}?9dLF_5WRxVIgaR+d~AS3uOiW_`M3ayE~W<# zn+*RNK&}D0Yw31FqIgjt+hpf!L!#I7odNjMK$GD60DPX}Mn`=es1M*v0JyA`8|BEw zhT`U?$i=3JE;bc>2H+M){Z>8&K%h!5Z~Gh(1F96THQ_Pl!Dg-yda<@(&eF__YvsB zt>F^|=Y}kO%7o7pd>YtG^k#q;gWJRqE0@176xZ2QGeLi(>sTahn;ZQ20OYdU_0@ml}p}=qO@{hbl@L;-QL6{Bakjd%lHh_$LHy zRm;}AY6$}f6-(FyaH$ts9|EYAf22mHb1O1GRaCR0QHSaX-4+PY_tEMOrP198N3F$V zuE<@^au3d-<*DeBNUHsIeJ4ooe&~=@jOC2}XZ=u$Tp3emh%B*;}q0KlHSX}CjbX2IO*%DAlb0wgJvIIK7 zsh8OjP%3jJph&U=cYUlp1SldHLCEo_qF7E!`bKSlGA#aHoNtI|JSpZPm~)UoER4s; zQ22oks-^9aj?E7#^bgJzkAbm@0dKt^D1{o1AY=Dt&;_a~g02=f8YAf?iZ|w+Fe=oaRscL3OBB$L|0aQccm0LJBCJf z9FJWKUaXLQyt2AesHCs#)Qv9&^2(}qcffFca~Cu{z5^CdXj}?)UE*%2lw#?3GMzkx z>nW7pmALF#+2HPj0!8+g;NBY%%JC>hcQyB>zJC<*+?ylreTk#+kYH}K23pMNNUq?m zKU70=2Nl`(xc=nsl$P2M^>VjbGHwTjdJUFP1~+gA#ha;a)5NF!_LX4`xY*+HRR`d} zXCv^>-T2J7trN$UTPG|s2g(RJkfsU6?GvZZK>%{c1pI%+1<=1X@Is60pX`NC4pVNQ zgbSaLYH<^=VM1?bnc??>#AH+4VX?EZyTTOK++M+wG@Sb@%o5zf$Rdn8Ry$dHSYmqM z?TuWI##OJBItIQd;dzgE(dh0LjU_4F1CQCF-;$3BC8Q{3VI)Nn zP>Ld;6h*+RgFW#i2j(M!E|`zV?1~3N|3HfNh#9-5lc8Z|yfY7S=0jrkV#lRMK*ait5`^*qkA2X(7i& zKDYFBB%zKhnd!&}+Q5$y3-yR3Y-qyIf5K{%xiGO{=O189@DwW52|SV^!cO=#gN`r< z09)KvfHwiSGr_pS53p_nhR_YCuJeXb>SAug;Q#AsdXR?$t4t@>A6F?*e@HvZKgc;g zX0+MOPSQaVLd=y*pD~ovLwJ=Jt=k?lFTx@_W;%hM)r-4`?A!|U)oK%&c%7tm3yo#JZk zdm+0sk4hdB}f-brgSTb}5wYp3{apWdp<>m1Iy;$iYTBa33d*@A$x1p)8b zBIp7Y06|xFFM5`XLKJ#QFNkHn&$}G%9qtq`oWdvEXx1#|tEL_D!yFBAO;+>hfYV?Vrtu2V z5^cu?Pm*w@mh-wa^rX~j8%UHPQC7h-gDgYlS<>g#+96rphfjI=m^B${ zFoHVqv1iz#HjV2P*C=8;KRo?ZBb#o7?a2Od`IyUQJ^FiGhG#7@-=r+evC^eNuj3(w z^?gjlawahOd`>p*7q@_sc8dniA@&}p3}4g0!U?^|HJ|Tj$S~f?`6 zloJ`!J^doazzKA=sz z7sa+boPMpzbfpTIFItJBdkUU%hV+PwLLCfmT*acahUc&jMA3a@pzMPO72~4N?7}a; zWKq23oG;2A4W&v#OwVZPP=E9n&wTVZjp|NI&~^~|JRWQJC@;kAO}LgbDAC>N0&$B~ zI4xwuadtTAa&c0g&&9ELl#BE5D1w9UJQ%0k`NY>8 zJ=c`DEN+73!87CB`Edld)bij91o3jPCqtqU>`bPK2A z-tlG$*3VCZ|5YrWDeh_E&<|Hn$4pGj)8fLZf~^YH_Xg}$s+~Rrb?Asl9Xg_YbqMc+ zN9s^rqz=_Z>QG&z4%J2H(RI>+n}<3n;oE?9d@!&(0xU*?06J1H1j4rg>-a2XUj#k) zKx`eKVHtp65T05_fOi82#(NLc5;ZD$r;EC7gY(`C6OWfTlYg}RxB-Sw?mrk(rD8~( ziXoLMhJ3t)VOMM<7!%$#*Vb}|54a0J1Ukv*~{bJZ3+X99IurFX(2?5S3rI)u1*CG4g83^Vbt6deO*N2$mb4)$r|p3|zG_1%`MVQI?)V0J zZKgXIl25a(hOFrqD(RQm8aeKzmjm$93wF3WC${d{zQGE{H(%6ns9d{1Ck$X>+coUp z;Pfo6xv;E-W&1PRkHn%> zj#Hu^Rp8HS?44PvajFQ2+p?re1Ki9~h4!{Ge7+B=NM($_0kJRQRZC`V=MY zptvGAI??YO>;wB+2$kxloK}-gJa!MW@L=fx)oHK{;eH{oL!}H#(@?&&+84>;Xu${> zPLWxTf{uyP=`0-y6!=Vy ze}vRzw&jaVG_&F15^St7{3S58l{l9LwLe`Jz(z!?S#3x8+sN(54?;YnFzfD_`-=ZMomH1 zR7Eca7`CP8+PJTxgYxn#h`k;T zh#oU>)STDDkm&sqCos-)J`dP8!q36*ff9rZVfEw;I-iEC3+Tp>xmnZ00U3NAp1z21 zbI^Q_1R>vtFG3dF928s}`0~giWEo^#%9dZI1mR^_q?c#cn+*puH@9Nd>>J$Fy<8?a)aMF1Qc%aZl71A>bb{z<6X*r-&7?O)FAr^AOm_;Z z7uiZWI;IMK6_Hy7&V9TRdtLTi^*XjJ*1{6!s&J#g|J@c5q3aQZ*uxbuAA6fphR#0` zq4Q5f2o<_3^WjL^ona9r62f8%DuhrR%Nas*?8^`)p#BVD{c)Zf*dkXljUOBs$PmWr zDu%FD4`zsc@oMM5AA~!+$(k+wWs`&aN!!31?4SJgRXEwgrg{Jcv~WiXM~u#-Lf@^ro*6E zJ(Vq`TVnF?8T_2M#K(Ni4hZyZEBay*D#XCi~}mrnKC^?&(doEW0KdM z-H^a!6|UisK$pUAT6=CRcE@KGIGn@-k~E_7xKbKyWmLy_7$Qa559iD5B+b`PE?$^E`gFPw|V?!b-HY5^aLn0YAM7AVH4#CeaU`soMKTXgT0bb_p zjsRi@ziKB{kY2G2DW{l#2zjhX4QeYw#^gl^yj7!JDgtg&5m1C6pa?;b0Xrh-0`(RF z&438H+kO8?XzUk{eO74nkIu?+G6SsOCMTz7j`_L9b1Mk@KJ}7lH1><9+W&SZh(U#( z!%5ONvol4Jn+F{*JnjcNGPItSV(Q?>lcdb0oEQpelidX{Zef)(yE281EHu!YZjNA- zOunFAC3F5T&pc&FqTr zyQ1RUM)sxsy=yof@?opYZV|g<%53y6*M0cjJ)+q++HxYfHPCJ&TSq^f6L~E_lu3*; z?%;S@zli63B*E^<4KJ`+vFueoR@(zf?hecOPIeC`%X-CiP1eVGJd|^{2^b8)c6&sKQ!I!p1yMx-)t6@1en`^z?L--E-<)0jrH|lO6Crs9pyV#d$vQhwl75J{H7kz^ShNtVHpWEm_%$uiiT5Fmgm(-i?Um+rAFk*q9vWlJ@CgCp|6d0~Rv zkaOH+IjGqPDNh(upfIFFVVJ?3WXPW{W7rjH0K@K>c?<<}j$tq80SwFSvItRM{?Zh4 z`ooviMFv=St}>?*o`ruTl4k4NP`PJqX{XJAi7-=<&v`?#d2x3 z{vE-Te-XM!=U=-~qJECa6Zk)y#aLp4eUVG%*^;8UZ!9N;O zQu|}-?h>YCw{Fgoa$*B5DPd}&b3Mhj&zAaCnA>|`Q_O2F@IKp9_K-cDs}eY<3`>%R zE{osP;mj|?j45*F4|fR4AJ+jZ8{}7^8KH#H;pl!+C0K}ykUt3JF-4;MAu@=j4J-^W zZ5VeRNj$FpLI^sAip9&F~m2XZHjYnke|aOg_ch z#GkPAki%zKQKh5gD2JsP8;BNZmX=`_udqf~G7bxV9h0)*Xc&-T!3b3=4H)j5L zt^o#&jxb>Sm)!^h1~&_^NBobRu(#sy!zRJcr-0;CS|a#f>okQjFgHwBAq)<%Kp^8J zwYSnJ?`#wN;$($SV3t653ci6^Vw30|MW~x2!vxoRS|$LRg|Ep}&N{)bVV39wlLYTk zoQbbtf!M^J&8rizMC`3nC_0-zQpuuoSadGrR_@wFXBrRY@ruOWiY)022rPOoi^6(< z@H}9J*>H7Fz-10bg(OpHuNlhrQ6WcM0J&daKc_5;niwbw3p{+ z>W}|&GAvfz+sZKKGvi8OmD9X!agDpua4j!eV7N7m0=Qa1X|{w9o4PII_3r7?pf$Q| z;RFu0)wpm0d9lT$N{Y`L7@eZGO^NF^ z-p9z_zHkEQ4)=45UHNN^A-0! zBkaz*93gLWWCYCjAn$H)HD0OQgBB}QMuTS_;*X0y%sU)h*&m5u$VBY@IhggVDc>Sk z#XB9`Q~V#+-UQyN;>hE_XSw%2c<;egQE^GE^F#v?6EiUa%0v$G#Hh*O#3Y)Sj3y@W z|8zbR6O+m3pF|$6xTE5}f%}3H755GIecw<~aYsc(#U1tk{Z-#{mnRwLKQk|p>f5Kg zPIsT`>gwvM>N^!ew1!4JQjY&&VXz){=+i@S(=y`SD0gOCFWihw>kj(+9$RGb#s&AD5?x zL{K7m$_>QF6~BCaJcT;1}|Y7jd_c=9nys za0yY>=OTNKIo;lp=j9zD3Ht@L{830);_-ocLpV?s(ztRmxrX?kqa zktO>wVlN#OJ4+xS(!nu}o177)=#Utmj#y0WphM${)3DdzZ~hHagWP>vUO zA;h$BJO+d_{3GJ9FF8U_i_Juf?$+b{gslll`kfN@Cu~lDuDb=IldUNq-Rm$xuG1VY zI8?e1Aojv0h^^fSLEV-*Qi-cbj8@_r5*sOTEs2el_=E(Pn|SlE7F6S3E5~c>z5YN| z$)B6M8+Kb_U$FpJHhkG`WAlO&Pvn-J&c;F`ZO1?QA1j;mg`AThtn(t*7Y-TTSt`Y) zQWPa=sa&a6J39D}{|_46IkCnj6kvcsofC%xIyxsV($=)vIk7(iRyrqc1Soe-oUd$d z-t=p4UrM*5$_2|fo5dutakF*!hL8Q-uV=}-Kezv}kv z4c6<{x&u~i5vVR@B-Pm<%wZMw`>~X*vs|({%bkPxKgb5}t)r5O=>e!>v@z6msoe!u zwh-O*w#wy!>e2;Jojt@H=1QbpgtAdIDw}=890@iybngs(&BXWsmkNayk*&arlCfK| z1>>qC+pcZ2(ddpRGA=rwWv4#}9ZpI6`#Ee1SFvGx*Nr7{W#3yC1Kv*dZxcVD_nZG% z`w=mkw4n5k`bPfT&geJ)1*N<7zjXaL0pNxG zWt9HgqQUD1OI^(3wQZE?mmBIbwopviO$7T~-=!ql26}D_K-z*w$jS03|n=z)rad_>pGl+bW;*zEahKF2i4!Sk>q!+p<>eg9b7La z&0k0dyE!bU(m{YUP&Nn*FTbQt*{{wbTRNOVt(&D7p+EsMlVprM9aM zCd+2uYirVbV^v$~gQDe{{o&oUdhPRRxtIa(h8cKmohdY0t_feXT7%C%E40&qF`I!Y5!stop~DucmB zw^k}SQSB4Tq+UkWLW)>H8AYr}C?gff+;bdH(kO#ML}l=o>Xz`bGj@kpgfhg*NV8qw zA-}X;bQ?Ubo^U?on7U;5+Xm0RpXk=V`iDF_bv+77cI-Y1TgKl6Ui}-e7M!?63c?6P z=hImK+OG!k>dp;9=$SY_=VjEX@dPWu;Cf2=>f1nNB~&2Di3gXn2#VSx|kwui32b=jpO2|dP#f(}{kq;4!lm`LJ12#7yU&UApbTS#9u^5COGSt_R^awqX zy*O(D2LZGcX*|5h?=+Qg>e^(T5f5uw$%+ot=?6MaO$_h<33q{azOGU0ajjr@YdhSSlS zfilrPuZS{PRDyK=6`kv+{KB8413)+>Wal6~*Iar&zZ#7nC{eUnD!?2A<@t4I*h_>{ z0f1ybfDB;)!;sqm!x7s6@-6}x>keQ znV;7+I+<$!A?}6*qUoAS1kpD~_z1s|JVbSf8sRs>hR6?DBm73r5FH|7=yw#Piatpd z8Emh4%sAP155D(r>0&+En176VI6;KIkSz3O1Pd^G*VrSE3o{Udq7}_Rq=_&C$A|4P z4sM!(xZh}NKR(zsjn~$97{6B5&Uk#Vb02T(X41b>IfAh;JYgW#W$83g}|3?SGaaW107ei4hh64N7=btMjsI3Q7C zM#S-m5;G%?Gn6olt6j?H&4usIJi*Gyhyrc zrLK&m2v&;FJg9M%njb0bj#9ToXk@>PA1-VhPO~-B9&9O=`7(%zED~cIQOf(%aPTD) zRf3Lww>DDD%o(5-#%n9Cni7w2vj}Hs;Z$DdE@kkn46j_pRu*O`9`n_?k?rHF(pS*j{Pn%C&*l z#M8de(Xv%ewFwvhhH*((rx3D;Pr3-aZW00SvUSAt5kqXlQb~#sIXl9Xkgck&2l2Bj z*<97_-utBG@byC*9Vlm{jWD?2D9USlgDPzU8)X~ND(L}yKjYVc`+$CfR=Ks+WU&{i z*2G>E|H`lJoxo3RTIMrq8#hO-F;Im7aVXZ%8@H_Yt!KV;lndqk1eLzSdQd$uGA%0? zgExlOYI{Tbn@6cy`lN2q(kI)41CL2-S5~BOU}Y<1-(5k20z*E4`)ae-FQzu39R->zN0GOp$T!i-2a1U;D1y_$Nwi{O zJBqZ9Vv7a}+rqUHlV}ajfGjauX>?q}W~x`4r>0hyEmW`ePjo)z$oG4_zF~rpZ)VY+Ks-I>h+D3FBJm|YG*ZxP~qj&UbJACt?X@fB%Klc4&V=NBspmHeNtC zcPzU3)0Q>{gXSY3rJuH=7*t2`vsM&8E4sN;3yNUjd^)YzsU5}OI*Ok+P!ND4bhF+` zcuS)5_Iz6CCR@zjjQwQ@AN&Y3wu|jT74(DbFDz*N&!zUu_IGx64fYTGtHwL& zIXlGgfp={|(d8)a0mZKED7xw>e%*@V*G12N(}JSgQJf5l-?XFXuA}&E1BLyT=uj;J zmpilK;H^1PWNTj0PB}RA%DbUEQ4Vw^lY!oB58H!1dMYOe*T_Qf{#R6IC>2`d+=V`a zFe2!c`9NT017{Eh1^H|WGJ}YlRsEb(HjPMuVR4z*fKgp z9fe5ikL@Ui)=~Vafr5yTU!)7!F&rA&h%G~}TrmP&XhaAVSb_{2Ad`` z3e+fRu&n5nUB$j+=u3;<-LRrpW)=IB+u)bQHx8WiEU2c)@hNnGtS|BpX7~p^P_`Bt zDKTA~Kj0~l296=qqx{;iJ{=^Fk)jCt%TVNCS!m>^ha!i_gQO^eqA(P}Py;`btMP4z zat@Q#Mp5J(FCseQWf*WA9_9CkVigC)qZQGUqNUI@#O9u7~j4>^&iZW!WEPnKs%enEJ8irh*X?L>LVu=pEJm9t6ya_BK`CZ~a8 zR)oQb|&xdgd+t*$pKw;dD5GB&v^(l)f5T^C)Ay^xCboffSRLyVXXyUi7PQ0K(PEu4O=z#> zl1rJQXulcB>g2jex`XQnpk1|&_Gr*v-->qCcC=ifyN}S$m$iz`2W<_sH%2m5smWBu zKSQIntJTro23jmwnrHZ{wWGZ`$`3s*2JbB%oAeg&mcYvNh7049-Ce?sh{T-tERc?eAW@{_al(bY$%>qJphp6@*QYy5S~4?Wn#|M|I+W zZhYm7sB~;`zhcA+6&6De3>cBG)=|B+puK}%{UR!zN<1hVB%yjp#z*a~TBnX`_5f7t zd=ZrnFWgp1sN7bm9hKEl-7x@_eG%0qpmOsjp?XZ_P3@?%I;y7!3_CWqn2xnk?xmm# zwoss2AWNurR6TW67Y{(y6n|{8#z)0ogq5Ah^BU`hY)@P6W7v zt{DKbaoJ7qr(7~1$S&k}f;(*z?)b*s`^Q3Mf1#2dCE2&%fjNu&Mj>r!JzEwZ4TDL@aydFNcMf!@w zt}~1{`)cd0%VF;1bb^#0uye@aqbTa;=s?l6;Hi}7sFZVQ)9F?Zr*t?#%T8(t6}v;l zAw5ZLRP!e$eE*)Md?@DPRtPCbivn^+?kW4#LBxr*${u|z?n-gl&F=ibA|V@;OfYUi z=m&|evVSlvf=-NU%Pcv(f< z+&eY3PhN^K)6+93QW}y(rC3Lw61L}FUg@Fh3_mFqQRafnDn14pirROwm7Bv(0M!kW z#g|oPPb!s46TbcJhd2LKuSV_b@kqt$`;gladr$(+RL*GSEH847I&zC6ZhCM0&neEE z(M0nSHNju(vaoJH37I5l4J|az`bPE)9g|GIoWe$eH-yAeC1~6#&Bm=VPE8|kSTm19 zArGpP+~F8j8ka1(yrPr)mcA0ua!5I%L--7<&C4#s07VJjktN=?MnlN5p%ZQTIoD^Y z4dvg2DjEH-qSbow;`d0t2SH6S=|O|)a=WTQJDqdGgz|4z4vVU-Cy`{ z`4`DMh+CYOwkVb6ZBcKffL>8=Ytew(J>{&s`GW2(7JcK_6KD1$UiB!*SgBI!=WFq; zxao&R)iT;o=F=mDXlL++uTdryqT$8aB(Q%L|CUqa+fHVE(~vWVfeUYzM7#?Aeyxbc-zAi)sK@y9xV@fM;$pf zUgqeFiRWEao4u8e!)QuRS&ivYwe|+}RO?OZ={UNFfY;tEuHe4Bl5ryX^_YHUgTw5D zp^-sB(|9JP3+=WR|NWWE1)<6E4~mnI(b;dvh)cf~U&ojUdZ z51w^|`@8Y{I+7a}fBNR_XPxx$PyYuv?x^EwWp*GmD)R0QisTE z?NDhV9V&$m-2?NuI*KX-?Hrn+)>%(doulwk{&67{NP^Bw3yzD?U9~Yt%*BaUL!+Q& zsnCuYpU<$WW`WD~?7W1{eJ%`OrQX(%5Ve)YlQHZxDT?)ti=vub zyjjMG6s_r8)AO#^^au^iIl4o}eUr(j-M}mobdu?S-1fW9x zg2UYUyT&!pBCWZ!YH8;uam#fDh}`}v=J^aIIR6F2|E|=@p0bifH53eWM&e7RuKuG* z7}G2IqDLjnr+s6Sc!>uKfuRZ|^ZB0|NQF|qz5ZfXhwg*BiIz{}$ z&WF-ysA#wo8eTML_ny*-Qtc`=uhYqsPl~)Et~>KHjWCHrm)8?_d_p3NlL>4AV&{CD zmZo!wb1Z6}&TY*xGIUSOdV>7XNin9|hNT;pS2iu(&h^cbuo1I6^iX(&eN^(m^2(TG zfnFh=&##a@OWEfxuM{ua?=!F*%H_`WcQ}@KLhZX*SEKEi5S411yVMstW8JjIw=#Hp zP?Oof>1;_RGAZErjy_q}`39$wm-p(a=5zL~vac}``;cHHyt`cX)<+4^=+A(9l7a0n$h8h>2W?(%Lu49EX_Kk+%u>z zLoQ&(`m4f{G*}alp^_U1--K0KM&D#XQ9j<&A_J~&8>mvY|*N$GOkFH*-Q;gP)+b8s(3@j3o8l)SKjJ{V8pkMx0@70~TPgR}vi zwN`RRGo$R^l#>o+la zud$z(l!e8-pXW^CILBiae$Q<@;1#lv*DT)3${2SLukd?r-XXJ}ZRiUg{fs5Wu!C2z z?~_N+LPn9`Md2iW{H1?;2 zXI|Q0wx6z*{fuw2lSelEne7B|Z6zytFIW!}EWsxV=JBX;o6Sfmq4T%&~m1qS8Cta zasHZc?2xH21=ZRQ6sMqpSFsa2YX71@1&zF^HZ>nqo09cM9IZEUr$sg`$_LlB3n%Q2 z{C#!Mo_E&%HJq_G^7q$Kd)`(1p~4s((8P0~j?rt|^C?)17d4p#iexMrBgXF_jr&39 z>|AgTQ|(}#q5E_?L{AUlDbh5BIW{kGcJ87tgm9RC9>!0;85GWGIi1%UafD9G^Zxmz zJvklE&-s*a?bFM|Kv+v>J$-n-kzOu%-%A0 z+T83*#9Sz*=v_K_=X`8TvJve$#xJepVD#9~oCe}xX_n-NGbfL2MeLsUUMy9Ij&sDK z=eu=4Z+C;($VVy9rI(QH2?G!pZph0(d_pVYvRwL`h);CHjI)l^PL#|1n4|_`KjPQn z=*a^R7uOOj0P)GKhzTCsiue>q%+^IGZCD1}3*r)pPj!5a0SIPbN&W^0*Qd6k^B}Qp ztBB^xX)+$rIx;K5e4sa*9br2#V2uohUuk~L-`m&74m?*IE!5eQ?L zp>o(+9_2$=#eWsJ5Od1x>fmn&E*U94@WxuAUP+hU8ktQb|F|KDhkueRQp+olu=+>g{+-2 zEFLauDL0JFpNH@n&B_RCwO<6Ii1y5X3+4~)nL7tFi1y4~LOhMoEp8&I{W6$3G&6n` z3?9~m1~FN=n+J&_S2M)2Zg{Y)SW?$S$dV;l zGF%&tN_Gy%%oF=(zP>QoTPMb)VAilPHsl-|lkq_GSB`&Sd=D~H7VTecSOXTLWi*PWl}Lhg7b|L78Pyg6zK#`_p+O19})CSI^9E% zGB=hec110Rw71K$Aso^IX<@40sHHjtIsEJrJemhJC5|OAObNxl9j=4|-L9>K!rPh> zI$r!j5W{0*-}Sd`&RRV4u}qh^M@Rq(YlFXRPc@|Y1nau%ny&GZ{3&r6)fr=>u%?mh zsHGcXo5{wjgxNd?g|ZomTkjT%>a2+1GWGq`*;tMYZdr6%-PEWnhang>yRqUVygQ6B z;SE-#%)@_316l&Goo)Bz?z|#OlBv<(T%TNSX!VRwP;-@7xvmruhM*E-bfpr53HTnk zvB&C3;nO;VVVb1AX1C}9p_WVXIS)4!g5$F)T8n_(s+advj#&;~);o(YG5yHmaN-tn zk%rU&Wcfmi*12v&g;p09^3VUWCz=;ZMr-{(?BZ5X=0En-^uQdbDDzS|8aGhWx|`0S zeN45b2!sL9-Kc;LzBQnWy$wKqKY(G`H@}Q%#4T;%P49v8^}lQ zW6@UHqr3Zo>sd#}%UNO}fnE_n2oN?h{*b(G2vCmbnB=!Qj^S-+E6D&X^-VN;4t&j> zT8C-igl$zkxmFFA8%Qw~&?%%OK1R8m_;H?KSh0AZG(Y5B?xE3OwsN1~?FA~f)V;x9 zqMf-Wg&G0YgqDHBc*UpiJ(=2$x2JEkX}g(a5iiN?tCsa;J#4SmwH{rxR4SS_g2(F_ zHi@mJ$A7h2cbpp zYF5>~O5f33#>=9Z%VWY^9^(|~X^a3G{mJf8;VnIW~fkW0D|!j zE12zY)$Z&I(U-KzOWiBfz|PK>BTn05?ug999Uq8x?@326ayd%fKHbi%G^*KpI?WfCILzQ*)?a!Y zW7e@}&|*e8Dq!hP=};;ohuv@&pBRma_uwa|i0FF-W-PB9C3yVu%FG^ed?R(qF=J(* zKKb zL*;EltKK=Rv0#Y)CU080p3FZ+iAYs_#@48%%V@dkU9RiAq;~f9s~fMDHskc_20!2$ z(#J{fSjdCH49zKv4Ap$Lu=%H-|838@PBHQGpFHaPejrD_r}S9$*-_#;)OsxOde#2g z@3UZd5>S2qAA54_N0*rTLLKqTlFm_$UKj8DeD6JV@KDODd*%Jno?$iQy@QLAQRnaD zG<@!sMSno|5FlGSSZPp=akS7NoP z5gDyhKbSl;VsM=_I)=niNtO!8jo38|-n0bE5eg0^1~HY<7t-`FL-`J>jR{E@{1%49 zBx1GLqlM!7`nW(gDZ!I-Bv#F8?xE$A=^%4A9jJg+XDLZOgVn7Is0{#PkquJsk;g7+ zjzd;UCU}1_x*Oc5e$ibRHofxB4({vWoh$c%pau_T(>HC37@RSeagE*K}y}9~C zYA$C-$zEY7HJ&yYacpoHYfVASMIjpLa$COwd^MjMEHC)l6cG6@5`%?yXQk1)|AnN9 z>$-%ML?A_q0CeEy4Cq4Q0@OIQ01V64`7%kf^_F4wBa$=~ut1U~66XjeizH5bY&s-k zVzk1Ftv^wQOF=1vC%JRO(gPj7-@t&^Pk#_~6!<9FTB2sR92@1+doBwg)L+wDF62m@ zj$FY`IqOH_^!wEF1)MjoN>nUtX<3N;xTdNrL|4z}2*YrSu2Hllw5a~CH_CeIqS4Kpxisg~kR9L)r%nr%!;j=@Y=RAAcF?{InR3 zbtU+x`P?W(-52dZL(q=XP=3Y?I=3@F@I zHHggFoP%%QC|fBLpX#hzq)5hhslSll|AFLRJpP|b|5~{>ExquD)=$|tclC;4u!MM& zG-MJnj9xJd&%?S>p(i+S>da+GR?5#@O{y#SC3fQy1STRXF5j1!k(-Z65Q=%yk0t&;oT9CMz+j_qANEU#LB(e4Qp#weAb|sP4hPfD3d!|w7HEh ztP9!W30iriP$zDiYk)Y6?iFvVZ$@~cxPK8mkW*;hRhJvIjrQ{OT{I}_YpU3kmxo8$ z+I~oasRJ{aLuqgB<*uEo4feXa=bqRTELPrjm>rhV+_lLG-Y;k)$JiK5cV@q` zUuFLm2FIv zfZJFug0W4x^5tb|uox1~o3YRC%oO~5XMPjO4HNlJom%41o%s2)#(08F2&0fQ3Y<*R z+5XLs!rM8w-N(jzP;w%pfZucd!N1!?`}eUidnit+ch)(jhG+g!oK$XM|1lQPCdnq@ zFwS9R{lT6#$@Ux@vjO8QJJCV556B;_*Z!#EC0$;eC}M#R$e(Po{YeqH63(|19d7%8 z)Wg+lM7QNXqSTK0PF3*F3)Vd2LGXGIG?2jM}H{qvy5 z{<$g)ZgGrz%Cw~8mUL22*W}a@ zteC?E!;PPvpT==AHE}N(Hiq*{ZrKMVeaE-vbsOw*PcklbkM)JIw1qTUxv@}|mszOv z@Q`L*9}E3?KJvg=WKmBqR=O*sQTUC8a6SJHrPGi`WYCVSR6A7~r22?zsHH&q=ojhS z>eRLNUiWWb8E6DIv-MVEZYA~@X(fjeVf9-wte}KgLBG`)=(idJ{Z?b3-)amrZpvrD;PnVcQ6_d;T)?0&9VCTHhtW_b6m*%=|RTXtsk%OveN)fQ1( zs(y4C+H+|JYR@ID2A)|9h&C8FT9}1%piWIg;t!tQn8-fM8+$jY?3O~@2wuHmpC(K* znB2%-47f+7)%HR0mvm;eGFiw$+E_@4k*vQe;h0w4(#06GWz8)j+`#{|!S)8xl2if? z=CJQpB;oW*u<6#;5F|pVa zwB!q`VzyFra~p4)`}*!rNRoT-i4NU5E#!na7 zh&+D;J^Dp9Tlz&dalK9}0kTL3QX{@=uY$Wez4?{A9oVbI9?O+)@eA9@e$kh4hkc;8 zopq&6ptoIY7Y+F@c|X#t-mmLysPk+4WpSMi3%WY+Tl=kw?nV+RPDPQ|RCIUS&A4A1 zl|Dvfd)U7RdP6i*@&BMW!kCIH;ta)qZ~tMx?~}<`L2p=$spuamikX;-D)0+M|7?G> zKl=^51-&5?spwxQifx#R$}Ehcd)r@(E08b<^H0$qVGySAo)+1($Z2jL-D4xFyR>ST z)~Rma2t@nomR(`pzkbWE+;btU0|;YL&E{1x3A1@n9|nmfU2hX-7=Qt%GZE)2?;yW@ zcRt_yV7L2eeBJ*^qCtU$-0}R?DF$UNB-nb>T0w$`_-()H&7u0|FvVrj=!7sVw9Jjl zoUk}kq0Edr7dcY)WEv>9CTk_l79~+E^X#N?+0K^1)XQVo94qq#kvjHT$Kf#o5d?EB z+yO#ZmF5{>6Jsvs+RjZe%Q_MDJ?BNiEUQ;`-zQ`C1V${YPT?8HPqG0&Rhdz+lG10J zrB5NDncVPq!gu9^;o$sprSIyp}h;Vz#smsc?fw9A<>G~e&7iDh?px9sllZdTsC9+yHJ zjr;!hGlp5#m^6hxY$0s>zSc?8YQtDe8tjqo51oHNy?QWQjgyA36ryROOYr1jS}g)# zL3+eT=uusS(>hgJxcFlc!6P)-kLx}hpKz>NiNZMmpTKAENriK01a@lW=TAlURGrKh z>T;Z3LIV;G(5d~I5Wcb_dsfuGD6&QVC7<(%0?*Ob=Nr`iLS)bD-kU(}FGi+|Z#uG< z)W?@2ZnshMUWvH#MzpXvGM+33!>hXECg<=%oqbLB+^E{?sUE@;j>ht}d}rU$6oD|$awMz)t2kZmtsx$R5!t>+GncvxvqXuwf>k}Uev>BF_*(| z^-G^Fe%U8>YTs8EzlhrRi@EZ}*9R_t**_MwUs1Iy>eS8^Fj2VrMfj)dLKtp-@mLVB z{aEY6l~t~Qu`6}(C(7m?m{?c901u(yEamw%F!?OneOTOF`u``3Lo2BlTHSfqq+BJ_ zvOct0)fS}Abu)*Do*$tu&4{_hM}u^vu9y_5bGge=8V6W?Y?L{=zUt46ZKe;@F|i#J zw-SAmn^Wmn?w!fFcoleDyk&NLY{$pGKAaHS3I2i;V>>bS_2H!0PKt2|%TA8%rQg#a4e0-?MxxZ@nE9cbMPKoW*cye}HY^TN2JmNx4fd{Jg zfC|j=DjcF_4_56#<;;$4R&29r;pwrRP7B#rXJ^EA23_pP&Q$l$itQ{Xo3mph<7~+0 z9Pk9m>D<`PiS1m*M#B1ev7P4?&)1k<5ZeVlrgLJO;}|ZCjVBj^;qPp@;@qv`qU@sB zF7j$~Rqf)~F7|4da1iX(E`_dQyOe74yaO7AhpP6FI&fKR^J2S<256pL9^2)P=?Y=G z5;Am5S8<1rW4byvo?Hzk^hou=dAMp13)8jS@59YLV3NpxU2NAmrt5|2hS+X!O!H%# z@0f0kjVCvP>899j0$C9MZ;tI|uXc;7-5T4iUhOu#yS&=%vGL?~s@)OW9f1JvjO|WJ zv0B7-mnb62?vCwlpL$nS?W+3JyGI!BjqP5?e_w25+(&C?YDV4fQ}1dBf$lN&j#uUb zimCTtY`_O8I74|4#r9C_=eQ65A5OjEtmMHPQhT^{>Xlm*=Ec-|B(_IF&mUEn9*gZU zAEd`)d)#Nng4h;>srN)|lzD>2%X;!j6@MzWr+l;)#ik8X|s%z|tb( z0j#8Rz%;@TBzvT4kLa^M>x6*kW%g**9#zhw*q)7T5!2|o*q*CTBdkcW$Ex<23Ow&s z7LxOL)gD*Q3$Z;P+Y7Yd#n@h~PotM&d&$4m%bG^7#P*7lz+&!Gi)}F^@G5x1GRBeGe@Ih?v$MyjY&@}omwhtZCN5b@RY#%$OPq^>O zF)fdcC(FU~sbkXMJW;hLgz2-`K4pCYlcv$5C`V)RlOKe&qF1t@+`y^V5_Dzf@ z`zC$aeu?du6w_$`#P+9PM|Oa!9hlgGUTu0})4ke3iSgthsvVrz!HKV6ha`3grC41O zJ2dfWbXa1CC0fC*soFL5X>_bZlbBhMpg% zE*+oP@jgf=Bz8ig73{>sPSiN0*-42}<|G=gUni^hDT$rpqjhRxrzSp)PD_kOrzKlv zvl5$?tY8{>L!~7C!e(W5VzZMC<(ZtFp4jOL7l0;qMuMc4W@jdLCeJWd$<9jbEM-R7 z*@>O)U*H_I=G?^2^~Rr<*m?ei&rgge=ktXxfGWZ)nUmNBiOr!Knk5$|cA;bVyD(go z*hP+EE}zgbT#ODcv5UcQNn)1}Um(nqOB1`)tIboj%M!cHt6iSh>%8*yiSgumD&LUU4NlIQ1@jY|@6~QpwVM*V z$*bL**v($;mc)2+3)OB-?AFFCxGk~UyxQ%mc1L1&c(pqdyVI-Pl^9R%qT1bw-5qG* zp2Y5<6g!HappsCWB2E}>#3^w|YwN3-~4r&l#P-Z@! z*yEw=3)H745_`f&>B+>N^l9)^Vmx_@R%>NlnAk!epQjUh8oF;T6)k&~XSkQZkvyB& zvl>J;7+PqaOAPoNGvxWio^Q^O#_|HeypY%nb!vYxu@{*MFD3R;Ao`aRd)Wv46%FU& z#1{K^d^IsLUgbN!)}Zy*6MHSO*J-tAeMw?Vyy6?`CJm9v9}z<(!_YO6bx@C z_BIByp|kHK_KsJ3SJjp!w#=)&m)Lt=?ft}f@;=o*5Uqch81O^hDO&$1v5&m+$Ey5E zVxM^B<%uo#%AY32lTWGqSz@0xX#MlVKKE+<8t!SSO-r5Qr?yY(96vRl?3=>zQ`;|X zaQxKvryv|()ecPUK(97Ewdr2%pwxJB5Y-Mw`=bMcC_5yzLnsBuPwi0oU7+Vd^iRd{ zZ>ZW01;-c0BT_rU@y|%@@YH0tvMWSNWwryCC=-aEEOgzeGP9(8Pw!KWSDzOg)o!fM(uKnKbZSpK{%2An;~8GNJu~uI zpQSg^B!-Dux&wKO^eLZ94fq_zrjYe~YR_ZI&MbZ5e?Lnh=*C1X%&tD-Q@+qTQQN#j z>l5|G)Lslde@R_>IklI4kht^U6`!b!Q(GJ+>Z_?y=2e=n&b+4Luc!99kJggZmdMp8 z$=*nfM{hvVZ>IKU+TAvTHSZcLSDL+*+FSmTrKv4VGf~&uslAOw^W^NE)ZR%8?Ltu} zC+-W1=lY@w1-zTuyD3p%vSq0)^NTmL_fjKJuZMzpKehM81FG2vseM4E0>ylo+J{^N z2db7~Z&hY@WFM&|AEyTV80z>WwNKIwOWa?a+VZqF`!uyrX&Q6;GZp+iHQ?tI>@Qn? zSp}z+ZCcqS$9>ASPgyI)zGcR1zq0MeuQc1gZ2OnBz#LFEo*Yo_%MNtUA{{8=E`DIy zrlYvltUjo02RVj=h2fC09pV@cE!&}v;jpstadwY)4aVCXqq2W6B0RhIeXKA6vF#z4CFYe0&nVj& zUhPa(JF9GGd9}04cD7eLr))eqhid1R?cB1jsppmLJW7?a^UHRA+1Jzy%636nYwFEa zySYAF=LqA4WxLSv|GjKv{GHZLVj5ml)|z@t)kxgJY~6~yxy16xF6KemE~eN7vMwpx zCFLBm0glw0%ZKRsfAiOvv%w)d$uEOhUs`TiTnEb`yiV_hN@8Bw=7s)WrjA`+w#$8} zt|;3T_yMpNC>u|%r0JrBtIBqj57O0TySm)Eq!x%NbWPc=aU|E4?OKgwoLwj5x$DaY zyuQ3;c0<{2C^x2aW8q{L%oh#ZST^8|e4d-ic9YM7o6B}{xi`Cofen-4*0SB|pWrqP z@a<*0-M{P|Wh3Jbs@~a{19z3}&a&M_7c>X%F5BH+@g8;f-m=~6ZN0B-_c@09%f^%Y z!SF!Y9w_Hsq2~{l?Ln{hkg7dgwuimiBV~KUt36sao;*sm$212XFB|Z2-l;jTpll1g z@)N53WZ9nd%1@Q;DX+Y+Y&=;=<)_vEXSkh$3&E(YIq+=Rp7qL$RQb8GJ?E95FWd88 z`GvCaAXguO|5sNFwjG5`X6ki2wbvy&pRMfqL{|**^3! z`lxIlIq`p7wvPh=e^NHed_wCr4VIT}xsTJQW&5;k8nmoQarT+0{`0Z{KZol3E7o7> z)_!AJ#ims>yY{KrKH;9{eJi$aMVDvoSF!yn#bPCf(3n}(Z2yYwUkS0i4yf1xm9X?c zZU|lZwZkZiYu|sfYW8NKF*`ieH zzkz>BL?$7y;G(K6s>-_P?rQd2)t;+jUMycmDt1hzH#@ds$Lhr(c(rP;>cyQ+hT32&H2a=v z_L}2(y=o+0ukMr`SFz(fz;kwd#g4CNB|V{HCvdMN_RW0b6DxKixgFU_3S)F~#ZInh zkv*kiWSl}rPIY@_EwZOo?9_^##(9|-%&dyd@`|%7{5rj2r#td9Dt3lrIJ06rITH+L zRqU)vj@!Cu>ga4SH2iat%_YtvlbZfdmgW%FBFX2o3A(@1vNU(CfIB@@T0Sh0nHJ3U>orz;YrpW%Ya6?3Ob_H4zT^?Hjcwy2VcN}sFPb8wo;+4B{9 zzEQ7egoF^{I%h9b>;@~Wsx%Ya-UiXSiG-QNRc*BS6&5Ge&!0dgiVmx^Z3`;Avw36d{p%Ht#VsCr3cU0}& zioNUAh#IiWtG!n-p1eo3_x;6c^amAtzhWQoVoksgEB2vd_(&K&uGq(p;ggEtsLhM< zs^bYB&>6mTI5#4wYU&Zs@-wgYxvKS7tsi?z)`zN1<1*(xvVE$?6NRGOw`%)h`WWWV zepTC#g4iilsdfN%NnY*1svYRnrdN$8)2Vh4XVO)lKL=OsU`my;L#lQNmcLXyv}%V| zHGl4`+MV_JbC@t5UbVv={}ELq;|Pu`hcPi`R5gF@sv3#Am_NhGJF*HlI0`jV)sCWA zjjW@qc63!H?lX&3=zlzU8tZxyrscf(D5R<_GpE&KqY!G3soF82)5oee$5rh(AD`o^ zc6?RK?g>@n$qBT#*tfNkq|CritlEjy+CO7Gy|ijetJ#}Xd$XFoEi>u2t8FIK?^Nxb zYW9{te^<}ng??Os=Z&}`aoqrpzIx??1%i`K-SmUM^*c< zY9Cc+Wgl1V!>{y)6IQ4Y@d#LH}_>nYx{Pzb#uQC+pnYE&HeR! zf1cO7c|eDdAJ}0e4g~FVp5rABqU4l0>Tx74PI47%z-Wpt7E^x&d#jX7Bck+F4FxXX|^NO#{fKv#kUsncKjy>i|ov4ax#)2N-4m`SU4R^kj2yDD)eiQS6MFDbdJ$XvznN&o6j z@o|V`5RE9&fYKy{5dZs?Uu+;3{<_(|mbD0wE9bPhYOlOeXLks?A_!ZQ@Jvsa#Ca3958fR!Sx?qZHw%{x&`fEg-0F z{lb>RI@2jrhY)or9_Z@2ZPV2iCnB-yl0XUz2gpqT(3O2npoZZ$U|2R)%GVV8vnPjp<{g*sKn6B@G>%4NOJ zzgFXB1Bj^?|AdaPi3#(K_@C}PljhH!h03{wfwxA>ZSgGBc4YHxyLf^ozCz*2MF0;v zJOp~>9som&GW;v$J2i!*+_I$r9pYh@2qsk#zFBaqe!GP#Q zQPb05iQ($7kpk_G9 zK9=M-8|U9))7G)@5ieTl#-}#cHmzZZ&}d!~nzvbV1UA!6+=S;1*Ag~ollxHkJLE)B zs@++3Kgp?EW)p0Jf3lo*;6veMwy<3HYH4RR$tFqi>TPLR(Wb&maP~f_^|nmFw8g}t zWdee1Oa3FwufJm}+tRiQLiYC@d4V=qK&AOB9Fcsl1#P*_pD=RgjHQNihHX>$6K)$8 zv~5?sp5ZbXRx_rz#Plg)Et_Ir(^59YMykhC6xnJR0NI8Fecu$@ zOy7Ho^=bi|V&8+-iWOvIUqBw}inbmYnd0~sr!6k84xAVuP7Dwy2FPCvAa^Z*ytM$s zaXJF54aWgkRudS3OA%lsyaF&94guH*hatemFa*F@cmZI1)*~>183~w_jS$$1xd_-6 zq6JLB8wapGY#p!z6a?5Q`)7fjArZi?*`zOH@{@~+2$L7{#%EBxn+|$>j1@9@xNvWX z$OaKK=vDk;zXPh`%f26N_`OHW?;(&lfg@Vx$K<*T*AN@JQi>Z7q*RY!Q7+q7S*q=uAf9nFA*y9qjK|= zIPvI}t2JM_+M3i~z3_;i9GpH02DiMW7Je71HN07CI27Q~JBk+u4zLCvL6Y zi_$^&njQ2g9nBzetq;Wi5e&utJ%$|2+=m-(-Wzy%z1z)7F~pQYNl7+>XGPR`!}=C53Y~LjhwaaXS z2k`dXau*I*kVcgF*a{mzsW~1rbP}RxZwMc=W#IZ-u9)lN!xy;z)`9D99k~A1VFR;u z*uQKYwl7;7rftKifYs010E`d}fK)aDu$s93*1E8AG=Ly98v&5IHUfOFgR`U)ih3=vScxp8)g}^1i7WFZ_gi!qlMF77 zE>OXa#1bQjffHrzgXmmIlQ@rlAU@yS+!kdu#b_vr>tC6zRNpNv-P~3>!&z&s(`wl& zdC9m_5H$lBxtl_K_Hs$QNa+9Xq?z)4y@s`|!&V)ahyt5|aG*r~0x@zmrOW?G{`RbY z6b{Gf8Tnqb$sK^9AojiCDiLizSG4QJrB{T)t#Jx4Fd(|?dqbif1}^OTwJhw2_F-WM zXkiCvVFzeo2WVjjXkiD)3mYIOY=E&60Y)%XfRQXhfYA&OU?Wy^z{afTfU$T01I8oF z112EH117=80b1Ar+ah2CrodzY+rwl5JHRmkJF&h4cFuBvT@lLwyCF~k_CTHj{4U#8 zU@sz10REi)@XM&?$1PM7LKy9?9hNUAd;&RNGXjymgOrXXpUiyC)|INH{a1)@6Y;#U z=tvq^j*0_9c2aCayon&Sl|Z^O^tnobG0+D)FVP2^td(t*m8zxeC*(JUf}do=nmiB> z?Jo!gx&h?|ZZStFfHXzTrwZ6TOzT_|Y0(uIPbw6D=1T&oZY zeq0v{){;=rsO3VzPqMX}4P6_uNwcpss|BHedsc!_(5UJ{!B2>8Q+yTs>Y8mrLD|E@ zMq6p)=G*GVV6&`dM5%FkpvQVN!CCIt?L}-HQJf++3u{YPhSXTh8UJD&f;g~V9%+G> zIM8UAivvGt-@r*kB!mrt-n9I?D6jz^cC>9ES=@ZB-%yKfv2|;{sMsq!gOSTOS{9^o z*Pv$CD-sZ3nk-UHwHZ{i5$~bn~$_U1Un$?9Vgqo!d-yv%gc5j=Ao5#q@ zRo3k>+89jY=QtX?sg2VHVFEw#UHA2Cd_j~@y8em*Dg=d(vEmuu((X!oyLGin(%x*v zyJ;-Y8}X_MHbEjz?r$pa7k0m|Bi`gK_^Vw_@rLgzpLr+!rZl3pRxa~fXcZ#PwU$}& z&n?^V7gq#G(AlyDe@Ba;)4KK3?Jjb!pR6q(`!2lfzvsKat=rHR^2H-q*KOT`c2Jv; zlj4tGbkqe3yyy{f8ZY6J@7_JN@_V2V(Sb_AhEhfwG8LbtH}W zmzGAfMy$$VX7sNg?_ z&IrIN5^Q$V&D^5_NHiM(kZ3jrtR=x_M`?`40|>G+0YH$QNdOmYcC_^+*zBlX^b`QQ z=a$RtT5?F9S@1mjSk7D+AaT76h2WPUK6ZuT2VKLHd%2HJ?4SSg=Ge z808B0(5$z;T5Q`Hx$E56L$mt&^2N#cJ?NR!`6-x)KqDI4Ho9&S?K zVXwv_vbqhgeO_)hBI>G^Z4AqAF;)bAi|7#XQDD^x!jaURYl&zTK&yyCS#&c@^i9H= zo2U6DO!Tj|O!U_KoW#Uh8@dh+^{{V+t}|gjTq<;(3gX2wDSo_O@wPf&*(CS1n%6Cv zliGSMuS@;`&rDcW6^WfCRI^pV*hgv=9OamcP83SGbN5YcR14O00L%P(on>y4`E$u#6&`X1J zx(8JKK2_+h*yIl6qSdzTp~BB?E;>$k!EFUV(YP&uUE-92|2FIbk=uE$b~jbssI zyC;$^2s0QCmcW}3g<8N$9unBGZ(0iP=7{9T1F8yd%h_(z22bR zvsh!))*^m~mL!cqL8Yfw(Hx`0eQI={tB|}$ov$TP7YhsTD&gR}drus;FT$FCqc)$j zBVJkDzT14^i(REI@GR#;^`Gt$<>SOTj*wQ; zO`0Xew(lwD_IuMha0B;IEB5`G-&gv1edOvk0A)jODW5g;MYj!j*lmJI)5H*{Ju5Xv zC8i+N*Si3fmJgED&zz`BBin#6B!+NJ~zfUynPsDDn3*`WJmY?(!cyvB)vJ4B~VQ z-b#LwM|A%F)*m10F7k;S@h#uCU$I!@nf{dXzC*9@%jJ!Cpnq}(<4O6nYzEof1Dr@T4w& z#AO>ngBmaFf@4XX(XjyftvNcDEg`zqMiMs$*=?w;v^)9%owpK?jYzA*PzVfD*z9iU z_0Em_d&b)2^9f7Z9}?DSHWD63JEZm1v|tQn;pDp47F$+SKOW+A%Cxo1^j`(T66&Dt7x z(T#MV9KYzN4qv!2!3m}mPau^s$gn6R%pMh3*Vg5*8@tGU(u=NzXuP!3)A@NYt zORALGJK?%nX;z5b=c1fzt%SD&8E!+^I%3>6JZyiJ%}EKF>YIk#`Yl@jPyE!CvC&>g zQU7Ec_bF^2Vg~w;Z`mfk{Gk6BBlgV}%lkhLw66b{EZv8jrua3nQoF>R`4wEZ`_4^i z{@$Q``pmSpNlELTG$DXoP6IQfHulfcsZJK01HYVEhvSwpfu8g21N;qV+)RCUJ8z8UJ7mmGZ5UExhOc6`6xJ^ zIVm`Sc_}!Fxhc36oI!9~ScBjcrkUXO%qPJem{5W{!G{HRW=09_%8U}+jj1HK2XjgA zcg!Why_igbe`YcX{*~Dz*dH;Sl-Ms~C#A%6MYmMqP#KFTF+))+m6#bp`AQtG(>^5# zWBnaZ%!;xJo;Wjt4)utYWTGcnaZU<@ITsJ%kYeQ_Dujw%8D)fpQ0iLT%|dE^q_7am zyCuqIhtwSy_J`CxL=6h52O@gLT zT0#V#P;RL^bt`Wf7P;ZWf9Ni@%3Dskkk=o}(N=kcufo$-sp)YxKco(gvl~NdMl63@ zJ)IfL*H)?H;|!IcQYXjRZ6P%acdC#&GtO|A)zfo{K@(DQVtGX>Z*DACNTue*@`P0C z%2*DMN?jXgX9OahA7^KV)GfRtqzC|Xdq~|AXLwwx#sk=~hZI3_&J2W2G#s2H^puD< zct|LYJ}7s)Cj42lI+ot zdLYR@==idw`{RycVPx&jI5?PbWW2jpEMG)fvV7|#2OKFz5T`mwB7sgsR+ZMh{-=d< z;Qx|_FKv}|ZhhjO99Cu)mpDC$>NA>hebZQ{z2YE8J9?thHDBmu%zKeg-?WjoVSgbrj!eqWDgJ zZ)r=}o5>xr_%a*Gt>!>L-EAotjxsj&g8hR~N%Rj=_mB%V1I2jT zOiJC2e1&Gg&dcBPC0koIK1Tle`C*(m$WTsWESm#UamzDA4T(59w(yl#qZCfFCgdf~ zEIx=^K4;R^=_56<+0BWJP(^kDT5K>egx@I2vU;^^NmM*Et{%p`z zk^|Ug*7*D-KaAiSc4PtHd8!+yU)<;h^tuf+vaM|+Rkfr$V)Se2BOWiyVnxCE)d<9C zR!3bszg@44M7won_(P6B(dTQ$#VS~-cR9Gu{Kz=X(B`w24pOLHE!&uN zX5C>z&_FJ!$vd`I%v}Vc!5DIOVv3q(J6m_Qi*;qcv|lLfuI*yKti2Iux+|gsGN#0? zl=!vnYQNqi`wazuYrnDI?vZhGf@C{F?MhJ8rR|a%cemYpGp<8$>8neZw&&4Sx(0!F zcIvuzMXvZANcXhg*`B{A*zWIrKoxEGPkkAYc6}~!H+#OuHj1{}&1J3Gf93}scI?{r zpMT1@nmv#9%(#W1SN9Kev;Rd}C=qb?FRD+>U4({i54tqpAod8H5%x0`SQG~j66$NSAlx1ZZg9cEYS_nm+K zd9qm~c6DroT^dnvfyYIgMQDveBwWg_93tUz3s-ic!rX$rTEBdpt&qpLbsG0Lw|R`0 zp`zR}QY(ijx80?#uFn6Dwl@K{qB`@vch#;sd!GppgNlN2trL@&8#8n|vAv1ip^QgR zOkyXw-I@A6CNYUQkX%7x>?GYeASw7fQ zReSH+N0WTd_k7<;aJ{>#)~Yqt8sGP~m{oN7{>U-R8Gg)UBd=p+L7bL7Q&?-1$UHF}+CSfd%5;LcINI#2jAC+f=w)+>0&pL;NL?yCnFg zU0KAdz>h?3aY*|Tqu#dkhLf)?^30}}MvDA0VQ-0i8qT#Q^6eq=mkV-hk-q|>vPJ$% z0dPB8E%H|>@`k@vubg3orgSma+) z^qxUX5{DhE}DrO}tr4*gIm;s*1cT7Of==810`eVec_(3kmy+K(r*R5)$@) z1b5b|$OmH5s#N-7*B5uDmaxe&k(nYQtrB)r?6`1LtcIf^Ds9OhEg-ETdW;ygpl9{< zLLiUbv0P64G_hzcddI~uXd55E@iFN+A!pDkGqCiI-HCd3h>n4n9xHVx84^}??qm^P zmAVUj5E)jfJ5&7E&csr8mZEAHSf$_` zqrjd?%YCk{8v$0SHUcbTAuOzghlS@#+ovat=&D5a$F4ulb{X$y3-#(|^S~UTTeIpB z0=M#-xt3?C=&kcY5-&7_D@mL$ek*aL$rHF$pVb24TP=wTMQ>GQy;zu5uOwa~geyr* zLlPGW{iQ{jw43HhCgm794$WztoP2!ze5??U*=?g^SMLqG7NT*67Jk!mV#4W<00zB>Y zFB|TZB!WBTHLq9_D?*-v*AVLT^HGa`O#oD|rfLb&z&y1Qe#4-rBp>MMn<4pc32~|t zep{eZE8%V8oGSV62xw}_e^;c`Dh<0j;Fx;sUF zbIkMHqUWFmKX-uVYVLVn!Sg)xd|}bE>7&6}ZO*XP-1Gc`=lSKJU#U5PWf?2UB^Kx! znIAOOE*cP4TSr)^SWpOywH+-=EHr@YKONvN7QMAI;?gC;wxVn1;kPaVn#rZbVz*|y z@8==3F5wats!=!U^`H`{uGwDud84{oXv@TO%{H^(a9J6wYmHJ{_e2Myj|+zD6+ll} z?3mmN@YPMW<$wXZB0P7c9==NOS9^F$D?C^?C9EA({M91CX7BN`Ys7)=tmM(GzpX`p z*lWvd9&0tcBtUG72LXFM3GM|DYtPqfqbcb@kOdpt^;U7Ipgk{~8w(kFW4Xt}lf6lq zSQ1aRI?BMTa;>{jS>rtJlj-QM47AlY4i<5!9zYvpj8AhWP!5BE@HEB+3lWTC~5 z3m92@I{+3e1X#+x#lIvFtO7R-tOXA3b(lD?E#4TgdIJnt zF60bY?!U^r3;>(Ozwxh&^vZT211rP8_V_mifh9Su{w*P3GdA^)+|R!)1g!CtI`~$s zu%W_knA5}vZS$oikPtV8gtdcyppx?Uf$f|j}j+V>7FW5tfl+tgkI2 zB@u)CG~GB(v{)dq<8nx>7Kly|BsQB|9TO*J*;5m?H0jH^ z)k)r;CdO>;`E)^MYwcOB-qu?h`r`yWJi6m#L=J<+EZ?6c)+<3(0udGyzTmU&ujJ3s zsN!5dt=8c48N zA1Q_W%9Ulw#K42?jLDX?-f%Sf!=e6iF=Dm#e1+Jsgf+}ViM=vWmu7(2nz2t~>A%Ha zEi$ZBDuKqP{#paZvf+1~5V8$mthK{1+DhzV)!tq2Ee!SoD7JY7(b>^u!;hPiMkOSK zo06}T)U&elML(gy>fspS!z~{W&Y(P;6@_r{yn=AlX|qRGVtcF@PC$R$Iv||w@^Drb z!ol-O!jVRv#e!i)YarQLUv_&_uwAwla{GW_yE+D2GVdq^dq+~R7lmLY&@DahS4!wk z1rDypx$tlA3bpWVl{iL!xT}-V0e)N4m?Rz=@7KC@sfvT%yxp9v8T|K!63!Wmka#`VPY8 zK83p4etv!8)+Y>J_?9*#ZUgo~wL$wawT+KK3g&46boGTlBhIZdbE9CkS#*SdR;XHd zdOY=96VX=MBYu;Rwpw_9K{#6mhk)kzWZ>403q;$jJi%`^qHPBe+ajE;I9e|YXzRQ9 z^rYXHf6taj_MiF(#m%9G%2W!RTgB8kw|cW-ZbRwTy^&s^w=8psd<)jLH;3A)iDLV< z#lIz-t-eyWa7*mo){3cKLPM;CwhgG9L-NY`PN8zX6FMjux9`$UA0fo;AmMFy2yk0* z1~K<}KQSGl55&KPd<)}tgzrmTUn)A_Wax@?j<6`Fh;eJfkE2Ah{cMSInNlFUux|OR zi2czS_AKvuD0q=RrUe9#m!;2r%QWM5n~TP$Xm^_&lK>M z7M1XZ`m;p0&7z3{-_juodaJ?%ddr1#)6s(7o|h6j{gJS@R)cGW(Wnnasou2kg04Ww z?eXUeglppggXCu0P4NAxYxA>H*N^I|o1KpEbA-tC!x-KWmAN$e^}-%%g*`WIZg7Wo z46&AI9(yD9D6QE%0%-iIimgkhC%`UfUCu{Jq3T-Oz96NREfiB%wd`V*!zIG$s<;=4 zujVQJ%?rX)cwavy>Zx~xETcEX^ei-_Fc7ip-&HCQgITxv@ zx=*JQ{4@HFHX2&DukXFee*Rg}c7f|o@Xw{}YCdlu-RJqaNo?H^H~Jw4x_aMEdfN#8 zjpQGupB{FP2V3Mj`L`Yab`2lo3xe^g-n=LrueLy65{);D=|7CdyHl7QwD~PU^7eS3 zyD#gL?+Pg19=}x-UM{o?!uzT!oVo#FcN^W_Q#13if2S6*UKfzJ>#}md@$%ia>2PPb zxtEuHfa7)$JmA~6?Wt`7ISjWS@Drb}g4q z6}XmS!(xfz8m!jSAhsI$gQ-2e#lEF8#H3Y!9H_Jm0?5xD0%lg)q-TpVi@w~B0W+&U z=3F6WAy$>VD|~hle~pfuEfNuDRWXb~YeV(okbh?(X=lOBB$%Nj4ic@%vie}dI=cl*Eg)JpQADVvR8v3K5Vf?UXkW2sTx$#JpYaa%8DH4a+)eC|j|t{C z=;F|Af!T%*`yz2`)f}O;1>VjAt%tayg}87)h&$#XUR($f-xud0qTf|QwTmpPhcn#5 zSu`M=;dwZV3*q2-vBKe_S60?LQ#Sb_`wNQr2}5FQ{GE1E4*YG z`B`t;$n48n;O(mK0la%TwcZ-FK>@tmx8-2?oM$o;J@_*)IKc9P(}X!WfjGYstO)36p= zAJWjd6+$0rp#$e_T67(aaF!%+=QJt*B)L3VMs5Ehi(kBP9mtKho)K-_9!y(+venMMA*CX%kc z1cU7Qq4}3!q+OQg1li?F7z$?>x^C@Dc)Nuw+XUMMvdf;8(($eVb>GduguvP5OMtWc zo_z_aK)XW(*u{OH!iS^#fxv#ld|$=&Rn#I)uDHn+8+}gEp5Rdx5WD&k!0U2hYGsW0 zx<`W+9nd=4r|>ua)A;l`I=q5y!LgOXV0#yWS2*9USEINVyOFwwJ_?`CM8;@5R3v~C)N><^Ba3OiK@(~^$ zZwV;xI3an@;mU+S-evW0$H1>uKWPM8n=CVx`S4`9xx1WIX*3ldv#g#~Y3{H-ma8Y8 zU&FgHuQ?yX>!x|O(Pb6q{)+3b*hFx4#m%Nn#t1Guhm;YQp;?7ySGmVuv5%cA720_M zmx3&X^e!r_)wKEA0=UTFugr@UXvhWfwIbRp?!}cO;Jms^c+CXAs3Ptx^QFZV0I>jR zC;BB7w3Iq1bb-umkOIK7J7p}-3x>ARD zt3|j<4_&Q8jx}H6{9-O#V-K-%rvq5^rCwLzVAZ_O>Iw%+_UNR@8!Fak-Dqd)S&LBh zH&uwk%@t11;}Ei5zr5m>3)ZW+rG7<)GmkWjx~0NlMrsd+hLctFEv~G%l@)6)Z^Mqv z->%apI6z{*z;>?bok^4!B#0TN)Uf46iPJ zpSxP6Sv{cA?AkHNCc|qAm1d2s^;tp#fotu?y`XEUD)l;1|4@eNAmUb?J&b!FU+Vpw zF_^b2jSm#X2PnI!f)^SKXOZFhx?*GDiVN}W;rv!*;zK&8)n%PSsdEsv}D6 z>wHY-wsIWVm~i@7v1zMEguL4^oI9qE?+KkRM&1nx=WHPj_fIMG^%b|?lD(nAiCJz# zWqdgPK{fUno$a7(-dN!n2d@hLtPXdOZs>Crj&(3Kf~pR7sQ69!xej36b&5k?U+lz& z7pZ|`{YyHrfe~uOZ`RQQS_s^ta|H-D4ajP3`CC`Ay%5!}@SXz#xSQyrG{I>k7Sq>^ z)!nY%tK?s=fa=y44xIZ9<=SwOy5HpM`ArV$mO|^>6(HUE=s|LCQ$Dnd&%LA2+_>+O z=s#D$a@)5JcN-=*&;CU`Zkq^78I$A4^_hR5Z=)|~Z*vxT6-YPuZPvUDy*-HMj;ay~ zNZW1x=qiBi?2m_gklI{0hR5J*4+E_YVH>9Qc%ij<{5WnLUj?j9wPV7;+Xnd)s^rv( zRfl^bx2IR#^s0^TPpZ0;s%kS%uDX+}^o6OPQKepgMZ4)nB9=3uKnJuu4f?to*#B>bT5BE^*XugNZX8E*E40h14)?O^p0TU~FR$|K6;*cy&nEuLs^h|y zcCYNOs=BKP^XjU*y4neQ+h3!HudTXkd6*M4s*VfS>ET=pzNtm4H5(LYRSPop-wWRe zW_ec+%8uS*W_k5{|HaX5Cv}b;~UQE2@qQ zD|Am4i8$Xde(kQRyNhdI@^@F=-MSXW<`z&>cf2~cThRo-hX%UZ^-@ujz>77E zUd);TGHDI*zo+W%A^yrtB5`lk-CNa)@fK zuByA=p2zS;HaB|E9#KTPEh0R}&2bR zEiX4z-G)%NpRPJ?J*}tgLwcs_o~dTPpWruE-9~*eG|N@@EDvknq~f2`m-D3&VrQ1YB54@ zRNWg@nLVK*S9NbzcT>CZR@J>#mHCunU#kLdSN*oC+g1(MrSDXOdFeaK&6Ax!%3d;B7 zLdpD*Trimj%Y`a+h+MEzhsuR3HC`@^p2OrqmYO6NQp%BXv7!HiT(>7ioDx1|2a6-@ z4iv$zfKkD0gDb#ZF~2~7!;K9E!k6~Mh*JX8mzgGv+B5DqA=@*aXTmh=i6p&rPSax0-Yk(i`D9B(%x7dm|DW<489l z^`Trz6O4p{H_~#XX(p{eLTQ_8Iw*C9Nw*@QcFnbwNN1aLI}%#dT)P9Q-z2Fop$*No z$B-77^d=Je%v^gLX{kxukkCrz+B-;S86(Z5j-q3XG!JRHNw*`RC(N}wkXD&=FA}=G zTze2{tx5B!*C_9D?Ls7!bCKpFp@56D0BOBR3z1Nw<=Vwan@qX{39VSJ>2xcUT#*(d zq1lSG6bbEBq-99xrXt;mgbFH>PI^M46zOiHX(p{kLRFM&I#&W^P^7g;r<-&PUmp6L zTssyCgJ7gtNc|?Ak2KGu)kq6WT7!f_AJ092gnk~uh^Dw7^WLa&T#ZzHWO*V>kK<=lRJc@$NJw`m7&)7LewI}y~?#f($C*(Vr7 zGhTMl_-lO=Y0~m8KsOA_M{DrrQ1I#Mg$J>yCEn$aI-ese zGH(lPiyW~~5@{jvksR5+BhrEvCOy8-75 zShC}MiNP+;UVy#-4%=eqLLbu19j{@L*#xkDKh~sVk*1oKkcZLRxfwN?HL>x(Vfo%m-YZT{6Y)%*wB(rVND?dXFMDCE@Q?^?6l z@ei28{I?hU2gA+wCjWLe!H6bQOSac&^s72GM=Xwu28B0}j-a4Cs3{yy6Hqz|JCfUF z`}fK=a8NmlF}G{<#o9}$B`K&Y4{i#I69g30kVcY*WE)ER+02AE)f1|v=#q3oO_B9u zZkYR+S-^@@w}Vjb#ZG-kO@l*^zEkMX>FPeJKL_^_dh=aEXTD45%XbM~`7VJMu}k1Z z?4o{qI3DP>N8-?1I~+Re-EiomcgLZN-UEl8`3pF7%wNKx-~A9TV&T`LOOt^hm>K`o zphcj;wam0tO6KZ=(Qkb*a`nl`6)i%pXc2Nni;yc?gj~m0Bv-TuxuQkL-GlE*u4oZ* zMT?LtT7+EDBIJq|Ay>2rxuQkL6)i%pXc2Nni;yc?gj~@g`565=-M>qYe70OlHsAQ%|K@$NSJIg zQqZ-tBahLcq?wV&u252cB)daN^EmcANGNtf`lm< zJ*=)_DE4%yOBjQp#j9(WdZE%Q33vo5y^?0e(%zNS&uQL4!U7BRU0uV<3jJM4*idZ= z5>`^^?CKhpP-yZ>0v>@XucRAd-xuoc@>puKx`u7ilpw8&rShq3t7EBmN?OYiok3a` zOQ}=WfJdO!Dd}-w6hT@KS|UgrW9eq( z=qeyb+MhBcmM>~J-z9Dk4UcF99#(hDG$19(V;`k%RfOQ1&(0akk=Q3TXdj^+A+ZY)n7$WwoNc3UgPqFe8bqJSGnzzswJHBbUI@J)Bn zc##Ht94Zd?Kn|$s{f_%i79Sz#KvtPx&;jN9zwz(i`3G$P%!2=Z7Q26U-yh+BKwkZj zW2t`NemKG~1OMGC%)p>nhU_GPGo!Tr$iY{(;*r`|FY*VwgO$i16XH)C*nwUTbl|h4 zl0U>9(&K;Ter6f=bN6!<&@XsO$N{PW$N|glUiS;v+Y53a@(>49IKLvJf9-zde%&k7 z!0rTfm>cH~+f&@f6y(4Jtpy4>pwt{r%qF?R-K5bT+(6C7EEaS?vHh+4t&Lo3v4uRK z*#0Lzf9L+w{jOKc0mT;PK#za}7F&n|itQhHsxNYVSW2Tu7`e%j#du2O{s?SU2ARN~7}?Mk zIFHB!`UX#m$d{8NcQU^cKSK}#HzOJ!@Bxa}sgXNX=D#QpiXG4s$N`=5c1GmRz*~nu zQ@_poG|Dv*0+XSt9jIY`VcV%6pQl|+|0<$kQF;&i^@ z1QeAEB6k5%>5p7LDdOqbk(U3nG>PpTk^1C)=|p*YXi-9H<&)?U${Q&C5q& zXq4xp+If-2aE*4%;J>tE7Z$XRFASM6KXUUUR`Wz5xF|A?MJgDOJ}ib)tBFCGvRIKkGUE-A!hiDJT%FM-s3 zhtct+1AK%1HQ!4Mz8M6>_+D1@9md4V2KY{L-1>aXiw9!H=6w)2+_O2e_8%~S)zNX-tfsQtSt}Xfw zhI`iz@C{(zd|y}aeO+X`X4e;e2g|+d2l#Hyecw><&Csen`(UoRl(P5^74aQz!Xkf? z2kpRxn^Cr19)WhSUTB5t@-6y^Z;jlo_Si~69^6VEyUmae`WSAH98ccPr+62+ zGf%Iyr?=?Amz4=X8gO6X>8+7ttg5h~Gw{HxJbi;b{hFSBU2$jStei6%5Z{bO2+_dp zw|I87J;h$BU?+FmW zV3pDIUs(AIxnyt%!FoPWTKi9Wf~fN2Jyp89L&#rQHHLLMjbLj-dY&F~T|>BSvT{ zdZvgG#E^1in#2fS!818(VO}&a+VxTiW~DsO(>!}_+;v0USPje4`oaO@xu$N?s1u(p z4a=z$eZ&mv#4Mtey}3q1Wa0q{P@IWu_uhb@@D`0)Fx>7}G-t;^Dco$bcmYL%g_u26 zk6^H)n`28wjXtp>uQqcV(SluJ=^+H$BV6^xJaYjE$ zb{o3Fv)}C*J@H{(tZchP@CvmFEc0?VnI z3SWU9&L90SG67vgFC8H(h3N16HS~3c5d+yb1Ot5`h zGoZ$F%I=&|)IEh7b5AHw!)f&RwSsAMCVEZ1j>i5zQ8lE80X^e>JukS1o~get*vLIF z;C+Jxs^fj@3hzUQQ8*4L9FzP*`Y<0BiUR`2ME{78&LsL?lQBXar%susM>{_39~ zk3r-pi^hTbcswr9IOqgggyTRfUrY{Q925NdSP+i3Og5u~{04zIs4f^Ai^M^d7~%nB zJd>9{-q}ki3&w%_EXKdUIG)o<6*~qZ2VYp5-=uo`g18*+g?K;FI9>$f!VQod9iEK` z+|5+zErM|{MJ#Dag*A%5Tczq*8q5Xp^-5e&@Y@bGyL!oBzExXJX1p2<0k;k)gRYJ? zD}z@HW$>zq987p)4>qz?E#S+A{{y^$hJb{fNLsp?+7Vkv1+6@@`e}D)aK80V&OqHZ{8yn0V|TS zYVv*zMg)C{D3C?8V%b*)E22r_WJm^J2)H*zWD$*tj?!WQyFF9+Wl#|=99m^A z>UtcABJw>=KoRqOoQNW7)Q=ZX#2SoJK1(*Th$cYn7GW1%cDU2aSP2L!^4StQUgd=UJd^Ma{H8LDO<)7EghuJ>SxLfe}X7;M8=xBs^_DnbhlNm)-2LFL7y( z+V#0*hdY-A1op7zl{>2)rJAZk_#~VETd$pM!q>L?`DOM&-Td+afHBzp)LwvJP|i-j zFv-?pEV`gPB0w+rtU7b*MaqJEpk73W2kM1-{l$V_bTTH;|DZN35&J@_V3(HNrOMFO zfVs#%_}YQqFc+*|oZqjGxGH@ico(gLTi{+^9vui5JV8Ww!i+mXSF{G0h4K}61sAR+ z$JmJjsj3yDYlVxrPRI%{6ynqvt)dF4g6j}>Z?wDyJHdsU@ChK|W(qwPdIGG)^0NBH z7QdoQCwq&Ui(3sn!Q0r+`n(j~PZ{FbM?+K?^N2 z8#oaBKzxD+j0Hgx+!|OAtn|0}^<`iXto830U=Wl^qtS1!VSoKs@z@^BacdwJ+Mi&X z__PsW8bhd|`4H-v!iL*3<7fYUgd1tVrpm>3JKfu3dJj%8{7E2YmA6zOYiBe_u$ za$_3%23^8#9G8&vQowH529aSmu#iBZsuai@pq>roJw35b=_IA*6_Q47{F^(6pbKfWvTSk`$K0=u!m3(9RwkBW1W38H_&BeUJo9Bf}aiQ29Jpy;khe1M$*cD0785v< zo~RaC8o&lAB`Y;H!!vCOwE+CcO29sH<+Mf`nYtPKgH5QApR`+xlECx`d)7-h;g-=3 zXpfKHwZ1HI{NJ?Da9Mq@-%L+YT%~Ggw+0u_U2@Ua873EPnBj8KVi_ry-E1eD05V>fZ9V!=Xv+;80k+8!gT!=79!eWFYB`iVsgM>>F`XWh7k*1oo3~8E4mm!^K z(&b33+4I~LNT-{0B@*lIT)PU1Wpt#gk@`)#25Fv2*CH)2={h97M4r1IX{kv!AhFfV zwYQP3F=-pp4JN&VwA`e#D4vxjosG20q;rr~n{+M`i-UwR2Wg#2bCFmYKzbJGbd#P#Vo8Q;FCfh{=|!Y|lho<4&cWTyNDEBbg2ZYC z*Iq_qAp+?Yq$^C?io~h{*ZQcstQsIqMp|yt6r`0VosG20B=LTjV)L8~o|zmY%|cpd z()mctS-CbBiFqi}Jf!s|U4+C0l4}ApZ8B*Q(&o6Pnzc2~RkOCVMx9d4>Y`s@sTHj! z$JcJd+&D|WCG&Nz0|gY_R z0C88?A)C;{uaee%1m13SjQo1L+cbU_kQx?}E2I78VidkumUry6BDI9k&qw{&wf=4J zb(`;S?FPGU(X0o=lJ(sz3A@g(luE9nyHiUF0G?z+gr=F=ZRP-M>=~Q74KHo*G6RX) zDUj|CgX=gPrr&Z(uCu#C!6I0UA`e zo*b?Fg?K4BwE)=g)I_9Kb{N8|>{#JwlwBSyc^{H%G~ar#NiEn&SX0Zc3p-{U9*{in8>^+?y{gS-K)n8&j+WJf4|JSi5 zH$pZT{SlGt?{=oCRgeu!W%VFQgU}x|K4Z z=|-V^v~5S1P@iu!FDbjFO;<2-qI=iywbY)~tW4hj@V&`H zqTy=p2BC?%cIde76y^DnMimZ+{tP`lIm6{RwUHyODNKT9YGOZ13}3pL?y!Q>9q&)u zSN4$^WYMmXBD`}+H6v-yRxC_>IUc3JXiF8U9$~biR?aQ~Q<~%=H4V|kY}doAO^q@~ zlUd5PosMq>4G(Ps2Zpd@a1*1cayyMFE9Q!~tY3Mcq?1m%T!|AO87P&qX)LzO-Hqm! zha*KiED~iU9gSG(dL<^y28G6)q*T2^A$qjT^pW^g0=sCXqa(U`kNSrwi$BtD7Xy6@ zLZ*l=&i>m{s34d|9ia>{OqAkK{2zDA69y$E6hDIE3)?WL@`h~c+R8d!9XVlKca$AT!J{fqIEn6l2S%p=EVl2-}j*!);~ut4qVEl;P$`ZaUJ%8J(=Rb~UoGs|RX|MVNVlW>jVQwLE9Jt)?1{Uyabi zp_%q$nEe>0U8UA+#>r{cA9uaR@^vHR!9ATQQ)f$0Ni(NgLmIb+aEm(1i$HS!l?oK; zl~vn4Bd34Qsh^<^Mp=4<>Z7V(OV;{Vd|P5TN|1G_Y}W}igDP(Vq2{R;GLSiok567E))Mp@#Q;P{-LrXT9_OAm^RF+P{iLl$OMNFVDis|Ej+trc#G!r)nV9o|5(wm&ydIF|K_y>C}8Yugfi} z%b{AO*-#b1&_)pq?O|fr={h+6RPp8OU{6d{u$ zqwq3oaa3ORVECqq`eD66jSIiz*+-@pFSRzJ(8#EnQ1MU^vD>3nP`2?2gg5hnt2GsA z*h2p3e5{8oHRF2oMPL?knS8TA|8_;J2lAiIfmHH9J}6Dd+KHN)1QNphbet=X=`1U^ z)Ns}EiV?G^>gj`2!%AyGTV?KOnvT}+V24U+`$q0>uTrA=DA^sou2Z*nXx!d`+xGPi zQwj1)mYr38J2oEKv0FPP`aJ`etXEEx2EAqSLciQUzwk%mQ#f_^)0TsJdCg z*?LN9-C>+P!?p1tD!P7Zss?|jMr?L+ssgGjRi$y~#+{u><1Qg!0&T(bX{o1Y=0!;e zP}fek05MLe^>HH{Lk}swk~ZQze4I;^JrB(Yk>+~YvWFtoG0CKo!=A~Zk&Pfms*P*p z5X)0)O6UiaEtG$xKvWILJ!))T2MC8cK)vIu(?j{)&?zx}ppN9dk(}6eI2go~vKMmF zmG$QvHFbX)#w7YSt)S>Hd(~c9$L}JW z4yx%UeS^o4OlkSESJK{oP$UzUTCi31X%t0mOj0h4NkU^mkrX~@#WA$yf8-_XAxvmr z8$~iVP?D^2k`m(UDBe=G@id}D7HHHMQmA{wyUUm%;h7eWt1L(|?9q*pjvEpEr{xF3 zAwDKTDULmrOVG`_BmA0uHzn8w>qW!YG(^6oo1w)(Zzb7ZXk>|hvTmeFvcDXbp&Z!s zbo<*$I1pUpR2>Lj-i_eso60=4vP9dW5nt9ZkA*zwOTph zQh@q|!vWr**)~sFKh`QGXJ zlC3RqjJQ7ZwqC8v@#QLLNqj+`T49GBa+>}e* zt$HteRTlSF%QPB~Qa6(mN8)I+dO00p9CJ?-$P-eaFSo;z*6Z3x4&k+CtyBg%lU$or zhTAo&Zx@JsOoIMPKq#9<=I zZym?*meOgRg2ywz7t z!PQ%bGL=lNL(;x2j#~67Ra8B!VWGL*F7zmB19VAmLS4n$%MPtLXY>eUGP&NRe$$2r zVS-Vy@1fr6b`eoF3l(|twL1=Njf$(4S%!Vq_68P&?31VOC{JK2XpDNdYA5-i=Cj;BHwrml z<&)pKt4&QQC04;4W9=5-O6w91lXtD%75iRPd@O;J@hWgl5rp`pvJyoW>|RFiq~WOz zFFc{mYFdSn^wc!2jIn47?Lv18F)OL)bURGOYlqjTL`c=6rTyJO(HN>nRNGe{ig+vUg%5=Ul`I5LC8kr^b8 z%ph_0VzU-!Z|t&gMxh{svoAI*IAgG3!8s5U7Mz2yUcvb;7Fjso!~O*4N8ZUf*n2sL z_-;9e`cKHw5!X0}`A^B2TfH!>Q)A7dC7z$K>XlW^-A8g_&>e z-)wV<`6hJRLFG7#qrdr@#!H6P%OPmA50gQAosI(XfgO8Ah+`RMu`Ot_+6WVgOi~MxJGa#@9Pl=TJOHeM{DrW-SE+^2z=Z* z_wk8-H}^5Oo0_eN&#mM?*%X1Gqx{LH;MziPpK1j6385KSk>JxTao}zv{y~}c(@oyn zgZKZ@@V>kIA2tm0pQ&y6j^Q`})z!~5`Q#K0rF@Tu&pqf*BRjiSTeygyV@&&b_c`}@ zTPNfKc4cY>|H1u3Ho32lgDbx1zGwr%+R+L5C^V9-nOaC}&GIKX@&2QpjAeD!BbzfC z?pQWw8D9n+y$Vi$jmD#F#%K}Iz!*(UEaqsoUynIjCJo`bJz7M@eU0ZvxlvLi%LsTM zw~w@-zn;bJ>y!Mx_29!x?7QF~`=HzTHJ7=4vp*J8l{>YiUjKa6?A5-c9?aMF3p>A~ z!^ZDu>nu#Bx2pFXW8GNwXC)j)6A6wjLypxVX9vIdY`Som{S3n~Yvr-QT6t`+RvsIy zmB$8a<*~t9d2Fy&9viHc$7>b=3zLyYg>1$0~vB84mIu%IG?c% z-LY;D+s+;9zGj=bV_jxjxnteFwvjv5^=KQnwpDkwjpnja`=g(W)rXWWFcFt z>&(=nWUl&O{Z>u*qUDqOUHWUe-=o8p`y;+5xd-!2$vuS6 zN$#P1PjbieHOV~;%S^eG_%!4m$=4zG4}2YR`yy(-1p4Q_O`wDRXA|h5|HTBl=&zYT zAH9zWXGi|)Cd^dtE${u*V-w~@7+dPf0$E#1Kc}5r!rI9H%!GB3|G5c|MA$LvU5`ipP!rZim^13i#>n@Y zuqnb&QCBucm?}!x8eyv_;f=^oGGSYU$)c{j7h$d_p)bZ@QNq;NA8Eq0SZ0E{guV0$ zLBhi0#2{fWJv~U+OP>^^nX&8z<)c6LGlDcPmcgK|Er?|?C<%LMECwYljb$__343Xb z1|?xHeQuCYqCYQ4%dvwF(n{>0gS0C4^Mi!F^hH5h8_Uv8pzV}D7I z)?*PJq>ZtR@8x4tEDL%`*h^m-B$l793ep>Z_k)B!FiH=4?!8zR^pg6@vY?kVwJZyI zNz=-*pqF%F8QZD9H|D#4;E1L+=)0e>gY`r<>U%&#sm8F6<8qtEeLA@P!{a`Jh%5*j z_%(vCksm=cOiGxo>fm+_{hG&KCp=did(|59lFu7>9pGCV8-f^aydqYI$t#MZL$+;v zXRV*bV;B^6s-taqEax5@XQ#M9@<_K~Z?_|ZEm7MwdrWeVUG=`lb;;x4g2w`vqw&Tx z_gExz$m7t0$1ofl+WbZvkCDd05fa08b`dRH$_D?9-g^?eaH#y%^}e z4Nt+SWZz~_UAd>8hNm9o)_(5mZoi3e5=PVh36Nm(uws=ac7-fdm(FrUAs2#O$pOu; z8=N;3V;iq4`2!nq47Mc)HhUV9d-_Jh(>D~yZ!!e@=0unZ`@3&Z3glNKyJ8p%2k9e% zv0$brjaw!E?Zyj(GWoZg%W7y|g}&2x;ddD9l?}?k7Q_E?|0|2e!esb2%ax7A$#qk< z@Nt*HHvD_W0ez4gtXVj&@U-3kzWaVw9u3Li2YmdI|DpS#<~%=gKVo{62Yo-$E-0-3wAthKxyM5q z9uJYnpA|d?4fUTjd)y)S`16LxpUdMf3Lb-s`Y)P2?wET#wBhkkdHiL;W6=2iWwXcO zxyRmy$KJ;2u7&oOrgNMdm%UUvz(cVZP)%Zx7QfQLtiN`@?u>X8tc3trhq=SFP3I@* z`{b{l-$7S;LUUZuleRWvVk0gSm59R&i3s}9hc|oNIrliJ;c=2Y{-)qDs5bwm+2e@Z z;}H#yN66!E3m${Q@^70xj?6tC+3=YB^|8G9%ks*F%LtlI*_ zp>s{(aOi-wG9->aT6feJxxPpbPL7~)ka>W6B3K-H_$UE4=;hG97mXuhVyN!*XmL6A z>D$Jv|2_4^qTUw&!Uvp$-t!pIJFEjdR_qRo%d|-34jor}oX{QEK@uv1a)9|PSv3kR zu=h`hnzLe;j;fW~iEIH{`LddU=M$MpYgoYWU67ArH~}nw(tvP2mWOk4AsjrPOgL=g zX`l}=zbTx+8b4(~IJ@TIoLUG6&!-ZOa*HWJiP=CgJ~ZCM`SbzdxICOQ3gO`S48j?1 zZPA$`j4-MU;1O$&&SsZU2W~nU7l>=MRYE$MfV~ zREXn6#IeM*s_^CQW}X)e@Vr~@d11lxLi2oa(eo$F^Th)^e zu`E{q-7TDJ286SF9uAz6dgAabrG0&l%tK2|L5tyh+QI=t(iERh=iv;%kSJSjj2yw- zn17g%NFq^4Ze}X${PM^xw_IEyK#5zyLyr5m2tT6bq+9j$N|8vksC1jLNOb9Tfl6SJ zj1DXkLw&4LT<RUFBW)nc9O z^8qci{{9%IMQemT*@s5^*uM2&qumabp&oR^sJ8ZlR^=XHQ8d916@Uio-bjR$wd~(V zCF~ekw4=WPmcsC^wtiPwKr>}Q_=Z`sAbi^lSrEQsb}R@#HZvB4pO_U3!cWbJ1>q30VL|wr znXn-I+$>lSeqjbI2#1>e3c@eVd0%_TR*)`1!fFL+5z=~-WC4ZM3fE-Ew8N+U zjptUAWXJS|NwQrfDYKi*#ZgP&}gsD8BAH(c4mr zYTDOcSpb&W!GRh|mN-B#Y;DWc(z;wNt;?1As9XU{Nm3+(Vfu%N@^bSngpgV$0QBRql~YR^|SI*{R&Vi2136saoZhz|#8nO<-yL z2PUwz{zDU3T0hhTmezl10!!FOE!N zZJnN7kF&T=*Dh&!q^@1kN~5MqVtt(sToMcH^x%?MVW$h0#1i|xL1K-a)?3$DWWO&+ z>miT^X(I&EAhFKAHApP9zZxV~+5tGpFH7yO2Z^!8l+Mi5beHw^w}R9k>wr*Qn-_ad2$i$|QfZJ_Z|AH{ zU1Pm{OORM^=cG+tW4--#G(iVe^u`vFYWQ3EYIHK{;~e?vMrJdrrXmXAhq5Yvk0N}M#kJMH`)?~ zmK!;=!d4qmc&SCF?m0v4hSA2Uw}o|ZTYRgH0y5DVwe$NqtuuYzeO@aneBHM9o5iEG z_gmMEYvYzwt!js*>Y&W+_}5i`XB7TI4m9UN>c1FX>PU82)Bj@EmBnO7nr4vff2_yc z{UdANjlhbM4Otnnr2b2dV8c58mzsl(JBC@XUv32ZWy?2qqO<#^&Aux+!1kljF|z&W zJEzV%k0Y{0LRDt7V41C(a>`v?5)V~M>e_%_IrEIWu)Sap8YS8`w&DJzhb_3Tb)uMQ zx&6Ykd2SCGm^oxoE%ym)6nob9D-!$p42G)SsJ-jk7A%{R?#CA1*O|g6?BMO2Juvgm zIhE0(sCMc=BKDzsv_7a&XY(7`E@=9zzb&PC9PIb6O@}CluzxYe?O)*Hlsg*R2vmfLQ8bMBX!|hjY9i|tuo^MApZR;LDWMCdm{hZ9739h@a;wj-?n1^jyp($rG)q< zwxTH2hW)juSdVf|y`jTWCHm{X>2udgVt6=TOtdU0JWR{*eIoaRya4JE40|s>X#UDu z@(BL05y2l?1b^hd?|#ITNY$Mv{s;erk!9hN)ki+p7Jsn&4|nk4{>SdesK-xW7q*2B z*q@qwi2I2<=ED527c!Bz@K>vcmaYyh`DsSVDj)e?W+YJ3 zQlADLTIpkLN-KS8jhX`EwBL?^vz;KEZ4djyhu6!k@XEsUH}#Vm$qIW>lbVxN&6D+; zMzVg>BN}e~{YTY~W(xlr&8ZkrB&n7TRnJ*Cw2IiLg~OhF*$_R; zuxzN|;!#>Qw5m8&%Z81*_0YZblu&uQ!a|}|Oj{+SPNstVcKEPBSRSkO!49nq9?v%H z1Xc%GEo53SQM>ggM(XCKYf8WXaj-V)@vB*Zw6)b6p-IigeWn>O{Eq0?TGAV=ZF}5P z_{p|?i-`1R13I~V>Mm7bRKJk30MSaD<8QLnW1p28IR2TMs{R+LR{**~nV)t`Gf-?-p# zdD3VLZZf8u;QJ%3xRrk$R@@khx8_T1u>^giE8Zl+=hVRbYbpHk$mf^%$tWjc_{haEer4JYPmQ3Zg;w zrP~QxjDhUi2%$3%VF1~8FtNBYa#u!FWig}@DOU{E$`|g{T#_B+HIciS6E9lpNuVG-N*`55;(d&Vg0IJ3s!8*KQOcl8qEYu zMqAucZ@}u-3M!c`YncsCRV!P!QsKygm0I4C%3U?sP;q{o*177z-`-ToSowmMrL`}2 z2ODmywBFU(mL+!dt7;HLkwE0_$(O+XX8pO_)~~2PtX(C3jUjreKP*FW;U4M_^O%$= zOvs&joeBH7YX{VsL3v5t*T_DWuUM-J<#WHNzG^-m5Zl-4ffUlEZWGv;q?g!9x>^)jIZ2a5xo_{WU{92p0g3r{e-eo_$N zdREV?jf)0Rkgh5!@Kd_0nv?qV3S&d$HdrE_jvN=BR_ml=i3^=}7!y-%o)Iosz2`2hx;DakPR!t}bbx8Hlf*cA`Pizt$IE%h1e((!yR z@Zu9>NSRj}W#@?oAtpPg8-rMF|4E9`$)XSI>tRuk3o`((8hw}vR9lW8COZv3Y}v_* z9}5M_&NE_nMof0LGx3zhgB z9_MVAb9tQR?Y!8X*YJ2#t^G5P)xaapKgzDaB(`AA7mC;_&jqo&fB^er*B^IwlJeP_ z!_A2u?i{U!cUVw^b#%)rGaOyQe^6_&l>^4Kj8S-K*2D;k+ovsI+w!~ZSH z-CIQ)1~beo4r406Qu%UQ>~L=*!)}k=?Np@?RUc)PwItfNwp>dCNLY1$l{muIMcye= zup#1L2H%D0KV^Ein8BteyE=BO^GqD9Gk{VZ|8q}x{@&Q#tLKOKwYp)fU-J}Tzxp;F z5Ea-x5RZf83k{0(&_Sa363~P30sbKYd>KshAS~a(p2cO{M@SPG-yuTy;yy-}g6aJe zkX&+fu&BL{$2|erO9I-2>`jF19qiZV++MdnwsYi&)CR@uY0-KuX3yxcjY9UijlAYr z0evC$YQKSXBElaOn7us#*lXc$Qur?@&tdiQ1M$Ur_%Dgqs}*9_0o%mv9VA>Y?#l$v zir`?sRo7mP9qy~-gQ0WnOJbEU^>4)P4g7bpQrKL8^*$h|3=uq`;pNSEa0DQ?zIZk? zZ{wis)`nH?EwwBu6kYzq0{ga5TySx@@{T2zxW21o0mH@pb3EF!{Qh2!iMHma7Fedv zvL!%r{h-iF74B)W`pA>{ctHDawRyR$T6inO1*F6g8V^xe@+I+!v6+*!4s)0DR413od%ea49nQ!Gdp>>s)pmkH9({y1V z3bYGLcf63g)5}>UC+cQEMXhqr;RhK(lKeycV2D;H=>ROs-mK`DJ+)z!sAnVS;k70FX zz3<`bUSMhLFS~xclDlZ*mjYK;>#{-v&Qa>-imR)mv23(V{wNGh`W8xz-4T?Mr>R#xQyP*5O6KW zfZ*O)c6SMdE4msG+qGpjbcTzEdmqJmf7#t%HU=5cbAfO5{&hm)T1WDr$heC5LuIJ% z4-1Q{+2tb!##P%1823>gSk5|nz~bs~FG#q5GV(4wTs%HbRfUh6c;n)-!*f!agK@Pa zvR=$w*toqp7*~r5PYcZZOxfW+Q~q^;)zXG@+C~|Go}&1i!h2r0St-Ha&%;~FZVQNE1{yDmE(=YMX0QxO&kAd+(7>;j9qy~V z{I#-sjUuCgXchA{@o$Lw3h8xh;Ji{K?f$JYv3^^ySNAqIwu$P>jY;K-V1wa~&p-E63iK=}K5G+1^hE9H}$hc#3Cug8SU%9(SfBU00R;QNpwK2+cY* zVRX|bKI`^kv*I3;j2D|V5q=eS8b6J{ss`ow#2uex<==Rtuj(T_5$dF$o;cj;JPBC! zBpu6EC$Dzo;MGB-zD?-WQ<$QR@uw#4R1sZ=eM=(n#+xO;uiub?DZE4Sn3D!62?Zvz9q0rdju}MNO2!5dTF9F?OGv? z0x<+NI$mVah|}#H?jk~2te7tWoCz|MyO)Z03O}`%qnl`4IbkyK01zww^2Fg@&W$VN z<4Q1@iMtXXSLw(+cNI6T){Sf6Yy!zl+%-w)`xAd{;;toAd;N8ZyDsqx@_J>+4L~vz zcLPeYHzu5dEJy;4Ou{k9didsqQ;^x{t@`CE!W9WeA-fekd`rRs$Y!KJ$lsc{TNB!6 zYTC-g?d)$$I0)I@22oQCXH5z9LhcV~i?0U!HaiMz|*b$8dvPn+#}TSM-%sG(rE;Y?fhd22Q*vv@TbK6iMx*{ z?s1i6>Yqs56V$a1|77BxBp0nae=2cLak0yj%)8F zBm7@Dc0C07KFS1%dtW8Tx6)!SFZmA=_kn%7eW~k9>95-S5gCg{kRye{|}O4v!v_x?|Wy9pjHp-La`<_q5bacgp}pd z4?d{46VhM%6H~{<6VtJNdg`XjW1BxoPo11P+>?39jMU9Yg(^5Db#Q*vgrAzaQ&U^) zt`k(4l~_U&e_HBJ(~g=yJ$0vt5YI^68EKC{Gj(U;jYL-nwi0QD>)=`8laO z2OdMOKR2bRI4|WRpP4$`nM}lIrEXTLiTL@cJ3m#2ctPrT@B;4jr>;M>u6K6oX4_M9 zQb(9`QYPsnX0F)A^HMjDdy&5|4);3J zetqh$w-n!yx*IHCZcH5y-pIY1Qg>5`#?7g_*`8XSI>KC@=gSJ^@hz#lg?o{|HFaFL zHP4rox_4XZZsQ&Y2c(V*x99nCN6InlS-ID*O5G}@y~W>|x;riHcct#GP#AYB?Wh7n)GCq9(-AgiS z9agTYRh;@FHu*!Tdx(&#{^8U;Y!P@Q<-B+I2tja0L&-myx<~DS$5QuL{;EHv?oVR7 z+1LAc+C0IE{(t(bPuzk*#N%o6KJ74_q{Eit6KP|<_C(rHd}pnx1tws99z~1A6gPEG zk|$54?y0;2G3}}^`WQhl@#|B!KF#|0V`FJU>NYeUU3xXzh{6^m{%L*n&!p}ds@jo$ zW9qoDF+JQro4RN5{r*u$PVmpA?zvRN#pm_#rqpfX*OC5()N$bj9)6KrbuW_j1WaTp zpO;i;H(M6hGawjtaA$K`*l*t+1H*dK`4$SN(lC6i*;2A%m>)neApdsAwI*IJMGh8l8OjUVQ~dHc>Tybj7cv?iJOnM&T&1`dj&gx2A4u zipEW^e>HWlrn{B+VqQz#YpE1>RNpLbP~&)=nSbiufRif4(>K$gc={$e`caCf@1&0Z zo8l=htKxJxm^G+g)vaZyBda#2LxO>UbMPjOL5-9xTH z)o~4~j%!eLToh9G)_sGj;~G>Q7X{NXy8cNip5lH=il?~P&VN@f3Z>tZ`;SsQ#l;Zs zV7Vxm9wK*)6i;!{{~RwD9nZt$ep8C4xENU-Dfb{Lp5p$iDV`#r13ER*mG7J4DZ&p- z@f6{Qrg(~gS|_`o2&i?kkBNZFCL56msBHF|fTrd=6VTLTua8^5GsRPc-<#qog0vd1 zuzLc#v*pD#k=@zaLK4}1xk)0suQW+ycXp1rE3!K~JxJ1sTx*gv7}=2F+FGPXOp?Aa z+b3Lm8EL&quOMwSX)6+272JIliQNaJ*O0cF^g0rY{#^S2iA8;+K57OF_efKb`dIT} z{D3soq+^h#nY0<{M3cm1pJCGLNT-|hCKBt&_!WtLrb&-exB5+b0%@K}FCi^3X*1Fy zleQo&HR)v})>8@Pb);+R1oInWfe*4$`zzZ=$A3tr?O@%sZz7!Vr{PeEb#)Drw7#y6 zfJ2dRJLr|6Yb=WJUk)smx8!Pn$|c+4o#uHKkW!6x5?J8iSywO(TQ(H8p9S@XMuNtW!O>5-zC~5%{xc9 z5y~!90&T>yi`&^yGS)1qX^I-@j%9DG#7Rf6Ji$BXdc4QZSh-N!l_q|s)<*npp4=Qi znGM(DRQBDjTLp*`p|21C1ISu4Sn<2L-Sh@D276?99NrLm5ME#kZoFV?U-Jt988!M4 z(uS>a*2jPhLuF=eC20;St>IAdk~9aEA$zzzs5LrNTsFy{Q{_Md&~oDo41$DxVb}MI z?h6^(@FUQ<{jA!q5<~qjk%wP)Uvgg_FP;m5U>EHENea6VT?`{xk^-GHc4hFZ0Sn4= zniiouCvX?Ncr4|)Y*epw=LW^4h^73pROqyoILeJOR9MMpE>pau6BqCAr4Oe*MEY>$ zU-=%y{alaRuUDFI!tJ)8;x@tMy1P&Fa^IOk=;n#c#R;-8bAfYcu0- zxo>6pf+lvWrif9J>8ezUITxI7EVhHe`_?nQ=V)-kip>m_vBhXJMAf>d^uvfe%3*or zF)dZ(F)dZ(u`IR7V_K@n{|C|d-zakZ?_94-kw4fStjPb^{n#?G#s9?pq{pM%WiLF0 z$p4I|e(nx&KXX5~$XgOo?}7~HIV7B-DC?B)9%*FR(7IGsR*$2Eq;N&_e&xowU-e4Y z%BBwghXB#E61R<0!tD}zReJDn?o4u%vh9vQyZLbUn~7*d{U3LPh=-Uny5DNV&(YvC zL?yJD%IGtow>WY98FHcgRj zqGi-k(lSz3(Yt-6`jPEFst9PG_Wk3Ar+#YaAJ5N8_^>wNuTI6+wi7C<-+M?!x=I&u)I4{Z#hdE zL&{Nl+OxxTEcnie03}Lms3j-@WgSOI6^IKn*{MeD2fwqlQ_VZh*RkNrVAJ!lEbf;f z;OxlZ&PIJfK>E@u>t|%{y9QrsE z#bwgC$&2@L*_$!blM#fKDOxmDDbMJvYxHS?{!HyNWH^Ba4dXU_WUsV6_k(Y?_5ET^_6%`c`PyrDTe1anUKHu8i=N#0V%x~uY z{`!%4R&`bFdaSBi^;)&QJT^#C|3s`+qITHj)khfVZ%Sc=c0kGB>yU5)zDM=gD=iY% zew>sGliHh(Sp|JwAqHPw%_ zuiud*OHNIJEHIl>VpZQ1DjO7wgDk0Q$Y6=e*k6hpvH~jIjRC1D`w4juOtC2S-Y8rQ z!uDwF?X@$!H;Yu%GuUk;TGuG7KK}f_mZe7!>vd=e*s}Aw786N=l#X{^!BHnHI> zaX)M4HA-q7@y-iMB-Ab$dD?kFb+jjn&~Fe$B6Sd@TXhz_mJd#-KP1$0r_Mn zo^W9IJ5g;;wb%xRr{0i%qKA5j{=nRXhv|_k(-?Ta(-Zl|9LDi=R8l>hl*Md@M}dV4 zuAtgHWHV1avzH6J0JW;#mP4p2ZtrTRCiNy+3_muua@@HwuO#!;{hM#UJNQOI7Jq%7 zoN#hBaCLkbz%c+n^S`_L8wsup;-av=IXZ%l2Z+F-xk{67#K>+bcH@ewx26MW zgU3`ABfysF-Mf(mt;~3roj=^hK5#G0{PN2R>QH)cA?zPl!J+d+R)OAHan@_XwzDJ) z>WXeiEeB|Y#0T46Ex$RcIvt^rB&)Jmp+&Z2E59q%&V5w=K3Az;{7nLTWXH(2!E;q1 z?Yv8&?d7`aTrJ|vTjLF?-#LdQ!Ltzw92O2`Zy1a3VRdElDhZ>KW-=Z6hB~sZCv>Yn|&~CET9Dh4hivZqy_sYhOvT)njNnJLeOmR{jTk}+Y zovfmx%TDG`@j6*X2cVryVv^K5P*uvKkI`oAg`8w(-^(3C5N}L-H8xaJapy|MJ*w@m zV+d=ES>r=}MH-mpW%3^2qCS`qhj&*o-L~OFtXR=tffCQhiF>2G0iV^9`>rxOhA1*Z z9(d;aD9WMn7@DIw=Ik+WmX57Fufp%@xaO!@VD2$)1-?EU&j=h`iUn|rVv7rM@wpEz zX{PX<&S#-4;|N&bg?)BSQin97RQ04mk`{0`ca;azY$cK(}fekTn1Z7mg+T(T}9D+R6MXA zkGN<|SNr|327*B(ItZ4x=?0P{Ib134N?O7y-X*Pk*>)l>y+Luk@pg*#=f8?=$hDLq zT@8L)&LonlG#3V3jQL?snbJy3a*g~Y*ODUK?#jA)j%evCo51TKl$8!D`}N;R1Vg%- zY59%uF~zSHypcKhO2UyR>FUKzjg=;)K-=>LRTK13NM)%JsWw$FY4V&+D^GpY!cQU7 zbNHK~Wsp~SFRyZ5UPU!|6<0&ZU+9HcPPZ-CUXeTkDT7glz{lWrWBh~s8K*>|)7Hmn zDwf~kr^kNds2MZ#jY#=;#1(jtNMDIZRaT?wv`;>d?B05o!~p=3ll3Mf11}+Z0u0d$ zV2B<7Lpm_6KsqzCKu$ni1!A17Ku+d(1=5w{6-YOZRv>3^x&k?qa}&r}oSQ(t&C|zE zoopTbSo75SQspF#btWarV-SW|wlZM7NYME-|57byCbT}hUcQ;@=lGT`VF{Wl?4c8> z+6hgY=os`f;jpE3GNqf=ij^#~O2a{*g$(2fLOGm@=+;Q5)*q-%oU{%QzeI@G^j9&zv zcvJ=H=}PDGtrh(I@o>q^bc2;~&XTUNnlNXLU7Sv}YHifYfwa@P7FV2{Yf0SeXv;r@ zt#LNf-M-{Ftcn+*r^IW}Q$BkM$~)J10eX6T@_%}K@PB%I?tglG?0>qLsKWgC&wER32onfXhkWUF;koqk3FL4ICve?3&+8FJgwcO z#@!mtI9929G4QI(@nYcBy>v3X5HC)K&+e-QL^}SO6XNQ8{5#SEJ6T7W`B0+A+OgHy zcz32R9%r57gWfFC==kb1ygBSWd$Cf<#;Gs{lo7`-ejuE^nxOTCZ>Bl-$s)A8O-bZ8 zeLP9`b~=*f)Yc25lj!#+HPN9{^yZW83$n2P#p*Yj+?TKgPJg*kgQ_dZoWg&n^8IPV z>;`A(nlxiT8)h*Dd`1c!sKx482%b4KB+cRiig+s_38i$B`eGYRX<)PTdjRJTRUHx{GoSKMn{*gl_u)Xe+O0{a!DrWc zlHMwx+~jzx9Cxrx+%2OQu(ieYE0vD6?KiI|g5541~;XXPVu6{_(eqw*Gr@uO~ z|0$9Gk^g?i2bb`{&*?qC;P)^8Gd<>$ovYr1;u(iCX#1I6!fRrbuedUK47m%Zozg@{qsb?I=Kj;3Q7-xSOESZI1Ti$yQ+ zB|15rj%EDiv5dbwmhqRzCk&Uz2Mm|%X0-z`nJ79#PL+(mTvo{qf>H95A*V~mUoK-m z-5}WdIRo-l$@t54A$u0&r@GI*-2U+!EUqrMpUI5S<#vfKb1#=Mo%12T&{gi`GNf}6 z7 zAQv+1Ar~=tAr~{2AU|O&K`!B11#&63DUiz;Dv;jp0+A~i9gsc@3CQo=td!#Ma-4-! zw#aJ7r{Vv^-TWVGg7P?S__{RQpT@T)65CkA@)v=Udg$!8%^yo4J#_oWdNAWK5Q2S_ zhjLo_Xhvgd_A9-p)J=J3HuVF`HS|YE?Vf&f(a&w zQ`ihMN1V!8OlzrIT-v(ThfbPlp(l#zTYm9s5f+qR~jv)^q@X!=$>un zzJy~kP*&&Du`~gcGyxRo;t9-6T&NsnaYFy8;{?`8PT-_MfcPQKg*FUSWn{W9+fw)lA+L_x#Of|U0&`z2Z}XZXdDZ63mjZ3)7GZ3Bc;kPZ;eOFBaelB<_U zJ;oqt$D9m7Ii@QF-I#6=PPWg0aFTr{gmv{<5Z2Y-hOn;g4#B+I_aKPgo)ARu`4Fy? zFNAzca`h5fK)V=nj`U+Lv2&#!bBVNJE`?zE>@oGEJT^2ESlm&OyfV@UR1f z8KpCXZhQiS{%a6y(4P!3`hC5xb*pu?_mauNC%f7etzC^Bk-8ekZR%=hri(eKo2jb- z0R71?k3JE}*Lw~vrME_}ED$|o?b!Jd#ZJm@fOWTOP;P_$%D7=_c zjPcKs5Oh6>h6DuBz*`9MEf0ZjrFz8$iN;0dPk5@WuzqVV zEUGgmQ5`ag%F3Lmtjvi@FGti^1BvRSNwg~+Otc%LQ1lFXim0~5qGvJFiGG{ePP99- zo#^-2{)+Zwr7C(pD^<}8-DRF$o4)re0WT9vepKn`#$nn*L&=?I7d zRfmlov1O^6JLjKqj9Lz!o^}C^%pG7{vu|^xA6V%_AUGG zetD(*|B{ON)s-riZj*bR%Sa1ZB-6r`MV8Lawa5y{FPZL6hm%fK)Wl*-2tj{k-)mx_ zmDDEs^u)e#S+7y0!_c05|9t|^!_NPCOt5to7QZ*zN{wNZi=y%Ptr1uMc3|S|75-5 z*5o!5J*?h!J**@@W%P=!eFfaU(yp)=7F{N;)U~gM+kMc%>Ju~bH})G9`?oOuU+uT{ zub=DzEk$n;H>8THmKqMbQ^?(njL7Q(1#K1jwF-J#uGKnCTi$xxP(5SKE%I$n zT60p|?VGf|NzdPYUU5qt?k~kH@fd-csM&y`yhv5vD9dYzw6(b*NC6*7DT`APPVy=%+*huMqq3_jH)Ao{B;nZ(*Qry2z z3NmA4I||J%@!DIDLfeZr7@K6kjg!6?x?XYE4M}vi)Dq*lU~(M%L2p#p(Uppuqs_3K zAZ0M#MoamNE}4-&SW>!R(20}`T`){QA@02zm|87X18ZI2wQZS6Nt*;SdrCQMa?GAv9d+B(>kr&8d9FEJmyHFOu}HU*CLZ1xy1cEh0T{%85(6xu{xQ`wLlC) zj|_VE(Y$TpXf{?b(&49Ix?S9r`=N=hqiZ?`1BJn_yt2ixqpe%z* zqO5}&L|F)R5M?FQS(Fvj38HM1Ow`{hK-u?n)o&J#-9$g9%@Nd}Izid=oTcCB|9@K) z!_wVFIbHgm=&!^N=&!X$f^yDuq38e#c##}~a9k|MU>rY@V+Za zx#He($VTxM^%WckxLU%!cwF*CRxDokrU3-;_|n}n+8<|9-K)*bnNKOnc)c3{pqr}6 zhJKs`)YWHr#K+Bh_4m4s%+h-rfv#32+_R$Oa3I03pq@TN@0A+!mg54Oh`P)EQ|T!! z|H6rPO-f%3SE|{j>Sm?N$5ajb0U{*=^nj8-`KE^cX?I*}36GPcGs>AKJ?Y!?jeeq@ zV%a`d>0_R=9sT+7t)Cy?$W9p6uwr8p6>nm=a@6AD>-axt=a#PW0;QTguS;Wz+g=uI zq~6DC?u6;?d|atw>rksZ3oN0V_Vib%LK@*K6&x6t?qj*Dq1oR`i6@6xfOyRCg^MC;&pq(lI?3sghHR($J_l=c8{4U@DeGiQ36JD5}(Zd}(u5<~P40sbH~EwTKJuSTFP#9X2F52O(9TPnN5pTF;?c z?W&oh`eDov_@II-zOKZ@mv{%r(|*;;Z*s&k&$f!^A1y*-Fz{I`{ihnk^Ia9_P|Ln! zUF(8Upb7@RueqA`Q5)zF%;|(*U$ueWkGI!}pLL+LZTa3Vwxy~jLEVS0)}{#_i7j5=f>rOtpXNf+$V0G*e^RHzl3+E6Mr8 zvh<;1HRswB5!EY~_v}hnJN>{H1NL5NjLkj*iRZ^}NiEOB)tHZJk3G}XJE%MQH?<`4 z{w4mO`cCSo@gU7v`!<7A{V5)#g`FT9T)!tGCY)ObF-8U>-ORa$z zwd(aEO)moc=x={?!Y8yQd;+=vo(1p=K6Qdm5^w5X@M-k$m`_<&R&;(Md{zaed()WK z0I3%XHJMf+)LOq!6ytNP#rPbX#(WjPdUP!*1VxB*?^R=1o4U{trzh4AM-eB-;E$V) zowk4cQr3?a@B1UG7aBoiSD^B`Az>okB4rpvBnR{ z;7{=d{Y@urCiPp53%dA~YE$|-^N#wtgnZnbFFyJB-_rP zuJtR2w2Hrx=vEJm=R-O?sRg7^7h95nS!6W&AuXTRgg1<8_GPx9ZD=*ss)0sgoivZ- z;;Dy~S@rM{sqM10M6;@ixf=`A>M6!QX}ScO?Q0M)4v3$h+kB% zK6Pl_@Y#zPWv;CC1-l{YMIxx^F}i)Z8sZfQdZnmmQJqxJcx}_bM||?9vw&|c3ng?Z zluv`_yp}W#%u8`vKER6@Wb&UcverdPN?&O7_;pw(JyDImOvBU;9+&pLT^Gnv7oGQ{uVSt8}v9fN2`;bQ>%>#d9jMnq=d7 zt#xgat?oaPzQPZG??_9_mCxIg0aJYYxDeK<2d8Z2yIiidKj8Hr>T@h~Ja?GgRXyL) z^!~iHYy6kHnG}KHlJ91)$XmEy&w+GYtm6Y-h~<$?niP9_nAjV-5juRLT?> zElHoOKcH5kY6mZC7(2DDfvUbVinGOW$z(=*8zepz<>EHcn4&|ZoVT}Azf0mA7FVp(>|a9g{V1k&-!83V+|E3+7B;u?k;s~@&j4FdXY$7pTfR6FmIo?Go` zU2oyV9m81GinRkV5>}>OEP5$Z2a6g8YRekurV-D7d~FmpURd*t!IDkgSSaZ@{PVwQ z?0B_x?8UM~0;Q>u^2GCP4xI%4>)A-@&`!|6XYt9xpGY05Sw*VK21$FzD}rkF9EpRr zMPY-}wkVd=f}IOJ3wtXUY5l5L>Hx}^QWav+=Vc03c;jM3@f_M(AJX8ihW@D5n7AZp z=o@c=Yy3Tqg+rFc9ke)8;naOf!(-N5++N(q=oez#d@AISjU*}EN`r% z&#`b6|CF(H{EUoMrRLFhTsLD4RpKPkC#@3uq9%^|g4XxNrKUO{X`;JSN6(36$UTMX zs(G;tiQ9yccvKUry}iuK6&DAw%+p>aZ;~t-?Kt^MZ$NRSvCsw4#tVQ{cb)FskgZO- zfhBzxQm8H6^x6U;nCwMS3SIou#Vn5&y&U2|GMVPXqyJ~ga*#k#Ka-^gv;Wa*+GWs! zsQ(b}7g0?ZL-;~l9|X7%ouYPXfowo|7zA7B$}>?9EK)bt4X5Tk61v( zKP0pgzF_QEkix}@*?MW2yMM=RI;0QjGi=#fc&jJgc~K)jnrUqLU);#~^?+2WyHYx{ zs@HOibCrU3cd75w89cpG!Si`ce$JJRK^Jj?O5pG-q>RLXA~fjFkaTYym2H`l?X7H> z-{e|+o-Pw=qr`(OkYH$(5zQ}XgL5n#d~MO>mkt%DUM&Uc&w|3Eot zqFR2dzKHi7aWWlXmAb(8dkik+z?L$MXoRNd`^d}Dd^L%#5K zaj3Ajl*3|?UM#@F;+uCQGmn<98JhgVsejD;o-3o&IhpSDdxx2AKnNc#+oR|&BwWJN zj7xed^$__>Jw#OMA)-}kx^CXFFo~jrf|d&WO^)SBbRFba zDeN~n)+AAPkYjDqea$=8CDD3#w0vr6ebTKH7f(%Lo8a--wK3_Qh&j7Sn1}jsi|&`@ zcrD4zvK%{;+#t)bJL&qy?Y%E4lOOVXH>nF_rOMm<4RNZVEj$~$np5t%*fk*Ko{w_^ zdGPx9+u2cW>aaXgR*m&Nfw9=tb>HwiStICL86#eELs!53oJ?39eG zt5oyBC5&AQQ!=YAKadBv#IEHjSyPwa%9ML7?wM;+Ze8qJn{rFzUWd{6dt%pm$`ZS< z|Nao>Bbj)P8Y4$5fIU*KUvr+6aC(`+8+qxRFiKL6XBjOzL!^>mq)8&6*NZV8dWNj= z=d@0wfAzL_svL(fv+`M526@1kOzDLNgDxZWkshwQb(dUoRUT$A z!q>4>km?AFV8nrclObV@(D3@YRqo)VKhe7Ss+Egio@uDtqhaDx*Bg!8kEGGdRE|oo zeculTUTDZ0J(DP+wY3N>v{w)&#G7g=SglzR_Aped1 zwIJRQQc^gn>P-tzGITx6a}30Y^i2{{Hjy;=2V%)W59*LV#up_M$$+2YM2|$;YCpq? z4#{ch26v=_`{(xa)6(Xe8+feo5B6hB`25TWXl`g2nszM)dsNUC^^#vHZ{9^9x&pLJ zP%*K~B!T{kNStiBUe-$jr#DXjc&y|u$B9bFY3a_cFSD(~M9*pIuC8B${V&u=nyj~7 zZUpr6nPRx7hg3y8cK}4|$|EH7Mf&u>aL;eNCs<~Zm{{%UAw>}HhbD+;&A-v0|4tSF zhJoOzk(!8+z>qrE;BHP@GgI_{q(*F3gSAD&1EZ{;P!UM}*Z=trV~?=s_qvV$X8&$~ zuxrpVv3_iYxdv~zwnYKGtyUSu8kn?!6g44LlRPj!%{Csj}o&s;+;6 zgd3{Mb7qoMY%ZuPR`O!?5oVQ?^hbu19wKpsMi|5Y?-oYJYG}kDd~C8^Dd9F$2=uQY zlBE#Kq7`Iji`Isb;>Pk=_d?lTD7z=i_GH<;s9K`^G7fgoxnj*1HiT%rj886bFO}`3 z@?RwqiSLeao65GS?ADiUec8QSHoknhJjQJ<8^zs>>y@%m{8z|eOWC&guU3q4Tg$e! zJko6|+qUwdy5%Ivt_fJvDZ5vFg*qE6^Ui z9joW4?(;%#!`KzDYh7f}DlLOnxtblT)HyXfRwy~UO*KPTwuzW8%a|2wd zS7gk}=f5RMGjC1WR+^b2ZIcx%|Lp8lmFZQ=^qQ<#NjF+%tcdJE1F?o>;6n z#MKR(+NJ)n<|FmCNjObVmJFt5xo;DHjzwksn{*b^eu06 zORJ=PYM}kf`E9x0k+m%>ZS|CyEy4(Smjb-!G1lIr1>a9%Z7WjCeZZ-=jBG&<5O7dN zwx~xswy;HOrEB)JVC^A~sitG4kA_-*q~PRnx3&eE%GnQm{vQ79WCgfR8tIb<{NoPiqN4#H&d&EZif9U$wh2nwHKIK zT0myd5vlWJYL)1Oj3hhESB(;0Q{*rVJKBGJUCOTGMMm5wZdIQcld>_X1@5+r-BxeW zNfnz^?-P@KBTcCojwv+4)Qa)hRGMd+Z=TyLhU0cZrdMowJ%t$+n?du;tk_I7&-E$0 zUUr?b4!gAAmI^MdN}sqv2x|0+8z}5}FsXnF^V!|$`^2n@;h06Am|ZafW|Qe0pXuC+ z;h0ON^C~v4-Y4c)Y(AOZRk6F2Dd#Tip_J(at^aRQ&Ns`&DGYRCs;9uw2qWYc3UI67 z*nmho&)p_`v`CDdBoqE`YeN}%ek3?Rja1X6~5XXszL8!o3VD zbAF7grZYMwS5B;p!dJ@+T5Xx{d-n=k&G+2pDI;ik>Vgc~nv7XLa78c*(lqFRM$Q_Dj|lJ@o4CTG+Fn5teW|w@a(aw8&$^Tw`PG)(LVA zJHSc(t7k&#A6NaJ5c-;i@{=BXO}p0hs@hZPoZzlOpN8Ylc#Jhdo}u6yJoK9S+q1%5 zL(2H1<3IHbs(N0-k%J)FbSK0K0cIA3#^!gaFX-osLSyq=2F?l+F%p|!PHqVvGq};0l zanl~}H9@(>6B;MOf^U00W!qE#93!|@)91OJf^DNWw-<`r8>wpMpM~Vs-n}X8HmS|; zPTB61@Vxh=*l-cH2d?cEhMUeonIQzerdsS1j2q`<2?4t8$Lo?Bo?AP--Vr{V-bKAD zOgG&}0qO=`n~uibPZ^+W+9Q7;6gH)GK)`IAwE-!DeQdmd6%iVn>qz~QLT39YrLlO( z1GB00AEyix7wRvP!D->ECEXD3`W^!h@jBu18L!?Wrd*zy_O`0rEOT6p_dVo+VHf*)d&Hp`Gx#Q zomYUO1|7u%m(c=HLwZRm_BtV{ahe)qsc||sH!Co;>jmW%xUoV)Qz&q0;{+Z>=nXpBTs*O*do|q53#*G3}bDgR6ajl0ez6*HBHGiaclaSUpS=+q|>~P&r-_;sjj>9xEia`JQ6{uHBWcE}zHgwZ~#pZ@OC`Z0>X9 z;44@A3O2F95&jxH@#t)e($(KI388Iqx(XW15<#>P#x6(rY$}vTXzL+(wqL`1=BCBjkQ~wjymS(tJ_lb#n^7ub#q~dM|bO%NW{Qy)m)z#+O4`zym~}41nM+P?Hv!i(FVb_ShId?1uKf4YA_KM$tuAV0ecBMy%bi3a*xK^SorGDi4-%vEk62vNvWT!R4WD!avg4Z5UaIF_)+Tw1ZE zm0|9lirwQ|ApJ8pSnzSxo( z=L%yE@9X(`Y{tfBI1ot2Aam87iQX~FoNHtRju*n5g!PTWne&-U5Y$}t&_V{*O#+y6 zCn2J4&e+X9UW_y++gX6d-IA$pQaq64Zq0D9<3ZmE$fcB|y5n z@Eed6D&2w%*Geft)7_0<2O-lf%y7Y!5(-q+_t*XJ%^^W1_n3gz35g47$ z^VbN4&M$=?6o?&obcjUFQ4b4+uG$$OCt=ZX{F{s6=&Dy-DKNUU^FVZH_6UdWL}Ac@ z^DE#v?t_IuhsTqowO+V#KFg;BFLx?jyB|F>0nt63S>RSwY(+)q!}R5q6(eXRyRKD! zM69l$#Qlum=oYvKD)vBqi@2s@1g#<7gW6C6Rkwk3OYWhH;qegu4_AyN9%d)ERxv=b zdzKgp_lV!;Jz6mwj}q^(ipJkMzsGx=FdXLiO`rWB4u%09i#le4l#rR-7sXkRP z5`L=kGr{IPkI@?nx={dq0P+Ep*ChtZ^R<3ata?cRc~va^3L_8m;)2Jk9{T*1!p9>5 zo}2l|1LSeT_!YNBYxJ!d(DBr|+k}MY6MI!(zb3H5*A-*CTsu4f-VVS9ch=zYK*Q@I zT)cJy!s8R1yYTUFc-&i_AtXF<*iCoYBQQKJg@N7_1|fKO7!>ztc(m)j3`2XrAo0M$ z>n#YplzT_$cYby6(eJqZ{Hg%(uq7_oJ6&CYfA>L#%h0b0`;MRkBni|VUmwhTUnqDV zX581ACd^%-sQ|2O~IE=c80w=7-qHF&^zY%dN88Bjwl#s<`c2R7hg)J>aWI6#Fp zXRSHQn`p(F8YmLCX# z9R&^u9gQE`k*pvB&k#BwbPRrMuvprAJV5S7hwB%hfS-5Z0Yb+S!|y(%C?q&Q=y?3t zb+Nk7GDIeL6u$}h4Ur#kf1QL22)!9Uwo_Rl1Rg7JKc9||*Kn2dof*c4~ zppuK1U)*R2F|dcw0`G{^yA$v$!3ECppMVsI$LxA~bF%h@7%EWd%>znGXo0Qio#5sR zFR+JT1MiB{TcA%oSfD;xC=fvq18bjv%jzKmd$`2{_w#)M$iOc;Pym!0) zAsHC}J#ZQ6d+0ze+RS95S%%50T~ zzFWiul3bMqJ5U}Q$ssLF!A9W;LLXq-UL*8CucVWVAqBO6eMoqMe%qC1*P3w;dr(2T z{#t>2@%u2!%R60)y zQ7~5M$;N-He|H=5rF`TRaFKh1r@lVs0fhBeiY9+4H4&RjIuu{5@dz zK%iG@+dbYMHQS+@?es8vI|+P4XnU&Jt}JMKKK(ZZ(`UlmIvKSk5cgOD?-9bD?csyH zK!_<`I>xHggtJeObbi9wui^K$aOnV~I~PPcAi1OH6KOnFH*hE%xX*V#if!=pe zV1oj3PrJc^4fY8PQ368)gAOHuYXiI1M;#W}FmLF@4G(NMNhzTb0khr6z@Q_EJSwnJ zfma`MqXQdFdRRvY>^fq%3VDR>n83!M*GK}_2X?*Bb}aVj-MGM@<4Ea-z;5u_jt@A@ zzcDcAjrdOpYyzoqpng+eHwD^i-yGP@0WbM{fhGnv(SLVKV7CM;Fw^eVz;5+f+@>rh z1qPi&Qj-Il?4wQzY)ZiT^fWhBnN14}I*k~&2X=d$+4R7s`^;tpHY4caW(GDhh;&|h zM__mOdfpk>or;`xvjUst6P_K|?105^+RX`UjxWR9z`DA5fkEey!~DSJ`>1yXc2~es z`V_Yyumz+OH`LvM-R)Cf7}!Fez#=8EI56m95?B)05}&|Q%pdWY8s(nAzT}n#23y1#@nBV9Nt{B1yB-IPo*j5Y$X3#X3Rs-1`E%57x4nxj(Se-HO1VD==lC1Gkj{ zopx1V&{cS8XRtbei4Oz@eE_c^`f^QR-Q0tLK_A3#fczc`sOZCiK_AAigxA`@PIZq2 z27LrC=}|n2I#l2{s;Ec-?i?I__}Q{P^5vE4M{Ho?v4D-+x}afri@ryu)CS!x>mCp2 zf=>kYxFSA*n(C8*J?RY^x%B~4{8NEFCDnHKbYM@%P5Mk=&ji(d+Er}`Yy*!3K-SSg zN$1gP0o)7H#fISmR5rJ(CWc>Gqz+MRa`trrVUi3-66d2#VM6+xPY?Dvt<-o}H zWh%XiIhXG@2euh?|MT1{fxV(((!p&(9oTIRY->;*y_iC53v8SJ_*M1T*8+RZr~Z0i zc)U*P+XLGkNd0(6U^{%woq>_cPM=MYB;U}H|E|EGyYQTu!tc$1-PG>Dpu6##=GOp} zDdqMAwufYPC*9t__A&zA3hXVF4UC<@_7Q{%%>Kak2Y!qAc3^Mg$42j+z}^YGs?58A zy^G(PqxR=*mv4d_S=F2}e)lgTOwB`FTOat|C zM*_p+2>fc!Su+pSwPeg$U)~93TtC$FUH_c*=NBqVIU5j17??AH2IhLYK{*?gi!@;k z&M{hs8rEzlIAlLYuLC2HgjX5KXkQ+&7fxJo6?_@vq?E!l}zSDH|OQs zl$=e;iG5RZMx3cscv{Y;#p&Ljv)euUrsr&W%&-|M%gmh3^o+bCXL#H}#&_oI&RnFy zI1Bq3Znn5IN3OX!gU-#J=jP>XUYzdyoDqvS^Qp#NIlD_NNxKCq$zTS^M|h=I#guzPdH51jYny*y{j)o|_IeK{lT`zXWx zIlEu{VQ8#S8?MY5bR{9Ha<+;JXi2v^XRE0ms-O?#?13EGyvMsWs>_2pgFZ-gAIjN7 zs%{7OaLyj4ARwG-(5=nc+T7Xn>*g!Ii9RSkk0_f*_2;piJ?6{44z*>KeI12-JZF#R zIR5YCp2!(-pWwYG_jw)Mle`*r>vINOj~`cu9o$nY#M3+ycF*MO8Q+o{a<(Cd{&8pb ztOB3Q;d(x2(B~=U#+(tIkd0*Z0w<_B*;I5d=8U9XB-y1(_9cC}Ny)yPGw93keRIw> z`yTs>0=Fn|YtEosNp_n`Prx=(eKlvV=KKxCYdIsO*GP4~Qhi-@-mX78a<(JKOB1&< zXL#()UFqJ)*&FdV*rl{~k>i^=dow2!bZ&Rf_;@!7%}%kJ-jlOEbkTF%-kj~tMR|(y zmOgrmkM`wkU(VILJIF*{0_AJnA6OLsyFelK=WIV;UEto%+1t5DFS;eH3iYVz?u?b% z%7#qe$=N%(awe5XrdZc!+`G#0U2=R+9DZL+`2ds~cOYlb19YH+IU|gagK*`;oPEdu zix+$!iF=1~20fJf7x!__K8^?9VFet?8T1GPuNjCE*Ees?7!a_&c@!M-)(`UoS_kyU zREry+2m|FBlsD+0JU3Q(BaD#2d@v+$L-Jlu4#jYSyH@ds$u&H0(Bb)>ZbaS)BV+{e zN9Jv09ubmpqk!-7Psc~+ZM5uBBee2%UA~7KleaPXC|^qOc&25V{{Pldzt*Jm*XQl} zyq2D0^ENgv*SNfm%j=Qi4SBl(D-DQ+@p&6hQE$xKjrpk9Ru!$~inO}+?RbiLpk<0_ zxk_#cd-5~FM$e7E+xQt_8+f57)yx+@9mY(1tecRx32?QiyD4us<(XkQ5LW-4m^bJ| zE|qV|+bwyfjs|yY-fkssA9q{cZp*vVKGB!k6J=7~CV6udTG_#z$$6VhUqO>1Z&UKj zG=ZC%x2ehqO^Uot6T{F+RF>282Axh1n31;`d4Ch)lWBA_^ENYIM%$E^MMS?NPY=IS zU1yeDv-1X>&4+XHMi?P;=sI(G(dXu=r{bE2$Nap_CqJ0)%XU}Z?!pkvd2T`87Q`jG zTe0uX_i_uB?jq%|7{j7&N#3AK=*&y=Mi?PWN$?(QaK#A{aarD$#kILtwOO7w=yD2m zU*7JcHmp_eSAr|@wt{T0b}RFS$4XedO8%?!TFvGS`T$?8$=fQGW)1l~n70R&kKau_ zq|_hI8}#A)zqqw|TdQm{?hyq%nm6d9B>EVZqujc@J*HIFk;>!pctT8hGH?9A`6S-! z^R}J@Bto9TIDmUv(VmfOL*AepsP(gXBaDz|`QW*{J%_0rVm+^(y;1RBkn6>~L0_cs zFXfFeLS7>Nro3&^AmH3JZ!h~Hyg6^1=_Yu+l4sGdC2!Cze7H4lTWJcv!7aFLdE1tc zd)Ybe)x5n*kna%%_Zn6*-0OLRzD@zR=WV;1FmyZewj(c9_MM9HM&6)rO0_?4`~9~a+}ld^9VPItT<^*C ze%_$(6Y+z*5k|-d)cZi*4&?pBc`$E$cMzLke&YNvPhKA>i$ijKEZ5<@K@U@$BY7i? zkRzngT(IVXpAq{OjPLqlLB-FA{R-sXzhKb*_$^E^H*{3L&bt8x8&IfoZD7F$7HVAM z*il~%E*Nxh;XF5_U_%I`sfQM9D3)H?fGftZfw>*w@3k$YT*>-e`3JlssAS*5|*kbJUFvOM=Yzd~4Y2t!gs^Z>LFz7wB(z1dr zQwkm2y(;eVf*H;-j7oJ#|lQQ$M`_} zSy!-iR7|TT$+EnAykL*FFy@JZJrVQa$$~uzW7ZdJy*v<11$!#4JDR#G`ZEQCK11C% z6l_CW_h(i2=L!aWjtqU>pI79K1%qzH&)5A0`Mp>$=!^LIy1!Jgmuhw2q`JRcFzCw! ztD>6=6#kWhy;5L9nQ~hSwxyuG($<1)EjTe?TfvC5jrii#tLmGtDV^5~27Mh)Y*(}$ z1%vK@MLP>dtet!y#=KFmH#}qJvy|)Lb`@+_oYkAkd3V8f^K&Kp;)3m=m}IfHV1(^0 zobTQ$*jpNiX}7On`-q34la`Zj7YzC~G2SWIJ8_J63-&HCfS)bcdrBzn-q+gdgMxkF z{SOojj|0BmX?L(-2Mec=;ByswuHv56z1)Y2|53p{Dx8uA;kROVJYV@H_0G6MFrNd7 zis9H;`DR*vAFC{f3kE%`Wd9Q@w3fwI${i`#5em8?>6$}p4jsmpUEh#HiGHC$`-Qz- z|Iqq}+<$d&140`R`d!k%&<2Ja6?AZeLK}qNG#=fAHaO(1ATMn~8-gE7a6>~I8v4r| zF7-pZ7T>kJwFzxl=(lOZmDPyQpd-R_+{n;IhIG)-jS4x&939$dK=}H&>q5ihI*hfB z32jVB4+-7%p6WSaM4`OdMw7Frq#7Yli4M8qn2#cj+y1R}sLr(GLhc=%^0m(ZwJnjlL;5fw$ z8E|)pcDHB$!qD(o2>Ta>wn$9p3^TOFq3+w4gtkQ7@9LI@jL3UJgWeN<-z^Jm8I4(r z*hP?`bN7aJs#_k~@=!hf1@t;Xd%^eWQ{8>a@cz*5_ZhAT4UZLMxH7brYEkD_g|;e` zQs(N=R;y{9dq5ek2@Sf23?B^bL1kEqGd$is6mpXKaA*(v3}56bJ+v2nhR3_Lp{@1F zJrdd@aFeO&QAK|&w8vlwz}~zl4s9I_$>aUF%J)QQPx$gZ85$l>Qoi+}tyk|l-aQrC zQ=zm6o(}D4b+hB$Gb-PP(4ZSA-?O1TtMV1&@|k-sv@Y)X(4P0@dkL8k+DpEC<~Azq z1sFtF-fgNF9-9cuUJ30L^>1@qRG6)y zLAO$vZJ}*bVZyjDCHHE`W#wz3z2*z^a>ej?*%zkdURT)m(6;-+Y_1p{n|)zQZbxW4 zd{#R{+bKqt+#8C%E3{oOvcbI>8Xj-L$OgQ3tL%G1+vCf=H#9u#L@ga&0v7jl96erWIevcFO>JYMl-FS-vD zb|AC^zU*5nhQ}6P_M$r&+Cg9T4@3JP3S?Z>%UNed|!`EwO z(eRi_z3wR59YrKK+u)+zSri!DtfI{l+7$a?)oV`CpmV6#+@j4@y@I%2c{k5%rWS3! zuh$#As3_VSzFs^GP}qW^E%5c)#nXzS?eg`?ySs~ax3Aa2qAgUt@@|o$FD}|*U#~Y& zGA!DgzFwS!Dr{-dmil__Mz^kLyM4X#?w+FE<4e7)Xv^ZH?p5^VMO#kun!B%Pc-%+x z8s7Jd4J(Sa!n0vz(ePLa8&(x<6_%kX$m*i4E($8|fucQ7WcJFtHDbeqMT0&F8y+g! zLt;ZVW2~ggqP${<(SGwwA-f1N=>^al5C#qfBS=naHzSJ)1EJz<^Qdlkdu zJ;FK@wv!I;+3*G(F-~fiqQ6OJBD%TvD~8AWL^q=ErXTrA?xDfr=zA6YEtpQ{>FV~; zSTLE+(-rUi;@aC(%5&`<*hwYe+Pf4E`*0-q9z`h%dGUQRDf+{d55%)L0@7)CU$XI~>J`Z3lHI68PjVAVHUR`$7GP<26SmIX%_X~; z5+~fpJPIt?$COxShZ7ZcOUZ5_4Am@TbIA@9rk;6g$!;xas=2LXw+YUcd!>?1@?Mim zHd(w%yD3;Xb5lzOom%>#n^v-E6hA&1yuF0{m|imI^wN*qjFQbD%ol2=GQOi^ca*dY zy|ZL^-06*f^GKj%vph)s?2^rnGoDkjIo@k-$>zox&r{;_O9q_}-|i~eUCOvf?H8yW z?k?Hgo@EP5hQ~r!wy0!_N-U;1jug|ElnlCrkC&EgY5Z~M?kTYcSyr-T{^NVW1t{6Q ze7wA5%S+Yfm9yq!YAM0_!O8BvlHG^R_nz+llHJeu92~AF*$TW^!j^1hi7iXTtt#0n zy!yD+C0kuWnB?38CB9x$vNa{$$URsxJRT&Ehf4O4$4GP!m+avZ#u?q(lC4#RL-&Y2 zdK3#c9vD~Z@gHs|*@lv9q;=Z6XG`{M%=qU@_FP<|=S%jyZ>)_a+ZZ>&3ngUb zizS1;NQN(!V8Eu5K{u7ocQ2Rhit(65UlYymwKjH%s;= z@vn5dOSap0n>{7l6A!n&>aTB=?5$FjQ^I{E+l#~YmAbh7O788FLEkQ2<=!dTJMky) zDzo=W27Qlw-dEv2C>itv3V)zv2dE}JUjHNLpmO*S;e(8!Fdrd1N>0#Ehf4N!_c7vv z@mK2U4l~qLKQw|g7@8w%j#SCMk@bx(&aj9Q437*toWw>%Ho|{7GBUzP^5v+=Mnzu! zjgD+|{N*GG1}FTvQz z#wx*#8yDF)?{!0DH>gm78z0&DNL$q#BfBxK&4kD%M72|E#8w1nZjKCkbM$>TF|vsS z`rL1c>=tk^wP{6DD6(69+P6h^o3cYp>C?%PK_^E)a#JFk;?t#PPZb-cMFyQFJC`~> zyFFqRJ3TV!boekMvKbNMroEdP+000T@Q%pth?BlEV))LA3_6RXXGbc}s!!w= zMz)YHaiv=n*`f&b$jBDcaHP8=vL%uB%@`#*QTB+A!4y$F?USS{B;A{=H@iX6_jC_L_5e&I+M3AL5bgKw!N?wrSc+xcLy>;<>@G#Nj^=zkvd1Hyhb54EY4-&E#-3mRJQ>-O zk<-XtAKCgy2;fge_Ef~~4Gqf3o+h2q*m$8|M<@t&a2q1qfZuCasfz5`$Q?_H5#6zq zdrrnAo{#MLsH(Rk8zaMKBU!%?*$a_hJ-!$r&|Zq{rHJD*gk)s+Y@(MmAVFVN$JwlQ zdPOO1i43}hGH#6w@2$~4yKRwei~Mfu)rjw3iwyc2S-c+E>yh8CY>$kDwv%QDSbnVA z5!nv9#Lmcein)<{BeFN}*cI6>JgP~TrUqa|xHpyL?#On-g+6XiWO(c$?Y)uhjU~ui zk-bITc?BBTzQ`Zd?vHFg!D|YmvJs0ogUVgp;Ia)aBScXcFEiAK zmWgm}+4zC;S|SW9+pseHNxR`?WX6cHK}VF&btB6*vP}8XZdBPul_il!mu++z(ZkEn zvRzm9%MczLDdFqOFn28Wc*-`m+~mfU4exQFsH){}DBBI?>TIOo__B>x3Tbzv-l0w? z+XM`aVZlae+*~&3&3rzwY=lqbb0k+gcT1U7=dERf-iqG|c->a!@TtB%? z%S1)FaPajyS?nx`KFiYhBL|rok3k^mThKSovgc~%*eR2 zY}@x#r0=ziiO?@c*u|5k|;eFm*whk#u+2?j{XJ(!#Rw zF`f$vTU541ae|A>MrMmC{%|SRVT?vuFD=_rKHG_TwX)%JPx*Ye45KiVuR4W?R=S^G z{TJ2yZ;DMPCEUIGYI)h9%Sj8XKM8kV8BO5(%Lct4zn|c>qHHU$KqWLK1XUTIRb_*& zDmU;-IO$fGZ8ha$$D8~Q{Hx2w>WZ2*r$xurHQid(5bEj#cYa1#T@B%m&j>?trA5yH zvHU>U9w=9vxhPvxwl(FGH61=!wg<~HHm9Q7!@~{a zy#6bWMz0);<0Lw!4?3C0DBke}Ok{e;7cpGw9bfVtj>uiVk(%UvPC+-*J5EJ$(>qS% z3eP*bp-SZ)r*jAG9be{x+B?3&y{&g(5_P3_04|2%AX5ICUu56_W^A4JSyw&_ElPzw zj%$N=J%I}oJNW$@%BtS+@4Ra8jz3_=(>t!=C5w0TrMY)|S3g|)yh~_g?|Rn;(!$gW zX+4VzYc9B+!_|xdhq677Yk+rM&lf|yYb-8a#SprY(9z!YF0QfOwT#dkz3X0F6TRy_ zLMM6G^K`js-t_{mncnphE|kSc?`2%*pW%817ix33w&3DkAJ;Zq+;`)8jE=d|yVl|2 zIupO8bUH39aovM!op&w6wcfiPqAPAl)d$ALR1?FbnkZhEO=qsj{yzL8=J3NR2IVE1 zdN8$OHl1CH{$OHya%1s(3IFekvwnq_3?4LM=KKN$9~F|V{o424UlYcBf)VAOxJYnG zBRhg6Q!Txu5md3MR-D>cp3+!Zd=|G7iI&f-G8Lba-*)(H3Rn{%0WP|^7p8>hW5=uH ztZ@#r#GN+_qqw7j`I1}8N14Q|h%KjH(nnK;jw-Ya+h?a(X$mue@GU&Ijnr@@tUhs4xvXY{YlLFpPh8aoSkqTpdF!| zSPr!3H1ZhNnUZ#BJnlk1@4U>8TQ=1ylPA=R^POLc;|V+NJIEU%d?(eJHI08!aO{Pw z6583Z%|Kyw{-bsJJ$5VF+i`!ij=#t1L_6Ha{_zh??Z>gg?97VtSk`DAu=1bmVhtDh z$vd~yW#ih#nRubb29>(k^562^Nr!SX8tJxJ$6pG|fc4dFJT;XUt67?-ZQRCVee4rb zEY2<@RoX{DM*3Jw&OppAexion28SeWh6Hu&03k=92R!Ikapp0pul`}!r;wS)wn1iI zEwf@;NhCbYxcIkpo#bC~JYj-1Py^8ptdv$`^RP3WNAv_3CV#^=rs&D;67Sy?)+xLj zrf}tdhWojvXJQsp{%3I&Ci-pemKEOJUGC}k+!fxxr~87Z=eyIq|AiQ}RJ@BYW~uKk zcHKPv2~RWSe+dRHMK1-_RNvLQ1U@PljYPNGMh^0%gSu(sqjuKCndlvHj0&1UR~W9e&V{z zplUVn$y8yzEUHv3>CU#Qoz1-GJB<4)e79v4q11=i-OuRBiJy zoGJsa4#TNftHo>xrc-H9nN2;{&ez15a6csc0=t0S3*kSqAKH(YSgCEw0omIF+o^v| z$)O=C9oBKzAoiN7QA-`n5W-)lEr=>NAN1T5nv7|H&%+$M!$% z$IQ~7UKfeg^|ePpZcC1dtBowu4Tn5CqhfJ?BTJ!E0?`g-3qsQgwZAo`Yn}mI8 zwklb(6xsnpte3RIy5(5}c;l8_IAt+`+p%?h)Y0b#bQ-dRF+RrclJa$((fT@#;N!^e z=j8Vb@@vT_Hl%r+{oHwqd2`?zYWvF$RutZpMI z8UJhHHtig^f3km~Rbwz>cY*6=z2c74+j$3#6}oTw#)5`qxbLDN z8+!zf{;yZ(Oh4Lw6@?J^GU8SY!>X=|cShVv&lrbT${~^x4imd# z+5fIrsimy(yQZ(&zuNyks;od?sH|UWE$i2OS-(zM&otn}$9S91aj&Ttl#Kq3aEw5Y zki};@iqM?3UHrZMoBdu(B{1_l}yT0oUOd4?pCeM#e>v{n(I7xpR;_;b>z>%K(8XB9^m4v!h#v6xu zBxa0H4VNWdpVEk=5j27i&gX-X%6L@LM){0K3y7J?hZogK`~RWsP2jAkj{fi4_x8Pg zM`m=?QAr?4wW2}Ah*1+_Ou`jMC&n0)n1m-G2J@I`hA~lsgyiv25L6Ub1jHRg0Tl&A z5fv501^0d5P;tQ(_g(+rU!A_oAc^n$dH?SuSbe)spFT^SbL!NuPSr#`JXPLs?bN74 z4!%jwlSz0ToGf3oK8Ny|DUkv(^O@7+jy6n2QzUzO zXUX|%dx*O16~hPYIh3a@^Z%;(p1h_-HVwgLL^?g9dgsXntd__bk#S=N8~*d<>ot7* z0)2dD<_K1M5>8Od4eTzt?@C%r5%oRT@`W_>i1Z@&{(2Fm+=piu%ie5`5?tZ|k}rw6 z(o5yQRg?W(`DB%8$vpXv#fd8$9D1-AT)BGbFH^(g!WFuJ#|M)o+lQRoxnAM5S||su z-WONO(JQW8wfo7*v1=3@x~fq4Rpo|+@ew@3X?h}msZn~ZoTlO}6@MI&UFU_mUM^Ve zdXkRnQDymT68ZvJuSdEh3(LHO7uL4bT;?87eXGeOiSXxvKq>1RC|gUQ5f8)MD#{|% zCR!eVgavIIfanMPgWzrGP;E7#8x3Hq3H{0dwwloWwAFfqpnV3gVnYAQ zA|`sU#u0S$0dP2U>j5w>ln9u6i;hsQLHiA0s|nq109#GyKeW|^{!?2`=(h*t53Ft< zUJc=wZ{>K&5&8dR>rgP}X8N}?&GXf$(nBJ9zOr{`8WjdwPWp67dt6XWrwWJQ7tI5x zKVk<$zn)w5e$N5a-|r)MN+!$FQ@?)UejiBey9dC>O(_5(xm$7Tg*uKHmuHF`ay z*0=aHT*yoLAM2$aA8wz2v~a|qs7s|W-ox_4wNG-*LU7&`gwDrsGbEu?w4CBa4=VIX zRPi1}RY6h3dk|H;2T{d)5LLVfQN?=@?T4f$s(25giuWL@cn_kA_aLfx52A|qAgXu| zqKfw*s(25giudpsF0cm6v6L=`$gz|zhRUy$F7{9HE2WDA(-q;OOJ1Y&_Q5Q0q9a)3 zlwy<|M(N@(IY!dO=t!QAl!hsGgkNAKd8j{QsvI9uF&!QsQgJGic|z$qSIN*<9{3wS zA*7oY$%l{bF$K*FSFCqc=n3+Q>&x_LIbhQ;K1zh)hnYjFDp<%J%oSKkd`J;nh zB{``Tzrv0Q-jtP_I<*%@X|M`nPjB_L4xE+viEdv_D`zqZKM`)Ujd(_0x75D5G__QH zv?*FiO^^s7>N?q=Ht}mUv+z zEb=XQJ1*d5Oy$PG7#A-TCI$au;!0#+8=y(xB{>%pd*-w^P+PAm*eY-9Si2p8Y;1H= zX#|)zw71dFV;|#%{b40%KOCl=45KL0mPHF+#VUG_=nsr3kNu$Gw5#pPnAZ-45mwR` zg%MU{hq8OR{+F!=UsxXM9%HB=9@3sJ$UE9o1-VCS){bX^Jfyu=7?g8g^X@1uIDC_@ zG!ng0z$bd-G?DvC(_1(^#uwPzg%jm3?VSQrlQvKic=u4F;y;aVz9$!Q za-PPQ@sq~I2ZdARJ&gw+@&(+dk?*dF}W{%pf~rECwF7dK>YP-Zi5ko~no`vK0r z(p0#Kqp5HaM^lZC@e*gFW(zfbWH)LGPbVEu1z+~D2ApGwZME@3@x;{#BzW}YHJ*Wmp z-s)Xhd!NNDf=$LN6E*?RW20f(191B|b`2A>5x^kAKU;gNRr`Xnf@?svC6KiYGJc!3 z1Z4%sfS$~!5&B*94@WxK4@|@>`<~hxoElL`z%=a&1Z_|DeSza>0tJ0TpoU@_z%F4b zd9f!rT~6SeLnH{*EbIkP=O`Kkw*FZ(2z;b!Cr~YRXtM7At#@}W>=ra5PKzw3UBdLJ z@&o|*c@pSnNPs>cu{FIwyBhWev9<&xy4x z1Q&W8@gOhBfV1~m^VV24Y|lx++*l09456vnl7Qc7HzJ)NyAf_^ zH!_rGOZ04MgqBEp!W$yv#tl5%UtVT%3c0Y1Ctc}{in-vj$xRBlAPMef54jMN>J~*$ zkchfmVHaG!xm9r&B)#6|aTiJwoU3zBOM1IT+#Nt63c!H5L1cF-;KF)}!_Y$f1(w&l z86Wp}paf0l_bM_2@elSSS^}{WSmv3JPQ;fUfO3rIO1xGQIY90y!!mz=WcTy=KIsDr znILzi4~pp?itHh7_f;^3htZq^+^*bk*)9`3C~0XT0jhs(q|QD zL9)Vg5m6S>06f+>`afM12G-k=%Hxrf<6er%%peeW*#C=9= zT%5*aj#Exvn@WS>l#>n;l_O8Zat70>3q_7Oo_nF>5P+$g*Lq>|t z&_iJv@Ux<;Pa=bU!uLK^&<5klr+n|T$UftH>f6sFvKyU+V(3s%hB0~gl`w9K(J)qF z8EkAG)3m&e!@0VeV3srTY;ULwV?2`Ligc3vkn-Rn8s=j8A(f=?|H*A)T_&J!*bN~9 zTp|&GAP}wT(Q5>QP=UuQz{7&z=``btxpIGsyVHr;R0Q$Qy&&z-995n2!d zTX{Z-7d(VSx}oGJ(od1&?bGrGJ&h#*Bz9`vXYX>SaG-&~oVl@x2ENK`d^H6pe1mE%14BYN;O|!P9EjwwdkQX1EI}>f*XHe7Z{q6| zlmU4?QYeS(8DrfT@C%b@oxe6nm*j1U=dm8pJmb=k4KqssM?PsHBf7n1Te1$IyJ_S+ejPu0RgNSJ)$cg1!-dBZDj2 zf?j`0Z$6!8pRuLII$Kw>3L1`vDQIFP`Q}@h`ohf-`WRyWHc( z)I#g|v5v@Op&5vrqjH^DurtxhqoPdY$3!NeS0>cL2!6Pu}+(aqFU{K@ERTKtf@uDIx#OZv6Um);87IXoj zxHUvw(CToxVl23%bVY%2ys%)8~5f#4*k2IJaKCTcC z!R!#qz722VsB47MiPKhfp^=gu2-w)Xff|ZgvR8 z+G_`;ce6vNn;k;k>=5c^hfp^=gu2-w)Xff|ZgvQLq98Dcizm4lqKl`v7^;h>x!7M9 zE4VmN7te9gr3;J#4;IBHaD?be9*ok((ab-G>EakJMn}2=bsFavhr0bCcgFMVc)xW# zSEx?7CrA;^2v-+#g$jhL6L^Z2gR41QP4laHT%myA-h8fR`_-{D@*KZ9jw|-|JiUyk zmxJDUpH&t`0(W|hEk!%78N+x;9rht+vBr2#M3@gmkPk$N52TfCDx?jYD@acu14wV6 z0*IyCei=l8$qx(UW;(qfCBLsyxNP$H$3l`dIbh1>OFRbO5=FE?xR;citP-RbK*`?D z#wX2;B|I@?GhtgEN14A*#;s{K`VR~7rD()d3s#r zN|b_E)JjPH8-+1w-_9V0jVe(qp@z1n4jH_F;llRm#&w}=V+FrKCsZB0WU>h}cTd|y z7Oe;J6BNd4EMEhvF)&QKFqj5`tM+n46K9Cbkn|hO3*LAXC#X0%6=C0KJ+bCBGb1ATme;(MzKM!uxF3={^3_0vV1A@D_ScZ#;c7U-hy#c{VvIfix zEXf+MpY?NV7%ddr*fv>XhRL#88d_ZLmbdLuvuWNIOr<{!mFtmi7bX@AW7jsX5J5Z4 zDm#WrWydh5>=>q$9W|0$NrL@w8w7LUo)D~ndqc3kwdxq?BSyy#^x>WIx5P)3*2F)@ zH{hSkV`5E&p&+WUAgaM2s?i`S{8Lo;r>O8xQQ@DW2K$N%7!wu#DcTSI6&3y|D*RJa z_@}7wPf_8YqQXB#g@1|){}dJeDJuL^RPpXb74KejD0+0!{lO|l4@8+Q+J!z_^kDSZ zq9agYi;haigo+*}eXj0|cFPW3jfWTJG!?xl7yqHC1@_g z6&gV#8Qnwcw=i7Y5xK~~y?Z!n6z)9`Nn}vEMtJyl38ZP$oL=@SFg=7rLF&YRn2wt1&ORzJSN zXcxQ7A54+g8Smbq%18Mw?)=JREoPb6KV;-RKw{%Ye*f`jJ zx0mcTTS}~oB~ZuTOVr<&XAV5>o({F4%;<5tA1mh{?T>mY=<&Zp^Y70SEEzS^{n`Gk zhX>gHb^u*0ts?e|x`mly9bKw7p%}Byh@IBS+)5O;~nK(kJZk5$y3@{jh z|NYGlwnJJ^DgXlxr-fuj7=!YSP@^46ijmcJu6`~ohqn;K#ZN;1-43;pttZ#k!(8)* zwe=7*tvU$F_#fmpip;_A)V=>w#A#hhsOz= z6CX?vUI#)qOn@BDtusLGZvx}U=ESH=h#dK!L?1DY;~!R*c&g>ZXwCMkwqs-M0~AGZ zd3j>gdP=P|^J;)v8#W8livyac{+S%C{3!VpL481Ydjv?Y#@n@b#UfN6A$Ka}f;&!k zoKNS@&QQen_JH!ipzON^@VWQ0v(;pd^10)(a}@;M&ZQlu37Zo~PLFJQ6bub(R)6Ry z1=>kpD&0_VyGatIKXR?2rd`8<_fMWgdHpt{)W*X_!^pH zN7pvs+%&>T{aUM?WH{tuGm^74fXjU$vS9TWAuI zptk>CR=`=LIM=*QvV zwS7Jub0=@ok?P~9bz*H&DmI3hXc8v&i5nMuDliNwV;$jPIU!-6Q-~#z;IPrIksgx= zCj$_}?U%NPvD$_A&tr5yZSX96A9enn+5t zpB`kKg*hjjXcG6BmjX_thz3)nAqOKmE$?#QR7Z=ZQt8u$3c0utfTGKhwa!$CaHNbR zAVn@3f)JgpbU2g|RwStogy`IS+UoU;1Q|`EPSf+CL@raDCxl2tWrjx!m%a{o2x|(} zaHen|uQ2!zW)cE{yuuecB6J}Yz9?@Od4<7$c;{mFD|3VdX*^#doCzoh7l}fE(sJc1 z>4s{NSdh?Mvg#u=XkGwPfP_j4?M;wbMf6s4U7jbr2oN#G9RI1{W;n_Z5OJvu?C1d%Qm)MLv9fB8~+ zs}LQR0YPR*s$7N`#NMN0IN!#WXP2hLfQ*JcE0hm0 z70?{D)oP(WMA62_p+ac0co#zqZEaKD7FfgnyDi`~?Bv@5UX$WGh|_*d&;J+x>T5gx zwgvl0B79#!kaq(}5dLdIOzsQ-^5zBb;nBy8EnpygND2S(h6V!S&S&|(0uI#Dy`1&s zq?7^=MM8$4V+tK1M7K0bupgELdN@uP5xCGEf`^VO_+}-8hj2MHF&Lk=@kk46#RNuqLmhc|Q z<^VtE6nxq|w_xXDSF=Zeef(R~(NhcZ;i!pl9}u5mf_u&nFM#=w-~wsFdr$?CpB@5z zptESS*}{8TgE@F7@>qHSxEm|NR=ev!Ls%Xi5)N4(9u za|;bynvxdJdN1cfpl)BYz>MaDtMFA6EXb_|f^@sws$U>PSNP`_);?eRSmGb!CDbts z3k}{JIHy?Kho@!Z#uiq&i0Fr{<1+N55N>u}kx(DXk zGlb{{U0h$dl*35O#Tkq=Ob}9wAS42F=LpJ;Us^#(nyelXibYUvCgTD&u`EE$#5&iY zb^#xFyuieiOaGmEq(0F!%Y>yl*vD!U@suzVHW5$pwWr;zIAOY7p^7{ssDxtzgvxU3 ze|+_%OcB0~cuoUtrH~Sp?s;J;n8f1}OkMP%+WIBcWtEb>Ec?glN$Zj?02eLZ% zsrExL^hYv1uZHaYSYRUG{X{0``tGL+-mUN6r8vcWS5Hwzu9toe-j$AyG0s*ajd4Tm zF);$FOzTig64k&9dAEWZXLUL%uB>JwbMlqMQYE}DR?ms7qmS_{IGVzZ@nqqa&2mq6 zTx`do!OWr5Tnk%A;jhNsP0rmEjv`P1K0hID*uyk6?qL!cxZ-I?LA}AQI%O1jVvNqa zS%#6!*)om9EOJ<8sVJ?O+b4G0!}zD;fv`?O&u${KLbMEu@$Fg$HyE58?-@dT`>cyO z;U=;qgiZxsEcalR#ES6rIBix9YugjN+{(64;ICU3vf{6wVq2ICmW3|CVGekXw;UFN zJUW+JOp~o3i~YJX7n~leyU&ZU6BO1Yi@}X#EC@Y6-Yu9464)mCLetiE2bJS*59sRB z?JCb*v<6~(6(5%$oSWD3?88{oq_u41l(MLn+!Dw%6-8Yx0z5bK-`HcO6{))H*$`hDm49)c3F&gw7>SHFkjW z;_Q3%^jW-gNzj+c_K&roIhg;c<1y_cT)GR@ZtKHRD8tN!3YqTvt1D#|NYr#3w>8F0 zzY6B zC@;6_xg+>cNARIY_q}!B5qzj4_)tgip^o4~9l?h>f)8~BAL%$3akc90dKltjVFk?fZ+46zmG+lxLUdC}HJ6??Z1Qw9S7JqNd0+MbnSBw4XGOm{R)#Y5>=vNE5Lj6X% zjf;_70q zR{PZ)uHLCx7ofs{XL|fR%41yML6mcnw>Fh@%no$TiEA_V*1N|8b9l%#bTVe79?zZ& z@!Im8qVX^*{H?3A$7h>F6P0JB@u2GX2Ja}RO8KG1Eaz0iM85^piVCO|6;LZGpjK2s zt*C%nQ3180eORnS`?7}@?T4OCv_G2}(H)rcMF+T!n~R;L;?|vk(q`*oS1Ge~K`gOw zv8Qy{y0f=VtLS1Msj+o2SO-pYF+^HwT@00uS{M6EH?4~UrJB}7mvqUxI9RG=U5r4T z{AJMNDf#NOu$e3}TPv-@TzYcZ?->}UO5iCg$^pFvPYcQIX8PY&W2<5tQF3QK^9dODfo!!*_TW2?g zDfZ*`Hc)pP(E&8MrS-FIdu71nb_&9VF$YNFw|hA{*^J4AOOS#nDJa$knI*(`$mP2v z{q8Uj%J0~KJ#{?OWx$=dyVEc~l-Z0k4AOBXQ-#o(Ol3$-)3lB08fMXMAi{h7#an(*aUEdANSLCk`b*oJ3tBF;MIKob9oqAd@M*bIyagxCd=c#s{^=_um56*6w(A#{|{Yp7-##C ztsMj`I|itY{1G(UXlb>_2nA%J=?Va#nr3WdN7z_CHqIS){G0xW8ajke9VLj5Q|0-9 z6|$*YPhjCO5q+_)5W^;cg)IULp~vyP34XwD0^d1aKw(-GNA(bD*doBt9eO}dA}K2w zw@(IQI7QW(DD=;#0l>UdBjP-R^;K{s!0A2r=|QT=DPhLAaTK^jqB~QY-z174#^JiURJBM1;fA!GW zK9tgtO>+Qfx-ddu!C{(eBTchKO|dzh?Yn^bJ&f_7&6yUOGxbVgsX}X&PEc)9w3tz0v$#;e` zf2>>u0gyRikGGN!Q6T-ip9ab87!wI}6joml>?p*M8S_r~;x2)ZppG(NDFozEURw~H zuo@~dbL428C=>VZ)d%j=xj%JKHz4u>zDa;`VSPT;J0jU0j`vaEVgMzT=1~VFHPbz& zo(C9&KF$z)LTCGYeg}Sh(m&ytWai8c#kf#OP3$X#OS+2nnFwH#{PQ4_)bu%_jDUz8 z!V*`iQ+V>cp1dGL5ft%n;l!MG;Y)e|jtE@^o4qV<1_O9T%Q8XBN3OQ^YX~8%8n6W2c!o*66OHX z>mfLg*;D7r#P~-G<>SPg9nCSVWAb)Po}o)8=U@v2(ea)rfOaw!b)1BdOLCDbg( z3%b+xOY^DFx&U}^7E~af+;4#4os{>@7vq8b*U31gr2m2Q*1rF8{4VUjxP&3mdcY-O zS}1}$b1$cOwEu$o{tN2+FR1UopuYctvhV7nbnLtOin8zOC(6F7zbN~z9Ym+_p#i!$ zjf*5?P_R+<8TnyI53@(P~;(RWK>S87r z`|DyB7YFKMJ{MiOxQvT~bs+~xBdWHV9|W&EXT|xgj)>N@)ZAaY4R1+FeHu{2K9WM= zt0LvpM4AyXA+3m(kTyh0NYAwIm&wap)n>|^coJbXC>#qgklQ4m4?qYbXUeng>oWqV zHVH_wm6F?w`9y`DOGj}rnj4hEJK+!wTOJhHOysnLt9Y%3$J{PS=3;U|rkWrT%-bcE z1Bd8@uq1Ms6K^Dccw+bUBpvqTp4$|+(Exdb@fbl|LU?ccT9>@JD93N$+U^^}XqsG_ zN(9f*Jh^l;xo(MRB6r)O&C3>Cx-sArdD^PmN~0fPwZRD3buT^bt7f*T^|39i@A`$B z=34<`dh~$dw+#G_mHgV&4OkP(COQYfxo-?Hv3fr_>TQPf5u^9BEo9i+PbT+0tL)L+ z_nWU4qrPiy4i`0S4&AFuj)ug!i*|+(Z44pW7ecfxglJa?=}GHDdeiz4qwyhqXj({L znikTJ)`j$^aUnabb$gb%(zl_tiY~VEKEOuaJn%|kI%~t_wzBqtr zJ-SjUON-SGsc{|2VWz(M6?xZ23ORtG+O^SZ(Htd+Qg%ceR^QBeaLcR*o5^-9p>S!rLJNclD4Wh1Z5S| zkepXD|A@W&LU3K(4}yt$e+XQ@17tJJzFUjgcZR_110mmJ-mNnG@-P=ZSp4GIjluPq zkbSF0bxuUg4iU3M6ubn|3JXEn=u=2fx)su!`2k`yGo()n+PUV4I;{2$<-bFfX(?vJ z@IkLB7qmt1E2#vWlY#Jw@??a9hMCu*0b-qILq-Oyo%(Dum(IslpA)f)Y^7_7xNhrr z!NhnF@6?3oUutXY@T|vo$aosO!P**dN5x{QmYUDj*ctnzP5A9Pjd6K6If9dGj1|)J-dzm#P3&u(v{WRnRC$euX}2QO$`E!A8`;-k+_b??$r-&qur{?#8%-iMBX4vd z>N<{MXb-vtd1 zyQL^SY#ZCI7e?9rU1e<6--?j|a@Q!+7{k7!ThGhLxIWcV}T(Nihn1U5_;pv(^+~V?5!DjR|cfHpab= zwQ1nh*b#oO9Te(<8#l7Abc!LpqkD-PyE9z11H+QMZH@UiWQOhCz-{PwhN56U0}TJ0^@C`$+ndwOs{Pa0t2ie zC@fwl`saV(v9U6j7MB5WLV*pPmg!IZZl*s)ThS+pwxK2x?U^3_WxO_~20m^Ul&{m+ zZ|YFHR&&?BR^Xb@uk|&(2!Aw*KZ5dgBRrdL)RhKD$eT!*^C@cu?x7L;w#m(#t0j12 z`)ZdfVuebgh;3I-vuGyFTkA4!CG_vt(XQh2FSS(DG~Ju1dn?~KRNd>!q|NEq&Hv8i zvmX75^WR~bc>KwhbjSZXI$<*JT97Og#NuN2?$>+aPMV;mK$KEz8a6o~&@LZq;I4JnN+Sg*bpAD7!)DC{4dDWK(a*6WQPeZEMnV5+ zI#lw{UamV1;x7(ZrbXIhrWoZ`l^YJ%v666Ra&+dIcQk#lHsN)g z)XEZ3bD}KG7;m7*(FP03-k-3U?isgL6wI_u^zb$3PR>hS5l3HJbN1Y)CKPI#2`e;2 zD>OtaG(@{BNGoe3q>bqm(vw*M(wk`zqFolG53?PlF9&JAME>kmZ7(KNq)(w)b?LL@ zXckkOhEFR)osGIiRko|rrSxRlo|B-v7*yv8Nu_dz)GRHaIw`EMy)ypjVJ)pI@@eln zgA|I^8^2lAlF`pv@f-GGIVvj`a2vEfFV`Xh+GOjyk(y}ZD!bIb6GX`MnfBXkkiV49u~HaeV23_F~!OWNzhFF<%UQ~og`$nv!w)7AqyKcYaim2T+myoL?> z(ehFlm`7CHBP#Y075|88n=abMq9WRp^+dEc3yG+)hKTlI{SfWT0wUUvDND3}dZ5!C zn6vbI0F#yI&P-CG1DTvecV$)*?O>r7)#Ch4@p!4}14omGvl@BaHK%(X030=b4tc0(jfHawxANq&xOGuUQf~KC_ETQ;`!)Sl z4*rMXE5~2#_faRbi+`z?^jAGAN5A0rVcd4fyndepv6YoK`Td$aqx8~fog4CJJ4Tbx z(vn>n(!IG%X}3)+)%N-UolcU3!=vT8mK4ji#1?I{xa`lRYY-SveUVc8c506WBSuI& zXmZ?GB1YuNBj{{x{oJ%7M$n0ZpyLJ>+HvXVYkyhXAgW5vksFxpxfHC7>Uc*I$Te{9 z&h)zt9iA-}Ym!?31Rch9w!Q6$Xq0QkHPKPEr75qF8AnCwfLd2^kXGBm@7cCGNUOOH z5vpB4H7k^R4%U*bbGjha8bC-7%1Zwc;9h=wq1gj_bH%uWnAbxPSFaS&^g*Y)DwNV1l?vx6pXU& zN#TD=r)0-w)v|kY3;AlBoMbEf^V;6_i`I|wlCHek``DhgkE)$Rw2CECX>Rz9{YrsQ zV(t#+uAi0dgCI57eyhb$VNiazO|CDp)DYUhk?hb&IpnFxk!+yPp_QZ(2S>g8N}y6R zcujS9_WbEyQ>3bP$x&WYFzw2M=lwpgHYbG1`T#0$AYc3o*Bp!$iwxruFk38g5SL)t zn!x|YC9ZO{03FheTWX9E&XygB3*cd3-GAfM><5jkQBYJ5SYvpdHHLc|{oM}GVxJ?| zYL`){206w1)iFCD#UeZn0*DF_DD96$oNS>a=ckB^{dyTx0)@z~wl6SWUU~ zn{0@<#?Ce&sl0V|0x<-+Qb(b9UFX=X?jgdEGn8=B!Fv z1WEs!L4-pkyfzUIl}li{t!#5uE(dX`F|Xd zUsF6=-QWeqhdq_i=$C8;k!S{yWad)>R+W;=iXt+qgUF^1B9l6ZT%SPtvZ_M*v8Y1& zvtB}WV0D5FU}q26nKcPAklj0ER~8;f2g?p*PZku&-t65W`>>oq2D6uj3}Lc|3}vE+ z?9U_*Igsfb(#7r=axgPFWCW8rWK=p-r|HHhKWmjqD5-!LkGauk^X9|4R5-dFqn^v^VirYtgluU0H}RUO@Pug>^lY@ z4lZFLKebDE^4(~{bC_Mzv~-3-C}DOQza&Plmcom&#(!!h)6&h@Df^IM)G{R2P2!jX z7WpXOqauHHC5L4SOqi9}e=&rUMeRo_gi*b`BdsKrVhfIjUE&-ZS2mc;l| zb>zl zXS{F@o;Z88?kpVjQ&5Thy0KI#r2J#Ogn!IRm^EHS-BA6W zpW&ky?p{NpO6n3-thpkQCb25>7G%dMmtYO-k&{hlJA&^4KF$uLssCa~t&)QBE(0U& z4y)F;`guQ6S1DBP92?uP1_@A+=c=8}e4&Y_QHt#%_e|}m1^%zfwwk4%W1>cvadhgh z4OuqTBuPJVR23_kEo4yoH>UJXN#bnd3up%pVND>@kSl41%VIRF(wMHW!phm-+E!^q z=denT3X&!}*mVw5}%_9Z17(|!=d$o`O> z#MGnYCTRfV2O0pQ6rge-WRN7mQQEq7K-#4m9%Z{pTRqBlm(F~YHcf*ezmnO`C~cO8 zLIz8>JIaPggFQ+b<}S#-(*2H7z^)OHp*lD*O535sAb<2j6QeRM@F+#)V)rmgBIxn8 zqXI;T2!hFs-ue5{^{r{!b6{QiyiXp5gLX(%5{Rfo5K+k>qOGhvqHP>%|FQ-9-kLFd zC6_i%W0}=OtYzGn@0#W%VxsT`+oOZJz}c{13)qvZ0qiJ3@D)jh$hAUgSgr+jAieS_ zam^Zk^+{AVJ)5W|tmgi8R`Lp=*QE)`UJZPFZ@wl^UO2V;1et3X8;k=MfB3RK5`Ae8 zLhqX10huy@&3{V4FT$XDca4EaJH2B||TDJfrII{8okqZl&%Z^=c4Qa&yw<)(Fd zG_Nc3r!DyaLayV>q4Mkx)*)Q?pZ zcR9uMR+EmAf@2I_ z;Ti*P*0Hiq1yRY2_EiVe-P|~uWNgTfiBu6LNH!cQu&Y}t>m4Fx$#GEyTY(Ag#cM*w zaiD~W%=S+pq~u7M?w{z1PIC8OCy_|3a>pN5?w4Sd%HNR(HteZM3(fG0xn|Yl}m}{x*`2s5=oAvBJ)&{ z`Et#rid-fmdn{2qv98As)%)*qRpbg)WMSr)3->T?6R+OF?tPKxe3gggyeg~6)%yH3 z?rw|B7RxGLpTE{a;9Tn!NrL^m>Ttcx-}QV+WJ}aQrCR4xZ6Xb&B%9l@C_%s?KtEyp?(3x|J|6Sf$Hhi+s4?{ZduG-92!T_70iITRrfN zCak+;4PPt7-EzfM$$j5D;U1h><`K|u>z&}PhDIy}?_9Medcj)-k2OzL%kq>04v^)GncJ?=c`wP(UY)nf zqtobM2Cee4TIH3M>$orMj;vf{gRx>uQxZ)GDjxf=jLPrW@bCNwT+OZ0}RZ z+p@V=L2;k+bhRWa^0q=HdB=m(ypy%cyK0s9WQea;d0(dZdhr>#*2!AsS^3!EMa=U_ z{eibiNuIiJZy*DGHO>PXdw$#>xC<_^Sg_`=F63^~U*&Er`k7;8%HN9P7n}#ZSS{L1avwy|FzqMN zi4;v-?)LqfvfM=%Tux~{ii^$)aXv^z;DqWaI*i&GymNVf;+?CQPEn;!bH`j%YU;o9 z%cbg_DYslIlKU>oni=;+FRMsr<&FH#@*E-i1wu`2x3*?Zi#`ZJytyyy0rLw&yhe=t^I8S_(`NDjVeF7!tD(N&MlY4GpGjk1GL8`UD=ylJ(Hv`}8cY+=@1SE>q&Ol3X|Zy+*5km?X72V&Ib5$WFv`LGLS;F;qevd) zutWi5Y>77ubG~x8L5{#GrOx08OgY?`w;Mf&cNO&`%i%rwd?JUN%`9(>vr2tigXk#9vK_=YW)4g=te& z+wR_#5B|c!j`yDIG|N3;9BbS2-tQj6(8lECIm`hOr~@KU2SlK$cD~TNc+ghWUiZv4 ziHAh7wAWyFm32l|zH!K=QDu`6{Ad}mX}&Ug$>)VbHZ2UVV8yhg(1~ao_2OCU2;CSx z>X6~wDJ)pLX->aCNe;1m1z9Io*<|D}lIUfB_0_}mYM~cz55KO*8F945nuy5I`kvIy zaC0eUjbTFy(SFozbBPL|JzOl(21i1ABHBZGr%hkBGu@&`eLJYxJf9LkK5Y87$n>3n z9+gDupKo$M(|Hz(Y@(WKN)c1R#a>FiGZvBM+W46@gV2squ!e`j0$v-|2 zm9)-%bAIY1Emcrm7X*j3@j%c$a~a;vY-2?gF0oUUKYM1ug4E7pGpU`m`|U-(y$u`G z4sA2nU@x&)oyXj>{VrqZp4FJa%fN+O1}5AxXkWIJzNL+noS*6mX#$a}@}r3Zdc0GL zc3+b>I_kUu#vQa35GgAl;thyY6%g?TL~sd2a0x_k2}E!SL~seDFYOEIN83XB)3%Tu z(q3Q2MeViWn-dSnyhN=k?;^;UPA1*1-bHxB60k=)@)Z4cJtj?|+4w{hT{ij@(mv7)K2@vKmJfvcd_0IC7BTgn%g+ z^ws|uOB_7mBT^WyZ7iYg4`Zn#jHQk+mO8>%>Ih@0BWN-^f+iCMhS2SfpvmkAn#>Lz z{p!n2j>zC@f(`c$)loOVN8Kw;`2&w=T~klEcYWMph#JNnMB@&kaR<@3gJ|4A z+8A(Q#kce>QhXzKyCpY-qDojKp@S{77|>3{VKXDZ?!7{lE>7@FT{J0&(C0a9gu+Z{BzrA5x)ybIC zXhZY2hmSWk(0A9;p0$SkvWqa09gt~jBPNsYY9c$Z+eCI?cgw93O!GYo>3YR5Zof}$ zvr&zorEF9uXcT{FKk7;c+7E1CS6Z=3SoIa`y+|g5DE+QN^a4+|Q@70KJ;zg)sbJrf zN3+$6))74emmpSVo!nU-sM1^mlw}2#!I92%X=@ey_L$va|Xn zdc!|d=d+kLz0r{=sio-yb3gdk1yh9FHC#Lap- zgH=zb{fVisI@$I2$!^Kd^3#$d=6~VHbNvurIxVqji6*?WlP{a3&Lu@{rFDrw?=@H` zv}-P6ocLsZ`ol z%Q*45TbO44(}1d%GekdOYLZEg6dy9j;U}{WKjSo|c$*qBVV5uD+8}Bnk4I=u5#S={ zK?z)23afdC&muXPS?*++LxerBp8GleSp5B;{>Lj!GGD|U66TzO><9GWZy^eNt5b81 z&qlI)*p8>)W^VbmtU$N-sfKlZn_Nzd`hs+3VlxwFx+4ZnPG=?7-)1EPSaZwFJ{}fD z30dqHq_Y#7T}^mlV&Aa~Nr-PXW{U4A5%!&AUS|FOzHf7UTUBP#Xkxbb!GiRn#4f77 ze{o_v+r_+J7G#kiAQaqkfEo;BMj6m^Ar1t z%~w&W+g>CTqQQIsqM`Iyfi6fdOYE|0`UMF{{{qs>1krI0O-R24*K$|80p904J}BoO6;m?`l}N=z^*2JEZ8K^(p^Yd zm{p&H4D--VEv>4L)^&{MSl1oQR&xxugKc=HuhQyaR_Qt$HL)z0flRdX))KrRy(Y11 zs$X54*rB%AOWDM7Ec>2+s`{+23({*7ySAF}x&#pTIUgXSTWd(mf^=zOOOrvzjvr4~-H;gB-N472$$5et8Uef<@0iO80$&!S%Mx2wO@3oy zq`A@SRu(AJq}VGbIp%V*pcZ}R6yY%o(wh>ysruf{3Gj{G%zLT;Filei(E!5$(cou^ z_a+N{S&-h6*e%ufmM2Ey<=!>`G7jDlPTheU8VBG84aZc*$>|0U-nlKS+%y$(dSugSU>u+}068;w@AkxQufBH& z3lxxo3d#4ucA7G52Mt>zwljU(!3I1I77vPPM$_bzm}r_delxtRCvPVDaL zd-pI!0zU9wv(S)4K9xK&3m_1Ua;alKmr`g@pt+Hc`gv-U`DzrPA7~x=QKJC;T<(o> zg^-^G>Ai{FTm9I5Oj6h(WR0>=g>+O%jnW7TUB!F%Cw71Jy$2E_@dMr{O~HqfG>+E@ zE7FYSSdq`jOuV1Y*>{q{kC`+}om@ zMS_vuFk4UohN#>Vi4dYEvL;{Qs1i;7Oa!V#<$!Y%p-2UJVFEm&ax2{(Q$3)Ih9q!N zUdRwGuN@FVv$jgHU8*jaUJm}FUJ)duazB~iwaK2$D)*`?_nNRFDSTfStfNFvCB~Dd zymDoMMNJu4L=E3m)D|UrI+4q!r@j1TAxBLiSc@PT0HSw1(TW5>$ySiaT^Z)(xGB!S zBIZ`WB5u4-cYzFj;3zhr(1$9sBSVFN3aRoSKp)9nQ)h7B#^z~mRNsj(ASQnI?8Fz3&fGcyvAbI*HTQV!{J?*R zp{3|6S|26|4I%^!UhxFz_#%ITa38Ib?!HN%e>MR+vSr3Tyim;x>CIAI$5&|^UYrQfdSc|PBBORbP zU13@@u02W%wMMz02oWk|F4Q-ygVQf;7$hZ zcVQSmMiw4-`FpAg)|p3iCxeA5 @Tobz#OG^C`YMZK#&Et^IDe$>@*3`x!9}j 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

XJhBTw$9BBq`kfsOw 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

^Seud6!(! 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≪9>V)r53dY-RU&GMM|+a~-I@6ooTk_n(5F0VwA7A!+#G2}2SbJ^xs)z=0w zZ-xrw3u14b@v#j#*l{0G;+~iC>z~*Z05*+dE<+_bxvQ-Sh`c&p?+;VwNF7k4hc@V= znOLJC=KDPQjMUA@#iRz1Rwd@;|~dgTqWG90X0qrME{9%Ur%Xw{eb-#=~1T3P;{)maI^5fMYd8Iqv zE+MD;<=a3_WZ0*JjoxKf(--OsZNsBE&jgAJ0z-}eY#*fKZfZMsXIGRSlTB}S;ETW8 zS`MdRD_&VHdD;Yb+1@dBo$gc8i|bWG=PbAF&Bk4ATtk*RixEE>A^@5wUoDLIHd+Nm zqqP!v>0*=~ydJ$Essg(ftWNX8c0s$l580-5T_4jiF?1FU{KA7UvHzx@+6$Vdf}$L~ z*($;*5wnJT!IuOrpC z61>HP@cKM^9Bi=J;mn8y+V_`9s!zn`d`lJ8=b_L$LCS7u(mOf?$-8hl>fq;(WXg$5 zZ`TYX>r?3aguREg&!z@=`u64eGDn2gOxu_SZH32u?I9s&?IE`#1qYtR`q)$19&#Hn z)E?4!9+SIW{G(2Cwuij04a957cOH8u=n`$`!IU>|HpI1a&WSeBZO2K;|NHGnuB!12 zrTA;2K2e_cOHju`dXcSkf9CcBvrKbCMlG$q(aRJ*nT+H&|^k8L;Ffx6<0 zH^d-{j3@r}zPB7|gI&D}Q*mihty9#P?@*@u{#d(t15K~8y+>Wo=eG&c@S%*e|Ii`+ z$$O8p^67<}FPvigp=I$;-+t6w%b-q^OnG>+-+j#0<^w@=KwFdZ2}71K_BP~UlL!so zHTEDZhF-LsVZt)oje;jGh5*ZNbEZaU%-d{1C1N3UO$c1n^7bB01q zvZ3TCRaY0PQ0hy73TZ}?6!_gFpw%}D1q!JPXaTZTX|4%Z+KzBZQyXRkD|)CU4m-xm zWYJ1e$Hdo&Mk`3>m`f~2B24U+ zg5*~Tl$a<1nINh2>nyz8OHF%C(fEIIMPr2wOvfew5rN}Etp@q%x0oat--O%cmeL@dj-p}hpsSu_sUjNNyo@jH^oJH%5m>i z5~TGQcSc*JpD8g(D9Ct+aNHsR@3{*%52U~MwmRJ}XYDczo1G|$JD->k4 z7zl&z^Rph-7BOcvrq+v6`8qK+Rzu084_jP~Z`uyk_?fL!)ib;BT8(70+qL+Tbc-Au zJ0MP}Zz>(sdy~V1!xj25-P)o=l>XsDOz!+E5Y*qsN|Acg^N~th7Iww6v3-ejXZ{K4 z`IU$NOzKm2{2=zA*Nt(9!6Jgd$t>WO3hj(G9P~+tFev@)w8;yF5@kB|$MpTC=2u3j z(vD;rnYfFpA(&Vsm<9&PIut-gB+qd&H9<2FG&PiZ2Qz5$VT(hc4Z}2CnV!&vOn8)$zOyltX1jn?F7HpeaQBmnTQ@N^k@co8B}YF zeCKOkQoSoe3D)TFT`VFl1v7#hcuJN|(Hpr01W%IUPHHGoDKDEnufMOwJ@E zv0gxbW2IrrAm{6Nhm7FHm~g{hX=d%U_6X_u$n@X_{?xGF$CZJ{4dvlKGlp))4Y^9; z3kMnO`zPT>{Ks$ud0PgdH5X6B4ctBz;3whOmB9r7Y54J%0}>ztjd-L0PH0VMQ63%G zO^q^HvSt?gZ&*8wRrqI!js6^f5Em{-vDkDhr&=`GjB zNeRdV={xI8$JarV*bu+DniPG}wLK7q zRr-(?JsOU3g)}g)e6S}j(lA?gdztMSzqm`gKj($j+qp~r=> zW)sNF{T*X%RZ>IFVji&^-rrb@^Qf`5GFF(P&E;9+H#)`Mf<83pi*W_7|?uPm9FY17;koNrEZ(=hYf8Oa+Aw_K+Yv#smTe2kinzjRauGMg?GW z=IB4Ofc_K1I2Vwjf&MS@=>H-{ZseNB@8D=>HFl)zE*!RPUXF zsZHk8T%Xod8^e}q#C|5XQowXp&?IWh=(>{4CUWwO817bJ(p>SQ;(9@RZwA;1_?gx8 z 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 literal 313188 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 nSY3TM0iK-Rh&SSUtr)+@>v1GIrNB5fXN