-
Notifications
You must be signed in to change notification settings - Fork 0
/
worker_cpp.js
31 lines (26 loc) · 138 KB
/
worker_cpp.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
onmessage = function (e) {
let p = e.data;
submit_simulation([p.postcode, p.latitude, p.longitude, p.occupants, p['floor-area'], p.temperature, p['epc-space-heating'], p['tes-volume'], p['enable-optimisation']]);
}
function submit_simulation(inputs) {
// arguments: [postcode, latitude, longitude, occupants, floor_area, temperature, space_heating, tes_max, use_surface_optimisation]
console.log("simulation arguments: ", inputs);
// inputs = ["CV47AL", 52.3833, -1.5833, 2, 60, 20, 3000, 0.5, true];
try {
const t0 = performance.now();
Module.onRuntimeInitialized = () => {
let result = Module.ccall('run_simulation', // name of C function
'string', // return type
['string', 'number', 'number', 'number', 'number', 'number', 'number', 'number', 'bool'], // argument types
inputs); // arguments
const t1 = performance.now();
console.log(`Cpp-Sim-Runtime: ${t1 - t0} ms`);
postMessage(result);
};
}
catch (err) {
console.log("Cpp-Sim-Error:", err);
postMessage(undefined);
}
}
var Module = typeof Module !== "undefined" ? Module : {}; if (!Module.expectedDataFileDownloads) { Module.expectedDataFileDownloads = 0 } Module.expectedDataFileDownloads++; (function () { var loadPackage = function (metadata) { var PACKAGE_PATH = ""; if (typeof window === "object") { PACKAGE_PATH = window["encodeURIComponent"](window.location.pathname.toString().substring(0, window.location.pathname.toString().lastIndexOf("/")) + "/") } else if (typeof process === "undefined" && typeof location !== "undefined") { PACKAGE_PATH = encodeURIComponent(location.pathname.toString().substring(0, location.pathname.toString().lastIndexOf("/")) + "/") } var PACKAGE_NAME = "C:/dev/wasm_website/docs/cpp.data"; var REMOTE_PACKAGE_BASE = "cpp.data"; if (typeof Module["locateFilePackage"] === "function" && !Module["locateFile"]) { Module["locateFile"] = Module["locateFilePackage"]; err("warning: you defined Module.locateFilePackage, that has been renamed to Module.locateFile (using your locateFilePackage for now)") } var REMOTE_PACKAGE_NAME = Module["locateFile"] ? Module["locateFile"](REMOTE_PACKAGE_BASE, "") : REMOTE_PACKAGE_BASE; var REMOTE_PACKAGE_SIZE = metadata["remote_package_size"]; var PACKAGE_UUID = metadata["package_uuid"]; function fetchRemotePackage(packageName, packageSize, callback, errback) { if (typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string") { require("fs").readFile(packageName, function (err, contents) { if (err) { errback(err) } else { callback(contents.buffer) } }); return } var xhr = new XMLHttpRequest; xhr.open("GET", packageName, true); xhr.responseType = "arraybuffer"; xhr.onprogress = function (event) { var url = packageName; var size = packageSize; if (event.total) size = event.total; if (event.loaded) { if (!xhr.addedTotal) { xhr.addedTotal = true; if (!Module.dataFileDownloads) Module.dataFileDownloads = {}; Module.dataFileDownloads[url] = { loaded: event.loaded, total: size } } else { Module.dataFileDownloads[url].loaded = event.loaded } var total = 0; var loaded = 0; var num = 0; for (var download in Module.dataFileDownloads) { var data = Module.dataFileDownloads[download]; total += data.total; loaded += data.loaded; num++ } total = Math.ceil(total * Module.expectedDataFileDownloads / num); if (Module["setStatus"]) Module["setStatus"]("Downloading data... (" + loaded + "/" + total + ")") } else if (!Module.dataFileDownloads) { if (Module["setStatus"]) Module["setStatus"]("Downloading data...") } }; xhr.onerror = function (event) { throw new Error("NetworkError for: " + packageName) }; xhr.onload = function (event) { if (xhr.status == 200 || xhr.status == 304 || xhr.status == 206 || xhr.status == 0 && xhr.response) { var packageData = xhr.response; callback(packageData) } else { throw new Error(xhr.statusText + " : " + xhr.responseURL) } }; xhr.send(null) } function handleError(error) { console.error("package error:", error) } var fetchedCallback = null; var fetched = Module["getPreloadedPackage"] ? Module["getPreloadedPackage"](REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE) : null; if (!fetched) fetchRemotePackage(REMOTE_PACKAGE_NAME, REMOTE_PACKAGE_SIZE, function (data) { if (fetchedCallback) { fetchedCallback(data); fetchedCallback = null } else { fetched = data } }, handleError); function runWithFS() { function assert(check, msg) { if (!check) throw msg + (new Error).stack } Module["FS_createPath"]("/", "assets", true, true); Module["FS_createPath"]("/assets", "outside_temps", true, true); Module["FS_createPath"]("/assets", "solar_irradiances", true, true); function DataRequest(start, end, audio) { this.start = start; this.end = end; this.audio = audio } DataRequest.prototype = { requests: {}, open: function (mode, name) { this.name = name; this.requests[name] = this; Module["addRunDependency"]("fp " + this.name) }, send: function () { }, onload: function () { var byteArray = this.byteArray.subarray(this.start, this.end); this.finish(byteArray) }, finish: function (byteArray) { var that = this; Module["FS_createDataFile"](this.name, null, byteArray, true, true, true); Module["removeRunDependency"]("fp " + that.name); this.requests[this.name] = null } }; var files = metadata["files"]; for (var i = 0; i < files.length; ++i) { new DataRequest(files[i]["start"], files[i]["end"], files[i]["audio"] || 0).open("GET", files[i]["filename"]) } function processPackageData(arrayBuffer) { assert(arrayBuffer, "Loading data file failed."); assert(arrayBuffer instanceof ArrayBuffer, "bad input to processPackageData"); var byteArray = new Uint8Array(arrayBuffer); DataRequest.prototype.byteArray = byteArray; var files = metadata["files"]; for (var i = 0; i < files.length; ++i) { DataRequest.prototype.requests[files[i].filename].onload() } Module["removeRunDependency"]("datafile_C:/dev/wasm_website/docs/cpp.data") } Module["addRunDependency"]("datafile_C:/dev/wasm_website/docs/cpp.data"); if (!Module.preloadResults) Module.preloadResults = {}; Module.preloadResults[PACKAGE_NAME] = { fromCache: false }; if (fetched) { processPackageData(fetched); fetched = null } else { fetchedCallback = processPackageData } } if (Module["calledRun"]) { runWithFS() } else { if (!Module["preRun"]) Module["preRun"] = []; Module["preRun"].push(runWithFS) } }; loadPackage({ "files": [{ "filename": "/assets/agile_tariff.csv", "start": 0, "end": 58499 }, { "filename": "/assets/array_data.csv", "start": 58499, "end": 125607 }, { "filename": "/assets/input.txt", "start": 125607, "end": 125659 }, { "filename": "/assets/outside_temps/lat_50.0_lon_-3.5.csv", "start": 125659, "end": 192767 }, { "filename": "/assets/outside_temps/lat_50.0_lon_-4.0.csv", "start": 192767, "end": 259751 }, { "filename": "/assets/outside_temps/lat_50.0_lon_-4.5.csv", "start": 259751, "end": 326693 }, { "filename": "/assets/outside_temps/lat_50.0_lon_-5.0.csv", "start": 326693, "end": 393314 }, { "filename": "/assets/outside_temps/lat_50.0_lon_-5.5.csv", "start": 393314, "end": 460568 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-0.5.csv", "start": 460568, "end": 526536 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-1.0.csv", "start": 526536, "end": 592475 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-1.5.csv", "start": 592475, "end": 658431 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-2.0.csv", "start": 658431, "end": 724418 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-2.5.csv", "start": 724418, "end": 790336 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-3.0.csv", "start": 790336, "end": 856138 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-3.5.csv", "start": 856138, "end": 921540 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-4.0.csv", "start": 921540, "end": 986745 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-4.5.csv", "start": 986745, "end": 1052037 }, { "filename": "/assets/outside_temps/lat_50.5_lon_-5.0.csv", "start": 1052037, "end": 1118062 }, { "filename": "/assets/outside_temps/lat_50.5_lon_0.0.csv", "start": 1118062, "end": 1184057 }, { "filename": "/assets/outside_temps/lat_50.5_lon_0.5.csv", "start": 1184057, "end": 1250021 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-0.5.csv", "start": 1250021, "end": 1315095 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-1.0.csv", "start": 1315095, "end": 1380178 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-1.5.csv", "start": 1380178, "end": 1445138 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-2.0.csv", "start": 1445138, "end": 1509987 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-2.5.csv", "start": 1509987, "end": 1574791 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-3.0.csv", "start": 1574791, "end": 1639575 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-3.5.csv", "start": 1639575, "end": 1704417 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-4.0.csv", "start": 1704417, "end": 1769387 }, { "filename": "/assets/outside_temps/lat_51.0_lon_-4.5.csv", "start": 1769387, "end": 1834779 }, { "filename": "/assets/outside_temps/lat_51.0_lon_0.0.csv", "start": 1834779, "end": 1899918 }, { "filename": "/assets/outside_temps/lat_51.0_lon_0.5.csv", "start": 1899918, "end": 1965077 }, { "filename": "/assets/outside_temps/lat_51.0_lon_1.0.csv", "start": 1965077, "end": 2030381 }, { "filename": "/assets/outside_temps/lat_51.0_lon_1.5.csv", "start": 2030381, "end": 2095790 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-0.5.csv", "start": 2095790, "end": 2160705 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-1.0.csv", "start": 2160705, "end": 2225486 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-1.5.csv", "start": 2225486, "end": 2290209 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-2.0.csv", "start": 2290209, "end": 2354846 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-2.5.csv", "start": 2354846, "end": 2419566 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-3.0.csv", "start": 2419566, "end": 2484346 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-3.5.csv", "start": 2484346, "end": 2549233 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-4.0.csv", "start": 2549233, "end": 2614330 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-4.5.csv", "start": 2614330, "end": 2679731 }, { "filename": "/assets/outside_temps/lat_51.5_lon_-5.0.csv", "start": 2679731, "end": 2745531 }, { "filename": "/assets/outside_temps/lat_51.5_lon_0.0.csv", "start": 2745531, "end": 2810505 }, { "filename": "/assets/outside_temps/lat_51.5_lon_0.5.csv", "start": 2810505, "end": 2875580 }, { "filename": "/assets/outside_temps/lat_51.5_lon_1.0.csv", "start": 2875580, "end": 2940737 }, { "filename": "/assets/outside_temps/lat_51.5_lon_1.5.csv", "start": 2940737, "end": 3006100 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-0.5.csv", "start": 3006100, "end": 3070865 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-1.0.csv", "start": 3070865, "end": 3135630 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-1.5.csv", "start": 3135630, "end": 3200300 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-2.0.csv", "start": 3200300, "end": 3264902 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-2.5.csv", "start": 3264902, "end": 3329563 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-3.0.csv", "start": 3329563, "end": 3393753 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-3.5.csv", "start": 3393753, "end": 3457856 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-4.0.csv", "start": 3457856, "end": 3521982 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-4.5.csv", "start": 3521982, "end": 3586474 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-5.0.csv", "start": 3586474, "end": 3651595 }, { "filename": "/assets/outside_temps/lat_52.0_lon_-5.5.csv", "start": 3651595, "end": 3717384 }, { "filename": "/assets/outside_temps/lat_52.0_lon_0.0.csv", "start": 3717384, "end": 3782199 }, { "filename": "/assets/outside_temps/lat_52.0_lon_0.5.csv", "start": 3782199, "end": 3847096 }, { "filename": "/assets/outside_temps/lat_52.0_lon_1.0.csv", "start": 3847096, "end": 3912101 }, { "filename": "/assets/outside_temps/lat_52.0_lon_1.5.csv", "start": 3912101, "end": 3977167 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-0.5.csv", "start": 3977167, "end": 4041940 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-1.0.csv", "start": 4041940, "end": 4106554 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-1.5.csv", "start": 4106554, "end": 4171132 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-2.0.csv", "start": 4171132, "end": 4235691 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-2.5.csv", "start": 4235691, "end": 4300099 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-3.0.csv", "start": 4300099, "end": 4364207 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-3.5.csv", "start": 4364207, "end": 4428321 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-4.0.csv", "start": 4428321, "end": 4492558 }, { "filename": "/assets/outside_temps/lat_52.5_lon_-4.5.csv", "start": 4492558, "end": 4557481 }, { "filename": "/assets/outside_temps/lat_52.5_lon_0.0.csv", "start": 4557481, "end": 4622314 }, { "filename": "/assets/outside_temps/lat_52.5_lon_0.5.csv", "start": 4622314, "end": 4687082 }, { "filename": "/assets/outside_temps/lat_52.5_lon_1.0.csv", "start": 4687082, "end": 4751824 }, { "filename": "/assets/outside_temps/lat_52.5_lon_1.5.csv", "start": 4751824, "end": 4816704 }, { "filename": "/assets/outside_temps/lat_52.5_lon_2.0.csv", "start": 4816704, "end": 4881742 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-0.5.csv", "start": 4881742, "end": 4946340 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-1.0.csv", "start": 4946340, "end": 5010800 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-1.5.csv", "start": 5010800, "end": 5075255 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-2.0.csv", "start": 5075255, "end": 5139655 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-2.5.csv", "start": 5139655, "end": 5203984 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-3.0.csv", "start": 5203984, "end": 5268303 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-3.5.csv", "start": 5268303, "end": 5332381 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-4.0.csv", "start": 5332381, "end": 5396603 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-4.5.csv", "start": 5396603, "end": 5461425 }, { "filename": "/assets/outside_temps/lat_53.0_lon_-5.0.csv", "start": 5461425, "end": 5526779 }, { "filename": "/assets/outside_temps/lat_53.0_lon_0.0.csv", "start": 5526779, "end": 5591445 }, { "filename": "/assets/outside_temps/lat_53.0_lon_0.5.csv", "start": 5591445, "end": 5656077 }, { "filename": "/assets/outside_temps/lat_53.0_lon_1.0.csv", "start": 5656077, "end": 5720779 }, { "filename": "/assets/outside_temps/lat_53.0_lon_1.5.csv", "start": 5720779, "end": 5785558 }, { "filename": "/assets/outside_temps/lat_53.0_lon_2.0.csv", "start": 5785558, "end": 5850411 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-0.5.csv", "start": 5850411, "end": 5914925 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-1.0.csv", "start": 5914925, "end": 5979395 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-1.5.csv", "start": 5979395, "end": 6043742 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-2.0.csv", "start": 6043742, "end": 6107911 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-2.5.csv", "start": 6107911, "end": 6172212 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-3.0.csv", "start": 6172212, "end": 6236650 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-3.5.csv", "start": 6236650, "end": 6301256 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-4.0.csv", "start": 6301256, "end": 6366116 }, { "filename": "/assets/outside_temps/lat_53.5_lon_-4.5.csv", "start": 6366116, "end": 6431158 }, { "filename": "/assets/outside_temps/lat_53.5_lon_0.0.csv", "start": 6431158, "end": 6495683 }, { "filename": "/assets/outside_temps/lat_53.5_lon_0.5.csv", "start": 6495683, "end": 6560168 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-0.5.csv", "start": 6560168, "end": 6624452 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-1.0.csv", "start": 6624452, "end": 6688843 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-1.5.csv", "start": 6688843, "end": 6753040 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-2.0.csv", "start": 6753040, "end": 6817005 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-2.5.csv", "start": 6817005, "end": 6881057 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-3.0.csv", "start": 6881057, "end": 6945342 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-3.5.csv", "start": 6945342, "end": 7009962 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-5.5.csv", "start": 7009962, "end": 7074955 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-6.0.csv", "start": 7074955, "end": 7139464 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-6.5.csv", "start": 7139464, "end": 7203611 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-7.0.csv", "start": 7203611, "end": 7267756 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-7.5.csv", "start": 7267756, "end": 7331864 }, { "filename": "/assets/outside_temps/lat_54.0_lon_-8.0.csv", "start": 7331864, "end": 7395997 }, { "filename": "/assets/outside_temps/lat_54.0_lon_0.0.csv", "start": 7395997, "end": 7460354 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-0.5.csv", "start": 7460354, "end": 7524622 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-1.0.csv", "start": 7524622, "end": 7588702 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-1.5.csv", "start": 7588702, "end": 7652607 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-2.0.csv", "start": 7652607, "end": 7716512 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-2.5.csv", "start": 7716512, "end": 7780322 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-3.0.csv", "start": 7780322, "end": 7844323 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-3.5.csv", "start": 7844323, "end": 7908591 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-4.0.csv", "start": 7908591, "end": 7973137 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-4.5.csv", "start": 7973137, "end": 8037841 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-5.0.csv", "start": 8037841, "end": 8102606 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-5.5.csv", "start": 8102606, "end": 8167048 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-6.0.csv", "start": 8167048, "end": 8231126 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-6.5.csv", "start": 8231126, "end": 8295162 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-7.0.csv", "start": 8295162, "end": 8359137 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-7.5.csv", "start": 8359137, "end": 8423123 }, { "filename": "/assets/outside_temps/lat_54.5_lon_-8.0.csv", "start": 8423123, "end": 8487034 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-1.5.csv", "start": 8487034, "end": 8551101 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-2.0.csv", "start": 8551101, "end": 8615021 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-2.5.csv", "start": 8615021, "end": 8678872 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-3.0.csv", "start": 8678872, "end": 8742797 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-3.5.csv", "start": 8742797, "end": 8806733 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-4.0.csv", "start": 8806733, "end": 8870689 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-4.5.csv", "start": 8870689, "end": 8934780 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-5.0.csv", "start": 8934780, "end": 8999116 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-5.5.csv", "start": 8999116, "end": 9063638 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-6.0.csv", "start": 9063638, "end": 9127923 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-6.5.csv", "start": 9127923, "end": 9191970 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-7.0.csv", "start": 9191970, "end": 9255986 }, { "filename": "/assets/outside_temps/lat_55.0_lon_-7.5.csv", "start": 9255986, "end": 9319985 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-1.5.csv", "start": 9319985, "end": 9384088 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-2.0.csv", "start": 9384088, "end": 9447816 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-2.5.csv", "start": 9447816, "end": 9511658 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-3.0.csv", "start": 9511658, "end": 9575418 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-3.5.csv", "start": 9575418, "end": 9639170 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-4.0.csv", "start": 9639170, "end": 9702979 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-4.5.csv", "start": 9702979, "end": 9766774 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-5.0.csv", "start": 9766774, "end": 9830841 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-5.5.csv", "start": 9830841, "end": 9895187 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-6.0.csv", "start": 9895187, "end": 9959662 }, { "filename": "/assets/outside_temps/lat_55.5_lon_-6.5.csv", "start": 9959662, "end": 10024293 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-2.0.csv", "start": 10024293, "end": 10088533 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-2.5.csv", "start": 10088533, "end": 10152534 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-3.0.csv", "start": 10152534, "end": 10216449 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-3.5.csv", "start": 10216449, "end": 10280404 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-4.0.csv", "start": 10280404, "end": 10344242 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-4.5.csv", "start": 10344242, "end": 10407918 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-5.0.csv", "start": 10407918, "end": 10471656 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-5.5.csv", "start": 10471656, "end": 10535627 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-6.0.csv", "start": 10535627, "end": 10599904 }, { "filename": "/assets/outside_temps/lat_56.0_lon_-6.5.csv", "start": 10599904, "end": 10664445 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-2.5.csv", "start": 10664445, "end": 10728447 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-3.0.csv", "start": 10728447, "end": 10792244 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-3.5.csv", "start": 10792244, "end": 10855936 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-4.0.csv", "start": 10855936, "end": 10919572 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-4.5.csv", "start": 10919572, "end": 10983108 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-5.0.csv", "start": 10983108, "end": 11046516 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-5.5.csv", "start": 11046516, "end": 11110065 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-6.0.csv", "start": 11110065, "end": 11174053 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-6.5.csv", "start": 11174053, "end": 11238454 }, { "filename": "/assets/outside_temps/lat_56.5_lon_-7.0.csv", "start": 11238454, "end": 11303087 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-2.0.csv", "start": 11303087, "end": 11366967 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-2.5.csv", "start": 11366967, "end": 11430517 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-3.0.csv", "start": 11430517, "end": 11494039 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-3.5.csv", "start": 11494039, "end": 11557525 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-4.0.csv", "start": 11557525, "end": 11620992 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-4.5.csv", "start": 11620992, "end": 11684385 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-5.0.csv", "start": 11684385, "end": 11747784 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-5.5.csv", "start": 11747784, "end": 11811082 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-6.0.csv", "start": 11811082, "end": 11874908 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-6.5.csv", "start": 11874908, "end": 11939162 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-7.0.csv", "start": 11939162, "end": 12003576 }, { "filename": "/assets/outside_temps/lat_57.0_lon_-7.5.csv", "start": 12003576, "end": 12068296 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-2.0.csv", "start": 12068296, "end": 12132035 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-2.5.csv", "start": 12132035, "end": 12195590 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-3.0.csv", "start": 12195590, "end": 12259326 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-3.5.csv", "start": 12259326, "end": 12322934 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-4.0.csv", "start": 12322934, "end": 12386583 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-4.5.csv", "start": 12386583, "end": 12450188 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-5.0.csv", "start": 12450188, "end": 12513620 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-5.5.csv", "start": 12513620, "end": 12576791 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-6.0.csv", "start": 12576791, "end": 12640458 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-6.5.csv", "start": 12640458, "end": 12704572 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-7.0.csv", "start": 12704572, "end": 12768872 }, { "filename": "/assets/outside_temps/lat_57.5_lon_-7.5.csv", "start": 12768872, "end": 12833297 }, { "filename": "/assets/outside_temps/lat_58.0_lon_-3.5.csv", "start": 12833297, "end": 12897117 }, { "filename": "/assets/outside_temps/lat_58.0_lon_-4.0.csv", "start": 12897117, "end": 12960469 }, { "filename": "/assets/outside_temps/lat_58.0_lon_-4.5.csv", "start": 12960469, "end": 13023695 }, { "filename": "/assets/outside_temps/lat_58.0_lon_-5.0.csv", "start": 13023695, "end": 13086836 }, { "filename": "/assets/outside_temps/lat_58.0_lon_-5.5.csv", "start": 13086836, "end": 13150359 }, { "filename": "/assets/outside_temps/lat_58.0_lon_-6.0.csv", "start": 13150359, "end": 13214274 }, { "filename": "/assets/outside_temps/lat_58.0_lon_-6.5.csv", "start": 13214274, "end": 13278329 }, { "filename": "/assets/outside_temps/lat_58.0_lon_-7.0.csv", "start": 13278329, "end": 13342316 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-3.0.csv", "start": 13342316, "end": 13406111 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-3.5.csv", "start": 13406111, "end": 13469734 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-4.0.csv", "start": 13469734, "end": 13533239 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-4.5.csv", "start": 13533239, "end": 13596784 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-5.0.csv", "start": 13596784, "end": 13660457 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-5.5.csv", "start": 13660457, "end": 13724471 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-6.0.csv", "start": 13724471, "end": 13788640 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-6.5.csv", "start": 13788640, "end": 13852867 }, { "filename": "/assets/outside_temps/lat_58.5_lon_-7.0.csv", "start": 13852867, "end": 13917111 }, { "filename": "/assets/outside_temps/lat_59.0_lon_-2.5.csv", "start": 13917111, "end": 13980931 }, { "filename": "/assets/outside_temps/lat_59.0_lon_-3.0.csv", "start": 13980931, "end": 14044808 }, { "filename": "/assets/outside_temps/lat_59.0_lon_-3.5.csv", "start": 14044808, "end": 14108757 }, { "filename": "/assets/outside_temps/lat_59.5_lon_-1.5.csv", "start": 14108757, "end": 14172382 }, { "filename": "/assets/outside_temps/lat_59.5_lon_-2.5.csv", "start": 14172382, "end": 14236065 }, { "filename": "/assets/outside_temps/lat_59.5_lon_-3.0.csv", "start": 14236065, "end": 14299828 }, { "filename": "/assets/outside_temps/lat_60.0_lon_-1.0.csv", "start": 14299828, "end": 14363407 }, { "filename": "/assets/outside_temps/lat_60.0_lon_-1.5.csv", "start": 14363407, "end": 14426956 }, { "filename": "/assets/outside_temps/lat_60.5_lon_-1.0.csv", "start": 14426956, "end": 14490422 }, { "filename": "/assets/outside_temps/lat_60.5_lon_-1.5.csv", "start": 14490422, "end": 14553915 }, { "filename": "/assets/outside_temps/lat_61.0_lon_-1.0.csv", "start": 14553915, "end": 14617318 }, { "filename": "/assets/solar_irradiances/lat_50.0_lon_-3.5.csv", "start": 14617318, "end": 14675369 }, { "filename": "/assets/solar_irradiances/lat_50.0_lon_-4.0.csv", "start": 14675369, "end": 14733387 }, { "filename": "/assets/solar_irradiances/lat_50.0_lon_-4.5.csv", "start": 14733387, "end": 14791329 }, { "filename": "/assets/solar_irradiances/lat_50.0_lon_-5.0.csv", "start": 14791329, "end": 14849241 }, { "filename": "/assets/solar_irradiances/lat_50.0_lon_-5.5.csv", "start": 14849241, "end": 14907181 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-0.5.csv", "start": 14907181, "end": 14965082 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-1.0.csv", "start": 14965082, "end": 15023155 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-1.5.csv", "start": 15023155, "end": 15081294 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-2.0.csv", "start": 15081294, "end": 15139378 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-2.5.csv", "start": 15139378, "end": 15197383 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-3.0.csv", "start": 15197383, "end": 15255433 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-3.5.csv", "start": 15255433, "end": 15313463 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-4.0.csv", "start": 15313463, "end": 15371436 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-4.5.csv", "start": 15371436, "end": 15429377 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_-5.0.csv", "start": 15429377, "end": 15487340 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_0.0.csv", "start": 15487340, "end": 15547429 }, { "filename": "/assets/solar_irradiances/lat_50.5_lon_0.5.csv", "start": 15547429, "end": 15605389 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-0.5.csv", "start": 15605389, "end": 15663319 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-1.0.csv", "start": 15663319, "end": 15721351 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-1.5.csv", "start": 15721351, "end": 15779412 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-2.0.csv", "start": 15779412, "end": 15837419 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-2.5.csv", "start": 15837419, "end": 15895364 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-3.0.csv", "start": 15895364, "end": 15953342 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-3.5.csv", "start": 15953342, "end": 16011308 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-4.0.csv", "start": 16011308, "end": 16069196 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_-4.5.csv", "start": 16069196, "end": 16127067 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_0.0.csv", "start": 16127067, "end": 16184998 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_0.5.csv", "start": 16184998, "end": 16242994 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_1.0.csv", "start": 16242994, "end": 16300946 }, { "filename": "/assets/solar_irradiances/lat_51.0_lon_1.5.csv", "start": 16300946, "end": 16358908 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-0.5.csv", "start": 16358908, "end": 16416901 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-1.0.csv", "start": 16416901, "end": 16474954 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-1.5.csv", "start": 16474954, "end": 16533037 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-2.0.csv", "start": 16533037, "end": 16591022 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-2.5.csv", "start": 16591022, "end": 16649041 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-3.0.csv", "start": 16649041, "end": 16707071 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-3.5.csv", "start": 16707071, "end": 16765098 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-4.0.csv", "start": 16765098, "end": 16823082 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-4.5.csv", "start": 16823082, "end": 16880996 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_-5.0.csv", "start": 16880996, "end": 16938939 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_0.0.csv", "start": 16938939, "end": 16996923 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_0.5.csv", "start": 16996923, "end": 17054987 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_1.0.csv", "start": 17054987, "end": 17113039 }, { "filename": "/assets/solar_irradiances/lat_51.5_lon_1.5.csv", "start": 17113039, "end": 17171064 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-0.5.csv", "start": 17171064, "end": 17228994 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-1.0.csv", "start": 17228994, "end": 17287042 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-1.5.csv", "start": 17287042, "end": 17345103 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-2.0.csv", "start": 17345103, "end": 17403072 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-2.5.csv", "start": 17403072, "end": 17461087 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-3.0.csv", "start": 17461087, "end": 17518908 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-3.5.csv", "start": 17518908, "end": 17576833 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-4.0.csv", "start": 17576833, "end": 17634846 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-4.5.csv", "start": 17634846, "end": 17692761 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-5.0.csv", "start": 17692761, "end": 17750687 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_-5.5.csv", "start": 17750687, "end": 17808687 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_0.0.csv", "start": 17808687, "end": 17866609 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_0.5.csv", "start": 17866609, "end": 17924603 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_1.0.csv", "start": 17924603, "end": 17982691 }, { "filename": "/assets/solar_irradiances/lat_52.0_lon_1.5.csv", "start": 17982691, "end": 18040778 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-0.5.csv", "start": 18040778, "end": 18098741 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-1.0.csv", "start": 18098741, "end": 18156768 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-1.5.csv", "start": 18156768, "end": 18214801 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-2.0.csv", "start": 18214801, "end": 18272814 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-2.5.csv", "start": 18272814, "end": 18330853 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-3.0.csv", "start": 18330853, "end": 18388808 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-3.5.csv", "start": 18388808, "end": 18446811 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-4.0.csv", "start": 18446811, "end": 18504842 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_-4.5.csv", "start": 18504842, "end": 18562841 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_0.0.csv", "start": 18562841, "end": 18621572 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_0.5.csv", "start": 18621572, "end": 18679539 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_1.0.csv", "start": 18679539, "end": 18737541 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_1.5.csv", "start": 18737541, "end": 18795620 }, { "filename": "/assets/solar_irradiances/lat_52.5_lon_2.0.csv", "start": 18795620, "end": 18853644 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-0.5.csv", "start": 18853644, "end": 18911647 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-1.0.csv", "start": 18911647, "end": 18969660 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-1.5.csv", "start": 18969660, "end": 19027620 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-2.0.csv", "start": 19027620, "end": 19085599 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-2.5.csv", "start": 19085599, "end": 19143566 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-3.0.csv", "start": 19143566, "end": 19201630 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-3.5.csv", "start": 19201630, "end": 19259630 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-4.0.csv", "start": 19259630, "end": 19317638 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-4.5.csv", "start": 19317638, "end": 19375638 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_-5.0.csv", "start": 19375638, "end": 19433640 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_0.0.csv", "start": 19433640, "end": 19491600 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_0.5.csv", "start": 19491600, "end": 19549625 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_1.0.csv", "start": 19549625, "end": 19607728 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_1.5.csv", "start": 19607728, "end": 19665833 }, { "filename": "/assets/solar_irradiances/lat_53.0_lon_2.0.csv", "start": 19665833, "end": 19723808 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-0.5.csv", "start": 19723808, "end": 19781811 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-1.0.csv", "start": 19781811, "end": 19839735 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-1.5.csv", "start": 19839735, "end": 19897645 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-2.0.csv", "start": 19897645, "end": 19955582 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-2.5.csv", "start": 19955582, "end": 20013542 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-3.0.csv", "start": 20013542, "end": 20071607 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-3.5.csv", "start": 20071607, "end": 20129754 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-4.0.csv", "start": 20129754, "end": 20187841 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_-4.5.csv", "start": 20187841, "end": 20245818 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_0.0.csv", "start": 20245818, "end": 20303852 }, { "filename": "/assets/solar_irradiances/lat_53.5_lon_0.5.csv", "start": 20303852, "end": 20361904 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-0.5.csv", "start": 20361904, "end": 20419909 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-1.0.csv", "start": 20419909, "end": 20477857 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-1.5.csv", "start": 20477857, "end": 20535756 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-2.0.csv", "start": 20535756, "end": 20593634 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-2.5.csv", "start": 20593634, "end": 20651555 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-3.0.csv", "start": 20651555, "end": 20709558 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-3.5.csv", "start": 20709558, "end": 20767604 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-5.5.csv", "start": 20767604, "end": 20825687 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-6.0.csv", "start": 20825687, "end": 20883824 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-6.5.csv", "start": 20883824, "end": 20941948 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-7.0.csv", "start": 20941948, "end": 21000111 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-7.5.csv", "start": 21000111, "end": 21058164 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_-8.0.csv", "start": 21058164, "end": 21116220 }, { "filename": "/assets/solar_irradiances/lat_54.0_lon_0.0.csv", "start": 21116220, "end": 21176153 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-0.5.csv", "start": 21176153, "end": 21234144 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-1.0.csv", "start": 21234144, "end": 21292287 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-1.5.csv", "start": 21292287, "end": 21350384 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-2.0.csv", "start": 21350384, "end": 21408390 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-2.5.csv", "start": 21408390, "end": 21466317 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-3.0.csv", "start": 21466317, "end": 21524365 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-3.5.csv", "start": 21524365, "end": 21582447 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-4.0.csv", "start": 21582447, "end": 21640552 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-4.5.csv", "start": 21640552, "end": 21698574 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-5.0.csv", "start": 21698574, "end": 21756638 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-5.5.csv", "start": 21756638, "end": 21814693 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-6.0.csv", "start": 21814693, "end": 21872866 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-6.5.csv", "start": 21872866, "end": 21931064 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-7.0.csv", "start": 21931064, "end": 21989237 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-7.5.csv", "start": 21989237, "end": 22047374 }, { "filename": "/assets/solar_irradiances/lat_54.5_lon_-8.0.csv", "start": 22047374, "end": 22105404 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-1.5.csv", "start": 22105404, "end": 22163480 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-2.0.csv", "start": 22163480, "end": 22221580 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-2.5.csv", "start": 22221580, "end": 22279519 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-3.0.csv", "start": 22279519, "end": 22337533 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-3.5.csv", "start": 22337533, "end": 22395628 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-4.0.csv", "start": 22395628, "end": 22453721 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-4.5.csv", "start": 22453721, "end": 22511750 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-5.0.csv", "start": 22511750, "end": 22569849 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-5.5.csv", "start": 22569849, "end": 22627924 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-6.0.csv", "start": 22627924, "end": 22686077 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-6.5.csv", "start": 22686077, "end": 22744247 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-7.0.csv", "start": 22744247, "end": 22802475 }, { "filename": "/assets/solar_irradiances/lat_55.0_lon_-7.5.csv", "start": 22802475, "end": 22860658 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-1.5.csv", "start": 22860658, "end": 22918812 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-2.0.csv", "start": 22918812, "end": 22976894 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-2.5.csv", "start": 22976894, "end": 23034856 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-3.0.csv", "start": 23034856, "end": 23092751 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-3.5.csv", "start": 23092751, "end": 23150787 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-4.0.csv", "start": 23150787, "end": 23208836 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-4.5.csv", "start": 23208836, "end": 23266936 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-5.0.csv", "start": 23266936, "end": 23325068 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-5.5.csv", "start": 23325068, "end": 23383222 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-6.0.csv", "start": 23383222, "end": 23441309 }, { "filename": "/assets/solar_irradiances/lat_55.5_lon_-6.5.csv", "start": 23441309, "end": 23499455 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-2.0.csv", "start": 23499455, "end": 23557524 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-2.5.csv", "start": 23557524, "end": 23615586 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-3.0.csv", "start": 23615586, "end": 23673632 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-3.5.csv", "start": 23673632, "end": 23731773 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-4.0.csv", "start": 23731773, "end": 23789799 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-4.5.csv", "start": 23789799, "end": 23847920 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-5.0.csv", "start": 23847920, "end": 23905983 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-5.5.csv", "start": 23905983, "end": 23964125 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-6.0.csv", "start": 23964125, "end": 24022188 }, { "filename": "/assets/solar_irradiances/lat_56.0_lon_-6.5.csv", "start": 24022188, "end": 24080211 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-2.5.csv", "start": 24080211, "end": 24138340 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-3.0.csv", "start": 24138340, "end": 24196481 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-3.5.csv", "start": 24196481, "end": 24254616 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-4.0.csv", "start": 24254616, "end": 24312577 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-4.5.csv", "start": 24312577, "end": 24370570 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-5.0.csv", "start": 24370570, "end": 24428532 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-5.5.csv", "start": 24428532, "end": 24486598 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-6.0.csv", "start": 24486598, "end": 24544671 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-6.5.csv", "start": 24544671, "end": 24602769 }, { "filename": "/assets/solar_irradiances/lat_56.5_lon_-7.0.csv", "start": 24602769, "end": 24660851 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-2.0.csv", "start": 24660851, "end": 24719022 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-2.5.csv", "start": 24719022, "end": 24777149 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-3.0.csv", "start": 24777149, "end": 24835094 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-3.5.csv", "start": 24835094, "end": 24893233 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-4.0.csv", "start": 24893233, "end": 24951208 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-4.5.csv", "start": 24951208, "end": 25009239 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-5.0.csv", "start": 25009239, "end": 25067229 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-5.5.csv", "start": 25067229, "end": 25125339 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-6.0.csv", "start": 25125339, "end": 25183422 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-6.5.csv", "start": 25183422, "end": 25241426 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-7.0.csv", "start": 25241426, "end": 25299467 }, { "filename": "/assets/solar_irradiances/lat_57.0_lon_-7.5.csv", "start": 25299467, "end": 25357500 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-2.0.csv", "start": 25357500, "end": 25415685 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-2.5.csv", "start": 25415685, "end": 25473815 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-3.0.csv", "start": 25473815, "end": 25531943 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-3.5.csv", "start": 25531943, "end": 25590170 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-4.0.csv", "start": 25590170, "end": 25648346 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-4.5.csv", "start": 25648346, "end": 25706658 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-5.0.csv", "start": 25706658, "end": 25764664 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-5.5.csv", "start": 25764664, "end": 25822753 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-6.0.csv", "start": 25822753, "end": 25880808 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-6.5.csv", "start": 25880808, "end": 25938906 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-7.0.csv", "start": 25938906, "end": 25997028 }, { "filename": "/assets/solar_irradiances/lat_57.5_lon_-7.5.csv", "start": 25997028, "end": 26055074 }, { "filename": "/assets/solar_irradiances/lat_58.0_lon_-3.5.csv", "start": 26055074, "end": 26113229 }, { "filename": "/assets/solar_irradiances/lat_58.0_lon_-4.0.csv", "start": 26113229, "end": 26171348 }, { "filename": "/assets/solar_irradiances/lat_58.0_lon_-4.5.csv", "start": 26171348, "end": 26229471 }, { "filename": "/assets/solar_irradiances/lat_58.0_lon_-5.0.csv", "start": 26229471, "end": 26287534 }, { "filename": "/assets/solar_irradiances/lat_58.0_lon_-5.5.csv", "start": 26287534, "end": 26345654 }, { "filename": "/assets/solar_irradiances/lat_58.0_lon_-6.0.csv", "start": 26345654, "end": 26403780 }, { "filename": "/assets/solar_irradiances/lat_58.0_lon_-6.5.csv", "start": 26403780, "end": 26461802 }, { "filename": "/assets/solar_irradiances/lat_58.0_lon_-7.0.csv", "start": 26461802, "end": 26519852 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-3.0.csv", "start": 26519852, "end": 26577921 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-3.5.csv", "start": 26577921, "end": 26636045 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-4.0.csv", "start": 26636045, "end": 26694111 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-4.5.csv", "start": 26694111, "end": 26752183 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-5.0.csv", "start": 26752183, "end": 26810157 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-5.5.csv", "start": 26810157, "end": 26868220 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-6.0.csv", "start": 26868220, "end": 26926351 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-6.5.csv", "start": 26926351, "end": 26984429 }, { "filename": "/assets/solar_irradiances/lat_58.5_lon_-7.0.csv", "start": 26984429, "end": 27042442 }, { "filename": "/assets/solar_irradiances/lat_59.0_lon_-2.5.csv", "start": 27042442, "end": 27100399 }, { "filename": "/assets/solar_irradiances/lat_59.0_lon_-3.0.csv", "start": 27100399, "end": 27158400 }, { "filename": "/assets/solar_irradiances/lat_59.0_lon_-3.5.csv", "start": 27158400, "end": 27216441 }, { "filename": "/assets/solar_irradiances/lat_59.5_lon_-1.5.csv", "start": 27216441, "end": 27274449 }, { "filename": "/assets/solar_irradiances/lat_59.5_lon_-2.5.csv", "start": 27274449, "end": 27332485 }, { "filename": "/assets/solar_irradiances/lat_59.5_lon_-3.0.csv", "start": 27332485, "end": 27390520 }, { "filename": "/assets/solar_irradiances/lat_60.0_lon_-1.0.csv", "start": 27390520, "end": 27448566 }, { "filename": "/assets/solar_irradiances/lat_60.0_lon_-1.5.csv", "start": 27448566, "end": 27506533 }, { "filename": "/assets/solar_irradiances/lat_60.5_lon_-1.0.csv", "start": 27506533, "end": 27564681 }, { "filename": "/assets/solar_irradiances/lat_60.5_lon_-1.5.csv", "start": 27564681, "end": 27622869 }, { "filename": "/assets/solar_irradiances/lat_61.0_lon_-1.0.csv", "start": 27622869, "end": 27680942 }], "remote_package_size": 27680942, "package_uuid": "6d71af41-b2a0-4435-8b4c-973fdc38c69b" }) })(); var moduleOverrides = {}; var key; for (key in Module) { if (Module.hasOwnProperty(key)) { moduleOverrides[key] = Module[key] } } var arguments_ = []; var thisProgram = "./this.program"; var quit_ = function (status, toThrow) { throw toThrow }; var ENVIRONMENT_IS_WEB = typeof window === "object"; var ENVIRONMENT_IS_WORKER = typeof importScripts === "function"; var ENVIRONMENT_IS_NODE = typeof process === "object" && typeof process.versions === "object" && typeof process.versions.node === "string"; var scriptDirectory = ""; function locateFile(path) { if (Module["locateFile"]) { return Module["locateFile"](path, scriptDirectory) } return scriptDirectory + path } var read_, readAsync, readBinary, setWindowTitle; function logExceptionOnExit(e) { if (e instanceof ExitStatus) return; var toLog = e; err("exiting due to exception: " + toLog) } var nodeFS; var nodePath; if (ENVIRONMENT_IS_NODE) { if (ENVIRONMENT_IS_WORKER) { scriptDirectory = require("path").dirname(scriptDirectory) + "/" } else { scriptDirectory = __dirname + "/" } read_ = function shell_read(filename, binary) { if (!nodeFS) nodeFS = require("fs"); if (!nodePath) nodePath = require("path"); filename = nodePath["normalize"](filename); return nodeFS["readFileSync"](filename, binary ? null : "utf8") }; readBinary = function readBinary(filename) { var ret = read_(filename, true); if (!ret.buffer) { ret = new Uint8Array(ret) } assert(ret.buffer); return ret }; readAsync = function readAsync(filename, onload, onerror) { if (!nodeFS) nodeFS = require("fs"); if (!nodePath) nodePath = require("path"); filename = nodePath["normalize"](filename); nodeFS["readFile"](filename, function (err, data) { if (err) onerror(err); else onload(data.buffer) }) }; if (process["argv"].length > 1) { thisProgram = process["argv"][1].replace(/\\/g, "/") } arguments_ = process["argv"].slice(2); if (typeof module !== "undefined") { module["exports"] = Module } process["on"]("uncaughtException", function (ex) { if (!(ex instanceof ExitStatus)) { throw ex } }); process["on"]("unhandledRejection", function (reason) { throw reason }); quit_ = function (status, toThrow) { if (keepRuntimeAlive()) { process["exitCode"] = status; throw toThrow } logExceptionOnExit(toThrow); process["exit"](status) }; Module["inspect"] = function () { return "[Emscripten Module object]" } } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) { if (ENVIRONMENT_IS_WORKER) { scriptDirectory = self.location.href } else if (typeof document !== "undefined" && document.currentScript) { scriptDirectory = document.currentScript.src } if (scriptDirectory.indexOf("blob:") !== 0) { scriptDirectory = scriptDirectory.substr(0, scriptDirectory.replace(/[?#].*/, "").lastIndexOf("/") + 1) } else { scriptDirectory = "" } { read_ = function (url) { var xhr = new XMLHttpRequest; xhr.open("GET", url, false); xhr.send(null); return xhr.responseText }; if (ENVIRONMENT_IS_WORKER) { readBinary = function (url) { var xhr = new XMLHttpRequest; xhr.open("GET", url, false); xhr.responseType = "arraybuffer"; xhr.send(null); return new Uint8Array(xhr.response) } } readAsync = function (url, onload, onerror) { var xhr = new XMLHttpRequest; xhr.open("GET", url, true); xhr.responseType = "arraybuffer"; xhr.onload = function () { if (xhr.status == 200 || xhr.status == 0 && xhr.response) { onload(xhr.response); return } onerror() }; xhr.onerror = onerror; xhr.send(null) } } setWindowTitle = function (title) { document.title = title } } else { } var out = Module["print"] || console.log.bind(console); var err = Module["printErr"] || console.warn.bind(console); for (key in moduleOverrides) { if (moduleOverrides.hasOwnProperty(key)) { Module[key] = moduleOverrides[key] } } moduleOverrides = null; if (Module["arguments"]) arguments_ = Module["arguments"]; if (Module["thisProgram"]) thisProgram = Module["thisProgram"]; if (Module["quit"]) quit_ = Module["quit"]; var wasmBinary; if (Module["wasmBinary"]) wasmBinary = Module["wasmBinary"]; var noExitRuntime = Module["noExitRuntime"] || true; if (typeof WebAssembly !== "object") { abort("no native wasm support detected") } var wasmMemory; var ABORT = false; var EXITSTATUS; function assert(condition, text) { if (!condition) { abort("Assertion failed: " + text) } } function getCFunc(ident) { var func = Module["_" + ident]; assert(func, "Cannot call unknown function " + ident + ", make sure it is exported"); return func } function ccall(ident, returnType, argTypes, args, opts) { var toC = { "string": function (str) { var ret = 0; if (str !== null && str !== undefined && str !== 0) { var len = (str.length << 2) + 1; ret = stackAlloc(len); stringToUTF8(str, ret, len) } return ret }, "array": function (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; i < args.length; i++) { var converter = toC[argTypes[i]]; if (converter) { if (stack === 0) stack = stackSave(); cArgs[i] = converter(args[i]) } else { cArgs[i] = args[i] } } } var ret = func.apply(null, cArgs); function onDone(ret) { if (stack !== 0) stackRestore(stack); return convertReturnValue(ret) } ret = onDone(ret); return ret } function cwrap(ident, returnType, argTypes, opts) { argTypes = argTypes || []; var numericArgs = argTypes.every(function (type) { return type === "number" }); var numericRet = returnType !== "string"; if (numericRet && numericArgs && !opts) { return getCFunc(ident) } return function () { return ccall(ident, returnType, argTypes, arguments, opts) } } var UTF8Decoder = typeof TextDecoder !== "undefined" ? new TextDecoder("utf8") : undefined; function UTF8ArrayToString(heap, idx, maxBytesToRead) { var endIdx = idx + maxBytesToRead; var endPtr = idx; while (heap[endPtr] && !(endPtr >= endIdx)) ++endPtr; if (endPtr - idx > 16 && heap.subarray && UTF8Decoder) { return UTF8Decoder.decode(heap.subarray(idx, endPtr)) } else { var str = ""; while (idx < endPtr) { var u0 = heap[idx++]; if (!(u0 & 128)) { str += String.fromCharCode(u0); continue } var u1 = heap[idx++] & 63; if ((u0 & 224) == 192) { str += String.fromCharCode((u0 & 31) << 6 | u1); continue } var u2 = heap[idx++] & 63; if ((u0 & 240) == 224) { u0 = (u0 & 15) << 12 | u1 << 6 | u2 } else { u0 = (u0 & 7) << 18 | u1 << 12 | u2 << 6 | heap[idx++] & 63 } if (u0 < 65536) { str += String.fromCharCode(u0) } else { var ch = u0 - 65536; str += String.fromCharCode(55296 | ch >> 10, 56320 | ch & 1023) } } } return str } function UTF8ToString(ptr, maxBytesToRead) { return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : "" } function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { if (!(maxBytesToWrite > 0)) return 0; var startIdx = outIdx; var endIdx = outIdx + maxBytesToWrite - 1; for (var i = 0; i < str.length; ++i) { var u = str.charCodeAt(i); if (u >= 55296 && u <= 57343) { var u1 = str.charCodeAt(++i); u = 65536 + ((u & 1023) << 10) | u1 & 1023 } if (u <= 127) { if (outIdx >= endIdx) break; heap[outIdx++] = u } else if (u <= 2047) { if (outIdx + 1 >= endIdx) break; heap[outIdx++] = 192 | u >> 6; heap[outIdx++] = 128 | u & 63 } else if (u <= 65535) { if (outIdx + 2 >= endIdx) break; heap[outIdx++] = 224 | u >> 12; heap[outIdx++] = 128 | u >> 6 & 63; heap[outIdx++] = 128 | u & 63 } else { if (outIdx + 3 >= endIdx) break; heap[outIdx++] = 240 | u >> 18; heap[outIdx++] = 128 | u >> 12 & 63; heap[outIdx++] = 128 | u >> 6 & 63; heap[outIdx++] = 128 | u & 63 } } heap[outIdx] = 0; return outIdx - startIdx } function stringToUTF8(str, outPtr, maxBytesToWrite) { return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite) } function lengthBytesUTF8(str) { var len = 0; for (var i = 0; i < str.length; ++i) { var u = str.charCodeAt(i); if (u >= 55296 && u <= 57343) u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; if (u <= 127) ++len; else if (u <= 2047) len += 2; else if (u <= 65535) len += 3; else len += 4 } return len } function writeArrayToMemory(array, buffer) { HEAP8.set(array, buffer) } function writeAsciiToMemory(str, buffer, dontAddNull) { for (var i = 0; i < str.length; ++i) { HEAP8[buffer++ >> 0] = str.charCodeAt(i) } if (!dontAddNull) HEAP8[buffer >> 0] = 0 } var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64; function updateGlobalBufferAndViews(buf) { buffer = buf; Module["HEAP8"] = HEAP8 = new Int8Array(buf); Module["HEAP16"] = HEAP16 = new Int16Array(buf); Module["HEAP32"] = HEAP32 = new Int32Array(buf); Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); Module["HEAPU16"] = HEAPU16 = new Uint16Array(buf); Module["HEAPU32"] = HEAPU32 = new Uint32Array(buf); Module["HEAPF32"] = HEAPF32 = new Float32Array(buf); Module["HEAPF64"] = HEAPF64 = new Float64Array(buf) } var INITIAL_MEMORY = Module["INITIAL_MEMORY"] || 16777216; var wasmTable; var __ATPRERUN__ = []; var __ATINIT__ = []; var __ATPOSTRUN__ = []; var runtimeInitialized = false; var runtimeKeepaliveCounter = 0; function keepRuntimeAlive() { return noExitRuntime || runtimeKeepaliveCounter > 0 } function preRun() { if (Module["preRun"]) { if (typeof Module["preRun"] == "function") Module["preRun"] = [Module["preRun"]]; while (Module["preRun"].length) { addOnPreRun(Module["preRun"].shift()) } } callRuntimeCallbacks(__ATPRERUN__) } function initRuntime() { runtimeInitialized = true; if (!Module["noFSInit"] && !FS.init.initialized) FS.init(); FS.ignorePermissions = false; TTY.init(); callRuntimeCallbacks(__ATINIT__) } function postRun() { if (Module["postRun"]) { if (typeof Module["postRun"] == "function") Module["postRun"] = [Module["postRun"]]; while (Module["postRun"].length) { addOnPostRun(Module["postRun"].shift()) } } callRuntimeCallbacks(__ATPOSTRUN__) } function addOnPreRun(cb) { __ATPRERUN__.unshift(cb) } function addOnInit(cb) { __ATINIT__.unshift(cb) } function addOnPostRun(cb) { __ATPOSTRUN__.unshift(cb) } var runDependencies = 0; var runDependencyWatcher = null; var dependenciesFulfilled = null; function getUniqueRunDependency(id) { return id } function addRunDependency(id) { runDependencies++; if (Module["monitorRunDependencies"]) { Module["monitorRunDependencies"](runDependencies) } } function removeRunDependency(id) { runDependencies--; if (Module["monitorRunDependencies"]) { Module["monitorRunDependencies"](runDependencies) } if (runDependencies == 0) { if (runDependencyWatcher !== null) { clearInterval(runDependencyWatcher); runDependencyWatcher = null } if (dependenciesFulfilled) { var callback = dependenciesFulfilled; dependenciesFulfilled = null; callback() } } } Module["preloadedImages"] = {}; Module["preloadedAudios"] = {}; function abort(what) { { if (Module["onAbort"]) { Module["onAbort"](what) } } what = "Aborted(" + what + ")"; err(what); ABORT = true; EXITSTATUS = 1; what += ". Build with -s ASSERTIONS=1 for more info."; var e = new WebAssembly.RuntimeError(what); throw e } var dataURIPrefix = "data:application/octet-stream;base64,"; function isDataURI(filename) { return filename.startsWith(dataURIPrefix) } function isFileURI(filename) { return filename.startsWith("file://") } var wasmBinaryFile; wasmBinaryFile = "cpp.wasm"; if (!isDataURI(wasmBinaryFile)) { wasmBinaryFile = locateFile(wasmBinaryFile) } function getBinary(file) { try { if (file == wasmBinaryFile && wasmBinary) { return new Uint8Array(wasmBinary) } if (readBinary) { return readBinary(file) } else { throw "both async and sync fetching of the wasm failed" } } catch (err) { abort(err) } } function getBinaryPromise() { if (!wasmBinary && (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER)) { if (typeof fetch === "function" && !isFileURI(wasmBinaryFile)) { return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function (response) { if (!response["ok"]) { throw "failed to load wasm binary file at '" + wasmBinaryFile + "'" } return response["arrayBuffer"]() }).catch(function () { return getBinary(wasmBinaryFile) }) } else { if (readAsync) { return new Promise(function (resolve, reject) { readAsync(wasmBinaryFile, function (response) { resolve(new Uint8Array(response)) }, reject) }) } } } return Promise.resolve().then(function () { return getBinary(wasmBinaryFile) }) } function createWasm() { var info = { "a": asmLibraryArg }; function receiveInstance(instance, module) { var exports = instance.exports; Module["asm"] = exports; wasmMemory = Module["asm"]["p"]; updateGlobalBufferAndViews(wasmMemory.buffer); wasmTable = Module["asm"]["r"]; addOnInit(Module["asm"]["q"]); removeRunDependency("wasm-instantiate") } addRunDependency("wasm-instantiate"); function receiveInstantiationResult(result) { receiveInstance(result["instance"]) } function instantiateArrayBuffer(receiver) { return getBinaryPromise().then(function (binary) { return WebAssembly.instantiate(binary, info) }).then(function (instance) { return instance }).then(receiver, function (reason) { err("failed to asynchronously prepare wasm: " + reason); abort(reason) }) } function instantiateAsync() { if (!wasmBinary && typeof WebAssembly.instantiateStreaming === "function" && !isDataURI(wasmBinaryFile) && !isFileURI(wasmBinaryFile) && typeof fetch === "function") { return fetch(wasmBinaryFile, { credentials: "same-origin" }).then(function (response) { var result = WebAssembly.instantiateStreaming(response, info); return result.then(receiveInstantiationResult, function (reason) { err("wasm streaming compile failed: " + reason); err("falling back to ArrayBuffer instantiation"); return instantiateArrayBuffer(receiveInstantiationResult) }) }) } else { return instantiateArrayBuffer(receiveInstantiationResult) } } if (Module["instantiateWasm"]) { try { var exports = Module["instantiateWasm"](info, receiveInstance); return exports } catch (e) { err("Module.instantiateWasm callback failed with error: " + e); return false } } instantiateAsync(); return {} } var tempDouble; var tempI64; function callRuntimeCallbacks(callbacks) { while (callbacks.length > 0) { var callback = callbacks.shift(); if (typeof callback == "function") { callback(Module); continue } var func = callback.func; if (typeof func === "number") { if (callback.arg === undefined) { getWasmTableEntry(func)() } else { getWasmTableEntry(func)(callback.arg) } } else { func(callback.arg === undefined ? null : callback.arg) } } } var wasmTableMirror = []; function getWasmTableEntry(funcPtr) { var func = wasmTableMirror[funcPtr]; if (!func) { if (funcPtr >= wasmTableMirror.length) wasmTableMirror.length = funcPtr + 1; wasmTableMirror[funcPtr] = func = wasmTable.get(funcPtr) } return func } function ___cxa_allocate_exception(size) { return _malloc(size + 16) + 16 } function ExceptionInfo(excPtr) { this.excPtr = excPtr; this.ptr = excPtr - 16; this.set_type = function (type) { HEAP32[this.ptr + 4 >> 2] = type }; this.get_type = function () { return HEAP32[this.ptr + 4 >> 2] }; this.set_destructor = function (destructor) { HEAP32[this.ptr + 8 >> 2] = destructor }; this.get_destructor = function () { return HEAP32[this.ptr + 8 >> 2] }; this.set_refcount = function (refcount) { HEAP32[this.ptr >> 2] = refcount }; this.set_caught = function (caught) { caught = caught ? 1 : 0; HEAP8[this.ptr + 12 >> 0] = caught }; this.get_caught = function () { return HEAP8[this.ptr + 12 >> 0] != 0 }; this.set_rethrown = function (rethrown) { rethrown = rethrown ? 1 : 0; HEAP8[this.ptr + 13 >> 0] = rethrown }; this.get_rethrown = function () { return HEAP8[this.ptr + 13 >> 0] != 0 }; this.init = function (type, destructor) { this.set_type(type); this.set_destructor(destructor); this.set_refcount(0); this.set_caught(false); this.set_rethrown(false) }; this.add_ref = function () { var value = HEAP32[this.ptr >> 2]; HEAP32[this.ptr >> 2] = value + 1 }; this.release_ref = function () { var prev = HEAP32[this.ptr >> 2]; HEAP32[this.ptr >> 2] = prev - 1; return prev === 1 } } var exceptionLast = 0; var uncaughtExceptionCount = 0; function ___cxa_throw(ptr, type, destructor) { var info = new ExceptionInfo(ptr); info.init(type, destructor); exceptionLast = ptr; uncaughtExceptionCount++; throw ptr } function setErrNo(value) { HEAP32[___errno_location() >> 2] = value; return value } var PATH = { splitPath: function (filename) { var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; return splitPathRe.exec(filename).slice(1) }, normalizeArray: function (parts, allowAboveRoot) { var up = 0; for (var i = parts.length - 1; i >= 0; i--) { var last = parts[i]; if (last === ".") { parts.splice(i, 1) } else if (last === "..") { parts.splice(i, 1); up++ } else if (up) { parts.splice(i, 1); up-- } } if (allowAboveRoot) { for (; up; up--) { parts.unshift("..") } } return parts }, normalize: function (path) { var isAbsolute = path.charAt(0) === "/", trailingSlash = path.substr(-1) === "/"; path = PATH.normalizeArray(path.split("/").filter(function (p) { return !!p }), !isAbsolute).join("/"); if (!path && !isAbsolute) { path = "." } if (path && trailingSlash) { path += "/" } return (isAbsolute ? "/" : "") + path }, dirname: function (path) { var result = PATH.splitPath(path), root = result[0], dir = result[1]; if (!root && !dir) { return "." } if (dir) { dir = dir.substr(0, dir.length - 1) } return root + dir }, basename: function (path) { if (path === "/") return "/"; path = PATH.normalize(path); path = path.replace(/\/$/, ""); var lastSlash = path.lastIndexOf("/"); if (lastSlash === -1) return path; return path.substr(lastSlash + 1) }, extname: function (path) { return PATH.splitPath(path)[3] }, join: function () { var paths = Array.prototype.slice.call(arguments, 0); return PATH.normalize(paths.join("/")) }, join2: function (l, r) { return PATH.normalize(l + "/" + r) } }; function getRandomDevice() { if (typeof crypto === "object" && typeof crypto["getRandomValues"] === "function") { var randomBuffer = new Uint8Array(1); return function () { crypto.getRandomValues(randomBuffer); return randomBuffer[0] } } else if (ENVIRONMENT_IS_NODE) { try { var crypto_module = require("crypto"); return function () { return crypto_module["randomBytes"](1)[0] } } catch (e) { } } return function () { abort("randomDevice") } } var PATH_FS = { resolve: function () { var resolvedPath = "", resolvedAbsolute = false; for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { var path = i >= 0 ? arguments[i] : FS.cwd(); if (typeof path !== "string") { throw new TypeError("Arguments to path.resolve must be strings") } else if (!path) { return "" } resolvedPath = path + "/" + resolvedPath; resolvedAbsolute = path.charAt(0) === "/" } resolvedPath = PATH.normalizeArray(resolvedPath.split("/").filter(function (p) { return !!p }), !resolvedAbsolute).join("/"); return (resolvedAbsolute ? "/" : "") + resolvedPath || "." }, relative: function (from, to) { from = PATH_FS.resolve(from).substr(1); to = PATH_FS.resolve(to).substr(1); function trim(arr) { var start = 0; for (; start < arr.length; start++) { if (arr[start] !== "") break } var end = arr.length - 1; for (; end >= 0; end--) { if (arr[end] !== "") break } if (start > end) return []; return arr.slice(start, end - start + 1) } var fromParts = trim(from.split("/")); var toParts = trim(to.split("/")); var length = Math.min(fromParts.length, toParts.length); var samePartsLength = length; for (var i = 0; i < length; i++) { if (fromParts[i] !== toParts[i]) { samePartsLength = i; break } } var outputParts = []; for (var i = samePartsLength; i < fromParts.length; i++) { outputParts.push("..") } outputParts = outputParts.concat(toParts.slice(samePartsLength)); return outputParts.join("/") } }; var TTY = { ttys: [], init: function () { }, shutdown: function () { }, register: function (dev, ops) { TTY.ttys[dev] = { input: [], output: [], ops: ops }; FS.registerDevice(dev, TTY.stream_ops) }, stream_ops: { open: function (stream) { var tty = TTY.ttys[stream.node.rdev]; if (!tty) { throw new FS.ErrnoError(43) } stream.tty = tty; stream.seekable = false }, close: function (stream) { stream.tty.ops.flush(stream.tty) }, flush: function (stream) { stream.tty.ops.flush(stream.tty) }, read: function (stream, buffer, offset, length, pos) { if (!stream.tty || !stream.tty.ops.get_char) { throw new FS.ErrnoError(60) } var bytesRead = 0; for (var i = 0; i < length; i++) { var result; try { result = stream.tty.ops.get_char(stream.tty) } catch (e) { throw new FS.ErrnoError(29) } if (result === undefined && bytesRead === 0) { throw new FS.ErrnoError(6) } if (result === null || result === undefined) break; bytesRead++; buffer[offset + i] = result } if (bytesRead) { stream.node.timestamp = Date.now() } return bytesRead }, write: function (stream, buffer, offset, length, pos) { if (!stream.tty || !stream.tty.ops.put_char) { throw new FS.ErrnoError(60) } try { for (var i = 0; i < length; i++) { stream.tty.ops.put_char(stream.tty, buffer[offset + i]) } } catch (e) { throw new FS.ErrnoError(29) } if (length) { stream.node.timestamp = Date.now() } return i } }, default_tty_ops: { get_char: function (tty) { if (!tty.input.length) { var result = null; if (ENVIRONMENT_IS_NODE) { var BUFSIZE = 256; var buf = Buffer.alloc(BUFSIZE); var bytesRead = 0; try { bytesRead = nodeFS.readSync(process.stdin.fd, buf, 0, BUFSIZE, null) } catch (e) { if (e.toString().includes("EOF")) bytesRead = 0; else throw e } if (bytesRead > 0) { result = buf.slice(0, bytesRead).toString("utf-8") } else { result = null } } else if (typeof window != "undefined" && typeof window.prompt == "function") { result = window.prompt("Input: "); if (result !== null) { result += "\n" } } else if (typeof readline == "function") { result = readline(); if (result !== null) { result += "\n" } } if (!result) { return null } tty.input = intArrayFromString(result, true) } return tty.input.shift() }, put_char: function (tty, val) { if (val === null || val === 10) { out(UTF8ArrayToString(tty.output, 0)); tty.output = [] } else { if (val != 0) tty.output.push(val) } }, flush: function (tty) { if (tty.output && tty.output.length > 0) { out(UTF8ArrayToString(tty.output, 0)); tty.output = [] } } }, default_tty1_ops: { put_char: function (tty, val) { if (val === null || val === 10) { err(UTF8ArrayToString(tty.output, 0)); tty.output = [] } else { if (val != 0) tty.output.push(val) } }, flush: function (tty) { if (tty.output && tty.output.length > 0) { err(UTF8ArrayToString(tty.output, 0)); tty.output = [] } } } }; function mmapAlloc(size) { abort() } var MEMFS = { ops_table: null, mount: function (mount) { return MEMFS.createNode(null, "/", 16384 | 511, 0) }, createNode: function (parent, name, mode, dev) { if (FS.isBlkdev(mode) || FS.isFIFO(mode)) { throw new FS.ErrnoError(63) } if (!MEMFS.ops_table) { MEMFS.ops_table = { dir: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, lookup: MEMFS.node_ops.lookup, mknod: MEMFS.node_ops.mknod, rename: MEMFS.node_ops.rename, unlink: MEMFS.node_ops.unlink, rmdir: MEMFS.node_ops.rmdir, readdir: MEMFS.node_ops.readdir, symlink: MEMFS.node_ops.symlink }, stream: { llseek: MEMFS.stream_ops.llseek } }, file: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: { llseek: MEMFS.stream_ops.llseek, read: MEMFS.stream_ops.read, write: MEMFS.stream_ops.write, allocate: MEMFS.stream_ops.allocate, mmap: MEMFS.stream_ops.mmap, msync: MEMFS.stream_ops.msync } }, link: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr, readlink: MEMFS.node_ops.readlink }, stream: {} }, chrdev: { node: { getattr: MEMFS.node_ops.getattr, setattr: MEMFS.node_ops.setattr }, stream: FS.chrdev_stream_ops } } } var node = FS.createNode(parent, name, mode, dev); if (FS.isDir(node.mode)) { node.node_ops = MEMFS.ops_table.dir.node; node.stream_ops = MEMFS.ops_table.dir.stream; node.contents = {} } else if (FS.isFile(node.mode)) { node.node_ops = MEMFS.ops_table.file.node; node.stream_ops = MEMFS.ops_table.file.stream; node.usedBytes = 0; node.contents = null } else if (FS.isLink(node.mode)) { node.node_ops = MEMFS.ops_table.link.node; node.stream_ops = MEMFS.ops_table.link.stream } else if (FS.isChrdev(node.mode)) { node.node_ops = MEMFS.ops_table.chrdev.node; node.stream_ops = MEMFS.ops_table.chrdev.stream } node.timestamp = Date.now(); if (parent) { parent.contents[name] = node; parent.timestamp = node.timestamp } return node }, getFileDataAsTypedArray: function (node) { if (!node.contents) return new Uint8Array(0); if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes); return new Uint8Array(node.contents) }, expandFileStorage: function (node, newCapacity) { var prevCapacity = node.contents ? node.contents.length : 0; if (prevCapacity >= newCapacity) return; var CAPACITY_DOUBLING_MAX = 1024 * 1024; newCapacity = Math.max(newCapacity, prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125) >>> 0); if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256); var oldContents = node.contents; node.contents = new Uint8Array(newCapacity); if (node.usedBytes > 0) node.contents.set(oldContents.subarray(0, node.usedBytes), 0) }, resizeFileStorage: function (node, newSize) { if (node.usedBytes == newSize) return; if (newSize == 0) { node.contents = null; node.usedBytes = 0 } else { var oldContents = node.contents; node.contents = new Uint8Array(newSize); if (oldContents) { node.contents.set(oldContents.subarray(0, Math.min(newSize, node.usedBytes))) } node.usedBytes = newSize } }, node_ops: { getattr: function (node) { var attr = {}; attr.dev = FS.isChrdev(node.mode) ? node.id : 1; attr.ino = node.id; attr.mode = node.mode; attr.nlink = 1; attr.uid = 0; attr.gid = 0; attr.rdev = node.rdev; if (FS.isDir(node.mode)) { attr.size = 4096 } else if (FS.isFile(node.mode)) { attr.size = node.usedBytes } else if (FS.isLink(node.mode)) { attr.size = node.link.length } else { attr.size = 0 } attr.atime = new Date(node.timestamp); attr.mtime = new Date(node.timestamp); attr.ctime = new Date(node.timestamp); attr.blksize = 4096; attr.blocks = Math.ceil(attr.size / attr.blksize); return attr }, setattr: function (node, attr) { if (attr.mode !== undefined) { node.mode = attr.mode } if (attr.timestamp !== undefined) { node.timestamp = attr.timestamp } if (attr.size !== undefined) { MEMFS.resizeFileStorage(node, attr.size) } }, lookup: function (parent, name) { throw FS.genericErrors[44] }, mknod: function (parent, name, mode, dev) { return MEMFS.createNode(parent, name, mode, dev) }, rename: function (old_node, new_dir, new_name) { if (FS.isDir(old_node.mode)) { var new_node; try { new_node = FS.lookupNode(new_dir, new_name) } catch (e) { } if (new_node) { for (var i in new_node.contents) { throw new FS.ErrnoError(55) } } } delete old_node.parent.contents[old_node.name]; old_node.parent.timestamp = Date.now(); old_node.name = new_name; new_dir.contents[new_name] = old_node; new_dir.timestamp = old_node.parent.timestamp; old_node.parent = new_dir }, unlink: function (parent, name) { delete parent.contents[name]; parent.timestamp = Date.now() }, rmdir: function (parent, name) { var node = FS.lookupNode(parent, name); for (var i in node.contents) { throw new FS.ErrnoError(55) } delete parent.contents[name]; parent.timestamp = Date.now() }, readdir: function (node) { var entries = [".", ".."]; for (var key in node.contents) { if (!node.contents.hasOwnProperty(key)) { continue } entries.push(key) } return entries }, symlink: function (parent, newname, oldpath) { var node = MEMFS.createNode(parent, newname, 511 | 40960, 0); node.link = oldpath; return node }, readlink: function (node) { if (!FS.isLink(node.mode)) { throw new FS.ErrnoError(28) } return node.link } }, stream_ops: { read: function (stream, buffer, offset, length, position) { var contents = stream.node.contents; if (position >= stream.node.usedBytes) return 0; var size = Math.min(stream.node.usedBytes - position, length); if (size > 8 && contents.subarray) { buffer.set(contents.subarray(position, position + size), offset) } else { for (var i = 0; i < size; i++)buffer[offset + i] = contents[position + i] } return size }, write: function (stream, buffer, offset, length, position, canOwn) { if (!length) return 0; var node = stream.node; node.timestamp = Date.now(); if (buffer.subarray && (!node.contents || node.contents.subarray)) { if (canOwn) { node.contents = buffer.subarray(offset, offset + length); node.usedBytes = length; return length } else if (node.usedBytes === 0 && position === 0) { node.contents = buffer.slice(offset, offset + length); node.usedBytes = length; return length } else if (position + length <= node.usedBytes) { node.contents.set(buffer.subarray(offset, offset + length), position); return length } } MEMFS.expandFileStorage(node, position + length); if (node.contents.subarray && buffer.subarray) { node.contents.set(buffer.subarray(offset, offset + length), position) } else { for (var i = 0; i < length; i++) { node.contents[position + i] = buffer[offset + i] } } node.usedBytes = Math.max(node.usedBytes, position + length); return length }, llseek: function (stream, offset, whence) { var position = offset; if (whence === 1) { position += stream.position } else if (whence === 2) { if (FS.isFile(stream.node.mode)) { position += stream.node.usedBytes } } if (position < 0) { throw new FS.ErrnoError(28) } return position }, allocate: function (stream, offset, length) { MEMFS.expandFileStorage(stream.node, offset + length); stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length) }, mmap: function (stream, address, length, position, prot, flags) { if (address !== 0) { throw new FS.ErrnoError(28) } if (!FS.isFile(stream.node.mode)) { throw new FS.ErrnoError(43) } var ptr; var allocated; var contents = stream.node.contents; if (!(flags & 2) && contents.buffer === buffer) { allocated = false; ptr = contents.byteOffset } else { if (position > 0 || position + length < contents.length) { if (contents.subarray) { contents = contents.subarray(position, position + length) } else { contents = Array.prototype.slice.call(contents, position, position + length) } } allocated = true; ptr = mmapAlloc(length); if (!ptr) { throw new FS.ErrnoError(48) } HEAP8.set(contents, ptr) } return { ptr: ptr, allocated: allocated } }, msync: function (stream, buffer, offset, length, mmapFlags) { if (!FS.isFile(stream.node.mode)) { throw new FS.ErrnoError(43) } if (mmapFlags & 2) { return 0 } var bytesWritten = MEMFS.stream_ops.write(stream, buffer, 0, length, offset, false); return 0 } } }; function asyncLoad(url, onload, onerror, noRunDep) { var dep = !noRunDep ? getUniqueRunDependency("al " + url) : ""; readAsync(url, function (arrayBuffer) { assert(arrayBuffer, 'Loading data file "' + url + '" failed (no arrayBuffer).'); onload(new Uint8Array(arrayBuffer)); if (dep) removeRunDependency(dep) }, function (event) { if (onerror) { onerror() } else { throw 'Loading data file "' + url + '" failed.' } }); if (dep) addRunDependency(dep) } var FS = { root: null, mounts: [], devices: {}, streams: [], nextInode: 1, nameTable: null, currentPath: "/", initialized: false, ignorePermissions: true, ErrnoError: null, genericErrors: {}, filesystems: null, syncFSRequests: 0, lookupPath: function (path, opts) { path = PATH_FS.resolve(FS.cwd(), path); opts = opts || {}; if (!path) return { path: "", node: null }; var defaults = { follow_mount: true, recurse_count: 0 }; for (var key in defaults) { if (opts[key] === undefined) { opts[key] = defaults[key] } } if (opts.recurse_count > 8) { throw new FS.ErrnoError(32) } var parts = PATH.normalizeArray(path.split("/").filter(function (p) { return !!p }), false); var current = FS.root; var current_path = "/"; for (var i = 0; i < parts.length; i++) { var islast = i === parts.length - 1; if (islast && opts.parent) { break } current = FS.lookupNode(current, parts[i]); current_path = PATH.join2(current_path, parts[i]); if (FS.isMountpoint(current)) { if (!islast || islast && opts.follow_mount) { current = current.mounted.root } } if (!islast || opts.follow) { var count = 0; while (FS.isLink(current.mode)) { var link = FS.readlink(current_path); current_path = PATH_FS.resolve(PATH.dirname(current_path), link); var lookup = FS.lookupPath(current_path, { recurse_count: opts.recurse_count }); current = lookup.node; if (count++ > 40) { throw new FS.ErrnoError(32) } } } } return { path: current_path, node: current } }, getPath: function (node) { var path; while (true) { if (FS.isRoot(node)) { var mount = node.mount.mountpoint; if (!path) return mount; return mount[mount.length - 1] !== "/" ? mount + "/" + path : mount + path } path = path ? node.name + "/" + path : node.name; node = node.parent } }, hashName: function (parentid, name) { var hash = 0; for (var i = 0; i < name.length; i++) { hash = (hash << 5) - hash + name.charCodeAt(i) | 0 } return (parentid + hash >>> 0) % FS.nameTable.length }, hashAddNode: function (node) { var hash = FS.hashName(node.parent.id, node.name); node.name_next = FS.nameTable[hash]; FS.nameTable[hash] = node }, hashRemoveNode: function (node) { var hash = FS.hashName(node.parent.id, node.name); if (FS.nameTable[hash] === node) { FS.nameTable[hash] = node.name_next } else { var current = FS.nameTable[hash]; while (current) { if (current.name_next === node) { current.name_next = node.name_next; break } current = current.name_next } } }, lookupNode: function (parent, name) { var errCode = FS.mayLookup(parent); if (errCode) { throw new FS.ErrnoError(errCode, parent) } var hash = FS.hashName(parent.id, name); for (var node = FS.nameTable[hash]; node; node = node.name_next) { var nodeName = node.name; if (node.parent.id === parent.id && nodeName === name) { return node } } return FS.lookup(parent, name) }, createNode: function (parent, name, mode, rdev) { var node = new FS.FSNode(parent, name, mode, rdev); FS.hashAddNode(node); return node }, destroyNode: function (node) { FS.hashRemoveNode(node) }, isRoot: function (node) { return node === node.parent }, isMountpoint: function (node) { return !!node.mounted }, isFile: function (mode) { return (mode & 61440) === 32768 }, isDir: function (mode) { return (mode & 61440) === 16384 }, isLink: function (mode) { return (mode & 61440) === 40960 }, isChrdev: function (mode) { return (mode & 61440) === 8192 }, isBlkdev: function (mode) { return (mode & 61440) === 24576 }, isFIFO: function (mode) { return (mode & 61440) === 4096 }, isSocket: function (mode) { return (mode & 49152) === 49152 }, flagModes: { "r": 0, "r+": 2, "w": 577, "w+": 578, "a": 1089, "a+": 1090 }, modeStringToFlags: function (str) { var flags = FS.flagModes[str]; if (typeof flags === "undefined") { throw new Error("Unknown file open mode: " + str) } return flags }, flagsToPermissionString: function (flag) { var perms = ["r", "w", "rw"][flag & 3]; if (flag & 512) { perms += "w" } return perms }, nodePermissions: function (node, perms) { if (FS.ignorePermissions) { return 0 } if (perms.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: function (dir) { var errCode = FS.nodePermissions(dir, "x"); if (errCode) return errCode; if (!dir.node_ops.lookup) return 2; return 0 }, mayCreate: function (dir, name) { try { var node = FS.lookupNode(dir, name); return 20 } catch (e) { } return FS.nodePermissions(dir, "wx") }, mayDelete: function (dir, name, isdir) { var node; try { node = FS.lookupNode(dir, name) } catch (e) { return e.errno } var errCode = FS.nodePermissions(dir, "wx"); if (errCode) { return errCode } if (isdir) { if (!FS.isDir(node.mode)) { return 54 } if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) { return 10 } } else { if (FS.isDir(node.mode)) { return 31 } } return 0 }, mayOpen: function (node, flags) { if (!node) { return 44 } if (FS.isLink(node.mode)) { return 32 } else if (FS.isDir(node.mode)) { if (FS.flagsToPermissionString(flags) !== "r" || flags & 512) { return 31 } } return FS.nodePermissions(node, FS.flagsToPermissionString(flags)) }, MAX_OPEN_FDS: 4096, nextfd: function (fd_start, fd_end) { fd_start = fd_start || 0; fd_end = fd_end || FS.MAX_OPEN_FDS; for (var fd = fd_start; fd <= fd_end; fd++) { if (!FS.streams[fd]) { return fd } } throw new FS.ErrnoError(33) }, getStream: function (fd) { return FS.streams[fd] }, createStream: function (stream, fd_start, fd_end) { if (!FS.FSStream) { FS.FSStream = function () { }; FS.FSStream.prototype = { object: { get: function () { return this.node }, set: function (val) { this.node = val } }, isRead: { get: function () { return (this.flags & 2097155) !== 1 } }, isWrite: { get: function () { return (this.flags & 2097155) !== 0 } }, isAppend: { get: function () { return this.flags & 1024 } } } } var newStream = new FS.FSStream; for (var p in stream) { newStream[p] = stream[p] } stream = newStream; var fd = FS.nextfd(fd_start, fd_end); stream.fd = fd; FS.streams[fd] = stream; return stream }, closeStream: function (fd) { FS.streams[fd] = null }, chrdev_stream_ops: { open: function (stream) { var device = FS.getDevice(stream.node.rdev); stream.stream_ops = device.stream_ops; if (stream.stream_ops.open) { stream.stream_ops.open(stream) } }, llseek: function () { throw new FS.ErrnoError(70) } }, major: function (dev) { return dev >> 8 }, minor: function (dev) { return dev & 255 }, makedev: function (ma, mi) { return ma << 8 | mi }, registerDevice: function (dev, ops) { FS.devices[dev] = { stream_ops: ops } }, getDevice: function (dev) { return FS.devices[dev] }, getMounts: function (mount) { var mounts = []; var check = [mount]; while (check.length) { var m = check.pop(); mounts.push(m); check.push.apply(check, m.mounts) } return mounts }, syncfs: function (populate, callback) { if (typeof populate === "function") { callback = populate; populate = false } FS.syncFSRequests++; if (FS.syncFSRequests > 1) { err("warning: " + FS.syncFSRequests + " FS.syncfs operations in flight at once, probably just doing extra work") } var mounts = FS.getMounts(FS.root.mount); var completed = 0; function doCallback(errCode) { FS.syncFSRequests--; return callback(errCode) } function done(errCode) { if (errCode) { if (!done.errored) { done.errored = true; return doCallback(errCode) } return } if (++completed >= mounts.length) { doCallback(null) } } mounts.forEach(function (mount) { if (!mount.type.syncfs) { return done(null) } mount.type.syncfs(mount, populate, done) }) }, mount: function (type, opts, mountpoint) { var root = mountpoint === "/"; var pseudo = !mountpoint; var node; if (root && FS.root) { throw new FS.ErrnoError(10) } else if (!root && !pseudo) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); mountpoint = lookup.path; node = lookup.node; if (FS.isMountpoint(node)) { throw new FS.ErrnoError(10) } if (!FS.isDir(node.mode)) { throw new FS.ErrnoError(54) } } var mount = { type: type, opts: opts, mountpoint: mountpoint, mounts: [] }; var mountRoot = type.mount(mount); mountRoot.mount = mount; mount.root = mountRoot; if (root) { FS.root = mountRoot } else if (node) { node.mounted = mount; if (node.mount) { node.mount.mounts.push(mount) } } return mountRoot }, unmount: function (mountpoint) { var lookup = FS.lookupPath(mountpoint, { follow_mount: false }); if (!FS.isMountpoint(lookup.node)) { throw new FS.ErrnoError(28) } var node = lookup.node; var mount = node.mounted; var mounts = FS.getMounts(mount); Object.keys(FS.nameTable).forEach(function (hash) { var current = FS.nameTable[hash]; while (current) { var next = current.name_next; if (mounts.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: function (parent, name) { return parent.node_ops.lookup(parent, name) }, mknod: function (path, mode, dev) { var lookup = FS.lookupPath(path, { parent: true }); var parent = lookup.node; var name = PATH.basename(path); if (!name || name === "." || name === "..") { throw new FS.ErrnoError(28) } var errCode = FS.mayCreate(parent, name); if (errCode) { throw new FS.ErrnoError(errCode) } if (!parent.node_ops.mknod) { throw new FS.ErrnoError(63) } return parent.node_ops.mknod(parent, name, mode, dev) }, create: function (path, mode) { mode = mode !== undefined ? mode : 438; mode &= 4095; mode |= 32768; return FS.mknod(path, mode, 0) }, mkdir: function (path, mode) { mode = mode !== undefined ? mode : 511; mode &= 511 | 512; mode |= 16384; return FS.mknod(path, mode, 0) }, mkdirTree: function (path, mode) { var dirs = path.split("/"); var d = ""; for (var i = 0; i < dirs.length; ++i) { if (!dirs[i]) continue; d += "/" + dirs[i]; try { FS.mkdir(d, mode) } catch (e) { if (e.errno != 20) throw e } } }, mkdev: function (path, mode, dev) { if (typeof dev === "undefined") { dev = mode; mode = 438 } mode |= 8192; return FS.mknod(path, mode, dev) }, symlink: function (oldpath, newpath) { if (!PATH_FS.resolve(oldpath)) { throw new FS.ErrnoError(44) } var lookup = FS.lookupPath(newpath, { parent: true }); var parent = lookup.node; if (!parent) { throw new FS.ErrnoError(44) } var newname = PATH.basename(newpath); var errCode = FS.mayCreate(parent, newname); if (errCode) { throw new FS.ErrnoError(errCode) } if (!parent.node_ops.symlink) { throw new FS.ErrnoError(63) } return parent.node_ops.symlink(parent, newname, oldpath) }, rename: function (old_path, new_path) { var old_dirname = PATH.dirname(old_path); var new_dirname = PATH.dirname(new_path); var old_name = PATH.basename(old_path); var new_name = PATH.basename(new_path); var lookup, old_dir, new_dir; lookup = FS.lookupPath(old_path, { parent: true }); old_dir = lookup.node; lookup = FS.lookupPath(new_path, { parent: true }); new_dir = lookup.node; if (!old_dir || !new_dir) throw new FS.ErrnoError(44); if (old_dir.mount !== new_dir.mount) { throw new FS.ErrnoError(75) } var old_node = FS.lookupNode(old_dir, old_name); var relative = PATH_FS.relative(old_path, new_dirname); if (relative.charAt(0) !== ".") { throw new FS.ErrnoError(28) } relative = PATH_FS.relative(new_path, old_dirname); if (relative.charAt(0) !== ".") { throw new FS.ErrnoError(55) } var new_node; try { new_node = FS.lookupNode(new_dir, new_name) } catch (e) { } if (old_node === new_node) { return } var isdir = FS.isDir(old_node.mode); var errCode = FS.mayDelete(old_dir, old_name, isdir); if (errCode) { throw new FS.ErrnoError(errCode) } errCode = new_node ? FS.mayDelete(new_dir, new_name, isdir) : FS.mayCreate(new_dir, new_name); if (errCode) { throw new FS.ErrnoError(errCode) } if (!old_dir.node_ops.rename) { throw new FS.ErrnoError(63) } if (FS.isMountpoint(old_node) || new_node && FS.isMountpoint(new_node)) { throw new FS.ErrnoError(10) } if (new_dir !== old_dir) { errCode = FS.nodePermissions(old_dir, "w"); if (errCode) { throw new FS.ErrnoError(errCode) } } FS.hashRemoveNode(old_node); try { old_dir.node_ops.rename(old_node, new_dir, new_name) } catch (e) { throw e } finally { FS.hashAddNode(old_node) } }, rmdir: function (path) { var lookup = FS.lookupPath(path, { parent: true }); var parent = lookup.node; var name = PATH.basename(path); var node = FS.lookupNode(parent, name); var errCode = FS.mayDelete(parent, name, true); if (errCode) { throw new FS.ErrnoError(errCode) } if (!parent.node_ops.rmdir) { throw new FS.ErrnoError(63) } if (FS.isMountpoint(node)) { throw new FS.ErrnoError(10) } parent.node_ops.rmdir(parent, name); FS.destroyNode(node) }, readdir: function (path) { var lookup = FS.lookupPath(path, { follow: true }); var node = lookup.node; if (!node.node_ops.readdir) { throw new FS.ErrnoError(54) } return node.node_ops.readdir(node) }, unlink: function (path) { var lookup = FS.lookupPath(path, { parent: true }); var parent = lookup.node; var name = PATH.basename(path); var node = FS.lookupNode(parent, name); var errCode = FS.mayDelete(parent, name, false); if (errCode) { throw new FS.ErrnoError(errCode) } if (!parent.node_ops.unlink) { throw new FS.ErrnoError(63) } if (FS.isMountpoint(node)) { throw new FS.ErrnoError(10) } parent.node_ops.unlink(parent, name); FS.destroyNode(node) }, readlink: function (path) { var lookup = FS.lookupPath(path); var link = lookup.node; if (!link) { throw new FS.ErrnoError(44) } if (!link.node_ops.readlink) { throw new FS.ErrnoError(28) } return PATH_FS.resolve(FS.getPath(link.parent), link.node_ops.readlink(link)) }, stat: function (path, dontFollow) { var lookup = FS.lookupPath(path, { follow: !dontFollow }); var node = lookup.node; if (!node) { throw new FS.ErrnoError(44) } if (!node.node_ops.getattr) { throw new FS.ErrnoError(63) } return node.node_ops.getattr(node) }, lstat: function (path) { return FS.stat(path, true) }, chmod: function (path, mode, dontFollow) { var node; if (typeof path === "string") { var lookup = FS.lookupPath(path, { follow: !dontFollow }); node = lookup.node } else { node = path } if (!node.node_ops.setattr) { throw new FS.ErrnoError(63) } node.node_ops.setattr(node, { mode: mode & 4095 | node.mode & ~4095, timestamp: Date.now() }) }, lchmod: function (path, mode) { FS.chmod(path, mode, true) }, fchmod: function (fd, mode) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(8) } FS.chmod(stream.node, mode) }, chown: function (path, uid, gid, dontFollow) { var node; if (typeof path === "string") { var lookup = FS.lookupPath(path, { follow: !dontFollow }); node = lookup.node } else { node = path } if (!node.node_ops.setattr) { throw new FS.ErrnoError(63) } node.node_ops.setattr(node, { timestamp: Date.now() }) }, lchown: function (path, uid, gid) { FS.chown(path, uid, gid, true) }, fchown: function (fd, uid, gid) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(8) } FS.chown(stream.node, uid, gid) }, truncate: function (path, len) { if (len < 0) { throw new FS.ErrnoError(28) } var node; if (typeof path === "string") { var lookup = FS.lookupPath(path, { follow: true }); node = lookup.node } else { node = path } if (!node.node_ops.setattr) { throw new FS.ErrnoError(63) } if (FS.isDir(node.mode)) { throw new FS.ErrnoError(31) } if (!FS.isFile(node.mode)) { throw new FS.ErrnoError(28) } var errCode = FS.nodePermissions(node, "w"); if (errCode) { throw new FS.ErrnoError(errCode) } node.node_ops.setattr(node, { size: len, timestamp: Date.now() }) }, ftruncate: function (fd, len) { var stream = FS.getStream(fd); if (!stream) { throw new FS.ErrnoError(8) } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(28) } FS.truncate(stream.node, len) }, utime: function (path, atime, mtime) { var lookup = FS.lookupPath(path, { follow: true }); var node = lookup.node; node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) }) }, open: function (path, flags, mode, fd_start, fd_end) { if (path === "") { throw new FS.ErrnoError(44) } flags = typeof flags === "string" ? FS.modeStringToFlags(flags) : flags; mode = typeof mode === "undefined" ? 438 : mode; if (flags & 64) { mode = mode & 4095 | 32768 } else { mode = 0 } var node; if (typeof path === "object") { node = path } else { path = PATH.normalize(path); try { var lookup = FS.lookupPath(path, { follow: !(flags & 131072) }); node = lookup.node } catch (e) { } } var created = false; if (flags & 64) { if (node) { if (flags & 128) { throw new FS.ErrnoError(20) } } else { node = FS.mknod(path, mode, 0); created = true } } if (!node) { throw new FS.ErrnoError(44) } if (FS.isChrdev(node.mode)) { flags &= ~512 } if (flags & 65536 && !FS.isDir(node.mode)) { throw new FS.ErrnoError(54) } if (!created) { var errCode = FS.mayOpen(node, flags); if (errCode) { throw new FS.ErrnoError(errCode) } } if (flags & 512) { FS.truncate(node, 0) } flags &= ~(128 | 512 | 131072); var stream = FS.createStream({ node: node, path: FS.getPath(node), id: node.id, flags: flags, mode: node.mode, seekable: true, position: 0, stream_ops: node.stream_ops, node_ops: node.node_ops, ungotten: [], error: false }, fd_start, fd_end); if (stream.stream_ops.open) { stream.stream_ops.open(stream) } if (Module["logReadFiles"] && !(flags & 1)) { if (!FS.readFiles) FS.readFiles = {}; if (!(path in FS.readFiles)) { FS.readFiles[path] = 1 } } return stream }, close: function (stream) { if (FS.isClosed(stream)) { throw new FS.ErrnoError(8) } if (stream.getdents) stream.getdents = null; try { if (stream.stream_ops.close) { stream.stream_ops.close(stream) } } catch (e) { throw e } finally { FS.closeStream(stream.fd) } stream.fd = null }, isClosed: function (stream) { return stream.fd === null }, llseek: function (stream, offset, whence) { if (FS.isClosed(stream)) { throw new FS.ErrnoError(8) } if (!stream.seekable || !stream.stream_ops.llseek) { throw new FS.ErrnoError(70) } if (whence != 0 && whence != 1 && whence != 2) { throw new FS.ErrnoError(28) } stream.position = stream.stream_ops.llseek(stream, offset, whence); stream.ungotten = []; return stream.position }, read: function (stream, buffer, offset, length, position) { if (length < 0 || position < 0) { throw new FS.ErrnoError(28) } if (FS.isClosed(stream)) { throw new FS.ErrnoError(8) } if ((stream.flags & 2097155) === 1) { throw new FS.ErrnoError(8) } if (FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(31) } if (!stream.stream_ops.read) { throw new FS.ErrnoError(28) } var seeking = typeof position !== "undefined"; if (!seeking) { position = stream.position } else if (!stream.seekable) { throw new FS.ErrnoError(70) } var bytesRead = stream.stream_ops.read(stream, buffer, offset, length, position); if (!seeking) stream.position += bytesRead; return bytesRead }, write: function (stream, buffer, offset, length, position, canOwn) { if (length < 0 || position < 0) { throw new FS.ErrnoError(28) } if (FS.isClosed(stream)) { throw new FS.ErrnoError(8) } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(8) } if (FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(31) } if (!stream.stream_ops.write) { throw new FS.ErrnoError(28) } if (stream.seekable && stream.flags & 1024) { FS.llseek(stream, 0, 2) } var seeking = typeof position !== "undefined"; if (!seeking) { position = stream.position } else if (!stream.seekable) { throw new FS.ErrnoError(70) } var bytesWritten = stream.stream_ops.write(stream, buffer, offset, length, position, canOwn); if (!seeking) stream.position += bytesWritten; return bytesWritten }, allocate: function (stream, offset, length) { if (FS.isClosed(stream)) { throw new FS.ErrnoError(8) } if (offset < 0 || length <= 0) { throw new FS.ErrnoError(28) } if ((stream.flags & 2097155) === 0) { throw new FS.ErrnoError(8) } if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) { throw new FS.ErrnoError(43) } if (!stream.stream_ops.allocate) { throw new FS.ErrnoError(138) } stream.stream_ops.allocate(stream, offset, length) }, mmap: function (stream, address, length, position, prot, flags) { if ((prot & 2) !== 0 && (flags & 2) === 0 && (stream.flags & 2097155) !== 2) { throw new FS.ErrnoError(2) } if ((stream.flags & 2097155) === 1) { throw new FS.ErrnoError(2) } if (!stream.stream_ops.mmap) { throw new FS.ErrnoError(43) } return stream.stream_ops.mmap(stream, address, length, position, prot, flags) }, msync: function (stream, buffer, offset, length, mmapFlags) { if (!stream || !stream.stream_ops.msync) { return 0 } return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags) }, munmap: function (stream) { return 0 }, ioctl: function (stream, cmd, arg) { if (!stream.stream_ops.ioctl) { throw new FS.ErrnoError(59) } return stream.stream_ops.ioctl(stream, cmd, arg) }, readFile: function (path, opts) { opts = opts || {}; opts.flags = opts.flags || 0; opts.encoding = opts.encoding || "binary"; if (opts.encoding !== "utf8" && opts.encoding !== "binary") { throw new Error('Invalid encoding type "' + opts.encoding + '"') } var ret; var stream = FS.open(path, opts.flags); var stat = FS.stat(path); var length = stat.size; var buf = new Uint8Array(length); FS.read(stream, buf, 0, length, 0); if (opts.encoding === "utf8") { ret = UTF8ArrayToString(buf, 0) } else if (opts.encoding === "binary") { ret = buf } FS.close(stream); return ret }, writeFile: function (path, data, opts) { opts = opts || {}; opts.flags = opts.flags || 577; var stream = FS.open(path, opts.flags, opts.mode); if (typeof data === "string") { var buf = new Uint8Array(lengthBytesUTF8(data) + 1); var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length); FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn) } else if (ArrayBuffer.isView(data)) { FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn) } else { throw new Error("Unsupported data type") } FS.close(stream) }, cwd: function () { return FS.currentPath }, chdir: function (path) { var lookup = FS.lookupPath(path, { follow: true }); if (lookup.node === null) { throw new FS.ErrnoError(44) } if (!FS.isDir(lookup.node.mode)) { throw new FS.ErrnoError(54) } var errCode = FS.nodePermissions(lookup.node, "x"); if (errCode) { throw new FS.ErrnoError(errCode) } FS.currentPath = lookup.path }, createDefaultDirectories: function () { FS.mkdir("/tmp"); FS.mkdir("/home"); FS.mkdir("/home/web_user") }, createDefaultDevices: function () { FS.mkdir("/dev"); FS.registerDevice(FS.makedev(1, 3), { read: function () { return 0 }, write: function (stream, buffer, offset, length, pos) { return length } }); FS.mkdev("/dev/null", FS.makedev(1, 3)); TTY.register(FS.makedev(5, 0), TTY.default_tty_ops); TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops); FS.mkdev("/dev/tty", FS.makedev(5, 0)); FS.mkdev("/dev/tty1", FS.makedev(6, 0)); var random_device = getRandomDevice(); FS.createDevice("/dev", "random", random_device); FS.createDevice("/dev", "urandom", random_device); FS.mkdir("/dev/shm"); FS.mkdir("/dev/shm/tmp") }, createSpecialDirectories: function () { FS.mkdir("/proc"); var proc_self = FS.mkdir("/proc/self"); FS.mkdir("/proc/self/fd"); FS.mount({ mount: function () { var node = FS.createNode(proc_self, "fd", 16384 | 511, 73); node.node_ops = { lookup: function (parent, name) { var fd = +name; var stream = FS.getStream(fd); if (!stream) throw new FS.ErrnoError(8); var ret = { parent: null, mount: { mountpoint: "fake" }, node_ops: { readlink: function () { return stream.path } } }; ret.parent = ret; return ret } }; return node } }, {}, "/proc/self/fd") }, createStandardStreams: function () { if (Module["stdin"]) { FS.createDevice("/dev", "stdin", Module["stdin"]) } else { FS.symlink("/dev/tty", "/dev/stdin") } if (Module["stdout"]) { FS.createDevice("/dev", "stdout", null, Module["stdout"]) } else { FS.symlink("/dev/tty", "/dev/stdout") } if (Module["stderr"]) { FS.createDevice("/dev", "stderr", null, Module["stderr"]) } else { FS.symlink("/dev/tty1", "/dev/stderr") } var stdin = FS.open("/dev/stdin", 0); var stdout = FS.open("/dev/stdout", 1); var stderr = FS.open("/dev/stderr", 1) }, ensureErrnoError: function () { if (FS.ErrnoError) return; FS.ErrnoError = function ErrnoError(errno, node) { this.node = node; this.setErrno = function (errno) { this.errno = errno }; this.setErrno(errno); this.message = "FS error" }; FS.ErrnoError.prototype = new Error; FS.ErrnoError.prototype.constructor = FS.ErrnoError;[44].forEach(function (code) { FS.genericErrors[code] = new FS.ErrnoError(code); FS.genericErrors[code].stack = "<generic error, no stack>" }) }, staticInit: function () { FS.ensureErrnoError(); FS.nameTable = new Array(4096); FS.mount(MEMFS, {}, "/"); FS.createDefaultDirectories(); FS.createDefaultDevices(); FS.createSpecialDirectories(); FS.filesystems = { "MEMFS": MEMFS } }, init: function (input, output, error) { FS.init.initialized = true; FS.ensureErrnoError(); Module["stdin"] = input || Module["stdin"]; Module["stdout"] = output || Module["stdout"]; Module["stderr"] = error || Module["stderr"]; FS.createStandardStreams() }, quit: function () { FS.init.initialized = false; var fflush = Module["_fflush"]; if (fflush) fflush(0); for (var i = 0; i < FS.streams.length; i++) { var stream = FS.streams[i]; if (!stream) { continue } FS.close(stream) } }, getMode: function (canRead, canWrite) { var mode = 0; if (canRead) mode |= 292 | 73; if (canWrite) mode |= 146; return mode }, findObject: function (path, dontResolveLastLink) { var ret = FS.analyzePath(path, dontResolveLastLink); if (ret.exists) { return ret.object } else { return null } }, analyzePath: function (path, dontResolveLastLink) { try { var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); path = lookup.path } catch (e) { } var ret = { isRoot: false, exists: false, error: 0, name: null, path: null, object: null, parentExists: false, parentPath: null, parentObject: null }; try { var lookup = FS.lookupPath(path, { parent: true }); ret.parentExists = true; ret.parentPath = lookup.path; ret.parentObject = lookup.node; ret.name = PATH.basename(path); lookup = FS.lookupPath(path, { follow: !dontResolveLastLink }); ret.exists = true; ret.path = lookup.path; ret.object = lookup.node; ret.name = lookup.node.name; ret.isRoot = lookup.path === "/" } catch (e) { ret.error = e.errno } return ret }, createPath: function (parent, path, canRead, canWrite) { parent = typeof parent === "string" ? parent : FS.getPath(parent); var parts = path.split("/").reverse(); while (parts.length) { var part = parts.pop(); if (!part) continue; var current = PATH.join2(parent, part); try { FS.mkdir(current) } catch (e) { } parent = current } return current }, createFile: function (parent, name, properties, canRead, canWrite) { var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name); var mode = FS.getMode(canRead, canWrite); return FS.create(path, mode) }, createDataFile: function (parent, name, data, canRead, canWrite, canOwn) { var path = name ? PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name) : parent; var mode = FS.getMode(canRead, canWrite); var node = FS.create(path, mode); if (data) { if (typeof data === "string") { var arr = new Array(data.length); for (var i = 0, len = data.length; i < len; ++i)arr[i] = data.charCodeAt(i); data = arr } FS.chmod(node, mode | 146); var stream = FS.open(node, 577); FS.write(stream, data, 0, data.length, 0, canOwn); FS.close(stream); FS.chmod(node, mode) } return node }, createDevice: function (parent, name, input, output) { var path = PATH.join2(typeof parent === "string" ? parent : FS.getPath(parent), name); var mode = FS.getMode(!!input, !!output); if (!FS.createDevice.major) FS.createDevice.major = 64; var dev = FS.makedev(FS.createDevice.major++, 0); FS.registerDevice(dev, { open: function (stream) { stream.seekable = false }, close: function (stream) { if (output && output.buffer && output.buffer.length) { output(10) } }, read: function (stream, buffer, offset, length, pos) { var bytesRead = 0; for (var i = 0; i < length; i++) { var result; try { result = input() } catch (e) { throw new FS.ErrnoError(29) } if (result === undefined && bytesRead === 0) { throw new FS.ErrnoError(6) } if (result === null || result === undefined) break; bytesRead++; buffer[offset + i] = result } if (bytesRead) { stream.node.timestamp = Date.now() } return bytesRead }, write: function (stream, buffer, offset, length, pos) { for (var i = 0; i < length; i++) { try { output(buffer[offset + i]) } catch (e) { throw new FS.ErrnoError(29) } } if (length) { stream.node.timestamp = Date.now() } return i } }); return FS.mkdev(path, mode, dev) }, forceLoadFile: function (obj) { if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true; if (typeof XMLHttpRequest !== "undefined") { throw new Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.") } else if (read_) { try { obj.contents = intArrayFromString(read_(obj.url), true); obj.usedBytes = obj.contents.length } catch (e) { throw new FS.ErrnoError(29) } } else { throw new Error("Cannot load without read() or XMLHttpRequest.") } }, createLazyFile: function (parent, name, url, canRead, canWrite) { function LazyUint8Array() { this.lengthKnown = false; this.chunks = [] } LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) { if (idx > this.length - 1 || idx < 0) { return undefined } var chunkOffset = idx % this.chunkSize; var chunkNum = idx / this.chunkSize | 0; return this.getter(chunkNum)[chunkOffset] }; LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(getter) { this.getter = getter }; LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() { var xhr = new XMLHttpRequest; xhr.open("HEAD", url, false); xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); var datalength = Number(xhr.getResponseHeader("Content-length")); var header; var hasByteServing = (header = xhr.getResponseHeader("Accept-Ranges")) && header === "bytes"; var usesGzip = (header = xhr.getResponseHeader("Content-Encoding")) && header === "gzip"; var chunkSize = 1024 * 1024; if (!hasByteServing) chunkSize = datalength; var doXHR = function (from, to) { if (from > to) throw new Error("invalid range (" + from + ", " + to + ") or no bytes requested!"); if (to > datalength - 1) throw new Error("only " + datalength + " bytes available! programmer error!"); var xhr = new XMLHttpRequest; xhr.open("GET", url, false); if (datalength !== chunkSize) xhr.setRequestHeader("Range", "bytes=" + from + "-" + to); if (typeof Uint8Array != "undefined") xhr.responseType = "arraybuffer"; if (xhr.overrideMimeType) { xhr.overrideMimeType("text/plain; charset=x-user-defined") } xhr.send(null); if (!(xhr.status >= 200 && xhr.status < 300 || xhr.status === 304)) throw new Error("Couldn't load " + url + ". Status: " + xhr.status); if (xhr.response !== undefined) { return new Uint8Array(xhr.response || []) } else { return intArrayFromString(xhr.responseText || "", true) } }; var lazyArray = this; lazyArray.setDataGetter(function (chunkNum) { var start = chunkNum * chunkSize; var end = (chunkNum + 1) * chunkSize - 1; end = Math.min(end, datalength - 1); if (typeof lazyArray.chunks[chunkNum] === "undefined") { lazyArray.chunks[chunkNum] = doXHR(start, end) } if (typeof lazyArray.chunks[chunkNum] === "undefined") throw new Error("doXHR failed!"); return lazyArray.chunks[chunkNum] }); if (usesGzip || !datalength) { chunkSize = datalength = 1; datalength = this.getter(0).length; chunkSize = datalength; out("LazyFiles on gzip forces download of the whole file when length is accessed") } this._length = datalength; this._chunkSize = chunkSize; this.lengthKnown = true }; if (typeof XMLHttpRequest !== "undefined") { if (!ENVIRONMENT_IS_WORKER) throw "Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc"; var lazyArray = new LazyUint8Array; Object.defineProperties(lazyArray, { length: { get: function () { if (!this.lengthKnown) { this.cacheLength() } return this._length } }, chunkSize: { get: function () { if (!this.lengthKnown) { this.cacheLength() } return this._chunkSize } } }); var properties = { isDevice: false, contents: lazyArray } } else { var properties = { isDevice: false, url: url } } var node = FS.createFile(parent, name, properties, canRead, canWrite); if (properties.contents) { node.contents = properties.contents } else if (properties.url) { node.contents = null; node.url = properties.url } Object.defineProperties(node, { usedBytes: { get: function () { return this.contents.length } } }); var stream_ops = {}; var keys = Object.keys(node.stream_ops); keys.forEach(function (key) { var fn = node.stream_ops[key]; stream_ops[key] = function forceLoadLazyFile() { FS.forceLoadFile(node); return fn.apply(null, arguments) } }); stream_ops.read = function stream_ops_read(stream, buffer, offset, length, position) { FS.forceLoadFile(node); var contents = stream.node.contents; if (position >= contents.length) return 0; var size = Math.min(contents.length - position, length); if (contents.slice) { for (var i = 0; i < size; i++) { buffer[offset + i] = contents[position + i] } } else { for (var i = 0; i < size; i++) { buffer[offset + i] = contents.get(position + i) } } return size }; node.stream_ops = stream_ops; return node }, createPreloadedFile: function (parent, name, url, canRead, canWrite, onload, onerror, dontCreateFile, canOwn, preFinish) { Browser.init(); var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent; var dep = getUniqueRunDependency("cp " + fullname); function processData(byteArray) { function finish(byteArray) { if (preFinish) preFinish(); if (!dontCreateFile) { FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn) } if (onload) onload(); removeRunDependency(dep) } var handled = false; Module["preloadPlugins"].forEach(function (plugin) { if (handled) return; if (plugin["canHandle"](fullname)) { plugin["handle"](byteArray, fullname, finish, function () { if (onerror) onerror(); removeRunDependency(dep) }); handled = true } }); if (!handled) finish(byteArray) } addRunDependency(dep); if (typeof url == "string") { asyncLoad(url, function (byteArray) { processData(byteArray) }, onerror) } else { processData(url) } }, indexedDB: function () { return window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB || window.msIndexedDB }, DB_NAME: function () { return "EM_FS_" + window.location.pathname }, DB_VERSION: 20, DB_STORE_NAME: "FILE_DATA", saveFilesToDB: function (paths, onload, onerror) { onload = onload || function () { }; onerror = onerror || function () { }; var indexedDB = FS.indexedDB(); try { var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION) } catch (e) { return onerror(e) } openRequest.onupgradeneeded = function openRequest_onupgradeneeded() { out("creating db"); var db = openRequest.result; db.createObjectStore(FS.DB_STORE_NAME) }; openRequest.onsuccess = function openRequest_onsuccess() { var db = openRequest.result; var transaction = db.transaction([FS.DB_STORE_NAME], "readwrite"); var files = transaction.objectStore(FS.DB_STORE_NAME); var ok = 0, fail = 0, total = paths.length; function finish() { if (fail == 0) onload(); else onerror() } paths.forEach(function (path) { var putRequest = files.put(FS.analyzePath(path).object.contents, path); putRequest.onsuccess = function putRequest_onsuccess() { ok++; if (ok + fail == total) finish() }; putRequest.onerror = function putRequest_onerror() { fail++; if (ok + fail == total) finish() } }); transaction.onerror = onerror }; openRequest.onerror = onerror }, loadFilesFromDB: function (paths, onload, onerror) { onload = onload || function () { }; onerror = onerror || function () { }; var indexedDB = FS.indexedDB(); try { var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION) } catch (e) { return onerror(e) } openRequest.onupgradeneeded = onerror; openRequest.onsuccess = function openRequest_onsuccess() { var db = openRequest.result; try { var transaction = db.transaction([FS.DB_STORE_NAME], "readonly") } catch (e) { onerror(e); return } var files = transaction.objectStore(FS.DB_STORE_NAME); var ok = 0, fail = 0, total = paths.length; function finish() { if (fail == 0) onload(); else onerror() } paths.forEach(function (path) { var getRequest = files.get(path); getRequest.onsuccess = function getRequest_onsuccess() { if (FS.analyzePath(path).exists) { FS.unlink(path) } FS.createDataFile(PATH.dirname(path), PATH.basename(path), getRequest.result, true, true, true); ok++; if (ok + fail == total) finish() }; getRequest.onerror = function getRequest_onerror() { fail++; if (ok + fail == total) finish() } }); transaction.onerror = onerror }; openRequest.onerror = onerror } }; var SYSCALLS = { mappings: {}, DEFAULT_POLLMASK: 5, calculateAt: function (dirfd, path, allowEmpty) { if (path[0] === "/") { return path } var dir; if (dirfd === -100) { dir = FS.cwd() } else { var dirstream = FS.getStream(dirfd); if (!dirstream) throw new FS.ErrnoError(8); dir = dirstream.path } if (path.length == 0) { if (!allowEmpty) { throw new FS.ErrnoError(44) } return dir } return PATH.join2(dir, path) }, doStat: function (func, path, buf) { try { var stat = func(path) } catch (e) { if (e && e.node && PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))) { return -54 } throw e } HEAP32[buf >> 2] = stat.dev; HEAP32[buf + 4 >> 2] = 0; HEAP32[buf + 8 >> 2] = stat.ino; HEAP32[buf + 12 >> 2] = stat.mode; HEAP32[buf + 16 >> 2] = stat.nlink; HEAP32[buf + 20 >> 2] = stat.uid; HEAP32[buf + 24 >> 2] = stat.gid; HEAP32[buf + 28 >> 2] = stat.rdev; HEAP32[buf + 32 >> 2] = 0; tempI64 = [stat.size >>> 0, (tempDouble = stat.size, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[buf + 40 >> 2] = tempI64[0], HEAP32[buf + 44 >> 2] = tempI64[1]; HEAP32[buf + 48 >> 2] = 4096; HEAP32[buf + 52 >> 2] = stat.blocks; HEAP32[buf + 56 >> 2] = stat.atime.getTime() / 1e3 | 0; HEAP32[buf + 60 >> 2] = 0; HEAP32[buf + 64 >> 2] = stat.mtime.getTime() / 1e3 | 0; HEAP32[buf + 68 >> 2] = 0; HEAP32[buf + 72 >> 2] = stat.ctime.getTime() / 1e3 | 0; HEAP32[buf + 76 >> 2] = 0; tempI64 = [stat.ino >>> 0, (tempDouble = stat.ino, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[buf + 80 >> 2] = tempI64[0], HEAP32[buf + 84 >> 2] = tempI64[1]; return 0 }, doMsync: function (addr, stream, len, flags, offset) { var buffer = HEAPU8.slice(addr, addr + len); FS.msync(stream, buffer, offset, len, flags) }, doMkdir: function (path, mode) { path = PATH.normalize(path); if (path[path.length - 1] === "/") path = path.substr(0, path.length - 1); FS.mkdir(path, mode, 0); return 0 }, doMknod: function (path, mode, dev) { switch (mode & 61440) { case 32768: case 8192: case 24576: case 4096: case 49152: break; default: return -28 }FS.mknod(path, mode, dev); return 0 }, doReadlink: function (path, buf, bufsize) { if (bufsize <= 0) return -28; var ret = FS.readlink(path); var len = Math.min(bufsize, lengthBytesUTF8(ret)); var endChar = HEAP8[buf + len]; stringToUTF8(ret, buf, bufsize + 1); HEAP8[buf + len] = endChar; return len }, doAccess: function (path, amode) { if (amode & ~7) { return -28 } var node; var lookup = FS.lookupPath(path, { follow: true }); node = lookup.node; if (!node) { return -44 } var perms = ""; if (amode & 4) perms += "r"; if (amode & 2) perms += "w"; if (amode & 1) perms += "x"; if (perms && FS.nodePermissions(node, perms)) { return -2 } return 0 }, doDup: function (path, flags, suggestFD) { var suggest = FS.getStream(suggestFD); if (suggest) FS.close(suggest); return FS.open(path, flags, 0, suggestFD, suggestFD).fd }, doReadv: function (stream, iov, iovcnt, offset) { var ret = 0; for (var i = 0; i < iovcnt; i++) { var ptr = HEAP32[iov + i * 8 >> 2]; var len = HEAP32[iov + (i * 8 + 4) >> 2]; var curr = FS.read(stream, HEAP8, ptr, len, offset); if (curr < 0) return -1; ret += curr; if (curr < len) break } return ret }, doWritev: function (stream, iov, iovcnt, offset) { var ret = 0; for (var i = 0; i < iovcnt; i++) { var ptr = HEAP32[iov + i * 8 >> 2]; var len = HEAP32[iov + (i * 8 + 4) >> 2]; var curr = FS.write(stream, HEAP8, ptr, len, offset); if (curr < 0) return -1; ret += curr } return ret }, varargs: undefined, get: function () { SYSCALLS.varargs += 4; var ret = HEAP32[SYSCALLS.varargs - 4 >> 2]; return ret }, getStr: function (ptr) { var ret = UTF8ToString(ptr); return ret }, getStreamFromFD: function (fd) { var stream = FS.getStream(fd); if (!stream) throw new FS.ErrnoError(8); return stream }, get64: function (low, high) { return low } }; function ___syscall_fcntl64(fd, cmd, varargs) { SYSCALLS.varargs = varargs; try { var stream = SYSCALLS.getStreamFromFD(fd); switch (cmd) { case 0: { var arg = SYSCALLS.get(); if (arg < 0) { return -28 } var newStream; newStream = FS.open(stream.path, stream.flags, 0, arg); return newStream.fd } case 1: case 2: return 0; case 3: return stream.flags; case 4: { var arg = SYSCALLS.get(); stream.flags |= arg; return 0 } case 12: { var arg = SYSCALLS.get(); var offset = 0; HEAP16[arg + offset >> 1] = 2; return 0 } case 13: case 14: return 0; case 16: case 8: return -28; case 9: setErrNo(28); return -1; default: { return -28 } } } catch (e) { if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno } } function ___syscall_ioctl(fd, op, varargs) { SYSCALLS.varargs = varargs; try { var stream = SYSCALLS.getStreamFromFD(fd); switch (op) { case 21509: case 21505: { if (!stream.tty) return -59; return 0 } case 21510: case 21511: case 21512: case 21506: case 21507: case 21508: { if (!stream.tty) return -59; return 0 } case 21519: { if (!stream.tty) return -59; var argp = SYSCALLS.get(); HEAP32[argp >> 2] = 0; return 0 } case 21520: { if (!stream.tty) return -59; return -28 } case 21531: { var argp = SYSCALLS.get(); return FS.ioctl(stream, op, argp) } case 21523: { if (!stream.tty) return -59; return 0 } case 21524: { if (!stream.tty) return -59; return 0 } default: abort("bad ioctl syscall " + op) } } catch (e) { if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno } } function ___syscall_open(path, flags, varargs) { SYSCALLS.varargs = varargs; try { var pathname = SYSCALLS.getStr(path); var mode = varargs ? SYSCALLS.get() : 0; var stream = FS.open(pathname, flags, mode); return stream.fd } catch (e) { if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e); return -e.errno } } function _abort() { abort("") } function _emscripten_memcpy_big(dest, src, num) { HEAPU8.copyWithin(dest, src, src + num) } function abortOnCannotGrowMemory(requestedSize) { abort("OOM") } function _emscripten_resize_heap(requestedSize) { var oldSize = HEAPU8.length; requestedSize = requestedSize >>> 0; abortOnCannotGrowMemory(requestedSize) } var ENV = {}; function getExecutableName() { return thisProgram || "./this.program" } function getEnvStrings() { if (!getEnvStrings.strings) { var lang = (typeof navigator === "object" && navigator.languages && navigator.languages[0] || "C").replace("-", "_") + ".UTF-8"; var env = { "USER": "web_user", "LOGNAME": "web_user", "PATH": "/", "PWD": "/", "HOME": "/home/web_user", "LANG": lang, "_": getExecutableName() }; for (var x in ENV) { 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 } function _environ_get(__environ, environ_buf) { var bufSize = 0; getEnvStrings().forEach(function (string, i) { var ptr = environ_buf + bufSize; HEAP32[__environ + i * 4 >> 2] = ptr; writeAsciiToMemory(string, ptr); bufSize += string.length + 1 }); return 0 } function _environ_sizes_get(penviron_count, penviron_buf_size) { var strings = getEnvStrings(); HEAP32[penviron_count >> 2] = strings.length; var bufSize = 0; strings.forEach(function (string) { bufSize += string.length + 1 }); HEAP32[penviron_buf_size >> 2] = bufSize; return 0 } function _fd_close(fd) { try { var stream = SYSCALLS.getStreamFromFD(fd); FS.close(stream); return 0 } catch (e) { if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e); return e.errno } } function _fd_read(fd, iov, iovcnt, pnum) { try { var stream = SYSCALLS.getStreamFromFD(fd); var num = SYSCALLS.doReadv(stream, iov, iovcnt); HEAP32[pnum >> 2] = num; return 0 } catch (e) { if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e); return e.errno } } function _fd_seek(fd, offset_low, offset_high, whence, newOffset) { try { var stream = SYSCALLS.getStreamFromFD(fd); var HIGH_OFFSET = 4294967296; var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0); var DOUBLE_LIMIT = 9007199254740992; if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) { return -61 } FS.llseek(stream, offset, whence); tempI64 = [stream.position >>> 0, (tempDouble = stream.position, +Math.abs(tempDouble) >= 1 ? tempDouble > 0 ? (Math.min(+Math.floor(tempDouble / 4294967296), 4294967295) | 0) >>> 0 : ~~+Math.ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>> 0 : 0)], HEAP32[newOffset >> 2] = tempI64[0], HEAP32[newOffset + 4 >> 2] = tempI64[1]; if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null; return 0 } catch (e) { if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e); return e.errno } } function _fd_write(fd, iov, iovcnt, pnum) { try { var stream = SYSCALLS.getStreamFromFD(fd); var num = SYSCALLS.doWritev(stream, iov, iovcnt); HEAP32[pnum >> 2] = num; return 0 } catch (e) { if (typeof FS === "undefined" || !(e instanceof FS.ErrnoError)) abort(e); return e.errno } } function __isLeapYear(year) { return year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0) } function __arraySum(array, index) { var sum = 0; for (var i = 0; i <= index; sum += array[i++]) { } return sum } var __MONTH_DAYS_LEAP = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; var __MONTH_DAYS_REGULAR = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; function __addDays(date, days) { var newDate = new Date(date.getTime()); while (days > 0) { var leap = __isLeapYear(newDate.getFullYear()); var currentMonth = newDate.getMonth(); var daysInCurrentMonth = (leap ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR)[currentMonth]; if (days > daysInCurrentMonth - newDate.getDate()) { days -= daysInCurrentMonth - newDate.getDate() + 1; newDate.setDate(1); if (currentMonth < 11) { newDate.setMonth(currentMonth + 1) } else { newDate.setMonth(0); newDate.setFullYear(newDate.getFullYear() + 1) } } else { newDate.setDate(newDate.getDate() + days); return newDate } } return newDate } function _strftime(s, maxsize, format, tm) { var tm_zone = HEAP32[tm + 40 >> 2]; var date = { tm_sec: HEAP32[tm >> 2], tm_min: HEAP32[tm + 4 >> 2], tm_hour: HEAP32[tm + 8 >> 2], tm_mday: HEAP32[tm + 12 >> 2], tm_mon: HEAP32[tm + 16 >> 2], tm_year: HEAP32[tm + 20 >> 2], tm_wday: HEAP32[tm + 24 >> 2], tm_yday: HEAP32[tm + 28 >> 2], tm_isdst: HEAP32[tm + 32 >> 2], tm_gmtoff: HEAP32[tm + 36 >> 2], tm_zone: tm_zone ? UTF8ToString(tm_zone) : "" }; var pattern = UTF8ToString(format); var EXPANSION_RULES_1 = { "%c": "%a %b %d %H:%M:%S %Y", "%D": "%m/%d/%y", "%F": "%Y-%m-%d", "%h": "%b", "%r": "%I:%M:%S %p", "%R": "%H:%M", "%T": "%H:%M:%S", "%x": "%m/%d/%y", "%X": "%H:%M:%S", "%Ec": "%c", "%EC": "%C", "%Ex": "%m/%d/%y", "%EX": "%H:%M:%S", "%Ey": "%y", "%EY": "%Y", "%Od": "%d", "%Oe": "%e", "%OH": "%H", "%OI": "%I", "%Om": "%m", "%OM": "%M", "%OS": "%S", "%Ou": "%u", "%OU": "%U", "%OV": "%V", "%Ow": "%w", "%OW": "%W", "%Oy": "%y" }; for (var rule in EXPANSION_RULES_1) { pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_1[rule]) } var WEEKDAYS = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"]; var MONTHS = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; function leadingSomething(value, digits, character) { var str = typeof value === "number" ? value.toString() : value || ""; while (str.length < digits) { str = character[0] + str } return str } function leadingNulls(value, digits) { return leadingSomething(value, digits, "0") } function compareByDay(date1, date2) { function sgn(value) { return value < 0 ? -1 : value > 0 ? 1 : 0 } var compare; if ((compare = sgn(date1.getFullYear() - date2.getFullYear())) === 0) { if ((compare = sgn(date1.getMonth() - date2.getMonth())) === 0) { compare = sgn(date1.getDate() - date2.getDate()) } } return compare } function getFirstWeekStartDate(janFourth) { switch (janFourth.getDay()) { case 0: return new Date(janFourth.getFullYear() - 1, 11, 29); case 1: return janFourth; case 2: return new Date(janFourth.getFullYear(), 0, 3); case 3: return new Date(janFourth.getFullYear(), 0, 2); case 4: return new Date(janFourth.getFullYear(), 0, 1); case 5: return new Date(janFourth.getFullYear() - 1, 11, 31); case 6: return new Date(janFourth.getFullYear() - 1, 11, 30) } } function getWeekBasedYear(date) { var thisDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); var janFourthThisYear = new Date(thisDate.getFullYear(), 0, 4); var janFourthNextYear = new Date(thisDate.getFullYear() + 1, 0, 4); var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); if (compareByDay(firstWeekStartThisYear, thisDate) <= 0) { if (compareByDay(firstWeekStartNextYear, thisDate) <= 0) { return thisDate.getFullYear() + 1 } else { return thisDate.getFullYear() } } else { return thisDate.getFullYear() - 1 } } var EXPANSION_RULES_2 = { "%a": function (date) { return WEEKDAYS[date.tm_wday].substring(0, 3) }, "%A": function (date) { return WEEKDAYS[date.tm_wday] }, "%b": function (date) { return MONTHS[date.tm_mon].substring(0, 3) }, "%B": function (date) { return MONTHS[date.tm_mon] }, "%C": function (date) { var year = date.tm_year + 1900; return leadingNulls(year / 100 | 0, 2) }, "%d": function (date) { return leadingNulls(date.tm_mday, 2) }, "%e": function (date) { return leadingSomething(date.tm_mday, 2, " ") }, "%g": function (date) { return getWeekBasedYear(date).toString().substring(2) }, "%G": function (date) { return getWeekBasedYear(date) }, "%H": function (date) { return leadingNulls(date.tm_hour, 2) }, "%I": function (date) { var twelveHour = date.tm_hour; if (twelveHour == 0) twelveHour = 12; else if (twelveHour > 12) twelveHour -= 12; return leadingNulls(twelveHour, 2) }, "%j": function (date) { return leadingNulls(date.tm_mday + __arraySum(__isLeapYear(date.tm_year + 1900) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, date.tm_mon - 1), 3) }, "%m": function (date) { return leadingNulls(date.tm_mon + 1, 2) }, "%M": function (date) { return leadingNulls(date.tm_min, 2) }, "%n": function () { return "\n" }, "%p": function (date) { if (date.tm_hour >= 0 && date.tm_hour < 12) { return "AM" } else { return "PM" } }, "%S": function (date) { return leadingNulls(date.tm_sec, 2) }, "%t": function () { return "\t" }, "%u": function (date) { return date.tm_wday || 7 }, "%U": function (date) { var janFirst = new Date(date.tm_year + 1900, 0, 1); var firstSunday = janFirst.getDay() === 0 ? janFirst : __addDays(janFirst, 7 - janFirst.getDay()); var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday); if (compareByDay(firstSunday, endDate) < 0) { var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31; var firstSundayUntilEndJanuary = 31 - firstSunday.getDate(); var days = firstSundayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate(); return leadingNulls(Math.ceil(days / 7), 2) } return compareByDay(firstSunday, janFirst) === 0 ? "01" : "00" }, "%V": function (date) { var janFourthThisYear = new Date(date.tm_year + 1900, 0, 4); var janFourthNextYear = new Date(date.tm_year + 1901, 0, 4); var firstWeekStartThisYear = getFirstWeekStartDate(janFourthThisYear); var firstWeekStartNextYear = getFirstWeekStartDate(janFourthNextYear); var endDate = __addDays(new Date(date.tm_year + 1900, 0, 1), date.tm_yday); if (compareByDay(endDate, firstWeekStartThisYear) < 0) { return "53" } if (compareByDay(firstWeekStartNextYear, endDate) <= 0) { return "01" } var daysDifference; if (firstWeekStartThisYear.getFullYear() < date.tm_year + 1900) { daysDifference = date.tm_yday + 32 - firstWeekStartThisYear.getDate() } else { daysDifference = date.tm_yday + 1 - firstWeekStartThisYear.getDate() } return leadingNulls(Math.ceil(daysDifference / 7), 2) }, "%w": function (date) { return date.tm_wday }, "%W": function (date) { var janFirst = new Date(date.tm_year, 0, 1); var firstMonday = janFirst.getDay() === 1 ? janFirst : __addDays(janFirst, janFirst.getDay() === 0 ? 1 : 7 - janFirst.getDay() + 1); var endDate = new Date(date.tm_year + 1900, date.tm_mon, date.tm_mday); if (compareByDay(firstMonday, endDate) < 0) { var februaryFirstUntilEndMonth = __arraySum(__isLeapYear(endDate.getFullYear()) ? __MONTH_DAYS_LEAP : __MONTH_DAYS_REGULAR, endDate.getMonth() - 1) - 31; var firstMondayUntilEndJanuary = 31 - firstMonday.getDate(); var days = firstMondayUntilEndJanuary + februaryFirstUntilEndMonth + endDate.getDate(); return leadingNulls(Math.ceil(days / 7), 2) } return compareByDay(firstMonday, janFirst) === 0 ? "01" : "00" }, "%y": function (date) { return (date.tm_year + 1900).toString().substring(2) }, "%Y": function (date) { return date.tm_year + 1900 }, "%z": function (date) { var off = date.tm_gmtoff; var ahead = off >= 0; off = Math.abs(off) / 60; off = off / 60 * 100 + off % 60; return (ahead ? "+" : "-") + String("0000" + off).slice(-4) }, "%Z": function (date) { return date.tm_zone }, "%%": function () { return "%" } }; for (var rule in EXPANSION_RULES_2) { if (pattern.includes(rule)) { pattern = pattern.replace(new RegExp(rule, "g"), EXPANSION_RULES_2[rule](date)) } } var bytes = intArrayFromString(pattern, false); if (bytes.length > maxsize) { return 0 } writeArrayToMemory(bytes, s); return bytes.length - 1 } function _strftime_l(s, maxsize, format, tm) { return _strftime(s, maxsize, format, tm) } var FSNode = function (parent, name, mode, rdev) { if (!parent) { parent = this } this.parent = parent; this.mount = parent.mount; this.mounted = null; this.id = FS.nextInode++; this.name = name; this.mode = mode; this.node_ops = {}; this.stream_ops = {}; this.rdev = rdev }; var readMode = 292 | 73; var writeMode = 146; Object.defineProperties(FSNode.prototype, { read: { get: function () { return (this.mode & readMode) === readMode }, set: function (val) { val ? this.mode |= readMode : this.mode &= ~readMode } }, write: { get: function () { return (this.mode & writeMode) === writeMode }, set: function (val) { val ? this.mode |= writeMode : this.mode &= ~writeMode } }, isFolder: { get: function () { return FS.isDir(this.mode) } }, isDevice: { get: function () { return FS.isChrdev(this.mode) } } }); FS.FSNode = FSNode; FS.staticInit(); Module["FS_createPath"] = FS.createPath; Module["FS_createDataFile"] = FS.createDataFile; Module["FS_createPreloadedFile"] = FS.createPreloadedFile; Module["FS_createLazyFile"] = FS.createLazyFile; Module["FS_createDevice"] = FS.createDevice; Module["FS_unlink"] = FS.unlink; function intArrayFromString(stringy, dontAddNull, length) { var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1; var u8array = new Array(len); var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length); if (dontAddNull) u8array.length = numBytesWritten; return u8array } var asmLibraryArg = { "f": ___cxa_allocate_exception, "e": ___cxa_throw, "d": ___syscall_fcntl64, "i": ___syscall_ioctl, "j": ___syscall_open, "a": _abort, "l": _emscripten_memcpy_big, "m": _emscripten_resize_heap, "o": _environ_get, "g": _environ_sizes_get, "b": _fd_close, "h": _fd_read, "k": _fd_seek, "c": _fd_write, "n": _strftime_l }; var asm = createWasm(); var ___wasm_call_ctors = Module["___wasm_call_ctors"] = function () { return (___wasm_call_ctors = Module["___wasm_call_ctors"] = Module["asm"]["q"]).apply(null, arguments) }; var _run_simulation = Module["_run_simulation"] = function () { return (_run_simulation = Module["_run_simulation"] = Module["asm"]["s"]).apply(null, arguments) }; var ___errno_location = Module["___errno_location"] = function () { return (___errno_location = Module["___errno_location"] = Module["asm"]["t"]).apply(null, arguments) }; var stackSave = Module["stackSave"] = function () { return (stackSave = Module["stackSave"] = Module["asm"]["u"]).apply(null, arguments) }; var stackRestore = Module["stackRestore"] = function () { return (stackRestore = Module["stackRestore"] = Module["asm"]["v"]).apply(null, arguments) }; var stackAlloc = Module["stackAlloc"] = function () { return (stackAlloc = Module["stackAlloc"] = Module["asm"]["w"]).apply(null, arguments) }; var _malloc = Module["_malloc"] = function () { return (_malloc = Module["_malloc"] = Module["asm"]["x"]).apply(null, arguments) }; Module["ccall"] = ccall; Module["cwrap"] = cwrap; Module["addRunDependency"] = addRunDependency; Module["removeRunDependency"] = removeRunDependency; Module["FS_createPath"] = FS.createPath; Module["FS_createDataFile"] = FS.createDataFile; Module["FS_createPreloadedFile"] = FS.createPreloadedFile; Module["FS_createLazyFile"] = FS.createLazyFile; Module["FS_createDevice"] = FS.createDevice; Module["FS_unlink"] = FS.unlink; var calledRun; function ExitStatus(status) { this.name = "ExitStatus"; this.message = "Program terminated with exit(" + status + ")"; this.status = status } dependenciesFulfilled = function runCaller() { if (!calledRun) run(); if (!calledRun) dependenciesFulfilled = runCaller }; function run(args) { args = args || arguments_; if (runDependencies > 0) { return } preRun(); if (runDependencies > 0) { return } function doRun() { if (calledRun) return; calledRun = true; Module["calledRun"] = true; if (ABORT) return; initRuntime(); if (Module["onRuntimeInitialized"]) Module["onRuntimeInitialized"](); postRun() } if (Module["setStatus"]) { Module["setStatus"]("Running..."); setTimeout(function () { setTimeout(function () { Module["setStatus"]("") }, 1); doRun() }, 1) } else { doRun() } } Module["run"] = run; if (Module["preInit"]) { if (typeof Module["preInit"] == "function") Module["preInit"] = [Module["preInit"]]; while (Module["preInit"].length > 0) { Module["preInit"].pop()() } } run();