diff --git a/Makefile b/Makefile index 04bc3e1..ca25e65 100644 --- a/Makefile +++ b/Makefile @@ -26,3 +26,11 @@ test_install: test: build/pocketpy.exe tests/test_numpy.py + +build_wasm: + bash build_wasm.sh +.PHONY: build_wasm + +serve_wasm: + cd web && python3 -m http.server 8080 --bind 0.0.0.0 +.PHONY: serve_wasm diff --git a/build_wasm.sh b/build_wasm.sh new file mode 100755 index 0000000..0c8779f --- /dev/null +++ b/build_wasm.sh @@ -0,0 +1,58 @@ +set -e + +# Run prebuild if _generated.c doesn't exist +if [ ! -f pocketpy/src/common/_generated.c ]; then + python3 pocketpy/prebuild.py +fi + +# Create output directory +rm -rf web/lib +mkdir -p web/lib + +# Generate test_numpy.js from test source +python3 -c " +import json +with open('tests/test_numpy.py') as f: + src = f.read() +print('var TEST_SOURCE = ' + json.dumps(src) + ';') +" > web/test_numpy.js + +# Common flags +DEFINES="-DPK_ENABLE_OS=0 -DPK_ENABLE_THREADS=0 -DPK_ENABLE_DETERMINISM=0 \ + -DPK_ENABLE_WATCHDOG=0 -DPK_ENABLE_CUSTOM_SNAME=0 -DPK_ENABLE_MIMALLOC=0 \ + -DPK_BUILD_MODULE_LZ4 -DPK_BUILD_MODULE_MSGPACK -DNDEBUG" +INCLUDES="-Ipocketpy/include -Iinclude -Ipocketpy/3rd/lz4 -Ipocketpy/3rd/lz4/lz4/lib -Ipocketpy/3rd/msgpack/include" +WARNINGS="-Wno-sign-compare -Wno-conversion -Wno-unused-variable -Wno-unused-parameter" + +# Generate a unity C file that includes all pocketpy sources +TMPDIR=$(mktemp -d) +UNITY_C="$TMPDIR/unity_pocketpy.c" + +for f in $(find pocketpy/src/ -name "*.c" | sort); do + echo "#include \"$(pwd)/$f\"" >> "$UNITY_C" +done +echo "#include \"$(pwd)/pocketpy/3rd/lz4/lz4/lib/lz4.c\"" >> "$UNITY_C" +echo "#include \"$(pwd)/pocketpy/3rd/msgpack/src/mpack.c\"" >> "$UNITY_C" +echo "#include \"$(pwd)/pocketpy/3rd/msgpack/src/bindings.c\"" >> "$UNITY_C" + +# Compile unity C source with emcc +emcc "$UNITY_C" -c -Os $DEFINES $INCLUDES $WARNINGS -o "$TMPDIR/pocketpy.o" + +# Compile C++ source and link with em++ +em++ "$TMPDIR/pocketpy.o" \ + src/numpy.cpp \ + $INCLUDES \ + -std=c++17 -Os \ + $DEFINES \ + -DSUPPRESS_XTENSOR_WARNINGS \ + -DPY_DYNAMIC_MODULE \ + -sEXPORTED_FUNCTIONS=_py_initialize,_py_exec,_py_finalize,_py_printexc,_py_clearexc,_py_module_initialize \ + -sEXPORTED_RUNTIME_METHODS=ccall \ + -sALLOW_MEMORY_GROWTH=1 \ + -sSTACK_SIZE=1048576 \ + $WARNINGS \ + -o web/lib/pocketpy.js + +rm -rf "$TMPDIR" + +echo "Build complete: web/lib/pocketpy.js, web/lib/pocketpy.wasm" diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..577447d --- /dev/null +++ b/web/index.html @@ -0,0 +1,225 @@ + + + + + + pocket-numpy + + + +

pocket-numpy

+ GitHub: cubao/xtensor-numpy +
+
1
+ +
+
+ +
Loading WASM module...
+

+
+  
+  
+  
+
+
diff --git a/web/lib/pocketpy.js b/web/lib/pocketpy.js
new file mode 100644
index 0000000..6bb613e
--- /dev/null
+++ b/web/lib/pocketpy.js
@@ -0,0 +1 @@
+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["p"]();FS.ignorePermissions=false}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("pocketpy.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;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 noExitRuntime=true;var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();class ExceptionInfo{constructor(excPtr){this.excPtr=excPtr;this.ptr=excPtr-24}set_type(type){HEAPU32[this.ptr+4>>2]=type}get_type(){return HEAPU32[this.ptr+4>>2]}set_destructor(destructor){HEAPU32[this.ptr+8>>2]=destructor}get_destructor(){return HEAPU32[this.ptr+8>>2]}set_caught(caught){caught=caught?1:0;HEAP8[this.ptr+12]=caught}get_caught(){return HEAP8[this.ptr+12]!=0}set_rethrown(rethrown){rethrown=rethrown?1:0;HEAP8[this.ptr+13]=rethrown}get_rethrown(){return HEAP8[this.ptr+13]!=0}init(type,destructor){this.set_adjusted_ptr(0);this.set_type(type);this.set_destructor(destructor)}set_adjusted_ptr(adjustedPtr){HEAPU32[this.ptr+16>>2]=adjustedPtr}get_adjusted_ptr(){return HEAPU32[this.ptr+16>>2]}}var exceptionLast=0;var uncaughtExceptionCount=0;var ___cxa_throw=(ptr,type,destructor)=>{var info=new ExceptionInfo(ptr);info.init(type,destructor);exceptionLast=ptr;uncaughtExceptionCount++;throw exceptionLast};var __abort_js=()=>abort("");var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};var INT53_MAX=9007199254740992;var INT53_MIN=-9007199254740992;var bigintToI53Checked=num=>numINT53_MAX?NaN:Number(num);function __localtime_js(time,tmPtr){time=bigintToI53Checked(time);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}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 stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetperformance.now();var _emscripten_date_now=()=>Date.now();var nowIsMonotonic=1;var checkWasiClock=clock_id=>clock_id>=0&&clock_id<=3;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 getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var oldHeapSize=wasmMemory.buffer.byteLength;var pages=(size-oldHeapSize+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(globalThis.navigator?.language??"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var _environ_get=(__environ,environ_buf)=>{var bufSize=0;var envp=0;for(var string of getEnvStrings()){var ptr=environ_buf+bufSize;HEAPU32[__environ+envp>>2]=ptr;bufSize+=stringToUTF8(string,ptr,Infinity)+1;envp+=4}return 0};var lengthBytesUTF8=str=>{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;for(var string of strings){bufSize+=lengthBytesUTF8(string)+1}HEAPU32[penviron_buf_size>>2]=bufSize;return 0};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 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 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 FS_stdin_getChar_buffer=[];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=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.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){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(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);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{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_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,readFiles:{},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}else if(perms.includes("w")&&!(node.mode&146)){return 2}else 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}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&(512|64)){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},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=typeof flags=="string"?FS_modeStringToFlags(flags):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)}if(Module["logReadFiles"]&&!(flags&1)){if(!(path in FS.readFiles)){FS.readFiles[path]=1}}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);if(typeof data=="string"){data=new Uint8Array(intArrayFromString(data,true))}if(ArrayBuffer.isView(data)){FS.write(stream,data,0,data.byteLength,undefined,opts.canOwn)}else{abort("Unsupported data type")}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){if(typeof data=="string"){var arr=new Array(data.length);for(var i=0,len=data.length;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 UTF8ToString=(ptr,maxBytesToRead,ignoreNul)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead,ignoreNul):"";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 _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 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;i0){Module["preInit"].shift()()}}}Module["ccall"]=ccall;var _py_exec,_py_clearexc,_py_printexc,_py_initialize,_py_finalize,_py_module_initialize,__emscripten_stack_restore,__emscripten_stack_alloc,_emscripten_stack_get_current,memory,__indirect_function_table,wasmMemory;function assignWasmExports(wasmExports){_py_exec=Module["_py_exec"]=wasmExports["q"];_py_clearexc=Module["_py_clearexc"]=wasmExports["r"];_py_printexc=Module["_py_printexc"]=wasmExports["s"];_py_initialize=Module["_py_initialize"]=wasmExports["t"];_py_finalize=Module["_py_finalize"]=wasmExports["u"];_py_module_initialize=Module["_py_module_initialize"]=wasmExports["v"];__emscripten_stack_restore=wasmExports["w"];__emscripten_stack_alloc=wasmExports["x"];_emscripten_stack_get_current=wasmExports["y"];memory=wasmMemory=wasmExports["o"];__indirect_function_table=wasmExports["__indirect_function_table"]}var wasmImports={a:___cxa_throw,i:__abort_js,m:__localtime_js,c:__tzset_js,h:_clock_time_get,g:_emscripten_date_now,l:_emscripten_resize_heap,j:_environ_get,k:_environ_sizes_get,n:_exit,e:_fd_close,f:_fd_read,d:_fd_seek,b:_fd_write};function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module["calledRun"]=true;if(ABORT)return;initRuntime();Module["onRuntimeInitialized"]?.();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}var wasmExports;createWasm();run();
diff --git a/web/lib/pocketpy.wasm b/web/lib/pocketpy.wasm
new file mode 100755
index 0000000..a6064e4
Binary files /dev/null and b/web/lib/pocketpy.wasm differ
diff --git a/web/test_numpy.js b/web/test_numpy.js
new file mode 100644
index 0000000..238aa18
--- /dev/null
+++ b/web/test_numpy.js
@@ -0,0 +1 @@
+var TEST_SOURCE = "import math\nimport numpy as np\n\ndef assert_equal(a, b):\n    assert (a == b).all()\n\n\n# test dtypes\nassert hasattr(np, 'int8')\nassert hasattr(np, 'int16')\nassert hasattr(np, 'int32')\nassert hasattr(np, 'int64')\nassert hasattr(np, 'int_')\nassert hasattr(np, 'float32')\nassert hasattr(np, 'float64')\nassert hasattr(np, 'float_')\nassert hasattr(np, 'bool_')\n\n\n# test array int\narr1 = np.array([])\narr2 = np.array(10)\narr3 = np.array([-2, -1, 0, 1, 2])\narr4 = np.array([[1, 2], [2, 1]])\narr5 = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])\narr6 = np.array([[[[[1], [10], [100], [1000], [10000]]]]])\narr7 = np.array([[[2147483647]]])\n\narr8 = np.array([1, 2, 3, 4, 5], dtype='int8')\narr8 = np.array([1, 2, 3, 4, 5], np.int8)\n\narr9 = np.array([1, 2, 3, 4, 5], dtype='int16')\narr9 = np.array([1, 2, 3, 4, 5], np.int16)\n\narr10 = np.array([1, 2, 3, 4, 5], dtype='int32')\narr10 = np.array([1, 2, 3, 4, 5], np.int32)\n\narr11 = np.array([1, 2, 3, 4, 5], dtype='int64')\narr11 = np.array([1, 2, 3, 4, 5], np.int64)\n\n\n# test array bool\narr1 = np.array([True, False, True, False])\narr2 = np.array([[True, False], [False, True]])\narr3 = np.array([[[True, False, True], [False, True, False]], [[True, False, True], [False, True, False]]])\n\narr4 = np.array([[1, 0], [0, 1]], dtype='bool')\narr4 = np.array([[1, 0], [0, 1]], np.bool_)\n\n\n# test array float\narr1 = np.array([0.123456789])\narr2 = np.array([-2.0, -1.0, 0.0, 1.0, 2.0])\narr3 = np.array([[1.0, 2.0], [2.0, 1.0]])\narr4 = np.array([[[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], [[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]]])\narr5 = np.array([[[[[1.0], [10.0], [100.0], [1000.0], [10000.0]]]]])\narr6 = np.array([[[3.141592653589793]]])\n\narr7 = np.array([1.0, 2.0, 3.0, 4.0, 5.0], dtype='float32')\narr7 = np.array([1.0, 2.0, 3.0, 4.0, 5.0], np.float32)\n\narr8 = np.array([1.0, 2.0, 3.0, 4.0, 5.0], dtype='float64')\narr8 = np.array([1.0, 2.0, 3.0, 4.0, 5.0], np.float64)\n\n\n# test array creation\nassert_equal(np.ones([1, 1]), np.array([[1.0]]))\nassert_equal(np.ones([1, 1, 2, 2]), np.array([[[[1.0, 1.0], [1.0, 1.0]]]]))\n\nassert_equal(np.zeros([1, 1]), np.array([[0.0]]))\nassert_equal(np.zeros([1, 1, 2, 2]), np.array([[[[0.0, 0.0], [0.0, 0.0]]]]))\n\nassert_equal(np.full([1, 1], -1e9), np.array([[-1.000000e+09]]))\nassert_equal(np.full([1, 1, 2, 2], 3.14), np.array([[[[3.14, 3.14], [3.14, 3.14]]]]))\n\nassert_equal(np.identity(1), np.array([[1.0]]))\nassert_equal(np.identity(3), np.array([[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]))\n\nassert_equal(np.arange(10), np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]))\nassert_equal(np.arange(1, 10), np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]))\nassert_equal(np.arange(1, 10, 2), np.array([1, 3, 5, 7, 9]))\n\nassert_equal(np.linspace(0, 1, 5), np.array([0.0, 0.25, 0.5, 0.75, 1.0]))\nassert np.allclose(np.linspace(0, 1, 5, False), np.array([0.0, 0.2, 0.4, 0.6, 0.8]))\nassert np.allclose(np.linspace(0, 1, 20, True),\n                   np.array([0.0, 0.05263158, 0.10526316,\n                             0.15789474, 0.21052632, 0.26315789,\n                             0.31578947, 0.36842105, 0.42105263,\n                             0.47368421, 0.52631579, 0.57894737,\n                             0.63157895, 0.68421053, 0.73684211,\n                             0.78947368, 0.84210526, 0.89473684,\n                             0.94736842, 1.0]))\n\n\n# test array properties\narr1 = np.array([1, 2, 3])\nassert arr1.size == 3\nassert arr1.ndim == 1\nassert arr1.shape == (3,)\nassert arr1.dtype == 'int64'\n\narr2 = np.array([[1, 2], [3, 4]])\nassert arr2.size == 4\nassert arr2.ndim == 2\nassert arr2.shape == (2, 2)\nassert arr2.dtype == np.int64\n\narr3 = np.array([[1, 2, 2, 1], [3, 4, 4, 3], [5, 6, 6, 5]], np.int32)\nassert arr3.size == 12\nassert arr3.ndim == 2\nassert arr3.shape == (3, 4)\nassert arr3.dtype == 'int32'\n\narr4 = np.array([[[[[1.5, 2.5], [3.5, 4.5], [5.5, 6.5]]]]])\nassert arr4.size == 6\nassert arr4.ndim == 5\nassert arr4.shape == (1, 1, 1, 3, 2)\nassert arr4.dtype == np.float64\n\n\n# test boolean functions\narr1 = np.array([0.0])\nassert arr1.all() == False\nassert arr1.any() == False\n\narr2 = np.array([1.0])\nassert arr2.all() == True\nassert arr2.any() == True\n\narr3 = np.array([[1, 0], [0, 1]])\nassert arr3.all() == False\nassert arr3.any() == True\n\narr4 = np.array([[[True, False, True], [False, True, False]], [[True, False, True], [False, True, False]]])\nassert arr4.all() == False\nassert arr4.any() == True\n\n\n# test array sum\na = np.array([1.0, 2.0, 3.0])\nassert math.isclose(a.sum(), 6.0)\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert arr1.sum() == 45\nassert arr1.sum(0) == 45\n\narr2 = np.array([[1], [2], [3]])\nassert arr2.sum() == 6\nassert_equal(arr2.sum(0), np.array([6]))\nassert_equal(arr2.sum(1), np.array([1, 2, 3]))\nassert arr2.sum((0, 1)) == 6\n\narr3 = np.array([[[[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]]]])\nassert arr3.sum() == 40.5\nassert_equal(arr3.sum(0), np.array([[[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]]]))\nassert_equal(arr3.sum(1), np.array([[[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]]]))\nassert_equal(arr3.sum(2), np.array([[[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]]]))\nassert_equal(arr3.sum(3), np.array([[[[10.5, 13.5, 16.5]]]]))\nassert_equal(arr3.sum(4), np.array([[[[7.5, 13.5, 19.5]]]]))\n\nassert_equal(arr3.sum((0, 1)), np.array([[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]]))\nassert_equal(arr3.sum((3, 4)), np.array([[[40.5]]]))\n\n\n# test array prod\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert arr1.prod() == 362880\nassert arr1.prod(0) == 362880\n\narr2 = np.array([[1], [2], [3]])\nassert arr2.prod() == 6\nassert_equal(arr2.prod(0), np.array([6]))\nassert_equal(arr2.prod(1), np.array([1, 2, 3]))\nassert arr2.prod((0, 1)) == 6\n\narr3 = np.array([[[[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]]]])\nassert arr3.prod() == 304845.556640625\nassert_equal(arr3.prod(0), np.array([[[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]]]))\nassert_equal(arr3.prod(1), np.array([[[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]]]))\nassert_equal(arr3.prod(4), np.array([[[[13.125, 86.625, 268.125]]]]))\nassert_equal(arr3.prod((0, 3)), np.array([[[28.875, 73.125, 144.375]]]))\n\n\n# test array min\na = np.array([1.0, 2.0, 3.0])\nassert math.isclose(a.min(), 1.0)\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert arr1.min() == 1\n\narr2 = np.array([[-1], [-2], [-3]])\nassert arr2.min() == -3\n\narr3 = np.array([[[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]])\nassert arr3.min() == -5.5\nassert_equal(arr3.min(0), np.array([[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]))\nassert_equal(arr3.min(4), np.array([[[[-1.5, -3.5, -5.5]]]]))\nassert_equal(arr3.min((0, 3)), np.array([[[1.5, -5.5]]]))\nassert_equal(arr3.min((0, 4)), np.array([[[-1.5, -3.5, -5.5]]]))\n\n\n# test array max\na = np.array([1.0, 2.0, 3.0])\nassert math.isclose(a.max(), 3.0)\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert arr1.max() == 9\n\narr2 = np.array([[-1], [-2], [-3]])\nassert arr2.max() == -1\n\narr3 = np.array([[[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]])\nassert arr3.max() == 5.5\nassert_equal(arr3.max(0), np.array([[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]))\n\nassert_equal(arr3.max(4), np.array([[[[1.5, 3.5, 5.5]]]]))\nassert_equal(arr3.max((0, 3)), np.array([[[5.5, -1.5]]]))\nassert_equal(arr3.max((0, 4)), np.array([[[1.5, 3.5, 5.5]]]))\n\n# test array mean\na = np.array([1.0, 2.0, 3.0])\nassert math.isclose(a.mean(), 2.0)\n\narr = np.array([[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]])\nassert arr.mean() == 4.5\nassert_equal(arr.mean(0), np.array([[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]))\nassert_equal(arr.mean(1), np.array([[3.5, 4.5, 5.5]]))\nassert_equal(arr.mean(2), np.array([[2.5, 4.5, 6.5]]))\n\n\n# test array std\na = np.array([1.0, 2.0, 3.0])\nassert math.isclose(a.std(), 0.816496580927726)\n\narr = np.array([[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]])\nassert arr.std() == 1.8257418583505538\nassert_equal(arr.std(0), np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]))\nassert np.allclose(arr.std(1), np.array([[1.632993, 1.632993, 1.632993]]))\nassert np.allclose(arr.std(2), np.array([[0.81649658, 0.81649658, 0.81649658]]))\n\n\n# test array var\na = np.array([1.0, 2.0, 3.0])\nassert math.isclose(a.var(), 0.6666666666666666)\n\narr = np.array([[[1.5, 2.5, 3.5], [3.5, 4.5, 5.5], [5.5, 6.5, 7.5]]])\nassert arr.var() == 3.3333333333333335\nassert_equal(arr.var(0), np.array([[0.0, 0.0, 0.0], [0.0, 0.0, 0.0], [0.0, 0.0, 0.0]]))\nassert np.allclose(arr.var(1), np.array([[2.66666667, 2.66666667, 2.66666667]]))\nassert np.allclose(arr.var(2), np.array([[0.66666667, 0.66666667, 0.66666667]]))\n\n\n# test array argmin\na = np.array([3, 1, 2])\nassert a.argmin() == 1\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert arr1.argmin() == 0\n\narr2 = np.array([[-1], [-2], [-3]])\nassert arr2.argmin() == 2\nassert_equal(arr2.argmin(0), np.array([2]))\n\narr3 = np.array([[[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]])\nassert arr3.argmin() == 5\nassert_equal(arr3.argmin(0), np.array([[[[0, 0], [0, 0], [0, 0]]]]))\nassert_equal(arr3.argmin(1), np.array([[[[0, 0], [0, 0], [0, 0]]]]))\nassert_equal(arr3.argmin(2), np.array([[[[0, 0], [0, 0], [0, 0]]]]))\nassert_equal(arr3.argmin(3), np.array([[[[0, 2]]]]))\nassert_equal(arr3.argmin(4), np.array([[[[1, 1, 1]]]]))\n\n\n# test array argmax\na = np.array([3, 1, 2])\nassert a.argmax() == 0\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert arr1.argmax() == 8\n\narr2 = np.array([[-1], [-2], [-3]])\nassert arr2.argmax() == 0\nassert_equal(arr2.argmax(0), np.array([0]))\n\narr3 = np.array([[[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]])\nassert arr3.argmax() == 4\nassert_equal(arr3.argmax(0), np.array([[[[0, 0], [0, 0], [0, 0]]]]))\nassert_equal(arr3.argmax(1), np.array([[[[0, 0], [0, 0], [0, 0]]]]))\nassert_equal(arr3.argmax(2), np.array([[[[0, 0], [0, 0], [0, 0]]]]))\nassert_equal(arr3.argmax(3), np.array([[[[2, 0]]]]))\nassert_equal(arr3.argmax(4), np.array([[[[0, 0, 0]]]]))\n\n\n# test array argsort\na = np.array([3, 1, 2])\nassert_equal(a.argsort(), np.array([1, 2, 0]))\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert_equal(arr1.argsort(), np.array([0, 1, 2, 3, 4, 5, 6, 7, 8]))\n\narr2 = np.array([9, 8, 7, 6, 5, 4, 3, 2, 1])\nassert_equal(arr2.argsort(), np.array([8, 7, 6, 5, 4, 3, 2, 1, 0]))\n\narr3 = np.array([[-1], [-2], [-3]])\nassert_equal(arr3.argsort(), np.array([[0], [0], [0]]))\nassert_equal(arr3.argsort(0), np.array([[2], [1], [0]]))\n\narr4 = np.array([[[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]])\nassert_equal(arr4.argsort(), np.array([[[[[1, 0], [1, 0], [1, 0]]]]]))\nassert_equal(arr4.argsort(0), np.array([[[[[0, 0], [0, 0], [0, 0]]]]]))\nassert_equal(arr4.argsort(1), np.array([[[[[0, 0], [0, 0], [0, 0]]]]]))\nassert_equal(arr4.argsort(2), np.array([[[[[0, 0], [0, 0], [0, 0]]]]]))\nassert_equal(arr4.argsort(3), np.array([[[[[0, 2], [1, 1], [2, 0]]]]]))\nassert_equal(arr4.argsort(4), np.array([[[[[1, 0], [1, 0], [1, 0]]]]]))\n\n\n# test array sort\na = np.array([3, 1, 2])\na.sort()\nassert_equal(a, np.array([1, 2, 3]))\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\narr1.sort()\nassert_equal(arr1, np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]))\n\narr2 = np.array([9, 8, 7, 6, 5, 4, 3, 2, 1])\narr2.sort()\nassert_equal(arr2, np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]))\n\narr3 = np.array([[-1], [-2], [-3]])\narr3.sort(0)\nassert_equal(arr3, np.array([[-3], [-2], [-1]]))\n\narr4 = np.array([[[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]])\narr4.sort(3)\nassert_equal(arr4, np.array([[[[[1.5, -5.5], [3.5, -3.5], [5.5, -1.5]]]]]))\n\n\n# test array reshape\na = np.array([[1, 2], [3, 4]])\nassert_equal(a.reshape([1, 4]), np.array([[1, 2, 3, 4]]))\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert_equal(arr1.reshape([3, 3]), np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))\n\narr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\nassert_equal(arr2.reshape([9]), np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]))\n\narr3 = np.array([1.5, 2.5, 3.5, 4.5, 5.5, 6.5, 7.5, 8.5, 9.5, 10.5, 11.5, 12.5])\nassert_equal(arr3.reshape([3, 4]), np.array([[1.5, 2.5, 3.5, 4.5], [5.5, 6.5, 7.5, 8.5], [9.5, 10.5, 11.5, 12.5]]))\nassert_equal(arr3.reshape([2, 3, 2]), np.array([[[1.5, 2.5], [3.5, 4.5], [5.5, 6.5]],\n                                                [[7.5, 8.5], [9.5, 10.5], [11.5, 12.5]]]))\nassert_equal(arr3.reshape([1, 1, 2, 2, 3]), np.array([[[[[1.5, 2.5, 3.5], [4.5, 5.5, 6.5]],\n                                                        [[7.5, 8.5, 9.5], [10.5, 11.5, 12.5]]]]]))\n\n\n# test array resize\na = np.array([[1, 2], [3, 4]])\na.resize([1, 4])\nassert_equal(a, np.array([[1, 2, 3, 4]]))\n\n\n# test array squeeze\na = np.array([[1, 2, 3, 4]])\nassert_equal(a.squeeze(), np.array([1, 2, 3, 4]))\n\narr1 = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])\nassert_equal(arr1.squeeze(), np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]))\n\narr2 = np.array([[-1], [-2], [-3]])\nassert_equal(arr2.squeeze(), np.array([-1, -2, -3]))\n\narr3 = np.array([[[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]])\nassert_equal(arr3.squeeze(), np.array([[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]))\nassert_equal(arr3.squeeze(0), np.array([[[[1.5, -1.5], [3.5, -3.5], [5.5, -5.5]]]]))\n\n\n# test array transpose\na = np.array([[1, 2, 3, 4]])\nassert_equal(a.transpose(), np.array([[1], [2], [3], [4]]))\n\narr1 = np.array([[1], [2], [3]])\nassert_equal(arr1.transpose(), np.array([[1, 2, 3]]))\n\narr2 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])\nassert_equal(arr2.transpose(), np.array([[1, 4, 7], [2, 5, 8], [3, 6, 9]]))\nassert_equal(arr2.transpose(0, 1), np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))\nassert_equal(arr2.transpose(1, 0), np.array([[1, 4, 7], [2, 5, 8], [3, 6, 9]]))\n\narr3 = np.array([[[[[1.5, -5.5], [3.5, -3.5], [5.5, -1.5]]]]])\nassert_equal(arr3.transpose(), np.array([[[[[1.5]]], [[[3.5]]], [[[5.5]]]],\n                                         [[[[-5.5]]], [[[-3.5]]], [[[-1.5]]]]]))\nassert_equal(arr3.transpose(0, 1, 2, 3, 4), np.array([[[[[1.5, -5.5],\n                                                         [3.5, -3.5],\n                                                         [5.5, -1.5]]]]]))\nassert_equal(arr3.transpose((3, 4, 0, 2, 1)), np.array([[[[[1.5]]], [[[-5.5]]]],\n                                                        [[[[3.5]]], [[[-3.5]]]],\n                                                        [[[[5.5]]], [[[-1.5]]]]]))\n\n\n# test array repeat\na = np.array([[1, 2, 3, 4]])\nassert_equal(a.repeat(2), np.array([[1, 1, 2, 2, 3, 3, 4, 4]]))\n\narr1 = np.array([[1, 2], [3, 4]])\nassert_equal(arr1.repeat(2, 0), np.array([[1, 2], [1, 2], [3, 4], [3, 4]]))\n\narr2 = np.array([[[[1, 2, 3], [4, 5, 6]]]])\nassert_equal(arr2.repeat(4, 3), np.array([[[[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3],\n                                            [4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6]]]]))\nassert_equal(arr2.repeat([1, 2, 3], 3), np.array([[[[1, 2, 2, 3, 3, 3],\n                                                    [4, 5, 5, 6, 6, 6]]]]))\n\n\n# test array flatten\na = np.array([[1, 2, 3, 4]])\nassert_equal(a.transpose().flatten(), np.array([1, 2, 3, 4]))\n\nassert_equal(a.repeat(2), np.array([[1, 1, 2, 2, 3, 3, 4, 4]]))\narr1 = np.array([[1, 2], [3, 4]])\nassert_equal(arr1.flatten(), np.array([1, 2, 3, 4]))\n\narr2 = np.array([[[1., 2.], [3., 4.], [5., 6.]], [[7., 8.], [9., 10.], [11., 12.]]])\nassert_equal(arr2.flatten(), np.array([1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.]))\n\n\n# test array copy\na = np.array([1.1, 2.2, 3.3])\nassert_equal(a.copy(), a)\n\narr1 = np.array([[1, 2], [3, 4]])\narr2 = arr1\narr3 = arr1.copy()\n\narr1[0] = [10, 20]\nassert_equal(arr2, np.array([[10, 20], [3, 4]])) # Shallow copy\nassert_equal(arr3, np.array([[1, 2], [3, 4]]))   # Deep copy\n\n\n# test array astype\na = np.array([1.1, 2.2, 3.3])\nassert_equal(a.astype(np.int32), np.array([1, 2, 3]))\n\narr1 = np.array([1, 2, 2.5])\n\nassert_equal(arr1.astype('int_'), np.array([1, 2, 2]))\nassert arr1.dtype == 'float64'\n\nassert_equal(arr1.astype('float64'), np.array([1.0, 2.0, 2.5]))\nassert arr1.dtype == 'float64'\n\n\n# test array round\na = np.array([1.1, 2.2, 3.3])\nassert_equal(a.round(), np.array([1., 2., 3.]))\n\nassert_equal(np.round(np.array([40, 20, 30, 10])), np.array([40, 20, 30, 10]))\nassert_equal(np.round(np.array([0.37, 1.64])), np.array([0.0, 2.0]))\nassert_equal(np.round(np.array([.5, 1.5, 2.5, 3.5, 4.5])),np.array([1., 2., 3., 4., 5.]))\n\n\n# test array floor\nassert_equal(np.floor(np.array([40, 20, 30, 10])), np.array([40, 20, 30, 10]))\nassert_equal(np.floor(np.array([0.37, 1.64])), np.array([0., 1.]))\nassert_equal(np.floor(np.array([.5, 1.5, 2.5, 3.5, 4.5])), np.array([0., 1., 2., 3., 4.]))\n\n\n# test array ceil\nassert_equal(np.ceil(np.array([40, 20, 30, 10])), np.array([40, 20, 30, 10]))\nassert_equal(np.ceil(np.array([0.37, 1.64])), np.array([1., 2.]))\nassert_equal(np.ceil(np.array([.5, 1.5, 2.5, 3.5, 4.5])), np.array([1., 2., 3., 4., 5.]))\n\n\n# test array abs\nassert_equal(np.abs(np.array([[-1.2, 1.2], [-10, 10]])), np.array([[1.2, 1.2], [10, 10]]))\nassert_equal(np.abs(np.linspace(0, -10)), np.linspace(0, 10))\n\n\n# test __repr__ __str__\na = np.array([[1, 2], [3, 4]])\nassert repr(a) == '''\narray([[1, 2],\n       [3, 4]])\n'''.strip()\n\n\n# test array add\na = np.ones([2, 3])\nassert_equal(a + 1, np.array([[2., 2., 2.], [2., 2., 2.]]))\n\narr1 = np.array([1, 2, 3, 4, 5])\n\nassert_equal(arr1 + 1, np.array([2, 3, 4, 5, 6]))\nassert_equal(arr1 + 2.5, np.array([3.5, 4.5, 5.5, 6.5, 7.5]))\nassert_equal(1 + arr1, np.array([2, 3, 4, 5, 6]))\nassert_equal(2.5 + arr1, np.array([3.5, 4.5, 5.5, 6.5, 7.5]))\nassert_equal(arr1 + arr1, np.array([2, 4, 6, 8, 10]))\nassert_equal(arr1 + np.array([-1, -2, -3, -4, -5]), np.array([0, 0, 0, 0, 0]))\n\narr2 = np.array([[1.33, 2.66], [3.99, 5.33]])\n\nassert_equal(arr2 + 1, np.array([[2.33, 3.66], [4.99, 6.33]]))\nassert_equal(arr2 + 1.66, np.array([[2.99, 4.32], [5.65, 6.99]]))\nassert_equal(1 + arr2, np.array([[2.33, 3.66], [4.99, 6.33]]))\nassert_equal(1.66 + arr2, np.array([[2.99, 4.32], [5.65, 6.99]]))\nassert_equal(arr2 + arr2, np.array([[2.66, 5.32], [7.98, 10.66]]))\n\narray1 = np.ones([2, 2, 2, 2, 2])\narray2 = np.array([[[[[1.1, 1.2], [1.3, 1.4]], [[1.5, 1.6], [1.7, 1.8]]],\n                    [[[2.1, 2.2], [2.3, 2.4]], [[2.5, 2.6], [2.7, 2.8]]]],\n                   [[[[3.1, 3.2], [3.3, 3.4]], [[3.5, 3.6], [3.7, 3.8]]],\n                    [[[4.1, 4.2], [4.3, 4.4]], [[4.5, 4.6], [4.7, 4.8]]]]])\n\nassert_equal(array1 + array2, np.array([[[[[2.1, 2.2], [2.3, 2.4]],\n                                          [[2.5, 2.6], [2.7, 2.8]]],\n                                         [[[3.1, 3.2], [3.3, 3.4]],\n                                          [[3.5, 3.6], [3.7, 3.8]]]],\n                                        [[[[4.1, 4.2], [4.3, 4.4]],\n                                          [[4.5, 4.6], [4.7, 4.8]]],\n                                         [[[5.1, 5.2], [5.3, 5.4]],\n                                          [[5.5, 5.6], [5.7, 5.8]]]]]))\n\n\n# test array sub\na = np.ones([2, 3])\nassert_equal(a - 1, np.array([[0., 0., 0.], [0., 0., 0.]]))\n\narr1 = np.array([1, 2, 3, 4, 5])\n\nassert_equal(arr1 - 1, np.array([0, 1, 2, 3, 4]))\nassert_equal(arr1 - 2.5, np.array([-1.5, -0.5, 0.5, 1.5, 2.5]))\nassert_equal(1 - arr1, np.array([0, -1, -2, -3, -4]))\nassert_equal(2.5 - arr1, np.array([1.5, 0.5, -0.5, -1.5, -2.5]))\nassert_equal(arr1 - arr1, np.array([0, 0, 0, 0, 0]))\n\narr2 = np.array([[1.33, 2.66], [3.99, 5.33]])\n\nassert np.allclose(arr2 - 1, np.array([[0.33, 1.66], [2.99, 4.33]]))\nassert np.allclose(arr2 - 1.66, np.array([[-0.33, 1.], [2.33, 3.67]]))\nassert np.allclose(1 - arr2, np.array([[-0.33, -1.66], [-2.99, -4.33]]))\nassert np.allclose(1.66 - arr2, np.array([[0.33, -1.], [-2.33, -3.67]]))\nassert_equal(arr2 - arr2, np.array([[0, 0], [0, 0]]))\n\narray1 = np.ones([2, 2, 2, 2, 2])\narray2 = np.array([[[[[1.1, 1.2], [1.3, 1.4]], [[1.5, 1.6], [1.7, 1.8]]],\n                    [[[2.1, 2.2], [2.3, 2.4]], [[2.5, 2.6], [2.7, 2.8]]]],\n                   [[[[3.1, 3.2], [3.3, 3.4]], [[3.5, 3.6], [3.7, 3.8]]],\n                    [[[4.1, 4.2], [4.3, 4.4]], [[4.5, 4.6], [4.7, 4.8]]]]])\n\nassert np.allclose(array1 - array2, np.array([[[[[-0.1, -0.2], [-0.3, -0.4]],\n                                                [[-0.5, -0.6], [-0.7, -0.8]]],\n                                               [[[-1.1, -1.2], [-1.3, -1.4]],\n                                                [[-1.5, -1.6], [-1.7, -1.8]]]],\n                                              [[[[-2.1, -2.2], [-2.3, -2.4]],\n                                                [[-2.5, -2.6], [-2.7, -2.8]]],\n                                               [[[-3.1, -3.2], [-3.3, -3.4]],\n                                                [[-3.5, -3.6], [-3.7, -3.8]]]]]))\n\n\n# test array mul\na = np.ones([2, 3])\nassert_equal(a * 2, np.array([[2., 2., 2.], [2., 2., 2.]]))\n\narr1 = np.array([1, 2, 3, 4, 5])\n\nassert_equal(arr1 * 2, np.array([2, 4, 6, 8, 10]))\nassert_equal(arr1 * 2.5, np.array([2.5, 5.0, 7.5, 10.0, 12.5]))\nassert_equal(4 * arr1, np.array([4, 8, 12, 16, 20]))\nassert_equal(5.0 * arr1, np.array([5.0, 10.0, 15.0, 20.0, 25.0]))\nassert_equal(arr1 * arr1, np.array([1, 4, 9, 16, 25]))\n\narr2 = np.array([[1.33, 2.66], [3.99, 5.33]])\n\nassert np.allclose(arr2 * 2, np.array([[2.66, 5.32], [7.98, 10.66]]))\nassert np.allclose(arr2 * 2.5, np.array([[3.325, 6.65], [9.975, 13.325]]))\nassert np.allclose(4 * arr2, np.array([[5.32, 10.64], [15.96, 21.32]]))\nassert np.allclose(5.0 * arr2, np.array([[6.65, 13.3], [19.95, 26.65]]))\nassert np.allclose(arr2 * arr2, np.array([[1.7689, 7.0756], [15.9201, 28.4089]]))\n\n\n# test array div\na = np.ones([2, 3])\nassert_equal(a / 2, np.array([[0.5, 0.5, 0.5], [0.5, 0.5, 0.5]]))\narr1 = np.array([1, 2, 3, 4, 5])\n\nassert np.allclose(arr1 / 2, np.array([0.5, 1.0, 1.5, 2.0, 2.5]))\nassert np.allclose(arr1 / 2.5, np.array([0.4, 0.8, 1.2, 1.6, 2.0]))\nassert np.allclose(4 / arr1, np.array([4.0, 2.0, 1.3333333333333333, 1.0, 0.8]))\nassert np.allclose(5.0 / arr1, np.array([5.0, 2.5, 1.6666666666666667, 1.25, 1.0]))\n\narr2 = np.array([[1.33, 2.66], [3.99, 5.33]])\n\nassert np.allclose(arr2 / 2, np.array([[0.665, 1.33], [1.995, 2.665]]))\nassert np.allclose(arr2 / 1.33, np.array([[1.0, 2.0], [3.0, 4.007519]]))\nassert np.allclose(4 / arr2, np.array([[3.0075188, 1.5037594], [1.00250627, 0.75046904]]))\nassert np.allclose(1.33 / arr2, np.array([[1.0, 0.5], [0.33333333, 0.24953096]]))\nassert np.allclose(arr2 / arr2, np.array([[1.0, 1.0], [1.0, 1.0]]))\n\n\n# test array matmul\na = np.ones([2, 3])\nassert_equal(a @ np.ones([3, 4]), np.ones([2, 4]) * 3)\n\narr1 = np.array([[1, 2], [3, 4]])\narr2 = np.array([[5, 6], [7, 8]])\n\nassert_equal(arr1 @ arr2, np.array([[19, 22], [43, 50]]))\nassert_equal(arr2 @ arr1, np.array([[23, 34], [31, 46]]))\n\narr3 = np.array([[1.0, 2.0], [2.0, 3.0], [4.0, 5.0]])\narr4 = np.array([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])\n\nassert_equal(arr3 @ arr4, np.array([[9.0, 12.0, 15.0],\n                                    [14.0, 19.0, 24.0],\n                                    [24.0, 33.0, 42.0]]))\nassert_equal(arr4 @ arr3, np.array([[17.0, 23.0],\n                                    [38.0, 53.0]]))\n\n\n# test array len\narr1 = np.array([1, 2, 3, 4, 5])\nassert len(arr1) == 5\n\narr2 = np.array([[1, 2], [3, 4], [5, 6]])\nassert len(arr2) == 3\n\narr3 = np.array([[1, 2], [3, 4]])\nassert len(arr3) == 2\n\narr4 = np.array([[[[1.5, -1.5, 2.5], [3.5, -3.5, 4.5], [5.5, -5.5, 6.5]]]])\nassert len(arr4) == 1\n\n\n# test array pow\nassert_equal(np.ones([2, 3]) ** 2, np.array([[1., 1., 1.], [1., 1., 1.]]))\n\na = np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])\nb = np.array([[[2, 2], [2, 2]], [[3, 3], [3, 3]]])\n\nassert np.allclose(a ** b, np.array([[[1, 4], [9, 16]], [[125, 216], [343, 512]]]))\n\narr1 = np.array([1, 2, 3, 4, 5])\nassert_equal(arr1 ** 2, np.array([1, 4, 9, 16, 25]))\nassert np.allclose(arr1 ** 2.5, np.array([1.0, 5.656854, 15.588457, 32.0, 55.901699]))\nassert_equal(2 ** arr1, np.array([2, 4, 8, 16, 32]))\nassert np.allclose(2.5 ** arr1, np.array([2.5, 6.25, 15.625, 39.0625, 97.65625]))\n\narr2 = np.array([[1.33, 2.66], [3.99, 5.33]])\nassert np.allclose(arr2 ** 2, np.array([[1.7689, 7.0756], [15.9201, 28.4089]]))\nassert np.allclose(arr2 ** 2.5, np.array([[2.039995, 11.53995437], [31.80037484, 65.58703869]]))\nassert np.allclose(4 ** arr2, np.array([[6.32033049, 39.94657756],\n                                        [252.47557235, 1618.0046067]]))\nassert np.allclose(5.0 ** arr2, np.array([[8.50413422, 72.32029875],\n                                          [615.0215271, 5315.08388464]]))\n\n\n# test array binary\na = np.array([[1, 0], [0, 1]], dtype=np.bool_)\n'''\narray([[ True, False],\n       [False,  True]])\n'''\n\nassert_equal(a & True, np.array([[1, 0], [0, 1]], dtype=np.bool_))\nassert_equal(a | True, np.array([[1, 1], [1, 1]], dtype=np.bool_))\nassert_equal(a ^ True, np.array([[0, 1], [1, 0]], dtype=np.bool_))\nassert_equal(~a, np.array([[False,  True], [ True, False]]))\n\n\n# test array trigonometry\narr1 = np.array([np.pi / 6, np.pi / 4, np.pi / 3, np.pi / 2, np.pi])\nassert np.allclose(np.sin(arr1), np.array([0.5, 0.707107, 0.866025, 1.0, 0.0]))\nassert np.allclose(np.cos(arr1), np.array([0.866025, 0.707107, 0.5, 0.0, -1.0]))\nassert np.allclose(np.tan(arr1), np.array([0.57735, 1.0, 1.73205, np.inf, 0.0]))\n\narr2 = np.array([0.5, 0.707107, 0.866025, 1.0, 0.0])\nassert np.allclose(np.arcsin(arr2), np.array([np.pi / 6, np.pi / 4, np.pi / 3, np.pi / 2, 0.0]))\nassert np.allclose(np.arccos(arr2), np.array([np.pi / 3, np.pi / 4, np.pi / 6, 0.0, np.pi / 2]))\nassert np.allclose(np.arctan(arr2), np.array([0.463648, 0.61548, 0.713724, 0.785398, 0.0]))\n\n\n# test array exponential\narr1 = np.array([0.0, 1.0, 2.0, 3.0, 4.0])\n\nassert np.allclose(np.exp(arr1), np.array([1.0, 2.718282, 7.389056, 20.085537, 54.598150]))\nassert np.allclose(np.log(arr1), np.array([-np.inf, 0.0, 0.693147, 1.098612, 1.386294]))\nassert np.allclose(np.log2(arr1), np.array([-np.inf, 0.0, 1.0, 1.584963, 2.0]))\nassert np.allclose(np.log10(arr1), np.array([-np.inf, 0.0, 0.30103, 0.477121, 0.60206]))\n\n\n# test array getitem\narr1 = np.arange(30).reshape([3, 2, 5])\n\nassert_equal(arr1[0], np.array([[0, 1, 2, 3, 4],\n                                [5, 6, 7, 8, 9]]))\nassert_equal(arr1[1], np.array([[10, 11, 12, 13, 14],\n                                [15, 16, 17, 18, 19]]))\nassert_equal(arr1[2], np.array([[20, 21, 22, 23, 24],\n                                [25, 26, 27, 28, 29]]))\nassert_equal(arr1[-1], np.array([[20, 21, 22, 23, 24],\n                                 [25, 26, 27, 28, 29]]))\nassert_equal(arr1[-2], np.array([[10, 11, 12, 13, 14],\n                                 [15, 16, 17, 18, 19]]))\n\nassert_equal(arr1[0, 0], np.array([0, 1, 2, 3, 4]))\nassert_equal(arr1[1, 1], np.array([15, 16, 17, 18, 19]))\nassert_equal(arr1[2, 0], np.array([20, 21, 22, 23, 24]))\n\nassert_equal(arr1[(0,)], np.array([[0, 1, 2, 3, 4],\n                                   [5, 6, 7, 8, 9]]))\nassert_equal(arr1[(0, 1)], np.array([5, 6, 7, 8, 9]))\nassert_equal(arr1[(1, 0)], np.array([10, 11, 12, 13, 14]))\nassert_equal(arr1[(-1,)], np.array([[20, 21, 22, 23, 24],\n                                    [25, 26, 27, 28, 29]]))\nassert_equal(arr1[(-3, -1)], np.array([5, 6, 7, 8, 9]))\nassert arr1[(0, 1, 2)] == 7\nassert arr1[(2, 1, 0)] == 25\nassert arr1[(-3, -2, -1)] == 4\nassert arr1[(-1, -2, -3)] == 22\n\nassert_equal(arr1[[0, ]], np.array([[[0, 1, 2, 3, 4],\n                                     [5, 6, 7, 8, 9]]]))\nassert_equal(arr1[[0, 1]], np.array([[[0, 1, 2, 3, 4],\n                                      [5, 6, 7, 8, 9]],\n                                     [[10, 11, 12, 13, 14],\n                                      [15, 16, 17, 18, 19]]]))\nassert_equal(arr1[[1, 2]], np.array([[[10, 11, 12, 13, 14],\n                                      [15, 16, 17, 18, 19]],\n                                     [[20, 21, 22, 23, 24],\n                                      [25, 26, 27, 28, 29]]]))\nassert_equal(arr1[[2, 1]], np.array([[[20, 21, 22, 23, 24],\n                                      [25, 26, 27, 28, 29]],\n                                     [[10, 11, 12, 13, 14],\n                                      [15, 16, 17, 18, 19]]]))\nassert_equal(arr1[[2, 2]], np.array([[[20, 21, 22, 23, 24],\n                                      [25, 26, 27, 28, 29]],\n                                     [[20, 21, 22, 23, 24],\n                                      [25, 26, 27, 28, 29]]]))\nassert_equal(arr1[[0, 1, 2]], np.array([[[0, 1, 2, 3, 4],\n                                         [5, 6, 7, 8, 9]],\n                                        [[10, 11, 12, 13, 14],\n                                         [15, 16, 17, 18, 19]],\n                                        [[20, 21, 22, 23, 24],\n                                         [25, 26, 27, 28, 29]]]))\nassert_equal(arr1[[2, 1, 0]], np.array([[[20, 21, 22, 23, 24],\n                                         [25, 26, 27, 28, 29]],\n                                        [[10, 11, 12, 13, 14],\n                                         [15, 16, 17, 18, 19]],\n                                        [[0, 1, 2, 3, 4],\n                                         [5, 6, 7, 8, 9]]]))\n\nassert_equal(arr1[0:1], np.array([[[0, 1, 2, 3, 4],\n                                   [5, 6, 7, 8, 9]]]))\nassert_equal(arr1[2:3], np.array([[[20, 21, 22, 23, 24],\n                                   [25, 26, 27, 28, 29]]]))\nassert_equal(arr1[0:2], np.array([[[0, 1, 2, 3, 4],\n                                   [5, 6, 7, 8, 9]],\n                                  [[10, 11, 12, 13, 14],\n                                   [15, 16, 17, 18, 19]]]))\nassert_equal(arr1[1:3], np.array([[[10, 11, 12, 13, 14],\n                                   [15, 16, 17, 18, 19]],\n                                  [[20, 21, 22, 23, 24],\n                                   [25, 26, 27, 28, 29]]]))\nassert_equal(arr1[1:3:3], np.array([[[10, 11, 12, 13, 14],\n                                     [15, 16, 17, 18, 19]]]))\nassert_equal(arr1[0:3:2], np.array([[[0, 1, 2, 3, 4],\n                                     [5, 6, 7, 8, 9]],\n                                    [[20, 21, 22, 23, 24],\n                                     [25, 26, 27, 28, 29]]]))\n\nassert_equal(arr1[1:], np.array([[[10, 11, 12, 13, 14],\n                                   [15, 16, 17, 18, 19]],\n                                  [[20, 21, 22, 23, 24],\n                                   [25, 26, 27, 28, 29]]]))\nassert_equal(arr1[:2], np.array([[[0, 1, 2, 3, 4],\n                                   [5, 6, 7, 8, 9]],\n                                  [[10, 11, 12, 13, 14],\n                                   [15, 16, 17, 18, 19]]]))\n\nassert_equal(arr1[::2], np.array([[[0, 1, 2, 3, 4],\n                                   [5, 6, 7, 8, 9]],\n                                  [[20, 21, 22, 23, 24],\n                                   [25, 26, 27, 28, 29]]]))\nassert_equal(arr1[-2:3:1], np.array([[[10, 11, 12, 13, 14],\n                                      [15, 16, 17, 18, 19]],\n                                     [[20, 21, 22, 23, 24],\n                                      [25, 26, 27, 28, 29]]]))\nassert_equal(arr1[3::-2], np.array([[[20, 21, 22, 23, 24],\n                                     [25, 26, 27, 28, 29]],\n                                    [[0, 1, 2, 3, 4],\n                                     [5, 6, 7, 8, 9]]]))\nassert_equal(arr1[::-1], np.array([[[20, 21, 22, 23, 24],\n                                    [25, 26, 27, 28, 29]],\n                                   [[10, 11, 12, 13, 14],\n                                    [15, 16, 17, 18, 19]],\n                                   [[0, 1, 2, 3, 4],\n                                    [5, 6, 7, 8, 9]]]))\nassert_equal(arr1[::], np.array([[[0, 1, 2, 3, 4],\n                                  [5, 6, 7, 8, 9]],\n                                 [[10, 11, 12, 13, 14],\n                                  [15, 16, 17, 18, 19]],\n                                 [[20, 21, 22, 23, 24],\n                                  [25, 26, 27, 28, 29]]]))\n\n\n# test array setitem\narr1 = np.arange(30).reshape([3, 2, 5])\n\narr1[0] = 10\nassert_equal(arr1[0], np.array([[10, 10, 10, 10, 10],\n                                [10, 10, 10, 10, 10]]))\n\narr1[1] = [1, 2, 3, 4, 5]\nassert_equal(arr1[1], np.array([[1, 2, 3, 4, 5],\n                                [1, 2, 3, 4, 5]]))\n\narr1[2] = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]\nassert_equal(arr1[2], np.array([[1, 2, 3, 4, 5],\n                                [6, 7, 8, 9, 10]]))\n\narr1[-1] = 0\nassert_equal(arr1[-1], np.array([[0, 0, 0, 0, 0],\n                                 [0, 0, 0, 0, 0]]))\n\narr1[0, 0] = 5\nassert_equal(arr1[0, 0], np.array([5, 5, 5, 5, 5]))\n\narr1[1, 1] = [1, 2, 3, 4, 5]\nassert_equal(arr1[1, 1], np.array([1, 2, 3, 4, 5]))\n\narr1[2, 0] = [2.5]\nassert_equal(arr1[2, 0], np.array([2, 2, 2, 2, 2]))\n\narr1[(0,)] = 10.5\nassert_equal(arr1[(0,)], np.array([[10, 10, 10, 10, 10],\n                                   [10, 10, 10, 10, 10]]))\n\narr1[(0, 1)] = 0\nassert_equal(arr1[(0, 1)], np.array([0, 0, 0, 0, 0]))\n\narr1[(-3, -1)] = 1\nassert_equal(arr1[(-3, -1)], np.array([1, 1, 1, 1, 1]))\n\narr1[(-1, -2, -3)] = 3.14159\nassert arr1[(-1, -2, -3)] == 3\n\narr1[[0, ]] = 0\nassert_equal(arr1[[0, ]], np.array([[[0, 0, 0, 0, 0],\n                                     [0, 0, 0, 0, 0]]]))\n\narr1[[0, 1]] = 1\nassert_equal(arr1[[0, 1]], np.array([[[1, 1, 1, 1, 1],\n                                      [1, 1, 1, 1, 1]],\n                                     [[1, 1, 1, 1, 1],\n                                      [1, 1, 1, 1, 1]]]))\n\narr1[[2, 2]] = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]\nassert_equal(arr1[[2, 2]], np.array([[[1, 2, 3, 4, 5],\n                                      [6, 7, 8, 9, 10]],\n                                     [[1, 2, 3, 4, 5],\n                                      [6, 7, 8, 9, 10]]]))\n\narr1[0:1] = 0\nassert_equal(arr1[0:1], np.array([[[0, 0, 0, 0, 0],\n                                   [0, 0, 0, 0, 0]]]))\n\narr1[2:3] = 1\nassert_equal(arr1[2:3], np.array([[[1, 1, 1, 1, 1],\n                                   [1, 1, 1, 1, 1]]]))\n\narr1[::2] = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]\nassert_equal(arr1[::2], np.array([[[1, 2, 3, 4, 5],\n                                   [6, 7, 8, 9, 10]],\n                                  [[1, 2, 3, 4, 5],\n                                   [6, 7, 8, 9, 10]]]))\n\narr1[-2:3:1] = [[[1, 2, 3, 4, 5],\n                 [6, 7, 8, 9, 10]],\n                [[11, 12, 13, 14, 15],\n                 [16, 17, 18, 19, 20]]]\nassert_equal(arr1[-2:3:1], np.array([[[1, 2, 3, 4, 5],\n                                      [6, 7, 8, 9, 10]],\n                                     [[11, 12, 13, 14, 15],\n                                      [16, 17, 18, 19, 20]]]))\n\nprint(\"ALL TESTS PASSED\")";