numbl 0.4.13 → 0.4.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +0 -4
- package/dist-browser/browser/index.d.ts +13 -4
- package/dist-browser/browser/protocol.d.ts +25 -1
- package/dist-browser/browser/session.d.ts +20 -10
- package/dist-browser/browser.js +26 -4
- package/dist-browser/numbl-core/version.d.ts +1 -1
- package/dist-browser/workerErrorFormat.d.ts +7 -0
- package/dist-cli/cli.js +31 -6
- package/dist-graphics/graphics-lib.d.ts +1 -0
- package/dist-graphics/index.js +33 -0
- package/dist-lib/lib.js +19 -1
- package/dist-lib/numbl-core/version.d.ts +1 -1
- package/dist-site-viewer/assets/{index-C2ItFYSf.js → index-CqtJ-i-7.js} +3 -3
- package/dist-site-viewer/assets/{numbl-worker-CtfdLxJh.js → numbl-worker-B-MPuV6f.js} +55 -37
- package/dist-site-viewer/index.html +1 -1
- package/package.json +1 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Numbl version, used for JIT disk cache invalidation. */
|
|
2
|
-
export declare const NUMBL_VERSION = "0.4.
|
|
2
|
+
export declare const NUMBL_VERSION = "0.4.14";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export declare function extractSnippetByLine(source: string, lineNumber: number, contextLines?: number, column?: number): string | null;
|
|
2
|
+
export declare function formatError(message: string, errorType: "syntax" | "semantic" | "runtime" | "unknown", line: number | null, snippet: string | null): string;
|
|
3
|
+
/** Format any error thrown by executeCode against the code that raised it. */
|
|
4
|
+
export declare function formatExecuteError(error: unknown, code: string): {
|
|
5
|
+
message: string;
|
|
6
|
+
cancelled: boolean;
|
|
7
|
+
};
|
package/dist-cli/cli.js
CHANGED
|
@@ -64277,7 +64277,7 @@ function getSourceLine(getSource, file, line) {
|
|
|
64277
64277
|
}
|
|
64278
64278
|
|
|
64279
64279
|
// src/numbl-core/version.ts
|
|
64280
|
-
var NUMBL_VERSION = "0.4.
|
|
64280
|
+
var NUMBL_VERSION = "0.4.14";
|
|
64281
64281
|
|
|
64282
64282
|
// src/cli-repl.ts
|
|
64283
64283
|
import { createInterface } from "readline";
|
|
@@ -71730,6 +71730,24 @@ function mtoc2_sprintf_format(fmt, args) {
|
|
|
71730
71730
|
case "t":
|
|
71731
71731
|
result += " ";
|
|
71732
71732
|
break;
|
|
71733
|
+
case "r":
|
|
71734
|
+
result += "\r";
|
|
71735
|
+
break;
|
|
71736
|
+
case "a":
|
|
71737
|
+
result += "\x07";
|
|
71738
|
+
break;
|
|
71739
|
+
case "b":
|
|
71740
|
+
result += "\b";
|
|
71741
|
+
break;
|
|
71742
|
+
case "f":
|
|
71743
|
+
result += "\f";
|
|
71744
|
+
break;
|
|
71745
|
+
case "v":
|
|
71746
|
+
result += "\v";
|
|
71747
|
+
break;
|
|
71748
|
+
case "0":
|
|
71749
|
+
result += "\0";
|
|
71750
|
+
break;
|
|
71733
71751
|
case "\\":
|
|
71734
71752
|
result += "\\";
|
|
71735
71753
|
break;
|
|
@@ -74507,7 +74525,7 @@ var JS_SNIPPETS = {
|
|
|
74507
74525
|
"error_fmt.js": "// JS sibling of `error_fmt.h`. Format the message + arguments and\n// throw a runtime error. Mirrors numbl's `error(...)` behavior\n// (stderr + halt).\n//\n// The thrown error carries an `identifier` string property so a\n// `try / catch ME` arm in the interpreter can populate the `ME`\n// struct's `identifier` field. When the caller passes no identifier\n// (the common `error('msg')` form), it's the empty string.\n\n\nfunction mtoc2_error_fmt(fmt, ...args) {\n const msg = mtoc2_sprintf_format(fmt, args);\n // Numbl writes to stderr; in the JS host we route through the same\n // `$write` channel by emitting a \"stderr\" sentinel prefix the host\n // can split on. For now, throw \u2014 the CLI's runner formats the\n // exception to stderr, matching the user-visible result.\n const err = new Error(msg);\n err.identifier = \"\";\n throw err;\n}\n\nfunction mtoc2_error_fmt_id(identifier, fmt, ...args) {\n const msg = mtoc2_sprintf_format(fmt, args);\n const err = new Error(msg);\n err.identifier = identifier;\n throw err;\n}\n",
|
|
74508
74526
|
"format_complex.js": '// JS sibling of `format_complex.h`. Format a scalar complex `{re, im}`\n// the way numbl\'s `formatComplex` does. Each component is rendered\n// through `mtoc2_format_double` so the scalar formatting stays in\n// lockstep with numbl\'s `formatNumber`.\n\n\nfunction mtoc2_format_complex(z) {\n const re = z.re;\n const im = z.im;\n if (im === 0) return mtoc2_format_double(re);\n if (re === 0) return mtoc2_format_double(im) + "i";\n if (im < 0) {\n return mtoc2_format_double(re) + " - " + mtoc2_format_double(-im) + "i";\n }\n return mtoc2_format_double(re) + " + " + mtoc2_format_double(im) + "i";\n}\n',
|
|
74509
74527
|
"format_double.js": '// JS sibling of `format_double.h` \u2014 same numbl-compatible formatter,\n// in JS. Used by `emitJs` for the `disp` scalar path and (later) by\n// the interpreter via the re-export in `snippets.gen.ts`.\n\nfunction mtoc2_format_double(x) {\n if (Number.isNaN(x)) return "NaN";\n // MATLAB spells these Inf / -Inf (matches the interpreter\'s formatNumber).\n if (x === Infinity) return "Inf";\n if (x === -Infinity) return "-Inf";\n if (x === 0) x = 0;\n if (Math.abs(x) < 1e15 && x === Math.trunc(x)) return String(x);\n\n const buf = x.toExponential(4);\n const ePos = buf.indexOf("e");\n if (ePos < 0) return buf;\n const decExp = parseInt(buf.slice(ePos + 1), 10);\n\n if (decExp < -6 || decExp >= 5) {\n let mantissaEnd = ePos - 1;\n while (mantissaEnd > 0 && buf[mantissaEnd] === "0") mantissaEnd--;\n if (mantissaEnd >= 0 && buf[mantissaEnd] === ".") mantissaEnd--;\n let expPart = buf.slice(ePos + 1);\n let sign = "+";\n if (expPart[0] === "+" || expPart[0] === "-") {\n sign = expPart[0];\n expPart = expPart.slice(1);\n }\n while (expPart.length > 1 && expPart[0] === "0") expPart = expPart.slice(1);\n return buf.slice(0, mantissaEnd + 1) + "e" + sign + expPart;\n }\n\n let fracDigits = 4 - decExp;\n if (fracDigits < 0) fracDigits = 0;\n let s = x.toFixed(fracDigits);\n if (s.includes(".")) {\n while (s.endsWith("0")) s = s.slice(0, -1);\n if (s.endsWith(".")) s = s.slice(0, -1);\n }\n return s;\n}\n',
|
|
74510
|
-
"format_engine.js": '// JS sibling of `format_engine.h`. Numbl-compatible printf-style\n// formatter, ported from `numbl/src/numbl-core/helpers/string.ts`\'s\n// `sprintfFormat`. Shared by fprintf / sprintf / error / assert on\n// the JS side.\n//\n// Spec set: d i u f e E g G x X o s c %\n// Flags: - + 0 # space. Precision `.N`. Width digits. `*` consumes the\n// next numeric arg as a width.\n// Escapes interpreted AT FORMAT TIME: \\n \\t \\\\.\n// Numeric tensors flatten column-major into the scalar stream; the\n// format string cycles through args until consumed (with a "no arg\n// consumed this pass" guard against infinite output).\n\nfunction isTensor(v) {\n return typeof v === "object" && v !== null && v.mtoc2Tag === "tensor";\n}\nfunction isChar(v) {\n return typeof v === "object" && v !== null && v.mtoc2Tag === "char";\n}\n\nfunction toNumber(v) {\n if (typeof v === "number") return v;\n if (typeof v === "boolean") return v ? 1 : 0;\n if (typeof v === "string") return Number(v);\n if (isChar(v)) {\n // Match the interpreter\'s toNumber (runtime/convert.ts): a single\n // char yields its code point; a multi-char value has no scalar\n // numeric form. `Number("A")` would wrongly give NaN.\n if (v.value.length === 1) return v.value.charCodeAt(0);\n throw new Error("Cannot convert multi-char to number");\n }\n if (isTensor(v) && v.data.length === 1) return v.data[0];\n return Number(v);\n}\n\nfunction toString(v) {\n if (typeof v === "string") return v;\n if (typeof v === "number") return String(v);\n if (typeof v === "boolean") return v ? "1" : "0";\n if (isChar(v)) return v.value;\n return String(v);\n}\n\nfunction numStr(n) {\n if (n === Infinity) return "Inf";\n if (n === -Infinity) return "-Inf";\n if (Number.isNaN(n)) return "NaN";\n if (n === 0) return "0";\n const prec = 5;\n const exp = Math.floor(Math.log10(Math.abs(n)));\n let s;\n if (exp < -4 || exp >= prec) {\n s = n.toExponential(prec - 1);\n const ePos = s.indexOf("e");\n let mantissa = s.slice(0, ePos);\n const expPart0 = s.slice(ePos);\n if (mantissa.includes(".")) mantissa = mantissa.replace(/\\.?0+$/, "");\n const expPart = expPart0.replace(/([eE][+-])(\\d)$/, "$1" + "0$2");\n s = mantissa + expPart;\n } else {\n if (Number.isInteger(n)) return String(n);\n s = n.toPrecision(prec);\n if (s.includes(".")) s = s.replace(/\\.?0+$/, "");\n }\n return s;\n}\n\nfunction applyWidth(spec, str) {\n const m = spec.match(/^%([-+ #]*)0?(\\d+)?/);\n if (!m) return str;\n const explicitFlags = m[1] || "";\n const leftAlign = explicitFlags.includes("-");\n const afterPercent = spec.slice(1);\n const flagAndWidth = afterPercent.match(/^([-+ #]*)(0?)(\\d+)?/);\n const zeroFlag = flagAndWidth ? flagAndWidth[2] === "0" : false;\n const width = flagAndWidth && flagAndWidth[3] ? parseInt(flagAndWidth[3]) : 0;\n if (width <= str.length) return str;\n const zeroPad = !leftAlign && zeroFlag;\n const padLen = width - str.length;\n if (leftAlign) return str + " ".repeat(padLen);\n if (zeroPad) {\n if (str[0] === "-" || str[0] === "+") {\n return str[0] + "0".repeat(padLen) + str.slice(1);\n }\n return "0".repeat(padLen) + str;\n }\n return " ".repeat(padLen) + str;\n}\n\nfunction mtoc2_sprintf_format(fmt, args) {\n // Char literals (`\'foo\'`) come through wrapped as\n // `{mtoc2Tag:"char", value:"..."}` to match the interpreter\'s\n // RuntimeValue convention; unwrap so the format walker indexes\n // a plain JS string.\n if (isChar(fmt)) fmt = fmt.value;\n // Flatten args column-major (tensors expand element-by-element).\n const flat = [];\n for (const arg of args) {\n if (isTensor(arg)) {\n for (let k = 0; k < arg.data.length; k++) flat.push(arg.data[k]);\n } else {\n flat.push(arg);\n }\n }\n\n let result = "";\n let argIdx = 0;\n\n do {\n const startArgIdx = argIdx;\n let outOfArgs = false;\n let i = 0;\n while (i < fmt.length && !outOfArgs) {\n if (fmt[i] === "%" && i + 1 < fmt.length) {\n i++;\n let spec = "%";\n while (i < fmt.length && !"dfigeEsoxXuc%".includes(fmt[i])) {\n if (fmt[i] === "*") {\n if (argIdx >= flat.length) {\n outOfArgs = true;\n break;\n }\n spec += String(Math.round(toNumber(flat[argIdx++])));\n i++;\n } else {\n spec += fmt[i];\n i++;\n }\n }\n if (outOfArgs) break;\n if (i < fmt.length) {\n const ch = fmt[i];\n i++;\n if (ch === "%") {\n result += "%";\n } else if (argIdx >= flat.length) {\n outOfArgs = true;\n } else if (ch === "d" || ch === "i" || ch === "u") {\n const raw = toNumber(flat[argIdx++]);\n const isInt = Number.isInteger(raw);\n const canPrintAsInt = ch === "u" ? isInt && raw >= 0 : isInt;\n if (!canPrintAsInt) {\n let eStr = raw.toExponential(6);\n eStr = eStr.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n result += applyWidth(spec, eStr);\n } else {\n const n = raw;\n const flags = spec.slice(1);\n const hasPlus = flags.includes("+");\n const leftAlign = flags.includes("-");\n const widthMatch = spec.match(/^%[^0-9]*(\\d+)/);\n const width = widthMatch ? parseInt(widthMatch[1]) : 0;\n const zeroPad = !leftAlign && /^[-+ ]*0/.test(spec.slice(1));\n const s = String(Math.abs(n));\n const sign = n < 0 ? "-" : hasPlus ? "+" : "";\n if (width > 0) {\n const padChar = zeroPad ? "0" : " ";\n const padLen = Math.max(0, width - sign.length - s.length);\n const pad = padChar.repeat(padLen);\n result += leftAlign\n ? sign + s + " ".repeat(padLen)\n : zeroPad\n ? sign + pad + s\n : pad + sign + s;\n } else {\n result += sign + s;\n }\n }\n } else if (ch === "f") {\n const n = toNumber(flat[argIdx++]);\n if (!isFinite(n) || isNaN(n)) {\n result += applyWidth(spec, numStr(n));\n } else {\n const fFlags = spec.slice(1);\n const fHasPlus = fFlags.includes("+");\n const precMatch = spec.match(/\\.(\\d+)/);\n const prec = precMatch ? parseInt(precMatch[1]) : 6;\n const formatted = n.toFixed(prec);\n const fSign = n < 0 ? "" : fHasPlus ? "+" : "";\n result += applyWidth(spec, fSign + formatted);\n }\n } else if (ch === "e" || ch === "E") {\n const n = toNumber(flat[argIdx++]);\n if (!isFinite(n) || isNaN(n)) {\n result += applyWidth(spec, numStr(n));\n } else {\n const precMatch = spec.match(/\\.(\\d+)/);\n const prec = precMatch ? parseInt(precMatch[1]) : 6;\n let eStr = n.toExponential(prec);\n eStr = eStr.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n if (ch === "E") eStr = eStr.toUpperCase();\n result += applyWidth(spec, eStr);\n }\n } else if (ch === "x" || ch === "X") {\n const n = Math.round(toNumber(flat[argIdx++]));\n let s = Math.abs(n).toString(16);\n if (ch === "X") s = s.toUpperCase();\n result += applyWidth(spec, s);\n } else if (ch === "o") {\n const n = Math.round(toNumber(flat[argIdx++]));\n result += applyWidth(spec, Math.abs(n).toString(8));\n } else if (ch === "g" || ch === "G") {\n const gVal = toNumber(flat[argIdx++]);\n if (!isFinite(gVal) || isNaN(gVal)) {\n result += applyWidth(spec, numStr(gVal));\n } else {\n const precMatch = spec.match(/\\.(\\d+)/);\n const gPrec = precMatch ? parseInt(precMatch[1]) : 6;\n let gStr;\n if (gVal === 0) {\n gStr = "0";\n } else {\n const exp = Math.floor(Math.log10(Math.abs(gVal)));\n if (exp < -4 || exp >= gPrec) {\n gStr = gVal.toExponential(gPrec - 1);\n const ePos = gStr.indexOf("e");\n let mantissa = gStr.slice(0, ePos);\n let expPart = gStr.slice(ePos);\n if (mantissa.includes(".")) {\n mantissa = mantissa.replace(/\\.?0+$/, "");\n }\n expPart = expPart.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n gStr = mantissa + expPart;\n } else {\n gStr = gVal.toPrecision(gPrec);\n if (gStr.includes(".")) {\n gStr = gStr.replace(/\\.?0+$/, "");\n }\n if (gStr.includes("e")) {\n gStr = String(parseFloat(gStr));\n }\n }\n }\n if (ch === "G") gStr = gStr.toUpperCase();\n result += applyWidth(spec, gStr);\n }\n } else if (ch === "s") {\n const sArg = flat[argIdx++];\n // A numeric/logical argument to %s is a character code (MATLAB:\n // sprintf(\'%s\', 65) -> \'A\').\n const sVal =\n typeof sArg === "number" || typeof sArg === "boolean"\n ? String.fromCharCode(Math.round(toNumber(sArg)))\n : toString(sArg);\n const sFlags = spec.slice(1);\n const sLeftAlign = sFlags.includes("-");\n const sWidthMatch = spec.match(/^%[^0-9]*(\\d+)/);\n const sWidth = sWidthMatch ? parseInt(sWidthMatch[1]) : 0;\n if (sWidth > sVal.length) {\n const sPad = " ".repeat(sWidth - sVal.length);\n result += sLeftAlign ? sVal + sPad : sPad + sVal;\n } else {\n result += sVal;\n }\n } else if (ch === "c") {\n result += String.fromCharCode(Math.round(toNumber(flat[argIdx++])));\n } else {\n result += spec + ch;\n argIdx++;\n }\n }\n } else if (fmt[i] === "\\\\" && i + 1 < fmt.length) {\n i++;\n switch (fmt[i]) {\n case "n":\n result += "\\n";\n break;\n case "t":\n result += "\\t";\n break;\n case "\\\\":\n result += "\\\\";\n break;\n default:\n result += "\\\\" + fmt[i];\n }\n i++;\n } else {\n result += fmt[i];\n i++;\n }\n }\n if (argIdx === startArgIdx) break;\n } while (argIdx < flat.length);\n\n return result;\n}\n',
|
|
74528
|
+
"format_engine.js": '// JS sibling of `format_engine.h`. Numbl-compatible printf-style\n// formatter, ported from `numbl/src/numbl-core/helpers/string.ts`\'s\n// `sprintfFormat`. Shared by fprintf / sprintf / error / assert on\n// the JS side.\n//\n// Spec set: d i u f e E g G x X o s c %\n// Flags: - + 0 # space. Precision `.N`. Width digits. `*` consumes the\n// next numeric arg as a width.\n// Escapes interpreted AT FORMAT TIME: \\n \\t \\r \\a \\b \\f \\v \\0 \\\\.\n// Numeric tensors flatten column-major into the scalar stream; the\n// format string cycles through args until consumed (with a "no arg\n// consumed this pass" guard against infinite output).\n\nfunction isTensor(v) {\n return typeof v === "object" && v !== null && v.mtoc2Tag === "tensor";\n}\nfunction isChar(v) {\n return typeof v === "object" && v !== null && v.mtoc2Tag === "char";\n}\n\nfunction toNumber(v) {\n if (typeof v === "number") return v;\n if (typeof v === "boolean") return v ? 1 : 0;\n if (typeof v === "string") return Number(v);\n if (isChar(v)) {\n // Match the interpreter\'s toNumber (runtime/convert.ts): a single\n // char yields its code point; a multi-char value has no scalar\n // numeric form. `Number("A")` would wrongly give NaN.\n if (v.value.length === 1) return v.value.charCodeAt(0);\n throw new Error("Cannot convert multi-char to number");\n }\n if (isTensor(v) && v.data.length === 1) return v.data[0];\n return Number(v);\n}\n\nfunction toString(v) {\n if (typeof v === "string") return v;\n if (typeof v === "number") return String(v);\n if (typeof v === "boolean") return v ? "1" : "0";\n if (isChar(v)) return v.value;\n return String(v);\n}\n\nfunction numStr(n) {\n if (n === Infinity) return "Inf";\n if (n === -Infinity) return "-Inf";\n if (Number.isNaN(n)) return "NaN";\n if (n === 0) return "0";\n const prec = 5;\n const exp = Math.floor(Math.log10(Math.abs(n)));\n let s;\n if (exp < -4 || exp >= prec) {\n s = n.toExponential(prec - 1);\n const ePos = s.indexOf("e");\n let mantissa = s.slice(0, ePos);\n const expPart0 = s.slice(ePos);\n if (mantissa.includes(".")) mantissa = mantissa.replace(/\\.?0+$/, "");\n const expPart = expPart0.replace(/([eE][+-])(\\d)$/, "$1" + "0$2");\n s = mantissa + expPart;\n } else {\n if (Number.isInteger(n)) return String(n);\n s = n.toPrecision(prec);\n if (s.includes(".")) s = s.replace(/\\.?0+$/, "");\n }\n return s;\n}\n\nfunction applyWidth(spec, str) {\n const m = spec.match(/^%([-+ #]*)0?(\\d+)?/);\n if (!m) return str;\n const explicitFlags = m[1] || "";\n const leftAlign = explicitFlags.includes("-");\n const afterPercent = spec.slice(1);\n const flagAndWidth = afterPercent.match(/^([-+ #]*)(0?)(\\d+)?/);\n const zeroFlag = flagAndWidth ? flagAndWidth[2] === "0" : false;\n const width = flagAndWidth && flagAndWidth[3] ? parseInt(flagAndWidth[3]) : 0;\n if (width <= str.length) return str;\n const zeroPad = !leftAlign && zeroFlag;\n const padLen = width - str.length;\n if (leftAlign) return str + " ".repeat(padLen);\n if (zeroPad) {\n if (str[0] === "-" || str[0] === "+") {\n return str[0] + "0".repeat(padLen) + str.slice(1);\n }\n return "0".repeat(padLen) + str;\n }\n return " ".repeat(padLen) + str;\n}\n\nfunction mtoc2_sprintf_format(fmt, args) {\n // Char literals (`\'foo\'`) come through wrapped as\n // `{mtoc2Tag:"char", value:"..."}` to match the interpreter\'s\n // RuntimeValue convention; unwrap so the format walker indexes\n // a plain JS string.\n if (isChar(fmt)) fmt = fmt.value;\n // Flatten args column-major (tensors expand element-by-element).\n const flat = [];\n for (const arg of args) {\n if (isTensor(arg)) {\n for (let k = 0; k < arg.data.length; k++) flat.push(arg.data[k]);\n } else {\n flat.push(arg);\n }\n }\n\n let result = "";\n let argIdx = 0;\n\n do {\n const startArgIdx = argIdx;\n let outOfArgs = false;\n let i = 0;\n while (i < fmt.length && !outOfArgs) {\n if (fmt[i] === "%" && i + 1 < fmt.length) {\n i++;\n let spec = "%";\n while (i < fmt.length && !"dfigeEsoxXuc%".includes(fmt[i])) {\n if (fmt[i] === "*") {\n if (argIdx >= flat.length) {\n outOfArgs = true;\n break;\n }\n spec += String(Math.round(toNumber(flat[argIdx++])));\n i++;\n } else {\n spec += fmt[i];\n i++;\n }\n }\n if (outOfArgs) break;\n if (i < fmt.length) {\n const ch = fmt[i];\n i++;\n if (ch === "%") {\n result += "%";\n } else if (argIdx >= flat.length) {\n outOfArgs = true;\n } else if (ch === "d" || ch === "i" || ch === "u") {\n const raw = toNumber(flat[argIdx++]);\n const isInt = Number.isInteger(raw);\n const canPrintAsInt = ch === "u" ? isInt && raw >= 0 : isInt;\n if (!canPrintAsInt) {\n let eStr = raw.toExponential(6);\n eStr = eStr.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n result += applyWidth(spec, eStr);\n } else {\n const n = raw;\n const flags = spec.slice(1);\n const hasPlus = flags.includes("+");\n const leftAlign = flags.includes("-");\n const widthMatch = spec.match(/^%[^0-9]*(\\d+)/);\n const width = widthMatch ? parseInt(widthMatch[1]) : 0;\n const zeroPad = !leftAlign && /^[-+ ]*0/.test(spec.slice(1));\n const s = String(Math.abs(n));\n const sign = n < 0 ? "-" : hasPlus ? "+" : "";\n if (width > 0) {\n const padChar = zeroPad ? "0" : " ";\n const padLen = Math.max(0, width - sign.length - s.length);\n const pad = padChar.repeat(padLen);\n result += leftAlign\n ? sign + s + " ".repeat(padLen)\n : zeroPad\n ? sign + pad + s\n : pad + sign + s;\n } else {\n result += sign + s;\n }\n }\n } else if (ch === "f") {\n const n = toNumber(flat[argIdx++]);\n if (!isFinite(n) || isNaN(n)) {\n result += applyWidth(spec, numStr(n));\n } else {\n const fFlags = spec.slice(1);\n const fHasPlus = fFlags.includes("+");\n const precMatch = spec.match(/\\.(\\d+)/);\n const prec = precMatch ? parseInt(precMatch[1]) : 6;\n const formatted = n.toFixed(prec);\n const fSign = n < 0 ? "" : fHasPlus ? "+" : "";\n result += applyWidth(spec, fSign + formatted);\n }\n } else if (ch === "e" || ch === "E") {\n const n = toNumber(flat[argIdx++]);\n if (!isFinite(n) || isNaN(n)) {\n result += applyWidth(spec, numStr(n));\n } else {\n const precMatch = spec.match(/\\.(\\d+)/);\n const prec = precMatch ? parseInt(precMatch[1]) : 6;\n let eStr = n.toExponential(prec);\n eStr = eStr.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n if (ch === "E") eStr = eStr.toUpperCase();\n result += applyWidth(spec, eStr);\n }\n } else if (ch === "x" || ch === "X") {\n const n = Math.round(toNumber(flat[argIdx++]));\n let s = Math.abs(n).toString(16);\n if (ch === "X") s = s.toUpperCase();\n result += applyWidth(spec, s);\n } else if (ch === "o") {\n const n = Math.round(toNumber(flat[argIdx++]));\n result += applyWidth(spec, Math.abs(n).toString(8));\n } else if (ch === "g" || ch === "G") {\n const gVal = toNumber(flat[argIdx++]);\n if (!isFinite(gVal) || isNaN(gVal)) {\n result += applyWidth(spec, numStr(gVal));\n } else {\n const precMatch = spec.match(/\\.(\\d+)/);\n const gPrec = precMatch ? parseInt(precMatch[1]) : 6;\n let gStr;\n if (gVal === 0) {\n gStr = "0";\n } else {\n const exp = Math.floor(Math.log10(Math.abs(gVal)));\n if (exp < -4 || exp >= gPrec) {\n gStr = gVal.toExponential(gPrec - 1);\n const ePos = gStr.indexOf("e");\n let mantissa = gStr.slice(0, ePos);\n let expPart = gStr.slice(ePos);\n if (mantissa.includes(".")) {\n mantissa = mantissa.replace(/\\.?0+$/, "");\n }\n expPart = expPart.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n gStr = mantissa + expPart;\n } else {\n gStr = gVal.toPrecision(gPrec);\n if (gStr.includes(".")) {\n gStr = gStr.replace(/\\.?0+$/, "");\n }\n if (gStr.includes("e")) {\n gStr = String(parseFloat(gStr));\n }\n }\n }\n if (ch === "G") gStr = gStr.toUpperCase();\n result += applyWidth(spec, gStr);\n }\n } else if (ch === "s") {\n const sArg = flat[argIdx++];\n // A numeric/logical argument to %s is a character code (MATLAB:\n // sprintf(\'%s\', 65) -> \'A\').\n const sVal =\n typeof sArg === "number" || typeof sArg === "boolean"\n ? String.fromCharCode(Math.round(toNumber(sArg)))\n : toString(sArg);\n const sFlags = spec.slice(1);\n const sLeftAlign = sFlags.includes("-");\n const sWidthMatch = spec.match(/^%[^0-9]*(\\d+)/);\n const sWidth = sWidthMatch ? parseInt(sWidthMatch[1]) : 0;\n if (sWidth > sVal.length) {\n const sPad = " ".repeat(sWidth - sVal.length);\n result += sLeftAlign ? sVal + sPad : sPad + sVal;\n } else {\n result += sVal;\n }\n } else if (ch === "c") {\n result += String.fromCharCode(Math.round(toNumber(flat[argIdx++])));\n } else {\n result += spec + ch;\n argIdx++;\n }\n }\n } else if (fmt[i] === "\\\\" && i + 1 < fmt.length) {\n i++;\n switch (fmt[i]) {\n case "n":\n result += "\\n";\n break;\n case "t":\n result += "\\t";\n break;\n case "r":\n result += "\\r";\n break;\n case "a":\n result += "\\x07";\n break;\n case "b":\n result += "\\b";\n break;\n case "f":\n result += "\\f";\n break;\n case "v":\n result += "\\v";\n break;\n case "0":\n result += "\\0";\n break;\n case "\\\\":\n result += "\\\\";\n break;\n default:\n result += "\\\\" + fmt[i];\n }\n i++;\n } else {\n result += fmt[i];\n i++;\n }\n }\n if (argIdx === startArgIdx) break;\n } while (argIdx < flat.length);\n\n return result;\n}\n',
|
|
74511
74529
|
"fprintf.js": "// JS sibling of `fprintf.h`. Routes formatted output through\n// `mtoc2_sprintf_format` then writes via `$write` (the JS analog of\n// C's stdout). Numbl-compatible spec set & semantics.\n\n\nfunction mtoc2_fprintf(fmt, ...args) {\n $write(mtoc2_sprintf_format(fmt, args));\n}\n",
|
|
74512
74530
|
"sprintf.js": '// JS sibling of `sprintf.h`. Two output variants:\n// - `mtoc2_sprintf_str(fmt, args)` returns the formatted text as a\n// plain JS string (the equivalent of numbl\'s `String` kind).\n// - `mtoc2_sprintf_char(fmt, args)` returns it as a `mtoc2_char_tensor_t`\n// placeholder \u2014 we keep the JS shape as a `{mtoc2Tag: "char", value}`\n// object so disp/length etc. dispatch correctly.\n\n\nfunction mtoc2_sprintf_str(fmt, ...args) {\n return mtoc2_sprintf_format(fmt, args);\n}\n\nfunction mtoc2_sprintf_char(fmt, ...args) {\n return { mtoc2Tag: "char", value: mtoc2_sprintf_format(fmt, args) };\n}\n',
|
|
74513
74531
|
"warning_fmt.js": '// JS sibling of `warning_fmt.h`. Format the message and write\n// `Warning: <msg>\\n` via `$write`. Matches numbl\n// (`runtime/specialBuiltins.ts:190` \u2014 `rt.output("Warning: " + msg + "\\n")`).\n\n\nfunction mtoc2_warning_fmt(fmt, ...args) {\n $write("Warning: " + mtoc2_sprintf_format(fmt, args) + "\\n");\n}\n\nfunction mtoc2_warning_fmt_id(_id, fmt, ...args) {\n // The id is informational \u2014 numbl threads it to lastwarn state,\n // which mtoc2 doesn\'t expose. Drop it here so the visible output\n // matches the bare form.\n $write("Warning: " + mtoc2_sprintf_format(fmt, args) + "\\n");\n}\n',
|
|
@@ -98617,8 +98635,9 @@ static int mtoc2_format_double(char *out, size_t cap, double x) {
|
|
|
98617
98635
|
* - spec set: d i u f e E g G x X o s c %
|
|
98618
98636
|
* - flags - + 0 # space; precision \`.N\`; width digits; \`*\` consumes
|
|
98619
98637
|
* the next numeric arg as a width
|
|
98620
|
-
* - escapes \\n \\t \\\\ interpreted AT FORMAT TIME
|
|
98621
|
-
* lexer, which preserves backslash bytes
|
|
98638
|
+
* - escapes \\n \\t \\r \\a \\b \\f \\v \\0 \\\\ interpreted AT FORMAT TIME
|
|
98639
|
+
* (matching the numbl lexer, which preserves backslash bytes
|
|
98640
|
+
* verbatim)
|
|
98622
98641
|
* - numeric tensors flatten column-major into the scalar stream;
|
|
98623
98642
|
* format string cycles through the args until the stream is
|
|
98624
98643
|
* exhausted (with a "no arg consumed this pass" guard against
|
|
@@ -98927,13 +98946,19 @@ static long mtoc2__num_to_str(char *buf, size_t cap, double x) {
|
|
|
98927
98946
|
return n;
|
|
98928
98947
|
}
|
|
98929
98948
|
|
|
98930
|
-
/* Emit one \`\\\` escape sequence \u2014 numbl interprets
|
|
98931
|
-
* at format time; any other \`\\x\` passes through verbatim. */
|
|
98949
|
+
/* Emit one \`\\\` escape sequence \u2014 numbl interprets \\n, \\t, \\r, \\a, \\b,
|
|
98950
|
+
* \\f, \\v, \\0, \\\\ at format time; any other \`\\x\` passes through verbatim. */
|
|
98932
98951
|
static long mtoc2__emit_escape(mtoc2__writer_fn writer, void *ctx,
|
|
98933
98952
|
char next) {
|
|
98934
98953
|
switch (next) {
|
|
98935
98954
|
case 'n': writer(ctx, "\\n", 1); return 1;
|
|
98936
98955
|
case 't': writer(ctx, "\\t", 1); return 1;
|
|
98956
|
+
case 'r': writer(ctx, "\\r", 1); return 1;
|
|
98957
|
+
case 'a': writer(ctx, "\\a", 1); return 1;
|
|
98958
|
+
case 'b': writer(ctx, "\\b", 1); return 1;
|
|
98959
|
+
case 'f': writer(ctx, "\\f", 1); return 1;
|
|
98960
|
+
case 'v': writer(ctx, "\\v", 1); return 1;
|
|
98961
|
+
case '0': writer(ctx, "\\0", 1); return 1;
|
|
98937
98962
|
case '\\\\': writer(ctx, "\\\\", 1); return 1;
|
|
98938
98963
|
default: {
|
|
98939
98964
|
char buf[2] = { '\\\\', next };
|
|
@@ -11,6 +11,7 @@ export { FigureView } from "./graphics/FigureView.js";
|
|
|
11
11
|
export { figuresReducer, initialFiguresState, } from "./graphics/figuresReducer.js";
|
|
12
12
|
export type { FigureState, AxesState, FiguresState, FiguresAction, } from "./graphics/figuresReducer.js";
|
|
13
13
|
export type * from "./graphics/types.js";
|
|
14
|
+
export { restoreNaNs } from "./graphics/restoreNaNs.js";
|
|
14
15
|
export { exportFigureHdf5, downloadFigureHdf5, } from "./graphics/exportFigureHdf5.js";
|
|
15
16
|
export { importFigureHdf5 } from "./graphics/importFigureHdf5.js";
|
|
16
17
|
export { FIGURE_HDF5_VERSION } from "./graphics/figureHdf5Schema.js";
|
package/dist-graphics/index.js
CHANGED
|
@@ -33866,6 +33866,38 @@ var figuresReducer = (state, action) => {
|
|
|
33866
33866
|
}
|
|
33867
33867
|
};
|
|
33868
33868
|
|
|
33869
|
+
// src/graphics/restoreNaNs.ts
|
|
33870
|
+
function restoreNullsToNaN(arr) {
|
|
33871
|
+
for (let i = 0; i < arr.length; i++) {
|
|
33872
|
+
if (arr[i] === null) arr[i] = NaN;
|
|
33873
|
+
}
|
|
33874
|
+
}
|
|
33875
|
+
function restoreNaNs(instr) {
|
|
33876
|
+
if (instr.type === "plot") {
|
|
33877
|
+
for (const t of instr.traces) {
|
|
33878
|
+
restoreNullsToNaN(t.x);
|
|
33879
|
+
restoreNullsToNaN(t.y);
|
|
33880
|
+
}
|
|
33881
|
+
} else if (instr.type === "plot3") {
|
|
33882
|
+
for (const t of instr.traces) {
|
|
33883
|
+
restoreNullsToNaN(t.x);
|
|
33884
|
+
restoreNullsToNaN(t.y);
|
|
33885
|
+
restoreNullsToNaN(t.z);
|
|
33886
|
+
}
|
|
33887
|
+
} else if (instr.type === "surf" || instr.type === "mesh") {
|
|
33888
|
+
restoreNullsToNaN(instr.trace.x);
|
|
33889
|
+
restoreNullsToNaN(instr.trace.y);
|
|
33890
|
+
restoreNullsToNaN(instr.trace.z);
|
|
33891
|
+
if (instr.trace.c) restoreNullsToNaN(instr.trace.c);
|
|
33892
|
+
} else if (instr.type === "imagesc") {
|
|
33893
|
+
restoreNullsToNaN(instr.trace.z);
|
|
33894
|
+
} else if (instr.type === "contour") {
|
|
33895
|
+
restoreNullsToNaN(instr.trace.x);
|
|
33896
|
+
restoreNullsToNaN(instr.trace.y);
|
|
33897
|
+
restoreNullsToNaN(instr.trace.z);
|
|
33898
|
+
}
|
|
33899
|
+
}
|
|
33900
|
+
|
|
33869
33901
|
// src/graphics/figureHdf5Schema.ts
|
|
33870
33902
|
var FIGURE_HDF5_VERSION = 1;
|
|
33871
33903
|
var GRID_FIELDS = {
|
|
@@ -35319,6 +35351,7 @@ export {
|
|
|
35319
35351
|
initialFiguresState,
|
|
35320
35352
|
loadFigureFromHash,
|
|
35321
35353
|
numblStoreUploader,
|
|
35354
|
+
restoreNaNs,
|
|
35322
35355
|
setFigureUploader,
|
|
35323
35356
|
uploadFigureForViewer
|
|
35324
35357
|
};
|
package/dist-lib/lib.js
CHANGED
|
@@ -70916,6 +70916,24 @@ function mtoc2_sprintf_format(fmt, args) {
|
|
|
70916
70916
|
case "t":
|
|
70917
70917
|
result += " ";
|
|
70918
70918
|
break;
|
|
70919
|
+
case "r":
|
|
70920
|
+
result += "\r";
|
|
70921
|
+
break;
|
|
70922
|
+
case "a":
|
|
70923
|
+
result += "\x07";
|
|
70924
|
+
break;
|
|
70925
|
+
case "b":
|
|
70926
|
+
result += "\b";
|
|
70927
|
+
break;
|
|
70928
|
+
case "f":
|
|
70929
|
+
result += "\f";
|
|
70930
|
+
break;
|
|
70931
|
+
case "v":
|
|
70932
|
+
result += "\v";
|
|
70933
|
+
break;
|
|
70934
|
+
case "0":
|
|
70935
|
+
result += "\0";
|
|
70936
|
+
break;
|
|
70919
70937
|
case "\\":
|
|
70920
70938
|
result += "\\";
|
|
70921
70939
|
break;
|
|
@@ -73693,7 +73711,7 @@ var JS_SNIPPETS = {
|
|
|
73693
73711
|
"error_fmt.js": "// JS sibling of `error_fmt.h`. Format the message + arguments and\n// throw a runtime error. Mirrors numbl's `error(...)` behavior\n// (stderr + halt).\n//\n// The thrown error carries an `identifier` string property so a\n// `try / catch ME` arm in the interpreter can populate the `ME`\n// struct's `identifier` field. When the caller passes no identifier\n// (the common `error('msg')` form), it's the empty string.\n\n\nfunction mtoc2_error_fmt(fmt, ...args) {\n const msg = mtoc2_sprintf_format(fmt, args);\n // Numbl writes to stderr; in the JS host we route through the same\n // `$write` channel by emitting a \"stderr\" sentinel prefix the host\n // can split on. For now, throw \u2014 the CLI's runner formats the\n // exception to stderr, matching the user-visible result.\n const err = new Error(msg);\n err.identifier = \"\";\n throw err;\n}\n\nfunction mtoc2_error_fmt_id(identifier, fmt, ...args) {\n const msg = mtoc2_sprintf_format(fmt, args);\n const err = new Error(msg);\n err.identifier = identifier;\n throw err;\n}\n",
|
|
73694
73712
|
"format_complex.js": '// JS sibling of `format_complex.h`. Format a scalar complex `{re, im}`\n// the way numbl\'s `formatComplex` does. Each component is rendered\n// through `mtoc2_format_double` so the scalar formatting stays in\n// lockstep with numbl\'s `formatNumber`.\n\n\nfunction mtoc2_format_complex(z) {\n const re = z.re;\n const im = z.im;\n if (im === 0) return mtoc2_format_double(re);\n if (re === 0) return mtoc2_format_double(im) + "i";\n if (im < 0) {\n return mtoc2_format_double(re) + " - " + mtoc2_format_double(-im) + "i";\n }\n return mtoc2_format_double(re) + " + " + mtoc2_format_double(im) + "i";\n}\n',
|
|
73695
73713
|
"format_double.js": '// JS sibling of `format_double.h` \u2014 same numbl-compatible formatter,\n// in JS. Used by `emitJs` for the `disp` scalar path and (later) by\n// the interpreter via the re-export in `snippets.gen.ts`.\n\nfunction mtoc2_format_double(x) {\n if (Number.isNaN(x)) return "NaN";\n // MATLAB spells these Inf / -Inf (matches the interpreter\'s formatNumber).\n if (x === Infinity) return "Inf";\n if (x === -Infinity) return "-Inf";\n if (x === 0) x = 0;\n if (Math.abs(x) < 1e15 && x === Math.trunc(x)) return String(x);\n\n const buf = x.toExponential(4);\n const ePos = buf.indexOf("e");\n if (ePos < 0) return buf;\n const decExp = parseInt(buf.slice(ePos + 1), 10);\n\n if (decExp < -6 || decExp >= 5) {\n let mantissaEnd = ePos - 1;\n while (mantissaEnd > 0 && buf[mantissaEnd] === "0") mantissaEnd--;\n if (mantissaEnd >= 0 && buf[mantissaEnd] === ".") mantissaEnd--;\n let expPart = buf.slice(ePos + 1);\n let sign = "+";\n if (expPart[0] === "+" || expPart[0] === "-") {\n sign = expPart[0];\n expPart = expPart.slice(1);\n }\n while (expPart.length > 1 && expPart[0] === "0") expPart = expPart.slice(1);\n return buf.slice(0, mantissaEnd + 1) + "e" + sign + expPart;\n }\n\n let fracDigits = 4 - decExp;\n if (fracDigits < 0) fracDigits = 0;\n let s = x.toFixed(fracDigits);\n if (s.includes(".")) {\n while (s.endsWith("0")) s = s.slice(0, -1);\n if (s.endsWith(".")) s = s.slice(0, -1);\n }\n return s;\n}\n',
|
|
73696
|
-
"format_engine.js": '// JS sibling of `format_engine.h`. Numbl-compatible printf-style\n// formatter, ported from `numbl/src/numbl-core/helpers/string.ts`\'s\n// `sprintfFormat`. Shared by fprintf / sprintf / error / assert on\n// the JS side.\n//\n// Spec set: d i u f e E g G x X o s c %\n// Flags: - + 0 # space. Precision `.N`. Width digits. `*` consumes the\n// next numeric arg as a width.\n// Escapes interpreted AT FORMAT TIME: \\n \\t \\\\.\n// Numeric tensors flatten column-major into the scalar stream; the\n// format string cycles through args until consumed (with a "no arg\n// consumed this pass" guard against infinite output).\n\nfunction isTensor(v) {\n return typeof v === "object" && v !== null && v.mtoc2Tag === "tensor";\n}\nfunction isChar(v) {\n return typeof v === "object" && v !== null && v.mtoc2Tag === "char";\n}\n\nfunction toNumber(v) {\n if (typeof v === "number") return v;\n if (typeof v === "boolean") return v ? 1 : 0;\n if (typeof v === "string") return Number(v);\n if (isChar(v)) {\n // Match the interpreter\'s toNumber (runtime/convert.ts): a single\n // char yields its code point; a multi-char value has no scalar\n // numeric form. `Number("A")` would wrongly give NaN.\n if (v.value.length === 1) return v.value.charCodeAt(0);\n throw new Error("Cannot convert multi-char to number");\n }\n if (isTensor(v) && v.data.length === 1) return v.data[0];\n return Number(v);\n}\n\nfunction toString(v) {\n if (typeof v === "string") return v;\n if (typeof v === "number") return String(v);\n if (typeof v === "boolean") return v ? "1" : "0";\n if (isChar(v)) return v.value;\n return String(v);\n}\n\nfunction numStr(n) {\n if (n === Infinity) return "Inf";\n if (n === -Infinity) return "-Inf";\n if (Number.isNaN(n)) return "NaN";\n if (n === 0) return "0";\n const prec = 5;\n const exp = Math.floor(Math.log10(Math.abs(n)));\n let s;\n if (exp < -4 || exp >= prec) {\n s = n.toExponential(prec - 1);\n const ePos = s.indexOf("e");\n let mantissa = s.slice(0, ePos);\n const expPart0 = s.slice(ePos);\n if (mantissa.includes(".")) mantissa = mantissa.replace(/\\.?0+$/, "");\n const expPart = expPart0.replace(/([eE][+-])(\\d)$/, "$1" + "0$2");\n s = mantissa + expPart;\n } else {\n if (Number.isInteger(n)) return String(n);\n s = n.toPrecision(prec);\n if (s.includes(".")) s = s.replace(/\\.?0+$/, "");\n }\n return s;\n}\n\nfunction applyWidth(spec, str) {\n const m = spec.match(/^%([-+ #]*)0?(\\d+)?/);\n if (!m) return str;\n const explicitFlags = m[1] || "";\n const leftAlign = explicitFlags.includes("-");\n const afterPercent = spec.slice(1);\n const flagAndWidth = afterPercent.match(/^([-+ #]*)(0?)(\\d+)?/);\n const zeroFlag = flagAndWidth ? flagAndWidth[2] === "0" : false;\n const width = flagAndWidth && flagAndWidth[3] ? parseInt(flagAndWidth[3]) : 0;\n if (width <= str.length) return str;\n const zeroPad = !leftAlign && zeroFlag;\n const padLen = width - str.length;\n if (leftAlign) return str + " ".repeat(padLen);\n if (zeroPad) {\n if (str[0] === "-" || str[0] === "+") {\n return str[0] + "0".repeat(padLen) + str.slice(1);\n }\n return "0".repeat(padLen) + str;\n }\n return " ".repeat(padLen) + str;\n}\n\nfunction mtoc2_sprintf_format(fmt, args) {\n // Char literals (`\'foo\'`) come through wrapped as\n // `{mtoc2Tag:"char", value:"..."}` to match the interpreter\'s\n // RuntimeValue convention; unwrap so the format walker indexes\n // a plain JS string.\n if (isChar(fmt)) fmt = fmt.value;\n // Flatten args column-major (tensors expand element-by-element).\n const flat = [];\n for (const arg of args) {\n if (isTensor(arg)) {\n for (let k = 0; k < arg.data.length; k++) flat.push(arg.data[k]);\n } else {\n flat.push(arg);\n }\n }\n\n let result = "";\n let argIdx = 0;\n\n do {\n const startArgIdx = argIdx;\n let outOfArgs = false;\n let i = 0;\n while (i < fmt.length && !outOfArgs) {\n if (fmt[i] === "%" && i + 1 < fmt.length) {\n i++;\n let spec = "%";\n while (i < fmt.length && !"dfigeEsoxXuc%".includes(fmt[i])) {\n if (fmt[i] === "*") {\n if (argIdx >= flat.length) {\n outOfArgs = true;\n break;\n }\n spec += String(Math.round(toNumber(flat[argIdx++])));\n i++;\n } else {\n spec += fmt[i];\n i++;\n }\n }\n if (outOfArgs) break;\n if (i < fmt.length) {\n const ch = fmt[i];\n i++;\n if (ch === "%") {\n result += "%";\n } else if (argIdx >= flat.length) {\n outOfArgs = true;\n } else if (ch === "d" || ch === "i" || ch === "u") {\n const raw = toNumber(flat[argIdx++]);\n const isInt = Number.isInteger(raw);\n const canPrintAsInt = ch === "u" ? isInt && raw >= 0 : isInt;\n if (!canPrintAsInt) {\n let eStr = raw.toExponential(6);\n eStr = eStr.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n result += applyWidth(spec, eStr);\n } else {\n const n = raw;\n const flags = spec.slice(1);\n const hasPlus = flags.includes("+");\n const leftAlign = flags.includes("-");\n const widthMatch = spec.match(/^%[^0-9]*(\\d+)/);\n const width = widthMatch ? parseInt(widthMatch[1]) : 0;\n const zeroPad = !leftAlign && /^[-+ ]*0/.test(spec.slice(1));\n const s = String(Math.abs(n));\n const sign = n < 0 ? "-" : hasPlus ? "+" : "";\n if (width > 0) {\n const padChar = zeroPad ? "0" : " ";\n const padLen = Math.max(0, width - sign.length - s.length);\n const pad = padChar.repeat(padLen);\n result += leftAlign\n ? sign + s + " ".repeat(padLen)\n : zeroPad\n ? sign + pad + s\n : pad + sign + s;\n } else {\n result += sign + s;\n }\n }\n } else if (ch === "f") {\n const n = toNumber(flat[argIdx++]);\n if (!isFinite(n) || isNaN(n)) {\n result += applyWidth(spec, numStr(n));\n } else {\n const fFlags = spec.slice(1);\n const fHasPlus = fFlags.includes("+");\n const precMatch = spec.match(/\\.(\\d+)/);\n const prec = precMatch ? parseInt(precMatch[1]) : 6;\n const formatted = n.toFixed(prec);\n const fSign = n < 0 ? "" : fHasPlus ? "+" : "";\n result += applyWidth(spec, fSign + formatted);\n }\n } else if (ch === "e" || ch === "E") {\n const n = toNumber(flat[argIdx++]);\n if (!isFinite(n) || isNaN(n)) {\n result += applyWidth(spec, numStr(n));\n } else {\n const precMatch = spec.match(/\\.(\\d+)/);\n const prec = precMatch ? parseInt(precMatch[1]) : 6;\n let eStr = n.toExponential(prec);\n eStr = eStr.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n if (ch === "E") eStr = eStr.toUpperCase();\n result += applyWidth(spec, eStr);\n }\n } else if (ch === "x" || ch === "X") {\n const n = Math.round(toNumber(flat[argIdx++]));\n let s = Math.abs(n).toString(16);\n if (ch === "X") s = s.toUpperCase();\n result += applyWidth(spec, s);\n } else if (ch === "o") {\n const n = Math.round(toNumber(flat[argIdx++]));\n result += applyWidth(spec, Math.abs(n).toString(8));\n } else if (ch === "g" || ch === "G") {\n const gVal = toNumber(flat[argIdx++]);\n if (!isFinite(gVal) || isNaN(gVal)) {\n result += applyWidth(spec, numStr(gVal));\n } else {\n const precMatch = spec.match(/\\.(\\d+)/);\n const gPrec = precMatch ? parseInt(precMatch[1]) : 6;\n let gStr;\n if (gVal === 0) {\n gStr = "0";\n } else {\n const exp = Math.floor(Math.log10(Math.abs(gVal)));\n if (exp < -4 || exp >= gPrec) {\n gStr = gVal.toExponential(gPrec - 1);\n const ePos = gStr.indexOf("e");\n let mantissa = gStr.slice(0, ePos);\n let expPart = gStr.slice(ePos);\n if (mantissa.includes(".")) {\n mantissa = mantissa.replace(/\\.?0+$/, "");\n }\n expPart = expPart.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n gStr = mantissa + expPart;\n } else {\n gStr = gVal.toPrecision(gPrec);\n if (gStr.includes(".")) {\n gStr = gStr.replace(/\\.?0+$/, "");\n }\n if (gStr.includes("e")) {\n gStr = String(parseFloat(gStr));\n }\n }\n }\n if (ch === "G") gStr = gStr.toUpperCase();\n result += applyWidth(spec, gStr);\n }\n } else if (ch === "s") {\n const sArg = flat[argIdx++];\n // A numeric/logical argument to %s is a character code (MATLAB:\n // sprintf(\'%s\', 65) -> \'A\').\n const sVal =\n typeof sArg === "number" || typeof sArg === "boolean"\n ? String.fromCharCode(Math.round(toNumber(sArg)))\n : toString(sArg);\n const sFlags = spec.slice(1);\n const sLeftAlign = sFlags.includes("-");\n const sWidthMatch = spec.match(/^%[^0-9]*(\\d+)/);\n const sWidth = sWidthMatch ? parseInt(sWidthMatch[1]) : 0;\n if (sWidth > sVal.length) {\n const sPad = " ".repeat(sWidth - sVal.length);\n result += sLeftAlign ? sVal + sPad : sPad + sVal;\n } else {\n result += sVal;\n }\n } else if (ch === "c") {\n result += String.fromCharCode(Math.round(toNumber(flat[argIdx++])));\n } else {\n result += spec + ch;\n argIdx++;\n }\n }\n } else if (fmt[i] === "\\\\" && i + 1 < fmt.length) {\n i++;\n switch (fmt[i]) {\n case "n":\n result += "\\n";\n break;\n case "t":\n result += "\\t";\n break;\n case "\\\\":\n result += "\\\\";\n break;\n default:\n result += "\\\\" + fmt[i];\n }\n i++;\n } else {\n result += fmt[i];\n i++;\n }\n }\n if (argIdx === startArgIdx) break;\n } while (argIdx < flat.length);\n\n return result;\n}\n',
|
|
73714
|
+
"format_engine.js": '// JS sibling of `format_engine.h`. Numbl-compatible printf-style\n// formatter, ported from `numbl/src/numbl-core/helpers/string.ts`\'s\n// `sprintfFormat`. Shared by fprintf / sprintf / error / assert on\n// the JS side.\n//\n// Spec set: d i u f e E g G x X o s c %\n// Flags: - + 0 # space. Precision `.N`. Width digits. `*` consumes the\n// next numeric arg as a width.\n// Escapes interpreted AT FORMAT TIME: \\n \\t \\r \\a \\b \\f \\v \\0 \\\\.\n// Numeric tensors flatten column-major into the scalar stream; the\n// format string cycles through args until consumed (with a "no arg\n// consumed this pass" guard against infinite output).\n\nfunction isTensor(v) {\n return typeof v === "object" && v !== null && v.mtoc2Tag === "tensor";\n}\nfunction isChar(v) {\n return typeof v === "object" && v !== null && v.mtoc2Tag === "char";\n}\n\nfunction toNumber(v) {\n if (typeof v === "number") return v;\n if (typeof v === "boolean") return v ? 1 : 0;\n if (typeof v === "string") return Number(v);\n if (isChar(v)) {\n // Match the interpreter\'s toNumber (runtime/convert.ts): a single\n // char yields its code point; a multi-char value has no scalar\n // numeric form. `Number("A")` would wrongly give NaN.\n if (v.value.length === 1) return v.value.charCodeAt(0);\n throw new Error("Cannot convert multi-char to number");\n }\n if (isTensor(v) && v.data.length === 1) return v.data[0];\n return Number(v);\n}\n\nfunction toString(v) {\n if (typeof v === "string") return v;\n if (typeof v === "number") return String(v);\n if (typeof v === "boolean") return v ? "1" : "0";\n if (isChar(v)) return v.value;\n return String(v);\n}\n\nfunction numStr(n) {\n if (n === Infinity) return "Inf";\n if (n === -Infinity) return "-Inf";\n if (Number.isNaN(n)) return "NaN";\n if (n === 0) return "0";\n const prec = 5;\n const exp = Math.floor(Math.log10(Math.abs(n)));\n let s;\n if (exp < -4 || exp >= prec) {\n s = n.toExponential(prec - 1);\n const ePos = s.indexOf("e");\n let mantissa = s.slice(0, ePos);\n const expPart0 = s.slice(ePos);\n if (mantissa.includes(".")) mantissa = mantissa.replace(/\\.?0+$/, "");\n const expPart = expPart0.replace(/([eE][+-])(\\d)$/, "$1" + "0$2");\n s = mantissa + expPart;\n } else {\n if (Number.isInteger(n)) return String(n);\n s = n.toPrecision(prec);\n if (s.includes(".")) s = s.replace(/\\.?0+$/, "");\n }\n return s;\n}\n\nfunction applyWidth(spec, str) {\n const m = spec.match(/^%([-+ #]*)0?(\\d+)?/);\n if (!m) return str;\n const explicitFlags = m[1] || "";\n const leftAlign = explicitFlags.includes("-");\n const afterPercent = spec.slice(1);\n const flagAndWidth = afterPercent.match(/^([-+ #]*)(0?)(\\d+)?/);\n const zeroFlag = flagAndWidth ? flagAndWidth[2] === "0" : false;\n const width = flagAndWidth && flagAndWidth[3] ? parseInt(flagAndWidth[3]) : 0;\n if (width <= str.length) return str;\n const zeroPad = !leftAlign && zeroFlag;\n const padLen = width - str.length;\n if (leftAlign) return str + " ".repeat(padLen);\n if (zeroPad) {\n if (str[0] === "-" || str[0] === "+") {\n return str[0] + "0".repeat(padLen) + str.slice(1);\n }\n return "0".repeat(padLen) + str;\n }\n return " ".repeat(padLen) + str;\n}\n\nfunction mtoc2_sprintf_format(fmt, args) {\n // Char literals (`\'foo\'`) come through wrapped as\n // `{mtoc2Tag:"char", value:"..."}` to match the interpreter\'s\n // RuntimeValue convention; unwrap so the format walker indexes\n // a plain JS string.\n if (isChar(fmt)) fmt = fmt.value;\n // Flatten args column-major (tensors expand element-by-element).\n const flat = [];\n for (const arg of args) {\n if (isTensor(arg)) {\n for (let k = 0; k < arg.data.length; k++) flat.push(arg.data[k]);\n } else {\n flat.push(arg);\n }\n }\n\n let result = "";\n let argIdx = 0;\n\n do {\n const startArgIdx = argIdx;\n let outOfArgs = false;\n let i = 0;\n while (i < fmt.length && !outOfArgs) {\n if (fmt[i] === "%" && i + 1 < fmt.length) {\n i++;\n let spec = "%";\n while (i < fmt.length && !"dfigeEsoxXuc%".includes(fmt[i])) {\n if (fmt[i] === "*") {\n if (argIdx >= flat.length) {\n outOfArgs = true;\n break;\n }\n spec += String(Math.round(toNumber(flat[argIdx++])));\n i++;\n } else {\n spec += fmt[i];\n i++;\n }\n }\n if (outOfArgs) break;\n if (i < fmt.length) {\n const ch = fmt[i];\n i++;\n if (ch === "%") {\n result += "%";\n } else if (argIdx >= flat.length) {\n outOfArgs = true;\n } else if (ch === "d" || ch === "i" || ch === "u") {\n const raw = toNumber(flat[argIdx++]);\n const isInt = Number.isInteger(raw);\n const canPrintAsInt = ch === "u" ? isInt && raw >= 0 : isInt;\n if (!canPrintAsInt) {\n let eStr = raw.toExponential(6);\n eStr = eStr.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n result += applyWidth(spec, eStr);\n } else {\n const n = raw;\n const flags = spec.slice(1);\n const hasPlus = flags.includes("+");\n const leftAlign = flags.includes("-");\n const widthMatch = spec.match(/^%[^0-9]*(\\d+)/);\n const width = widthMatch ? parseInt(widthMatch[1]) : 0;\n const zeroPad = !leftAlign && /^[-+ ]*0/.test(spec.slice(1));\n const s = String(Math.abs(n));\n const sign = n < 0 ? "-" : hasPlus ? "+" : "";\n if (width > 0) {\n const padChar = zeroPad ? "0" : " ";\n const padLen = Math.max(0, width - sign.length - s.length);\n const pad = padChar.repeat(padLen);\n result += leftAlign\n ? sign + s + " ".repeat(padLen)\n : zeroPad\n ? sign + pad + s\n : pad + sign + s;\n } else {\n result += sign + s;\n }\n }\n } else if (ch === "f") {\n const n = toNumber(flat[argIdx++]);\n if (!isFinite(n) || isNaN(n)) {\n result += applyWidth(spec, numStr(n));\n } else {\n const fFlags = spec.slice(1);\n const fHasPlus = fFlags.includes("+");\n const precMatch = spec.match(/\\.(\\d+)/);\n const prec = precMatch ? parseInt(precMatch[1]) : 6;\n const formatted = n.toFixed(prec);\n const fSign = n < 0 ? "" : fHasPlus ? "+" : "";\n result += applyWidth(spec, fSign + formatted);\n }\n } else if (ch === "e" || ch === "E") {\n const n = toNumber(flat[argIdx++]);\n if (!isFinite(n) || isNaN(n)) {\n result += applyWidth(spec, numStr(n));\n } else {\n const precMatch = spec.match(/\\.(\\d+)/);\n const prec = precMatch ? parseInt(precMatch[1]) : 6;\n let eStr = n.toExponential(prec);\n eStr = eStr.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n if (ch === "E") eStr = eStr.toUpperCase();\n result += applyWidth(spec, eStr);\n }\n } else if (ch === "x" || ch === "X") {\n const n = Math.round(toNumber(flat[argIdx++]));\n let s = Math.abs(n).toString(16);\n if (ch === "X") s = s.toUpperCase();\n result += applyWidth(spec, s);\n } else if (ch === "o") {\n const n = Math.round(toNumber(flat[argIdx++]));\n result += applyWidth(spec, Math.abs(n).toString(8));\n } else if (ch === "g" || ch === "G") {\n const gVal = toNumber(flat[argIdx++]);\n if (!isFinite(gVal) || isNaN(gVal)) {\n result += applyWidth(spec, numStr(gVal));\n } else {\n const precMatch = spec.match(/\\.(\\d+)/);\n const gPrec = precMatch ? parseInt(precMatch[1]) : 6;\n let gStr;\n if (gVal === 0) {\n gStr = "0";\n } else {\n const exp = Math.floor(Math.log10(Math.abs(gVal)));\n if (exp < -4 || exp >= gPrec) {\n gStr = gVal.toExponential(gPrec - 1);\n const ePos = gStr.indexOf("e");\n let mantissa = gStr.slice(0, ePos);\n let expPart = gStr.slice(ePos);\n if (mantissa.includes(".")) {\n mantissa = mantissa.replace(/\\.?0+$/, "");\n }\n expPart = expPart.replace(/e([+-])(\\d)$/, "e$1" + "0$2");\n gStr = mantissa + expPart;\n } else {\n gStr = gVal.toPrecision(gPrec);\n if (gStr.includes(".")) {\n gStr = gStr.replace(/\\.?0+$/, "");\n }\n if (gStr.includes("e")) {\n gStr = String(parseFloat(gStr));\n }\n }\n }\n if (ch === "G") gStr = gStr.toUpperCase();\n result += applyWidth(spec, gStr);\n }\n } else if (ch === "s") {\n const sArg = flat[argIdx++];\n // A numeric/logical argument to %s is a character code (MATLAB:\n // sprintf(\'%s\', 65) -> \'A\').\n const sVal =\n typeof sArg === "number" || typeof sArg === "boolean"\n ? String.fromCharCode(Math.round(toNumber(sArg)))\n : toString(sArg);\n const sFlags = spec.slice(1);\n const sLeftAlign = sFlags.includes("-");\n const sWidthMatch = spec.match(/^%[^0-9]*(\\d+)/);\n const sWidth = sWidthMatch ? parseInt(sWidthMatch[1]) : 0;\n if (sWidth > sVal.length) {\n const sPad = " ".repeat(sWidth - sVal.length);\n result += sLeftAlign ? sVal + sPad : sPad + sVal;\n } else {\n result += sVal;\n }\n } else if (ch === "c") {\n result += String.fromCharCode(Math.round(toNumber(flat[argIdx++])));\n } else {\n result += spec + ch;\n argIdx++;\n }\n }\n } else if (fmt[i] === "\\\\" && i + 1 < fmt.length) {\n i++;\n switch (fmt[i]) {\n case "n":\n result += "\\n";\n break;\n case "t":\n result += "\\t";\n break;\n case "r":\n result += "\\r";\n break;\n case "a":\n result += "\\x07";\n break;\n case "b":\n result += "\\b";\n break;\n case "f":\n result += "\\f";\n break;\n case "v":\n result += "\\v";\n break;\n case "0":\n result += "\\0";\n break;\n case "\\\\":\n result += "\\\\";\n break;\n default:\n result += "\\\\" + fmt[i];\n }\n i++;\n } else {\n result += fmt[i];\n i++;\n }\n }\n if (argIdx === startArgIdx) break;\n } while (argIdx < flat.length);\n\n return result;\n}\n',
|
|
73697
73715
|
"fprintf.js": "// JS sibling of `fprintf.h`. Routes formatted output through\n// `mtoc2_sprintf_format` then writes via `$write` (the JS analog of\n// C's stdout). Numbl-compatible spec set & semantics.\n\n\nfunction mtoc2_fprintf(fmt, ...args) {\n $write(mtoc2_sprintf_format(fmt, args));\n}\n",
|
|
73698
73716
|
"sprintf.js": '// JS sibling of `sprintf.h`. Two output variants:\n// - `mtoc2_sprintf_str(fmt, args)` returns the formatted text as a\n// plain JS string (the equivalent of numbl\'s `String` kind).\n// - `mtoc2_sprintf_char(fmt, args)` returns it as a `mtoc2_char_tensor_t`\n// placeholder \u2014 we keep the JS shape as a `{mtoc2Tag: "char", value}`\n// object so disp/length etc. dispatch correctly.\n\n\nfunction mtoc2_sprintf_str(fmt, ...args) {\n return mtoc2_sprintf_format(fmt, args);\n}\n\nfunction mtoc2_sprintf_char(fmt, ...args) {\n return { mtoc2Tag: "char", value: mtoc2_sprintf_format(fmt, args) };\n}\n',
|
|
73699
73717
|
"warning_fmt.js": '// JS sibling of `warning_fmt.h`. Format the message and write\n// `Warning: <msg>\\n` via `$write`. Matches numbl\n// (`runtime/specialBuiltins.ts:190` \u2014 `rt.output("Warning: " + msg + "\\n")`).\n\n\nfunction mtoc2_warning_fmt(fmt, ...args) {\n $write("Warning: " + mtoc2_sprintf_format(fmt, args) + "\\n");\n}\n\nfunction mtoc2_warning_fmt_id(_id, fmt, ...args) {\n // The id is informational \u2014 numbl threads it to lastwarn state,\n // which mtoc2 doesn\'t expose. Drop it here so the visible output\n // matches the bare form.\n $write("Warning: " + mtoc2_sprintf_format(fmt, args) + "\\n");\n}\n',
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Numbl version, used for JIT disk cache invalidation. */
|
|
2
|
-
export declare const NUMBL_VERSION = "0.4.
|
|
2
|
+
export declare const NUMBL_VERSION = "0.4.14";
|
|
@@ -4810,7 +4810,7 @@ directive is a comment, so MATLAB ignores it.`},disp:{signatures:["disp(X)"],des
|
|
|
4810
4810
|
|
|
4811
4811
|
`);u=p.pop()||"";for(const m of p){const y=m.trim();if(!y.startsWith("data: "))continue;const _=y.slice(6);try{const b=JSON.parse(_);b.type==="output"?t.onOutput(b.text):b.type==="drawnow"?t.onDrawnow(b.plotInstructions):b.type==="done"?h={...h,generatedJS:b.generatedJS}:b.type==="error"?h={success:!1,error:b.message,timedOut:b.timedOut}:b.type==="close"&&(h={...h,success:b.success})}catch{}}}return h}catch(o){return o instanceof DOMException&&o.name==="AbortError"?{success:!1,error:"Execution aborted"}:(console.error("Remote execution failed:",o),{success:!1,error:o instanceof Error?`Connection failed: ${o.message}`:"Unknown error occurred"})}}const cPe="https://magland.github.io/numbl-wasm-bridge/",yY="numbl_wasm_bridge_url";function _Y(){return localStorage.getItem(yY)||cPe}function uPe(e){localStorage.setItem(yY,e)}let vY=!0;function bY(){return vY}function hPe(e){vY=e}function x3(){return bY()?_Y():null}const WN="/system/";function fPe(e){return e.startsWith("/project/")?e.slice(9):e.startsWith("/")?e.slice(1):e}function xY(e){return e.startsWith(WN)?e.slice(WN.length):e}function w3(e){return e.startsWith(WN)||e==="/system"}function wY(e){const t={created:[],modified:[],deleted:[]},n={created:[],modified:[],deleted:[]};for(const r of e.created)(w3(r.path)?n:t).created.push(r);for(const r of e.modified)(w3(r.path)?n:t).modified.push(r);for(const r of e.deleted)(w3(r)?n:t).deleted.push(r);return{projectChanges:t,systemChanges:n}}async function qN(e,t,n){const r=[],i=[],s=[];return await Dn.transaction("rw",Dn.files,Dn.fileContents,Dn.projects,async()=>{for(const{path:o,content:a}of t.created){const l=n(o),c=Date.now(),u=crypto.randomUUID();await Dn.files.add({id:u,projectName:e,path:l,createdAt:c,updatedAt:c}),await Dn.fileContents.add({id:u,data:a}),r.push({id:u,name:l})}for(const{path:o,content:a}of t.modified){const l=n(o),c=await Dn.files.where("[projectName+path]").equals([e,l]).first();c&&(await Dn.fileContents.put({id:c.id,data:a}),await Dn.files.update(c.id,{updatedAt:Date.now()}),i.push({path:l,data:a}))}for(const o of t.deleted){const a=n(o),l=await Dn.files.where("[projectName+path]").equals([e,a]).first();l&&(await Dn.files.delete(l.id),await Dn.fileContents.delete(l.id),s.push(a))}(r.length>0||i.length>0||s.length>0)&&await Dn.projects.update(e,{updatedAt:Date.now()})}),r.length===0&&i.length===0&&s.length===0?null:{addedFiles:r,modifiedFiles:i,deletedPaths:s}}async function SY(e){const{systemChanges:t}=wY(e);return t.created.length===0&&t.modified.length===0&&t.deleted.length===0?!1:(await j0(),await qN(Wl,t,xY)!==null)}async function dPe(e,t){const{projectChanges:n,systemChanges:r}=wY(t),i=await qN(e,n,fPe);let s=null;return(r.created.length>0||r.modified.length>0||r.deleted.length>0)&&(await j0(),s=await qN(Wl,r,xY)),{projectResult:i,systemResult:s}}const sa="system/";function MY(){const[e,t]=ne.useState([]),n=ne.useRef(new Map),r=ne.useCallback(async()=>{const _=await qA();t(_.map(b=>({id:b.id,name:sa+b.path})))},[]);ne.useEffect(()=>{r()},[r]);const i=ne.useCallback(async _=>{const b=n.current.get(_);if(b!==void 0)return b;const x=await bF(_);return n.current.set(_,x),x},[]),s=ne.useCallback(async()=>{const _=await GA();for(const[b,x]of _)n.current.set(b,x);return _},[]),o=ne.useCallback(async()=>{const[_,b]=await Promise.all([qA(),GA()]);return _.map(x=>({path:"/system/"+x.path,content:b.get(x.id)??new Uint8Array(0)}))},[]),a=ne.useCallback(async()=>{const _=new TextDecoder("utf-8"),[b,x]=await Promise.all([qA(),GA()]);return b.filter(S=>S.path.endsWith(".m")).map(S=>({name:"/system/"+S.path,source:_.decode(x.get(S.id)??new Uint8Array(0))}))},[]),l=ne.useCallback(async(_,b)=>{n.current.set(_,b),await Aae(_,b)},[]),c=ne.useCallback(async _=>{await j0();const b=_?.startsWith(sa)?_.slice(sa.length):_,x=z7(e,_),S=b?`${b}/${x}`:x,M=Date.now(),E=crypto.randomUUID(),T=new Uint8Array(0);return await Dn.transaction("rw",Dn.files,Dn.fileContents,async()=>{await Dn.files.add({id:E,projectName:Wl,path:S,createdAt:M,updatedAt:M}),await Dn.fileContents.add({id:E,data:T})}),n.current.set(E,T),t(k=>[...k,{id:E,name:sa+S}]),E},[e]),u=ne.useCallback(async _=>{await j0();const b=_?.startsWith(sa)?_.slice(sa.length):_,x=pPe(e,_),S=b?`${b}/${x}`:x,M=z7(e,sa+S),E=`${S}/${M}`,T=Date.now(),k=crypto.randomUUID(),R=new Uint8Array(0);return await Dn.transaction("rw",Dn.files,Dn.fileContents,async()=>{await Dn.files.add({id:k,projectName:Wl,path:E,createdAt:T,updatedAt:T}),await Dn.fileContents.add({id:k,data:R})}),n.current.set(k,R),t(P=>[...P,{id:k,name:sa+E}]),sa+S},[e]),h=ne.useCallback(async _=>{await Dn.transaction("rw",Dn.files,Dn.fileContents,async()=>{await Dn.files.delete(_),await Dn.fileContents.delete(_)}),n.current.delete(_),t(b=>b.filter(x=>x.id!==_))},[]),f=ne.useCallback(async _=>{const b=e.filter(x=>x.name.startsWith(_+"/"));await Dn.transaction("rw",Dn.files,Dn.fileContents,async()=>{for(const x of b)await Dn.files.delete(x.id),await Dn.fileContents.delete(x.id)});for(const x of b)n.current.delete(x.id);t(x=>x.filter(S=>!S.name.startsWith(_+"/")))},[e]),d=ne.useCallback(async(_,b)=>{const x=b.startsWith(sa)?b.slice(sa.length):b;await Dn.files.update(_,{path:x,updatedAt:Date.now()}),t(S=>S.map(M=>M.id===_?{...M,name:b}:M))},[]),p=ne.useCallback(async(_,b)=>{const x=_.split("/");x[x.length-1]=b;const S=x.join("/"),M=e.filter(E=>E.name.startsWith(_+"/"));await Promise.all(M.map(E=>{const T=S+E.name.slice(_.length),k=T.startsWith(sa)?T.slice(sa.length):T;return Dn.files.update(E.id,{path:k,updatedAt:Date.now()})})),t(E=>E.map(T=>T.name.startsWith(_+"/")?{...T,name:S+T.name.slice(_.length)}:T))},[e]),m=ne.useCallback(async _=>{const b=e.find(R=>R.id===_);if(!b)return"";const x=jH(e,b.name),S=x.startsWith(sa)?x.slice(sa.length):x,M=n.current.get(_)??await bF(_),E=new Uint8Array(M),T=Date.now(),k=crypto.randomUUID();return await j0(),await Dn.transaction("rw",Dn.files,Dn.fileContents,async()=>{await Dn.files.add({id:k,projectName:Wl,path:S,createdAt:T,updatedAt:T}),await Dn.fileContents.add({id:k,data:E})}),n.current.set(k,E),t(R=>[...R,{id:k,name:x}]),k},[e]),y=ne.useCallback(async(_,b)=>{const x=e.find(k=>k.id===_);if(!x)return;const S=x.name.split("/"),M=S[S.length-1],E=b?`${b}/${M}`:M;if(E===x.name)return;const T=E.startsWith(sa)?E.slice(sa.length):E;await Dn.files.update(_,{path:T,updatedAt:Date.now()}),t(k=>k.map(R=>R.id===_?{...R,name:E}:R))},[e]);return{systemFiles:e,reloadSystemFiles:r,updateSystemFileContent:l,addSystemFile:c,addSystemFolder:u,deleteSystemFile:h,deleteSystemFolder:f,renameSystemFile:d,renameSystemFolder:p,moveSystemFile:y,duplicateSystemFile:m,loadSystemFileContent:i,loadAllSystemContents:s,getSystemVfsFiles:o,getSystemWorkspaceFiles:a,systemContentCache:n}}function z7(e,t){const n=new Set(e.map(r=>r.name));for(let r=1;;r++){const i=`untitled${r===1?"":r}.m`,s=t?`${t}/${i}`:i;if(!n.has(s))return i}}function pPe(e,t){const n=new Set;for(const r of e)if(t){if(r.name.startsWith(t+"/")){const i=r.name.slice(t.length+1).split("/");i.length>1&&n.add(i[0])}}else{const i=r.name.split("/");i.length>1&&n.add(i[0])}for(let r=1;;r++){const i=`folder${r===1?"":r}`;if(!n.has(i))return i}}const mPe="https://github.com/mip-org/mip-core/releases/download/mip-numbl/mip-numbl-any.mhl",gPe="mip/packages/gh/mip-org/core/mip/";function yPe(e){if(/^https:\/\/github\.com\/.+\/releases\/download\/.+/.test(e)){let t=e.replace("https://github.com/","https://mip-cors-proxy.figurl.workers.dev/gh/");return t+=t.includes("?")?"&":"?",t+="t="+Date.now(),t}return e}async function _Pe(){const e=await fetch(yPe(mPe));if(!e.ok)throw new Error(`HTTP ${e.status}`);const t=await e.arrayBuffer();return XH(new Uint8Array(t)).map(r=>({path:"/system/"+gPe+r.path,content:r.content}))}const vPe=600*1e3,EY="numbl:systemLastActivity";function CY(){try{localStorage.setItem(EY,String(Date.now()))}catch{}}function bPe(){try{const e=localStorage.getItem(EY),t=e?parseInt(e,10):0;return Number.isFinite(t)?t:0}catch{return 0}}function AY(e){ne.useEffect(()=>{let t=!1;return(async()=>{try{if(Date.now()-bPe()>vPe&&await kae(),CY(),t)return;if(await j0(),!await Tae()){const n=await _Pe();if(t)return;const r=Date.now();await Dn.transaction("rw",Dn.files,Dn.fileContents,async()=>{const i=n.map(o=>{const a=o.path.replace(/^\/system\//,"");return{id:"mip:"+a,projectName:Wl,path:a,createdAt:r,updatedAt:r}}),s=n.map(o=>({id:"mip:"+o.path.replace(/^\/system\//,""),data:o.content}));await Dn.files.bulkPut(i),await Dn.fileContents.bulkPut(s)})}t||e()}catch(n){console.warn("Failed to ensure mip core package:",n)}})(),()=>{t=!0}},[])}Qu.registerLanguage("javascript",VL);Qu.registerLanguage("c",cue);const xPe=new TextEncoder;function wPe({files:e,activeFileId:t,setActiveFileId:n,updateFileContent:r,addFile:i,addFolder:s,deleteFile:o,deleteFolder:a,renameFile:l,renameFolder:c,moveFile:u,duplicateFile:h,uploadFiles:f,headerContent:d,projectName:p,loadFileContent:m,loadAllContents:y,contentCache:_,maxInitialOutputPanelHeight:b,mergeVfsChanges:x}){const{systemFiles:S,reloadSystemFiles:M,updateSystemFileContent:E,addSystemFile:T,addSystemFolder:k,deleteSystemFile:R,deleteSystemFolder:P,renameSystemFile:F,renameSystemFolder:L,moveSystemFile:j,duplicateSystemFile:V,loadSystemFileContent:U,getSystemVfsFiles:B,getSystemWorkspaceFiles:N,loadAllSystemContents:H}=MY();AY(M);const O=ne.useCallback(ut=>ut==="system"||ut.startsWith("system/"),[]),G=ne.useCallback(ut=>S.some(Lt=>Lt.id===ut),[S]),Z=ne.useMemo(()=>[...e,...S],[e,S]),[ie,Y]=ne.useState("1"),[ce,pe]=ne.useState(""),[te,X]=ne.useState(null),[de,fe]=ne.useState(""),[le,J]=ne.useState(!1),[K,Se]=ne.useReducer(SI,rE),[ye,Xe]=ne.useState(0),[Fe,Oe]=ne.useState("js"),[Ee,ke]=ne.useState([]),_e=ne.useCallback(ut=>{const Lt=[];ut?.mainFile&&Lt.push({name:ut.mainFile.name,ast:ut.mainFile.ast,irProgram:ut.mainFile.irProgram});for(const pn of ut?.workspaceFiles??[])Lt.push({name:pn.name,ast:pn.ast,irProgram:pn.irProgram});return Lt},[]),we=ne.useMemo(()=>{if(Ee.length===0)return null;if(Ee.length===1)return Ee[0].ast;const ut={};for(const Lt of Ee)ut[Lt.name]=Lt.ast;return ut},[Ee]),[Le,ae]=ne.useState(null),[Q,xe]=ne.useState(0),[ge,be]=ne.useState(!1),[ve,Be]=ne.useState(),[He,je]=ne.useState("rendered"),[st,We]=ne.useState(0),[lt,Tt]=ne.useState(!1),rt=ne.useRef(null),ot=xae("(max-width:768px)"),Pe=ne.useRef(ot);Pe.current=ot;const[Ae,ze]=ne.useState(!1),[_t,zt]=ne.useState(0),[xt,vt]=ne.useState(!1),[Ct,Wt]=ne.useState(yM()),[Ut,Yt]=ne.useState(!1),[Ot,hn]=ne.useState(yM()),[Zn,Mn]=ne.useState(bY),[Kn,Ts]=ne.useState(_Y),ds=ne.useCallback(()=>{const ut=crypto.randomUUID().replace(/-/g,"").slice(0,16);return sessionStorage.setItem("numbl_passkey",ut),ut},[]),[Ci,Lo]=ne.useState(()=>{const ut=sessionStorage.getItem("numbl_passkey");return ut||ds()}),Hi=ne.useRef(Ci);Hi.current=Ci;const Kr=xt?"localhost":"browser",[Or,ps]=ne.useState(null),[ms,Yo]=ne.useState("unknown");ne.useEffect(()=>{if(!xt){ps(null),Yo("unknown");return}let ut=!1;return F7(Ct,Hi.current).then(Lt=>{ut||(Lt?(ps(Lt.nativeAddon===!0),Yo("connected")):Yo("disconnected"))}),()=>{ut=!0}},[xt,Ct,Ci]);const vi=ne.useRef(null),za=ne.useRef(ZH()),Yi=ne.useRef(typeof SharedArrayBuffer<"u"?new SharedArrayBuffer(4):null),mo=ne.useRef(null),Zs=ne.useRef(null),lr=ne.useRef(null),[$i,Ce]=ne.useState(!1);ne.useEffect(()=>{vi.current?.postMessage({type:"set_optimization",optimization:ie})},[ie]);const Ye=window.innerWidth>=1200?260:200,[St,yt]=ne.useState(Ye),[mt,rn]=ne.useState((window.innerWidth-Ye)/2),[ht,Rt]=ne.useState(()=>b!=null?Math.min(window.innerHeight/2,b):window.innerHeight/2),Gt=b!=null?Math.min(150,b):150,qt=ne.useMemo(()=>Z.find(ut=>ut.id===t),[Z,t]),Xt=ne.useCallback(ut=>{let Lt=ut.split(/[?#]/)[0];try{Lt=decodeURIComponent(Lt)}catch{}if(Lt=Lt.replace(/^\.\//,""),!Lt)return;const pn=jr=>jr.split("/").pop()??jr,tr=Z.find(jr=>jr.name===Lt)??Z.find(jr=>pn(jr.name)===pn(Lt));tr&&(n(tr.id),ot&&ze(!1))},[Z,n,ot]),En=ne.useMemo(()=>Object.keys(K.figs).map(ut=>Number(ut)).sort((ut,Lt)=>ut-Lt),[K.figs]),[cn,In]=ne.useState(!1),_r=ne.useCallback(async()=>{const ut=En[Q],Lt=K.figs[ut];if(Lt){In(!0);try{await Oxe(Lt,ut)}catch(pn){console.error("Figure HDF5 export failed:",pn)}finally{In(!1)}}},[K.figs,En,Q]),[fr,dr]=ne.useState(null),Ki=ne.useCallback(async()=>{const ut=K.figs[En[Q]];if(!ut)return;const Lt=Yxe(ut);if(Lt.url){window.open(Lt.url,"_blank"),dr(null);return}dr({kind:"uploading"});try{const pn=await twe(ut);dr({kind:"ready",url:pn})}catch{dr({kind:"failed",baseUrl:Lt.baseUrl})}},[K.figs,En,Q]);ne.useEffect(()=>{const ut=Object.keys(K.figs).map(Number).sort((Lt,pn)=>Lt-pn);if(ut.length>0){const Lt=ut.indexOf(K.currentHandle);Lt>=0&&xe(Lt)}},[K.figs,K.currentHandle]);const Zt=ne.useCallback(ut=>{if(Se(ut),!Pe.current)return;const Lt=ut.type;Lt.startsWith("set_")||Lt==="cla"||Lt==="clf"||Lt==="close"||Lt==="close_all"||zt(1)},[]);ne.useEffect(()=>{const ut=Lt=>{const pn=Lt.data;!pn||pn.source!=="numbl-uihtml"||vi.current?.postMessage({type:"html_event",compId:pn.compId,kind:pn.kind,name:pn.name,data:pn.data})};return window.addEventListener("message",ut),()=>window.removeEventListener("message",ut)},[]),ne.useEffect(()=>{if(!ge)return;const ut=Lt=>{Lt.key==="Escape"&&be(!1)};return window.addEventListener("keydown",ut),()=>window.removeEventListener("keydown",ut)},[ge]);const Ii=ne.useCallback(async(ut,Lt)=>{const[pn,tr,jr]=await Promise.all([y(),B(),N()]),Ko=await H(),Oa=[...ut.map(ni=>({path:ni.name,content:pn.get(ni.id)??new Uint8Array(0)})),...tr],yo=new TextDecoder("utf-8"),ja=[...ut.filter(ni=>!Lt||ni.id!==Lt).filter(ni=>ni.name.endsWith(".m")).map(ni=>({name:ni.name,source:yo.decode(pn.get(ni.id)??new Uint8Array(0))})),...jr];return{vfsFiles:Oa,workspaceFiles:ja,projectContents:pn,systemContents:Ko}},[y,B,N,H]),Nn=ne.useCallback(async ut=>{if(!ut)return;const{created:Lt,modified:pn,deleted:tr}=ut;if(!(Lt.length===0&&pn.length===0&&tr.length===0))if(p){const{projectResult:jr,systemResult:Ko}=await dPe(p,ut);jr&&x&&x(jr),Ko&&M()}else await SY(ut)&&M()},[p,x,M]),bi=ne.useCallback(ut=>{ut.onmessage=Lt=>{const pn=Lt.data;if(pn.type==="request-input"){const tr=prompt(pn.prompt??"")??"",jr=za.current;jr&&QH(jr,tr);return}if(pn.type==="output"){if(mo.current==="repl"){const tr=rt.current;tr?.writeOutput&&tr.writeOutput(pn.text,!1)}else pe(tr=>tr+pn.text);return}if(pn.type==="drawnow"){if(pn.plotInstructions?.length)for(const tr of pn.plotInstructions)Zt(tr);return}if(pn.type==="html_source_event"){document.querySelectorAll(`iframe[title="uihtml-${pn.compId}"]`).forEach(jr=>jr.contentWindow?.postMessage({source:"numbl-host",compId:pn.compId,name:pn.name,dataJson:pn.dataJson},"*"));return}if(pn.type==="done"){if(mo.current=null,fe(pn.generatedJS||""),ke(_e(pn.workspaceRep)),ae(pn.workspaceRep?.fileSources??null),X(pn.dispatchUnknownCounts??null),J(!1),pn.plotInstructions?.length)for(const tr of pn.plotInstructions)Zt(tr);Nn(pn.vfsChanges);return}if(pn.type==="error"){mo.current=null,pn.generatedJS&&fe(pn.generatedJS),ke(_e(pn.workspaceRep)),ae(pn.workspaceRep?.fileSources??null),J(!1),pe(tr=>tr+`
|
|
4812
4812
|
${NV(pn)}
|
|
4813
|
-
`),Nn(pn.vfsChanges);return}if(pn.type==="result"){mo.current=null;const tr=rt.current;if(pn.success){if(pn.plotInstructions?.length)for(const jr of pn.plotInstructions)Zt(jr)}else pn.error&&tr?.writeOutput&&tr.writeOutput(pn.error,!0);Nn(pn.vfsChanges),tr?.writePrompt&&tr.writePrompt(),Tt(!1);return}},ut.onerror=Lt=>{mo.current=null;const pn=rt.current;pn?.writeOutput&&pn.writeOutput(`Worker error: ${Lt.message}`,!0),J(!1),Tt(!1)}},[Zt,_e,Nn]);ne.useEffect(()=>{const ut=new Worker(new URL(""+new URL("numbl-worker-
|
|
4813
|
+
`),Nn(pn.vfsChanges);return}if(pn.type==="result"){mo.current=null;const tr=rt.current;if(pn.success){if(pn.plotInstructions?.length)for(const jr of pn.plotInstructions)Zt(jr)}else pn.error&&tr?.writeOutput&&tr.writeOutput(pn.error,!0);Nn(pn.vfsChanges),tr?.writePrompt&&tr.writePrompt(),Tt(!1);return}},ut.onerror=Lt=>{mo.current=null;const pn=rt.current;pn?.writeOutput&&pn.writeOutput(`Worker error: ${Lt.message}`,!0),J(!1),Tt(!1)}},[Zt,_e,Nn]);ne.useEffect(()=>{const ut=new Worker(new URL(""+new URL("numbl-worker-B-MPuV6f.js",import.meta.url).href,import.meta.url),{type:"module"});return vi.current=ut,ut.postMessage({type:"set_wasm_bridge",url:x3()}),za.current&&ut.postMessage({type:"set_input_sab",inputSAB:za.current}),bi(ut),()=>{ut.terminate()}},[bi]);const fi=ne.useRef(!0);ne.useEffect(()=>{fi.current=!0},[e,S]),ne.useEffect(()=>{if(ve){const ut=setTimeout(()=>{Be(void 0)},100);return()=>clearTimeout(ut)}},[ve]);const go=ne.useCallback(async()=>{if(!qt||!qt.name.toLowerCase().endsWith(".m"))return;J(!0),pe(""),X(null),ke([]),ae(null),Se({type:"clear"}),zt(0);const{vfsFiles:ut,workspaceFiles:Lt,projectContents:pn}=await Ii(e,t),tr=pn.get(t)??_.current.get(t)??new Uint8Array(0),jr=L_(tr);try{const Ko=RV(jr);console.info("AST:",Ko)}catch{console.info("Parse check skipped - error will be handled by worker")}if(xt){const Ko=new AbortController;Zs.current=Ko;try{const Oa=new TextDecoder("utf-8"),yo=[];for(const ni of e){if(ni.name==="system"||ni.name.startsWith("system/"))continue;const Ml=pn.get(ni.id)??_.current.get(ni.id)??new Uint8Array(0);XA(Ml)||yo.push({name:ni.name,content:Oa.decode(Ml)})}if(!yo.some(ni=>ni.name===qt.name))yo.push({name:qt.name,content:jr});else{const ni=yo.findIndex(Ml=>Ml.name===qt.name);yo[ni]={name:qt.name,content:jr}}const ja=await lPe({files:yo,mainScript:qt.name,optimization:ie},{onOutput:ni=>{pe(Ml=>Ml+ni)},onDrawnow:ni=>{for(const Ml of ni)Zt(Ml)}},Ct,Ko.signal,Hi.current);fe(ja.generatedJS||""),ja.success||pe(ni=>ni+`
|
|
4814
4814
|
Error: ${ja.error}${ja.timedOut?" (timed out)":""}
|
|
4815
4815
|
`)}catch(Oa){pe(yo=>yo+`
|
|
4816
4816
|
Remote execution failed: ${Oa instanceof Error?Oa.message:"Unknown error"}
|
|
@@ -4818,7 +4818,7 @@ Remote execution failed: ${Oa instanceof Error?Oa.message:"Unknown error"}
|
|
|
4818
4818
|
--- Execution stopped ---
|
|
4819
4819
|
`);return}if(vi.current)if($i){if(Yi.current){const ut=new Int32Array(Yi.current);Atomics.store(ut,0,1)}pe(ut=>ut+`
|
|
4820
4820
|
--- Cancelling execution... ---
|
|
4821
|
-
`)}else{vi.current.terminate(),mo.current=null;const ut=new Worker(new URL(""+new URL("numbl-worker-
|
|
4821
|
+
`)}else{vi.current.terminate(),mo.current=null;const ut=new Worker(new URL(""+new URL("numbl-worker-B-MPuV6f.js",import.meta.url).href,import.meta.url),{type:"module"});vi.current=ut,ut.postMessage({type:"set_wasm_bridge",url:x3()}),za.current&&ut.postMessage({type:"set_input_sab",inputSAB:za.current}),bi(ut),fi.current=!0,J(!1),pe(Lt=>Lt+`
|
|
4822
4822
|
--- Execution stopped ---
|
|
4823
4823
|
`)}},[$i,bi]),_n=ne.useCallback(()=>{Wt(Ot),aPe(Ot),hPe(Zn),uPe(Kn),vi.current?.postMessage({type:"set_wasm_bridge",url:x3()}),Yt(!1)},[Ot,Zn,Kn]),xi=ne.useCallback((ut,Lt)=>{Lt!==null&&vt(Lt==="local")},[]),qr=ne.useCallback(async ut=>{if(!(lt||le)){if(Tt(!0),fi.current&&vi.current){const{vfsFiles:Lt,workspaceFiles:pn}=await Ii(e);vi.current.postMessage({type:"update_workspace",workspaceFiles:pn,vfsFiles:Lt}),fi.current=!1}if(Yi.current){const Lt=new Int32Array(Yi.current);Atomics.store(Lt,0,0)}mo.current="repl",vi.current?.postMessage({type:"execute",code:ut,cancelSAB:Yi.current??void 0})}},[lt,le,e,Ii]),cr=ne.useCallback(()=>{lt||vi.current?.postMessage({type:"clear"})},[lt]),Gn=ne.useCallback(ut=>{rt.current=ut},[]),ys=ne.useRef(""),[ts,Yl]=ne.useState(null),fn=ne.useRef(""),kn=ts?XA(ts):!1,Un=!!qt?.name.toLowerCase().endsWith(".md"),vr=!!qt?.name.toLowerCase().endsWith(".m");ne.useEffect(()=>{if(!t){Yl(null),fn.current="";return}Yl(null),fn.current="";let ut=!1;return(S.some(tr=>tr.id===t)?U:m)(t).then(tr=>{ut||(fn.current=t,Yl(tr))}),()=>{ut=!0}},[t,S,U,m]);const _s=kn||Un&&He==="rendered";ne.useEffect(()=>{_s&&(lr.current=null,ys.current="")},[_s]),ne.useEffect(()=>{if(!lr.current||!qt||t===ys.current||!ts||fn.current!==t)return;ys.current=t;const ut=XA(ts)?"":L_(ts);lr.current.value!==ut&&lr.current.setValue(ut)},[t,qt,ts]);const ga=(ut,Lt)=>{lr.current=ut,ts&&fn.current===t&&(ys.current=t),Lt.languages.register({id:"numbl"}),Lt.languages.setLanguageConfiguration("numbl",Sme),Lt.languages.setMonarchTokensProvider("numbl",Mme()),Lt.editor.defineTheme("numbl-dark",{base:"vs-dark",inherit:!0,rules:[{token:"comment",foreground:"6A9955"},{token:"keyword",foreground:"C586C0"},{token:"number",foreground:"B5CEA8"},{token:"string",foreground:"CE9178"},{token:"operator",foreground:"D4D4D4"}],colors:{}}),Lt.editor.setTheme("numbl-dark")},wi=re.jsxs(An,{sx:{height:"100%",display:"flex",flexDirection:"column"},children:[re.jsxs(Qy,{value:xt?0:st,onChange:(ut,Lt)=>We(Lt),sx:{borderBottom:1,borderColor:"divider",minHeight:34,"& .MuiTab-root":{textTransform:"none",fontWeight:500,fontSize:"0.8rem",minHeight:34,py:0}},children:[re.jsx(pu,{label:"Script"}),!xt&&re.jsx(pu,{label:"REPL"})]}),re.jsx(An,{sx:{flexGrow:1,overflow:"hidden"},children:(st===0||xt)&&!qt?re.jsxs(An,{sx:{height:"100%",display:"flex",alignItems:"center",justifyContent:"center",flexDirection:"column",gap:2,p:3},children:[re.jsx(Sr,{variant:"body2",color:"text.secondary",children:"No file open"}),re.jsx(kd,{variant:"contained",size:"small",startIcon:re.jsx(pue,{}),onClick:()=>i(),sx:{textTransform:"none"},children:"New file"})]}):st===0||xt?re.jsxs(An,{sx:{height:"100%",display:"flex",flexDirection:"column"},children:[re.jsxs(An,{sx:{px:1.5,py:.5,borderBottom:1,borderColor:"divider",display:"flex",alignItems:"center",gap:1,bgcolor:"background.default"},children:[vr&&re.jsxs(re.Fragment,{children:[re.jsx(kd,{variant:"contained",color:le?"error":"success",size:"small",startIcon:le?re.jsx(fue,{}):re.jsx(hue,{}),onClick:le?gs:go,sx:{py:.25,px:2,fontSize:"0.8rem",fontWeight:600,textTransform:"none",borderRadius:1.5,boxShadow:"none","&:hover":{boxShadow:"none"}},children:le?"Stop":"Run"}),re.jsx(ku,{title:Kr==="browser"?"Executing in browser":"Executing on local server"+(ms==="disconnected"?" (not connected)":"")+(Or===!0?" (native)":Or===!1?" (no native addon)":""),children:re.jsx(lo,{size:"small",onClick:()=>{hn(Ct),Yt(!0)},sx:{opacity:.5,"&:hover":{opacity:1}},children:Kr==="browser"?re.jsx(KF,{sx:{fontSize:"0.9rem"}}):re.jsx(ZF,{sx:{fontSize:"0.9rem",color:"error.main"}})})}),Kr==="localhost"&&re.jsx(Sr,{variant:"caption",sx:{fontSize:"0.65rem",opacity:.5,color:"error.main"},children:ms==="disconnected"?"no server":Or?"native":Or===!1?"no native":"local"}),!xt&&re.jsx(ku,{title:$i?"Workspace persists across runs and REPL (click for fresh each run)":"Fresh workspace each run (click to persist across runs and REPL)",children:re.jsx(Sr,{variant:"caption",onClick:()=>Ce(ut=>!ut),sx:{cursor:"pointer",fontSize:"0.7rem",px:.5,py:.1,borderRadius:.5,bgcolor:$i?"action.selected":"transparent",opacity:$i?1:.5,"&:hover":{opacity:1},userSelect:"none"},children:$i?"persist":"1x"})}),re.jsx(ku,{title:ie==="0"?"Interpreter only (click for JIT)":"JIT (click to disable)",children:re.jsx(Sr,{variant:"caption",onClick:()=>Y(ut=>ut==="0"?"1":"0"),sx:{cursor:"pointer",fontSize:"0.7rem",px:.5,py:.1,borderRadius:.5,bgcolor:ie!=="0"?"action.selected":"transparent",opacity:ie!=="0"?1:.5,"&:hover":{opacity:1},userSelect:"none"},children:ie==="0"?"no jit":"jit"})})]}),Un&&re.jsxs(WA,{value:He,exclusive:!0,size:"small",onChange:(ut,Lt)=>{Lt&&je(Lt)},sx:{"& .MuiToggleButton-root":{py:0,px:1,fontSize:"0.7rem",textTransform:"none",lineHeight:1.6}},children:[re.jsx(Np,{value:"rendered",children:"Rendered"}),re.jsx(Np,{value:"source",children:"Source"})]}),qt&&re.jsx(Sr,{variant:"caption",color:"text.secondary",sx:{fontFamily:"monospace",fontWeight:"bold"},children:qt.name})]}),re.jsx(An,{sx:{flexGrow:1,minHeight:0},children:kn?re.jsx(An,{sx:{display:"flex",alignItems:"center",justifyContent:"center",height:"100%",color:"text.secondary"},children:re.jsxs(Sr,{variant:"body2",children:["Binary file (",ts?.length??0," bytes)"]})}):Un&&He==="rendered"?re.jsx(An,{sx:{height:"100%",overflow:"auto",p:3},children:re.jsx(sPe,{source:ts?L_(ts):"",onFileLink:Xt})}):re.jsx(pce,{height:"100%",language:qt?.name.endsWith(".js")?"javascript":Un?"markdown":"numbl",defaultValue:ts?L_(ts):"",onChange:ut=>{const Lt=xPe.encode(ut||"");Yl(Lt),fi.current=!0,G(t)?E(t,Lt):r(ut||"")},onMount:ga,options:{minimap:{enabled:!1},fontSize:14,lineNumbers:"on",scrollBeyondLastLine:!1}})})]}):re.jsx(_Me,{onExecute:qr,onClear:cr,isExecuting:lt,onTerminalReady:Gn})})]}),Ua=re.jsxs(An,{sx:{height:"100%",display:"flex",flexDirection:"column"},children:[re.jsxs(Qy,{value:ye,onChange:(ut,Lt)=>Xe(Lt),sx:{borderBottom:1,borderColor:"divider",minHeight:34,"& .MuiTab-root":{textTransform:"none",fontWeight:500,fontSize:"0.8rem",minHeight:34,py:0}},children:[re.jsx(pu,{label:"Output"}),re.jsx(pu,{label:"Internals"})]}),re.jsxs(An,{sx:{flexGrow:1,overflow:"hidden"},children:[ye===0&&re.jsx(An,{sx:{height:"100%",overflow:"auto",p:1.5},children:ce?re.jsx("pre",{style:{margin:0,fontFamily:'Menlo, Monaco, "Courier New", monospace',fontSize:"13px",lineHeight:1.5,whiteSpace:"pre-wrap"},children:ce}):re.jsx(Sr,{variant:"body2",color:"text.disabled",sx:{fontStyle:"italic",mt:2,textAlign:"center"},children:"Run a script to see output here"})}),ye===1&&re.jsxs(An,{sx:{height:"100%",display:"flex",flexDirection:"column"},children:[re.jsx(An,{sx:{display:"flex",alignItems:"center",px:1,py:.5},children:re.jsxs(WA,{value:Fe,exclusive:!0,onChange:(ut,Lt)=>{Lt&&Oe(Lt)},size:"small",children:[re.jsx(Np,{value:"js",sx:{py:0,px:1,fontSize:"0.75rem",textTransform:"none"},children:"JavaScript"}),re.jsx(Np,{value:"ast",sx:{py:0,px:1,fontSize:"0.75rem",textTransform:"none"},children:"AST"}),re.jsx(Np,{value:"dispatch",sx:{py:0,px:1,fontSize:"0.75rem",textTransform:"none"},children:"Dispatch"})]})}),re.jsxs(An,{sx:{flexGrow:1,overflow:"hidden"},children:[Fe==="js"&&re.jsx(An,{sx:{height:"100%",overflow:"auto"},children:re.jsx(Qu,{language:"javascript",style:YF,customStyle:{margin:0,fontSize:12},children:de||""})}),Fe==="ast"&&re.jsx(G9,{data:we,label:"ast",fileSources:Le}),Fe==="dispatch"&&re.jsx(An,{sx:{height:"100%",overflow:"auto",p:1},children:te&&Object.keys(te).length>0?re.jsx("pre",{style:{margin:0,fontFamily:"monospace",fontSize:"13px",whiteSpace:"pre-wrap"},children:Object.entries(te).sort(([,ut],[,Lt])=>Lt-ut).map(([ut,Lt])=>`${ut}: ${Lt}`).join(`
|
|
4824
4824
|
`)}):re.jsx(Sr,{variant:"body2",color:"text.secondary",children:"No dispatchUnknown calls"})})]})]})]})]}),Nc=re.jsxs(re.Fragment,{children:[re.jsxs(An,{sx:ge?{position:"fixed",inset:0,zIndex:1250,bgcolor:"background.paper",display:"flex",flexDirection:"column"}:{height:"100%",display:"flex",flexDirection:"column"},children:[re.jsxs(An,{sx:{display:"flex",alignItems:"center",borderBottom:1,borderColor:"divider"},children:[re.jsx(Qy,{value:Q,onChange:(ut,Lt)=>xe(Lt),variant:"scrollable",scrollButtons:"auto",sx:{flexGrow:1,minHeight:34,"& .MuiTab-root":{textTransform:"none",fontWeight:500,fontSize:"0.8rem",minHeight:34,py:0}},children:En.map(ut=>re.jsx(pu,{label:`Figure ${ut}`},ut))}),re.jsx(ku,{title:"Open this figure in the numbl figure viewer (new tab)",children:re.jsx("span",{children:re.jsx(lo,{size:"small",onClick:Ki,disabled:En.length===0,sx:{mx:.5,flexShrink:0},children:re.jsx(yue,{fontSize:"small"})})})}),re.jsx(ku,{title:"Download this figure's data as HDF5 (.h5)",children:re.jsx("span",{children:re.jsx(lo,{size:"small",onClick:_r,disabled:cn||En.length===0,sx:{mx:.5,flexShrink:0},children:re.jsx(QF,{fontSize:"small"})})})}),re.jsx(ku,{title:ge?"Collapse figures (Esc)":"Expand figures to full window",children:re.jsx(lo,{size:"small",onClick:()=>be(ut=>!ut),sx:{mx:.5,flexShrink:0},children:ge?re.jsx(gue,{fontSize:"small"}):re.jsx(mue,{fontSize:"small"})})})]}),re.jsx(An,{sx:{flexGrow:1,overflow:"auto",p:1},children:En.length>0?re.jsx(LD,{figure:K.figs[En[Q]]}):re.jsx(Sr,{variant:"body2",color:"text.disabled",sx:{p:2,textAlign:"center",fontStyle:"italic"},children:"No figures"})})]}),re.jsx(koe,{open:fr!==null,onClose:()=>dr(null),anchorOrigin:{vertical:"bottom",horizontal:"center"},children:re.jsxs(Qte,{severity:fr?.kind==="failed"?"warning":"info",onClose:()=>dr(null),sx:{width:"100%"},children:[fr?.kind==="uploading"&&"Preparing a temporary link to the figure viewer…",fr?.kind==="ready"&&re.jsxs(re.Fragment,{children:["Figure too large for a direct link — uploaded (encrypted, temporary)."," ",re.jsx(Tv,{href:fr.url,target:"_blank",rel:"noreferrer",children:"Open in figure viewer"})]}),fr?.kind==="failed"&&re.jsxs(re.Fragment,{children:["This figure is too large to open through a link, and the temporary upload failed. Download it (",re.jsx(QF,{fontSize:"inherit",sx:{verticalAlign:"middle"}}),") and"," ",re.jsx(Tv,{href:fr.baseUrl,target:"_blank",rel:"noreferrer",children:"open the figure viewer"}),", then load the file."]})]})})]}),Lc=re.jsx(cge,{files:Z,activeFileId:t,onSelectFile:ut=>{n(ut),ot&&ze(!1)},onAddFile:async ut=>{if(ut&&O(ut)){const Lt=await T(ut);Lt&&Be(Lt)}else{const Lt=await i(ut);Lt&&Be(Lt)}},onAddFolder:async ut=>{if(ut&&O(ut)){const Lt=await k(ut);Lt&&Be(`folder:${Lt}`)}else{const Lt=await s(ut);Lt&&Be(`folder:${Lt}`)}},onDeleteFile:ut=>G(ut)?R(ut):o(ut),onDeleteFolder:ut=>O(ut)?P(ut):a(ut),onRenameFile:(ut,Lt)=>G(ut)?F(ut,Lt):l(ut,Lt),onRenameFolder:(ut,Lt)=>O(ut)?L(ut,Lt):c(ut,Lt),onMoveFile:(ut,Lt)=>G(ut)?j(ut,Lt):u(ut,Lt),onDuplicateFile:async ut=>{const Lt=G(ut)?await V(ut):await h(ut);Lt&&Be(Lt)},onUploadFiles:f,fileCount:Z.length,triggerRenameId:ve});return re.jsxs(re.Fragment,{children:[re.jsxs(An,{sx:{height:"100vh",display:"flex",flexDirection:"column"},children:[re.jsxs(An,{sx:{display:"flex",alignItems:"center",px:1.5,py:.5,borderBottom:1,borderColor:"divider",bgcolor:"#1e1e2e",color:"#cdd6f4",minHeight:40,flexShrink:0,"& .MuiIconButton-root":{color:"#cdd6f4"},"& .MuiTypography-root":{color:"#cdd6f4"}},children:[ot&&re.jsx(lo,{size:"small",onClick:()=>ze(!0),sx:{mr:.5},children:re.jsx(due,{fontSize:"small"})}),d]}),ot?re.jsxs(re.Fragment,{children:[re.jsx(Kie,{open:Ae,onClose:()=>ze(!1),slotProps:{paper:{sx:{width:260}}},children:Lc}),re.jsxs(Sw,{direction:"horizontal",initialSize:Math.round(window.innerHeight*.55),minSize:100,children:[wi,re.jsxs(An,{sx:{height:"100%",display:"flex",flexDirection:"column"},children:[re.jsxs(Qy,{value:_t,onChange:(ut,Lt)=>zt(Lt),variant:"scrollable",scrollButtons:"auto",sx:{borderBottom:1,borderColor:"divider",minHeight:32},children:[re.jsx(pu,{label:"Output",sx:{minHeight:32,py:0,fontSize:"0.75rem",minWidth:0,px:1}}),re.jsx(pu,{label:"Figures",sx:{minHeight:32,py:0,fontSize:"0.75rem",minWidth:0,px:1}}),re.jsx(pu,{label:"JS",sx:{minHeight:32,py:0,fontSize:"0.75rem",minWidth:0,px:1}}),re.jsx(pu,{label:"AST",sx:{minHeight:32,py:0,fontSize:"0.75rem",minWidth:0,px:1}})]}),re.jsxs(An,{sx:{flexGrow:1,overflow:"hidden"},children:[_t===0&&re.jsx(An,{sx:{height:"100%",overflow:"auto",p:1},children:re.jsx("pre",{style:{margin:0,fontFamily:"monospace",fontSize:"13px",whiteSpace:"pre-wrap"},children:ce})}),_t===1&&re.jsx(An,{sx:{height:"100%",overflow:"auto",p:1},children:En.length>0?re.jsxs(re.Fragment,{children:[En.length>1&&re.jsx(Qy,{value:Q,onChange:(ut,Lt)=>xe(Lt),variant:"scrollable",scrollButtons:"auto",sx:{minHeight:28,mb:.5},children:En.map(ut=>re.jsx(pu,{label:`Fig ${ut}`,sx:{minHeight:28,py:0,fontSize:"0.7rem"}},ut))}),re.jsx(LD,{figure:K.figs[En[Q]]})]}):re.jsx(Sr,{variant:"body2",color:"text.secondary",children:"No figures"})}),_t===2&&re.jsx(An,{sx:{height:"100%",overflow:"auto"},children:re.jsx(Qu,{language:"javascript",style:YF,customStyle:{margin:0,fontSize:12},children:de||""})}),_t===3&&re.jsx(G9,{data:we,label:"ast",fileSources:Le})]})]})]})]}):re.jsxs(Sw,{direction:"vertical",initialSize:St,minSize:150,maxSize:400,onSizeChange:yt,children:[Lc,re.jsxs(Sw,{direction:"vertical",initialSize:mt,onSizeChange:rn,children:[wi,re.jsxs(Sw,{direction:"horizontal",initialSize:ht,minSize:Gt,onSizeChange:Rt,children:[Ua,Nc]})]})]})]}),re.jsxs(wie,{open:Ut,onClose:()=>Yt(!1),maxWidth:"sm",fullWidth:!0,children:[re.jsx(Pie,{children:"Execution Settings"}),re.jsxs(Nie,{sx:{display:"flex",flexDirection:"column",gap:2,pt:3,overflow:"visible"},children:[re.jsxs(WA,{value:xt?"local":"browser",exclusive:!0,onChange:xi,size:"small",children:[re.jsxs(Np,{value:"browser",sx:{px:2},children:[re.jsx(KF,{sx:{fontSize:"1rem",mr:.5}}),"In browser"]}),re.jsxs(Np,{value:"local",sx:{px:2},children:[re.jsx(ZF,{sx:{fontSize:"1rem",mr:.5}}),"Local server"]})]}),re.jsx(yF,{label:"Server URL",value:Ot,onChange:ut=>hn(ut.target.value),size:"small",fullWidth:!0,disabled:!xt,slotProps:{input:{style:{fontFamily:"monospace",fontSize:"0.85rem"}}},helperText:"Default: http://localhost:3001"}),re.jsxs(An,{sx:{display:"flex",alignItems:"center",gap:1},children:[re.jsx(Sr,{variant:"body2",color:xt?ms==="connected"?"success.main":ms==="disconnected"?"warning.main":"text.secondary":"text.disabled",children:xt?ms==="connected"?"Connected"+(Or===!0?" (native addon available)":Or===!1?" (no native addon)":""):ms==="disconnected"?"Not connected":"Checking...":"Server status: n/a"}),re.jsx(kd,{size:"small",disabled:!xt,onClick:()=>{Yo("unknown"),F7(Ot,Hi.current).then(ut=>{ut?(ps(ut.nativeAddon===!0),Yo("connected")):Yo("disconnected")})},sx:{minWidth:0,textTransform:"none"},children:"Check"})]}),re.jsxs(An,{sx:{opacity:xt?1:.4},children:[re.jsx(Sr,{variant:"body2",color:"text.secondary",gutterBottom:!0,children:"Start a local server in a terminal:"}),re.jsx(An,{component:"pre",sx:{bgcolor:"#1e1e1e",color:"#ccc",p:1.5,borderRadius:1,fontSize:"0.8rem",m:0,whiteSpace:"pre-wrap"},children:`# If installed globally:
|
|
@@ -4827,5 +4827,5 @@ npx numbl serve --passkey ${Ci}
|
|
|
4827
4827
|
# Or from the repo (dev mode):
|
|
4828
4828
|
npx tsx src/cli.ts serve --passkey ${Ci}`}),re.jsx(Sr,{variant:"caption",color:"text.disabled",onClick:()=>{Lo(ds()),Yo("disconnected")},sx:{cursor:"pointer",mt:.5,"&:hover":{color:"text.secondary"}},children:"regenerate passkey"})]}),re.jsx(nR,{}),re.jsxs(An,{children:[re.jsx(lse,{control:re.jsx(Hoe,{checked:Zn,onChange:ut=>Mn(ut.target.checked),size:"small"}),label:"Accelerate matrix math (WASM)"}),re.jsx(Sr,{variant:"caption",color:"text.secondary",component:"p",children:"Loads an external WebAssembly LAPACK/BLAS bridge to speed up matrix multiplication in the browser. Falls back to the built-in pure-JS implementation when off or unavailable. Turning it off is temporary — it re-enables on page reload."}),re.jsx(yF,{label:"Bridge URL",value:Kn,onChange:ut=>Ts(ut.target.value),size:"small",fullWidth:!0,disabled:!Zn,sx:{mt:1},slotProps:{input:{style:{fontFamily:"monospace",fontSize:"0.85rem"}}},helperText:"Base URL serving numbl-bridge.json"})]})]}),re.jsxs(Cie,{children:[re.jsx(kd,{onClick:()=>Yt(!1),children:"Cancel"}),re.jsx(kd,{variant:"contained",onClick:_n,children:"Save"})]})]})]})}const SPe=4,U7=0,O7=1,MPe=2;function X1(e){let t=e.length;for(;--t>=0;)e[t]=0}const EPe=0,TY=1,CPe=2,APe=3,TPe=258,RP=29,Hb=256,ib=Hb+1+RP,J0=30,DP=19,kY=2*ib+1,mm=15,S3=16,kPe=7,NP=256,RY=16,DY=17,NY=18,GN=new Uint8Array([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]),c2=new Uint8Array([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]),RPe=new Uint8Array([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]),LY=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),DPe=512,of=new Array((ib+2)*2);X1(of);const gv=new Array(J0*2);X1(gv);const sb=new Array(DPe);X1(sb);const ob=new Array(TPe-APe+1);X1(ob);const LP=new Array(RP);X1(LP);const _M=new Array(J0);X1(_M);function M3(e,t,n,r,i){this.static_tree=e,this.extra_bits=t,this.extra_base=n,this.elems=r,this.max_length=i,this.has_stree=e&&e.length}let IY,PY,BY;function E3(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}const FY=e=>e<256?sb[e]:sb[256+(e>>>7)],ab=(e,t)=>{e.pending_buf[e.pending++]=t&255,e.pending_buf[e.pending++]=t>>>8&255},gl=(e,t,n)=>{e.bi_valid>S3-n?(e.bi_buf|=t<<e.bi_valid&65535,ab(e,e.bi_buf),e.bi_buf=t>>S3-e.bi_valid,e.bi_valid+=n-S3):(e.bi_buf|=t<<e.bi_valid&65535,e.bi_valid+=n)},Bu=(e,t,n)=>{gl(e,n[t*2],n[t*2+1])},zY=(e,t)=>{let n=0;do n|=e&1,e>>>=1,n<<=1;while(--t>0);return n>>>1},NPe=e=>{e.bi_valid===16?(ab(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=e.bi_buf&255,e.bi_buf>>=8,e.bi_valid-=8)},LPe=(e,t)=>{const n=t.dyn_tree,r=t.max_code,i=t.stat_desc.static_tree,s=t.stat_desc.has_stree,o=t.stat_desc.extra_bits,a=t.stat_desc.extra_base,l=t.stat_desc.max_length;let c,u,h,f,d,p,m=0;for(f=0;f<=mm;f++)e.bl_count[f]=0;for(n[e.heap[e.heap_max]*2+1]=0,c=e.heap_max+1;c<kY;c++)u=e.heap[c],f=n[n[u*2+1]*2+1]+1,f>l&&(f=l,m++),n[u*2+1]=f,!(u>r)&&(e.bl_count[f]++,d=0,u>=a&&(d=o[u-a]),p=n[u*2],e.opt_len+=p*(f+d),s&&(e.static_len+=p*(i[u*2+1]+d)));if(m!==0){do{for(f=l-1;e.bl_count[f]===0;)f--;e.bl_count[f]--,e.bl_count[f+1]+=2,e.bl_count[l]--,m-=2}while(m>0);for(f=l;f!==0;f--)for(u=e.bl_count[f];u!==0;)h=e.heap[--c],!(h>r)&&(n[h*2+1]!==f&&(e.opt_len+=(f-n[h*2+1])*n[h*2],n[h*2+1]=f),u--)}},UY=(e,t,n)=>{const r=new Array(mm+1);let i=0,s,o;for(s=1;s<=mm;s++)i=i+n[s-1]<<1,r[s]=i;for(o=0;o<=t;o++){let a=e[o*2+1];a!==0&&(e[o*2]=zY(r[a]++,a))}},IPe=()=>{let e,t,n,r,i;const s=new Array(mm+1);for(n=0,r=0;r<RP-1;r++)for(LP[r]=n,e=0;e<1<<GN[r];e++)ob[n++]=r;for(ob[n-1]=r,i=0,r=0;r<16;r++)for(_M[r]=i,e=0;e<1<<c2[r];e++)sb[i++]=r;for(i>>=7;r<J0;r++)for(_M[r]=i<<7,e=0;e<1<<c2[r]-7;e++)sb[256+i++]=r;for(t=0;t<=mm;t++)s[t]=0;for(e=0;e<=143;)of[e*2+1]=8,e++,s[8]++;for(;e<=255;)of[e*2+1]=9,e++,s[9]++;for(;e<=279;)of[e*2+1]=7,e++,s[7]++;for(;e<=287;)of[e*2+1]=8,e++,s[8]++;for(UY(of,ib+1,s),e=0;e<J0;e++)gv[e*2+1]=5,gv[e*2]=zY(e,5);IY=new M3(of,GN,Hb+1,ib,mm),PY=new M3(gv,c2,0,J0,mm),BY=new M3(new Array(0),RPe,0,DP,kPe)},OY=e=>{let t;for(t=0;t<ib;t++)e.dyn_ltree[t*2]=0;for(t=0;t<J0;t++)e.dyn_dtree[t*2]=0;for(t=0;t<DP;t++)e.bl_tree[t*2]=0;e.dyn_ltree[NP*2]=1,e.opt_len=e.static_len=0,e.sym_next=e.matches=0},jY=e=>{e.bi_valid>8?ab(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0},j7=(e,t,n,r)=>{const i=t*2,s=n*2;return e[i]<e[s]||e[i]===e[s]&&r[t]<=r[n]},C3=(e,t,n)=>{const r=e.heap[n];let i=n<<1;for(;i<=e.heap_len&&(i<e.heap_len&&j7(t,e.heap[i+1],e.heap[i],e.depth)&&i++,!j7(t,r,e.heap[i],e.depth));)e.heap[n]=e.heap[i],n=i,i<<=1;e.heap[n]=r},H7=(e,t,n)=>{let r,i,s=0,o,a;if(e.sym_next!==0)do r=e.pending_buf[e.sym_buf+s++]&255,r+=(e.pending_buf[e.sym_buf+s++]&255)<<8,i=e.pending_buf[e.sym_buf+s++],r===0?Bu(e,i,t):(o=ob[i],Bu(e,o+Hb+1,t),a=GN[o],a!==0&&(i-=LP[o],gl(e,i,a)),r--,o=FY(r),Bu(e,o,n),a=c2[o],a!==0&&(r-=_M[o],gl(e,r,a)));while(s<e.sym_next);Bu(e,NP,t)},XN=(e,t)=>{const n=t.dyn_tree,r=t.stat_desc.static_tree,i=t.stat_desc.has_stree,s=t.stat_desc.elems;let o,a,l=-1,c;for(e.heap_len=0,e.heap_max=kY,o=0;o<s;o++)n[o*2]!==0?(e.heap[++e.heap_len]=l=o,e.depth[o]=0):n[o*2+1]=0;for(;e.heap_len<2;)c=e.heap[++e.heap_len]=l<2?++l:0,n[c*2]=1,e.depth[c]=0,e.opt_len--,i&&(e.static_len-=r[c*2+1]);for(t.max_code=l,o=e.heap_len>>1;o>=1;o--)C3(e,n,o);c=s;do o=e.heap[1],e.heap[1]=e.heap[e.heap_len--],C3(e,n,1),a=e.heap[1],e.heap[--e.heap_max]=o,e.heap[--e.heap_max]=a,n[c*2]=n[o*2]+n[a*2],e.depth[c]=(e.depth[o]>=e.depth[a]?e.depth[o]:e.depth[a])+1,n[o*2+1]=n[a*2+1]=c,e.heap[1]=c++,C3(e,n,1);while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],LPe(e,t),UY(n,l,e.bl_count)},$7=(e,t,n)=>{let r,i=-1,s,o=t[1],a=0,l=7,c=4;for(o===0&&(l=138,c=3),t[(n+1)*2+1]=65535,r=0;r<=n;r++)s=o,o=t[(r+1)*2+1],!(++a<l&&s===o)&&(a<c?e.bl_tree[s*2]+=a:s!==0?(s!==i&&e.bl_tree[s*2]++,e.bl_tree[RY*2]++):a<=10?e.bl_tree[DY*2]++:e.bl_tree[NY*2]++,a=0,i=s,o===0?(l=138,c=3):s===o?(l=6,c=3):(l=7,c=4))},V7=(e,t,n)=>{let r,i=-1,s,o=t[1],a=0,l=7,c=4;for(o===0&&(l=138,c=3),r=0;r<=n;r++)if(s=o,o=t[(r+1)*2+1],!(++a<l&&s===o)){if(a<c)do Bu(e,s,e.bl_tree);while(--a!==0);else s!==0?(s!==i&&(Bu(e,s,e.bl_tree),a--),Bu(e,RY,e.bl_tree),gl(e,a-3,2)):a<=10?(Bu(e,DY,e.bl_tree),gl(e,a-3,3)):(Bu(e,NY,e.bl_tree),gl(e,a-11,7));a=0,i=s,o===0?(l=138,c=3):s===o?(l=6,c=3):(l=7,c=4)}},PPe=e=>{let t;for($7(e,e.dyn_ltree,e.l_desc.max_code),$7(e,e.dyn_dtree,e.d_desc.max_code),XN(e,e.bl_desc),t=DP-1;t>=3&&e.bl_tree[LY[t]*2+1]===0;t--);return e.opt_len+=3*(t+1)+5+5+4,t},BPe=(e,t,n,r)=>{let i;for(gl(e,t-257,5),gl(e,n-1,5),gl(e,r-4,4),i=0;i<r;i++)gl(e,e.bl_tree[LY[i]*2+1],3);V7(e,e.dyn_ltree,t-1),V7(e,e.dyn_dtree,n-1)},FPe=e=>{let t=4093624447,n;for(n=0;n<=31;n++,t>>>=1)if(t&1&&e.dyn_ltree[n*2]!==0)return U7;if(e.dyn_ltree[18]!==0||e.dyn_ltree[20]!==0||e.dyn_ltree[26]!==0)return O7;for(n=32;n<Hb;n++)if(e.dyn_ltree[n*2]!==0)return O7;return U7};let W7=!1;const zPe=e=>{W7||(IPe(),W7=!0),e.l_desc=new E3(e.dyn_ltree,IY),e.d_desc=new E3(e.dyn_dtree,PY),e.bl_desc=new E3(e.bl_tree,BY),e.bi_buf=0,e.bi_valid=0,OY(e)},HY=(e,t,n,r)=>{gl(e,(EPe<<1)+(r?1:0),3),jY(e),ab(e,n),ab(e,~n),n&&e.pending_buf.set(e.window.subarray(t,t+n),e.pending),e.pending+=n},UPe=e=>{gl(e,TY<<1,3),Bu(e,NP,of),NPe(e)},OPe=(e,t,n,r)=>{let i,s,o=0;e.level>0?(e.strm.data_type===MPe&&(e.strm.data_type=FPe(e)),XN(e,e.l_desc),XN(e,e.d_desc),o=PPe(e),i=e.opt_len+3+7>>>3,s=e.static_len+3+7>>>3,s<=i&&(i=s)):i=s=n+5,n+4<=i&&t!==-1?HY(e,t,n,r):e.strategy===SPe||s===i?(gl(e,(TY<<1)+(r?1:0),3),H7(e,of,gv)):(gl(e,(CPe<<1)+(r?1:0),3),BPe(e,e.l_desc.max_code+1,e.d_desc.max_code+1,o+1),H7(e,e.dyn_ltree,e.dyn_dtree)),OY(e),r&&jY(e)},jPe=(e,t,n)=>(e.pending_buf[e.sym_buf+e.sym_next++]=t,e.pending_buf[e.sym_buf+e.sym_next++]=t>>8,e.pending_buf[e.sym_buf+e.sym_next++]=n,t===0?e.dyn_ltree[n*2]++:(e.matches++,t--,e.dyn_ltree[(ob[n]+Hb+1)*2]++,e.dyn_dtree[FY(t)*2]++),e.sym_next===e.sym_end);var HPe=zPe,$Pe=HY,VPe=OPe,WPe=jPe,qPe=UPe,GPe={_tr_init:HPe,_tr_stored_block:$Pe,_tr_flush_block:VPe,_tr_tally:WPe,_tr_align:qPe};const XPe=(e,t,n,r)=>{let i=e&65535|0,s=e>>>16&65535|0,o=0;for(;n!==0;){o=n>2e3?2e3:n,n-=o;do i=i+t[r++]|0,s=s+i|0;while(--o);i%=65521,s%=65521}return i|s<<16|0};var lb=XPe;const YPe=()=>{let e,t=[];for(var n=0;n<256;n++){e=n;for(var r=0;r<8;r++)e=e&1?3988292384^e>>>1:e>>>1;t[n]=e}return t},KPe=new Uint32Array(YPe()),ZPe=(e,t,n,r)=>{const i=KPe,s=r+n;e^=-1;for(let o=r;o<s;o++)e=e>>>8^i[(e^t[o])&255];return e^-1};var zo=ZPe,Om={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"},$b={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8};const{_tr_init:QPe,_tr_stored_block:YN,_tr_flush_block:JPe,_tr_tally:qd,_tr_align:e5e}=GPe,{Z_NO_FLUSH:Gd,Z_PARTIAL_FLUSH:t5e,Z_FULL_FLUSH:n5e,Z_FINISH:bc,Z_BLOCK:q7,Z_OK:aa,Z_STREAM_END:G7,Z_STREAM_ERROR:Yu,Z_DATA_ERROR:r5e,Z_BUF_ERROR:A3,Z_DEFAULT_COMPRESSION:i5e,Z_FILTERED:s5e,Z_HUFFMAN_ONLY:CS,Z_RLE:o5e,Z_FIXED:a5e,Z_DEFAULT_STRATEGY:l5e,Z_UNKNOWN:c5e,Z_DEFLATED:LE}=$b,u5e=9,h5e=15,f5e=8,d5e=29,p5e=256,KN=p5e+1+d5e,m5e=30,g5e=19,y5e=2*KN+1,_5e=15,Qr=3,jd=258,Ku=jd+Qr+1,v5e=32,T1=42,IP=57,ZN=69,QN=73,JN=91,eL=103,gm=113,X_=666,Qa=1,Y1=2,jm=3,K1=4,b5e=3,ym=(e,t)=>(e.msg=Om[t],t),X7=e=>e*2-(e>4?9:0),Ld=e=>{let t=e.length;for(;--t>=0;)e[t]=0},x5e=e=>{let t,n,r,i=e.w_size;t=e.hash_size,r=t;do n=e.head[--r],e.head[r]=n>=i?n-i:0;while(--t);t=i,r=t;do n=e.prev[--r],e.prev[r]=n>=i?n-i:0;while(--t)};let w5e=(e,t,n)=>(t<<e.hash_shift^n)&e.hash_mask,Xd=w5e;const Bl=e=>{const t=e.state;let n=t.pending;n>e.avail_out&&(n=e.avail_out),n!==0&&(e.output.set(t.pending_buf.subarray(t.pending_out,t.pending_out+n),e.next_out),e.next_out+=n,t.pending_out+=n,e.total_out+=n,e.avail_out-=n,t.pending-=n,t.pending===0&&(t.pending_out=0))},$l=(e,t)=>{JPe(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,Bl(e.strm)},pi=(e,t)=>{e.pending_buf[e.pending++]=t},T_=(e,t)=>{e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=t&255},tL=(e,t,n,r)=>{let i=e.avail_in;return i>r&&(i=r),i===0?0:(e.avail_in-=i,t.set(e.input.subarray(e.next_in,e.next_in+i),n),e.state.wrap===1?e.adler=lb(e.adler,t,i,n):e.state.wrap===2&&(e.adler=zo(e.adler,t,i,n)),e.next_in+=i,e.total_in+=i,i)},$Y=(e,t)=>{let n=e.max_chain_length,r=e.strstart,i,s,o=e.prev_length,a=e.nice_match;const l=e.strstart>e.w_size-Ku?e.strstart-(e.w_size-Ku):0,c=e.window,u=e.w_mask,h=e.prev,f=e.strstart+jd;let d=c[r+o-1],p=c[r+o];e.prev_length>=e.good_match&&(n>>=2),a>e.lookahead&&(a=e.lookahead);do if(i=t,!(c[i+o]!==p||c[i+o-1]!==d||c[i]!==c[r]||c[++i]!==c[r+1])){r+=2,i++;do;while(c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&c[++r]===c[++i]&&r<f);if(s=jd-(f-r),r=f-jd,s>o){if(e.match_start=t,o=s,s>=a)break;d=c[r+o-1],p=c[r+o]}}while((t=h[t&u])>l&&--n!==0);return o<=e.lookahead?o:e.lookahead},k1=e=>{const t=e.w_size;let n,r,i;do{if(r=e.window_size-e.lookahead-e.strstart,e.strstart>=t+(t-Ku)&&(e.window.set(e.window.subarray(t,t+t-r),0),e.match_start-=t,e.strstart-=t,e.block_start-=t,e.insert>e.strstart&&(e.insert=e.strstart),x5e(e),r+=t),e.strm.avail_in===0)break;if(n=tL(e.strm,e.window,e.strstart+e.lookahead,r),e.lookahead+=n,e.lookahead+e.insert>=Qr)for(i=e.strstart-e.insert,e.ins_h=e.window[i],e.ins_h=Xd(e,e.ins_h,e.window[i+1]);e.insert&&(e.ins_h=Xd(e,e.ins_h,e.window[i+Qr-1]),e.prev[i&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=i,i++,e.insert--,!(e.lookahead+e.insert<Qr)););}while(e.lookahead<Ku&&e.strm.avail_in!==0)},VY=(e,t)=>{let n=e.pending_buf_size-5>e.w_size?e.w_size:e.pending_buf_size-5,r,i,s,o=0,a=e.strm.avail_in;do{if(r=65535,s=e.bi_valid+42>>3,e.strm.avail_out<s||(s=e.strm.avail_out-s,i=e.strstart-e.block_start,r>i+e.strm.avail_in&&(r=i+e.strm.avail_in),r>s&&(r=s),r<n&&(r===0&&t!==bc||t===Gd||r!==i+e.strm.avail_in)))break;o=t===bc&&r===i+e.strm.avail_in?1:0,YN(e,0,0,o),e.pending_buf[e.pending-4]=r,e.pending_buf[e.pending-3]=r>>8,e.pending_buf[e.pending-2]=~r,e.pending_buf[e.pending-1]=~r>>8,Bl(e.strm),i&&(i>r&&(i=r),e.strm.output.set(e.window.subarray(e.block_start,e.block_start+i),e.strm.next_out),e.strm.next_out+=i,e.strm.avail_out-=i,e.strm.total_out+=i,e.block_start+=i,r-=i),r&&(tL(e.strm,e.strm.output,e.strm.next_out,r),e.strm.next_out+=r,e.strm.avail_out-=r,e.strm.total_out+=r)}while(o===0);return a-=e.strm.avail_in,a&&(a>=e.w_size?(e.matches=2,e.window.set(e.strm.input.subarray(e.strm.next_in-e.w_size,e.strm.next_in),0),e.strstart=e.w_size,e.insert=e.strstart):(e.window_size-e.strstart<=a&&(e.strstart-=e.w_size,e.window.set(e.window.subarray(e.w_size,e.w_size+e.strstart),0),e.matches<2&&e.matches++,e.insert>e.strstart&&(e.insert=e.strstart)),e.window.set(e.strm.input.subarray(e.strm.next_in-a,e.strm.next_in),e.strstart),e.strstart+=a,e.insert+=a>e.w_size-e.insert?e.w_size-e.insert:a),e.block_start=e.strstart),e.high_water<e.strstart&&(e.high_water=e.strstart),o?K1:t!==Gd&&t!==bc&&e.strm.avail_in===0&&e.strstart===e.block_start?Y1:(s=e.window_size-e.strstart,e.strm.avail_in>s&&e.block_start>=e.w_size&&(e.block_start-=e.w_size,e.strstart-=e.w_size,e.window.set(e.window.subarray(e.w_size,e.w_size+e.strstart),0),e.matches<2&&e.matches++,s+=e.w_size,e.insert>e.strstart&&(e.insert=e.strstart)),s>e.strm.avail_in&&(s=e.strm.avail_in),s&&(tL(e.strm,e.window,e.strstart,s),e.strstart+=s,e.insert+=s>e.w_size-e.insert?e.w_size-e.insert:s),e.high_water<e.strstart&&(e.high_water=e.strstart),s=e.bi_valid+42>>3,s=e.pending_buf_size-s>65535?65535:e.pending_buf_size-s,n=s>e.w_size?e.w_size:s,i=e.strstart-e.block_start,(i>=n||(i||t===bc)&&t!==Gd&&e.strm.avail_in===0&&i<=s)&&(r=i>s?s:i,o=t===bc&&e.strm.avail_in===0&&r===i?1:0,YN(e,e.block_start,r,o),e.block_start+=r,Bl(e.strm)),o?jm:Qa)},T3=(e,t)=>{let n,r;for(;;){if(e.lookahead<Ku){if(k1(e),e.lookahead<Ku&&t===Gd)return Qa;if(e.lookahead===0)break}if(n=0,e.lookahead>=Qr&&(e.ins_h=Xd(e,e.ins_h,e.window[e.strstart+Qr-1]),n=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),n!==0&&e.strstart-n<=e.w_size-Ku&&(e.match_length=$Y(e,n)),e.match_length>=Qr)if(r=qd(e,e.strstart-e.match_start,e.match_length-Qr),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=Qr){e.match_length--;do e.strstart++,e.ins_h=Xd(e,e.ins_h,e.window[e.strstart+Qr-1]),n=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart;while(--e.match_length!==0);e.strstart++}else e.strstart+=e.match_length,e.match_length=0,e.ins_h=e.window[e.strstart],e.ins_h=Xd(e,e.ins_h,e.window[e.strstart+1]);else r=qd(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++;if(r&&($l(e,!1),e.strm.avail_out===0))return Qa}return e.insert=e.strstart<Qr-1?e.strstart:Qr-1,t===bc?($l(e,!0),e.strm.avail_out===0?jm:K1):e.sym_next&&($l(e,!1),e.strm.avail_out===0)?Qa:Y1},C0=(e,t)=>{let n,r,i;for(;;){if(e.lookahead<Ku){if(k1(e),e.lookahead<Ku&&t===Gd)return Qa;if(e.lookahead===0)break}if(n=0,e.lookahead>=Qr&&(e.ins_h=Xd(e,e.ins_h,e.window[e.strstart+Qr-1]),n=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart),e.prev_length=e.match_length,e.prev_match=e.match_start,e.match_length=Qr-1,n!==0&&e.prev_length<e.max_lazy_match&&e.strstart-n<=e.w_size-Ku&&(e.match_length=$Y(e,n),e.match_length<=5&&(e.strategy===s5e||e.match_length===Qr&&e.strstart-e.match_start>4096)&&(e.match_length=Qr-1)),e.prev_length>=Qr&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-Qr,r=qd(e,e.strstart-1-e.prev_match,e.prev_length-Qr),e.lookahead-=e.prev_length-1,e.prev_length-=2;do++e.strstart<=i&&(e.ins_h=Xd(e,e.ins_h,e.window[e.strstart+Qr-1]),n=e.prev[e.strstart&e.w_mask]=e.head[e.ins_h],e.head[e.ins_h]=e.strstart);while(--e.prev_length!==0);if(e.match_available=0,e.match_length=Qr-1,e.strstart++,r&&($l(e,!1),e.strm.avail_out===0))return Qa}else if(e.match_available){if(r=qd(e,0,e.window[e.strstart-1]),r&&$l(e,!1),e.strstart++,e.lookahead--,e.strm.avail_out===0)return Qa}else e.match_available=1,e.strstart++,e.lookahead--}return e.match_available&&(r=qd(e,0,e.window[e.strstart-1]),e.match_available=0),e.insert=e.strstart<Qr-1?e.strstart:Qr-1,t===bc?($l(e,!0),e.strm.avail_out===0?jm:K1):e.sym_next&&($l(e,!1),e.strm.avail_out===0)?Qa:Y1},S5e=(e,t)=>{let n,r,i,s;const o=e.window;for(;;){if(e.lookahead<=jd){if(k1(e),e.lookahead<=jd&&t===Gd)return Qa;if(e.lookahead===0)break}if(e.match_length=0,e.lookahead>=Qr&&e.strstart>0&&(i=e.strstart-1,r=o[i],r===o[++i]&&r===o[++i]&&r===o[++i])){s=e.strstart+jd;do;while(r===o[++i]&&r===o[++i]&&r===o[++i]&&r===o[++i]&&r===o[++i]&&r===o[++i]&&r===o[++i]&&r===o[++i]&&i<s);e.match_length=jd-(s-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=Qr?(n=qd(e,1,e.match_length-Qr),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(n=qd(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),n&&($l(e,!1),e.strm.avail_out===0))return Qa}return e.insert=0,t===bc?($l(e,!0),e.strm.avail_out===0?jm:K1):e.sym_next&&($l(e,!1),e.strm.avail_out===0)?Qa:Y1},M5e=(e,t)=>{let n;for(;;){if(e.lookahead===0&&(k1(e),e.lookahead===0)){if(t===Gd)return Qa;break}if(e.match_length=0,n=qd(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,n&&($l(e,!1),e.strm.avail_out===0))return Qa}return e.insert=0,t===bc?($l(e,!0),e.strm.avail_out===0?jm:K1):e.sym_next&&($l(e,!1),e.strm.avail_out===0)?Qa:Y1};function xu(e,t,n,r,i){this.good_length=e,this.max_lazy=t,this.nice_length=n,this.max_chain=r,this.func=i}const Y_=[new xu(0,0,0,0,VY),new xu(4,4,8,4,T3),new xu(4,5,16,8,T3),new xu(4,6,32,32,T3),new xu(4,4,16,16,C0),new xu(8,16,32,32,C0),new xu(8,16,128,128,C0),new xu(8,32,128,256,C0),new xu(32,128,258,1024,C0),new xu(32,258,258,4096,C0)],E5e=e=>{e.window_size=2*e.w_size,Ld(e.head),e.max_lazy_match=Y_[e.level].max_lazy,e.good_match=Y_[e.level].good_length,e.nice_match=Y_[e.level].nice_length,e.max_chain_length=Y_[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=Qr-1,e.match_available=0,e.ins_h=0};function C5e(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=LE,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new Uint16Array(y5e*2),this.dyn_dtree=new Uint16Array((2*m5e+1)*2),this.bl_tree=new Uint16Array((2*g5e+1)*2),Ld(this.dyn_ltree),Ld(this.dyn_dtree),Ld(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new Uint16Array(_5e+1),this.heap=new Uint16Array(2*KN+1),Ld(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new Uint16Array(2*KN+1),Ld(this.depth),this.sym_buf=0,this.lit_bufsize=0,this.sym_next=0,this.sym_end=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}const Vb=e=>{if(!e)return 1;const t=e.state;return!t||t.strm!==e||t.status!==T1&&t.status!==IP&&t.status!==ZN&&t.status!==QN&&t.status!==JN&&t.status!==eL&&t.status!==gm&&t.status!==X_?1:0},WY=e=>{if(Vb(e))return ym(e,Yu);e.total_in=e.total_out=0,e.data_type=c5e;const t=e.state;return t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap===2?IP:t.wrap?T1:gm,e.adler=t.wrap===2?0:1,t.last_flush=-2,QPe(t),aa},qY=e=>{const t=WY(e);return t===aa&&E5e(e.state),t},A5e=(e,t)=>Vb(e)||e.state.wrap!==2?Yu:(e.state.gzhead=t,aa),GY=(e,t,n,r,i,s)=>{if(!e)return Yu;let o=1;if(t===i5e&&(t=6),r<0?(o=0,r=-r):r>15&&(o=2,r-=16),i<1||i>u5e||n!==LE||r<8||r>15||t<0||t>9||s<0||s>a5e||r===8&&o!==1)return ym(e,Yu);r===8&&(r=9);const a=new C5e;return e.state=a,a.strm=e,a.status=T1,a.wrap=o,a.gzhead=null,a.w_bits=r,a.w_size=1<<a.w_bits,a.w_mask=a.w_size-1,a.hash_bits=i+7,a.hash_size=1<<a.hash_bits,a.hash_mask=a.hash_size-1,a.hash_shift=~~((a.hash_bits+Qr-1)/Qr),a.window=new Uint8Array(a.w_size*2),a.head=new Uint16Array(a.hash_size),a.prev=new Uint16Array(a.w_size),a.lit_bufsize=1<<i+6,a.pending_buf_size=a.lit_bufsize*4,a.pending_buf=new Uint8Array(a.pending_buf_size),a.sym_buf=a.lit_bufsize,a.sym_end=(a.lit_bufsize-1)*3,a.level=t,a.strategy=s,a.method=n,qY(e)},T5e=(e,t)=>GY(e,t,LE,h5e,f5e,l5e),k5e=(e,t)=>{if(Vb(e)||t>q7||t<0)return e?ym(e,Yu):Yu;const n=e.state;if(!e.output||e.avail_in!==0&&!e.input||n.status===X_&&t!==bc)return ym(e,e.avail_out===0?A3:Yu);const r=n.last_flush;if(n.last_flush=t,n.pending!==0){if(Bl(e),e.avail_out===0)return n.last_flush=-1,aa}else if(e.avail_in===0&&X7(t)<=X7(r)&&t!==bc)return ym(e,A3);if(n.status===X_&&e.avail_in!==0)return ym(e,A3);if(n.status===T1&&n.wrap===0&&(n.status=gm),n.status===T1){let i=LE+(n.w_bits-8<<4)<<8,s=-1;if(n.strategy>=CS||n.level<2?s=0:n.level<6?s=1:n.level===6?s=2:s=3,i|=s<<6,n.strstart!==0&&(i|=v5e),i+=31-i%31,T_(n,i),n.strstart!==0&&(T_(n,e.adler>>>16),T_(n,e.adler&65535)),e.adler=1,n.status=gm,Bl(e),n.pending!==0)return n.last_flush=-1,aa}if(n.status===IP){if(e.adler=0,pi(n,31),pi(n,139),pi(n,8),n.gzhead)pi(n,(n.gzhead.text?1:0)+(n.gzhead.hcrc?2:0)+(n.gzhead.extra?4:0)+(n.gzhead.name?8:0)+(n.gzhead.comment?16:0)),pi(n,n.gzhead.time&255),pi(n,n.gzhead.time>>8&255),pi(n,n.gzhead.time>>16&255),pi(n,n.gzhead.time>>24&255),pi(n,n.level===9?2:n.strategy>=CS||n.level<2?4:0),pi(n,n.gzhead.os&255),n.gzhead.extra&&n.gzhead.extra.length&&(pi(n,n.gzhead.extra.length&255),pi(n,n.gzhead.extra.length>>8&255)),n.gzhead.hcrc&&(e.adler=zo(e.adler,n.pending_buf,n.pending,0)),n.gzindex=0,n.status=ZN;else if(pi(n,0),pi(n,0),pi(n,0),pi(n,0),pi(n,0),pi(n,n.level===9?2:n.strategy>=CS||n.level<2?4:0),pi(n,b5e),n.status=gm,Bl(e),n.pending!==0)return n.last_flush=-1,aa}if(n.status===ZN){if(n.gzhead.extra){let i=n.pending,s=(n.gzhead.extra.length&65535)-n.gzindex;for(;n.pending+s>n.pending_buf_size;){let a=n.pending_buf_size-n.pending;if(n.pending_buf.set(n.gzhead.extra.subarray(n.gzindex,n.gzindex+a),n.pending),n.pending=n.pending_buf_size,n.gzhead.hcrc&&n.pending>i&&(e.adler=zo(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex+=a,Bl(e),n.pending!==0)return n.last_flush=-1,aa;i=0,s-=a}let o=new Uint8Array(n.gzhead.extra);n.pending_buf.set(o.subarray(n.gzindex,n.gzindex+s),n.pending),n.pending+=s,n.gzhead.hcrc&&n.pending>i&&(e.adler=zo(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex=0}n.status=QN}if(n.status===QN){if(n.gzhead.name){let i=n.pending,s;do{if(n.pending===n.pending_buf_size){if(n.gzhead.hcrc&&n.pending>i&&(e.adler=zo(e.adler,n.pending_buf,n.pending-i,i)),Bl(e),n.pending!==0)return n.last_flush=-1,aa;i=0}n.gzindex<n.gzhead.name.length?s=n.gzhead.name.charCodeAt(n.gzindex++)&255:s=0,pi(n,s)}while(s!==0);n.gzhead.hcrc&&n.pending>i&&(e.adler=zo(e.adler,n.pending_buf,n.pending-i,i)),n.gzindex=0}n.status=JN}if(n.status===JN){if(n.gzhead.comment){let i=n.pending,s;do{if(n.pending===n.pending_buf_size){if(n.gzhead.hcrc&&n.pending>i&&(e.adler=zo(e.adler,n.pending_buf,n.pending-i,i)),Bl(e),n.pending!==0)return n.last_flush=-1,aa;i=0}n.gzindex<n.gzhead.comment.length?s=n.gzhead.comment.charCodeAt(n.gzindex++)&255:s=0,pi(n,s)}while(s!==0);n.gzhead.hcrc&&n.pending>i&&(e.adler=zo(e.adler,n.pending_buf,n.pending-i,i))}n.status=eL}if(n.status===eL){if(n.gzhead.hcrc){if(n.pending+2>n.pending_buf_size&&(Bl(e),n.pending!==0))return n.last_flush=-1,aa;pi(n,e.adler&255),pi(n,e.adler>>8&255),e.adler=0}if(n.status=gm,Bl(e),n.pending!==0)return n.last_flush=-1,aa}if(e.avail_in!==0||n.lookahead!==0||t!==Gd&&n.status!==X_){let i=n.level===0?VY(n,t):n.strategy===CS?M5e(n,t):n.strategy===o5e?S5e(n,t):Y_[n.level].func(n,t);if((i===jm||i===K1)&&(n.status=X_),i===Qa||i===jm)return e.avail_out===0&&(n.last_flush=-1),aa;if(i===Y1&&(t===t5e?e5e(n):t!==q7&&(YN(n,0,0,!1),t===n5e&&(Ld(n.head),n.lookahead===0&&(n.strstart=0,n.block_start=0,n.insert=0))),Bl(e),e.avail_out===0))return n.last_flush=-1,aa}return t!==bc?aa:n.wrap<=0?G7:(n.wrap===2?(pi(n,e.adler&255),pi(n,e.adler>>8&255),pi(n,e.adler>>16&255),pi(n,e.adler>>24&255),pi(n,e.total_in&255),pi(n,e.total_in>>8&255),pi(n,e.total_in>>16&255),pi(n,e.total_in>>24&255)):(T_(n,e.adler>>>16),T_(n,e.adler&65535)),Bl(e),n.wrap>0&&(n.wrap=-n.wrap),n.pending!==0?aa:G7)},R5e=e=>{if(Vb(e))return Yu;const t=e.state.status;return e.state=null,t===gm?ym(e,r5e):aa},D5e=(e,t)=>{let n=t.length;if(Vb(e))return Yu;const r=e.state,i=r.wrap;if(i===2||i===1&&r.status!==T1||r.lookahead)return Yu;if(i===1&&(e.adler=lb(e.adler,t,n,0)),r.wrap=0,n>=r.w_size){i===0&&(Ld(r.head),r.strstart=0,r.block_start=0,r.insert=0);let l=new Uint8Array(r.w_size);l.set(t.subarray(n-r.w_size,n),0),t=l,n=r.w_size}const s=e.avail_in,o=e.next_in,a=e.input;for(e.avail_in=n,e.next_in=0,e.input=t,k1(r);r.lookahead>=Qr;){let l=r.strstart,c=r.lookahead-(Qr-1);do r.ins_h=Xd(r,r.ins_h,r.window[l+Qr-1]),r.prev[l&r.w_mask]=r.head[r.ins_h],r.head[r.ins_h]=l,l++;while(--c);r.strstart=l,r.lookahead=Qr-1,k1(r)}return r.strstart+=r.lookahead,r.block_start=r.strstart,r.insert=r.lookahead,r.lookahead=0,r.match_length=r.prev_length=Qr-1,r.match_available=0,e.next_in=o,e.input=a,e.avail_in=s,r.wrap=i,aa};var N5e=T5e,L5e=GY,I5e=qY,P5e=WY,B5e=A5e,F5e=k5e,z5e=R5e,U5e=D5e,O5e="pako deflate (from Nodeca project)",yv={deflateInit:N5e,deflateInit2:L5e,deflateReset:I5e,deflateResetKeep:P5e,deflateSetHeader:B5e,deflate:F5e,deflateEnd:z5e,deflateSetDictionary:U5e,deflateInfo:O5e};const j5e=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var H5e=function(e){const t=Array.prototype.slice.call(arguments,1);for(;t.length;){const n=t.shift();if(n){if(typeof n!="object")throw new TypeError(n+"must be non-object");for(const r in n)j5e(n,r)&&(e[r]=n[r])}}return e},$5e=e=>{let t=0;for(let r=0,i=e.length;r<i;r++)t+=e[r].length;const n=new Uint8Array(t);for(let r=0,i=0,s=e.length;r<s;r++){let o=e[r];n.set(o,i),i+=o.length}return n},IE={assign:H5e,flattenChunks:$5e};let XY=!0;try{String.fromCharCode.apply(null,new Uint8Array(1))}catch{XY=!1}const cb=new Uint8Array(256);for(let e=0;e<256;e++)cb[e]=e>=252?6:e>=248?5:e>=240?4:e>=224?3:e>=192?2:1;cb[254]=cb[254]=1;var V5e=e=>{if(typeof TextEncoder=="function"&&TextEncoder.prototype.encode)return new TextEncoder().encode(e);let t,n,r,i,s,o=e.length,a=0;for(i=0;i<o;i++)n=e.charCodeAt(i),(n&64512)===55296&&i+1<o&&(r=e.charCodeAt(i+1),(r&64512)===56320&&(n=65536+(n-55296<<10)+(r-56320),i++)),a+=n<128?1:n<2048?2:n<65536?3:4;for(t=new Uint8Array(a),s=0,i=0;s<a;i++)n=e.charCodeAt(i),(n&64512)===55296&&i+1<o&&(r=e.charCodeAt(i+1),(r&64512)===56320&&(n=65536+(n-55296<<10)+(r-56320),i++)),n<128?t[s++]=n:n<2048?(t[s++]=192|n>>>6,t[s++]=128|n&63):n<65536?(t[s++]=224|n>>>12,t[s++]=128|n>>>6&63,t[s++]=128|n&63):(t[s++]=240|n>>>18,t[s++]=128|n>>>12&63,t[s++]=128|n>>>6&63,t[s++]=128|n&63);return t};const W5e=(e,t)=>{if(t<65534&&e.subarray&&XY)return String.fromCharCode.apply(null,e.length===t?e:e.subarray(0,t));let n="";for(let r=0;r<t;r++)n+=String.fromCharCode(e[r]);return n};var q5e=(e,t)=>{const n=t||e.length;if(typeof TextDecoder=="function"&&TextDecoder.prototype.decode)return new TextDecoder().decode(e.subarray(0,t));let r,i;const s=new Array(n*2);for(i=0,r=0;r<n;){let o=e[r++];if(o<128){s[i++]=o;continue}let a=cb[o];if(a>4){s[i++]=65533,r+=a-1;continue}for(o&=a===2?31:a===3?15:7;a>1&&r<n;)o=o<<6|e[r++]&63,a--;if(a>1){s[i++]=65533;continue}o<65536?s[i++]=o:(o-=65536,s[i++]=55296|o>>10&1023,s[i++]=56320|o&1023)}return W5e(s,i)},G5e=(e,t)=>{t=t||e.length,t>e.length&&(t=e.length);let n=t-1;for(;n>=0&&(e[n]&192)===128;)n--;return n<0||n===0?t:n+cb[e[n]]>t?n:t},ub={string2buf:V5e,buf2string:q5e,utf8border:G5e};function X5e(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}var YY=X5e;const KY=Object.prototype.toString,{Z_NO_FLUSH:Y5e,Z_SYNC_FLUSH:K5e,Z_FULL_FLUSH:Z5e,Z_FINISH:Q5e,Z_OK:vM,Z_STREAM_END:J5e,Z_DEFAULT_COMPRESSION:e4e,Z_DEFAULT_STRATEGY:t4e,Z_DEFLATED:n4e}=$b;function Wb(e){this.options=IE.assign({level:e4e,method:n4e,chunkSize:16384,windowBits:15,memLevel:8,strategy:t4e},e||{});let t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new YY,this.strm.avail_out=0;let n=yv.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(n!==vM)throw new Error(Om[n]);if(t.header&&yv.deflateSetHeader(this.strm,t.header),t.dictionary){let r;if(typeof t.dictionary=="string"?r=ub.string2buf(t.dictionary):KY.call(t.dictionary)==="[object ArrayBuffer]"?r=new Uint8Array(t.dictionary):r=t.dictionary,n=yv.deflateSetDictionary(this.strm,r),n!==vM)throw new Error(Om[n]);this._dict_set=!0}}Wb.prototype.push=function(e,t){const n=this.strm,r=this.options.chunkSize;let i,s;if(this.ended)return!1;for(t===~~t?s=t:s=t===!0?Q5e:Y5e,typeof e=="string"?n.input=ub.string2buf(e):KY.call(e)==="[object ArrayBuffer]"?n.input=new Uint8Array(e):n.input=e,n.next_in=0,n.avail_in=n.input.length;;){if(n.avail_out===0&&(n.output=new Uint8Array(r),n.next_out=0,n.avail_out=r),(s===K5e||s===Z5e)&&n.avail_out<=6){this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;continue}if(i=yv.deflate(n,s),i===J5e)return n.next_out>0&&this.onData(n.output.subarray(0,n.next_out)),i=yv.deflateEnd(this.strm),this.onEnd(i),this.ended=!0,i===vM;if(n.avail_out===0){this.onData(n.output);continue}if(s>0&&n.next_out>0){this.onData(n.output.subarray(0,n.next_out)),n.avail_out=0;continue}if(n.avail_in===0)break}return!0};Wb.prototype.onData=function(e){this.chunks.push(e)};Wb.prototype.onEnd=function(e){e===vM&&(this.result=IE.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};function PP(e,t){const n=new Wb(t);if(n.push(e,!0),n.err)throw n.msg||Om[n.err];return n.result}function r4e(e,t){return t=t||{},t.raw=!0,PP(e,t)}function i4e(e,t){return t=t||{},t.gzip=!0,PP(e,t)}var s4e=Wb,o4e=PP,a4e=r4e,l4e=i4e,c4e={Deflate:s4e,deflate:o4e,deflateRaw:a4e,gzip:l4e};const AS=16209,u4e=16191;var h4e=function(t,n){let r,i,s,o,a,l,c,u,h,f,d,p,m,y,_,b,x,S,M,E,T,k,R,P;const F=t.state;r=t.next_in,R=t.input,i=r+(t.avail_in-5),s=t.next_out,P=t.output,o=s-(n-t.avail_out),a=s+(t.avail_out-257),l=F.dmax,c=F.wsize,u=F.whave,h=F.wnext,f=F.window,d=F.hold,p=F.bits,m=F.lencode,y=F.distcode,_=(1<<F.lenbits)-1,b=(1<<F.distbits)-1;e:do{p<15&&(d+=R[r++]<<p,p+=8,d+=R[r++]<<p,p+=8),x=m[d&_];t:for(;;){if(S=x>>>24,d>>>=S,p-=S,S=x>>>16&255,S===0)P[s++]=x&65535;else if(S&16){M=x&65535,S&=15,S&&(p<S&&(d+=R[r++]<<p,p+=8),M+=d&(1<<S)-1,d>>>=S,p-=S),p<15&&(d+=R[r++]<<p,p+=8,d+=R[r++]<<p,p+=8),x=y[d&b];n:for(;;){if(S=x>>>24,d>>>=S,p-=S,S=x>>>16&255,S&16){if(E=x&65535,S&=15,p<S&&(d+=R[r++]<<p,p+=8,p<S&&(d+=R[r++]<<p,p+=8)),E+=d&(1<<S)-1,E>l){t.msg="invalid distance too far back",F.mode=AS;break e}if(d>>>=S,p-=S,S=s-o,E>S){if(S=E-S,S>u&&F.sane){t.msg="invalid distance too far back",F.mode=AS;break e}if(T=0,k=f,h===0){if(T+=c-S,S<M){M-=S;do P[s++]=f[T++];while(--S);T=s-E,k=P}}else if(h<S){if(T+=c+h-S,S-=h,S<M){M-=S;do P[s++]=f[T++];while(--S);if(T=0,h<M){S=h,M-=S;do P[s++]=f[T++];while(--S);T=s-E,k=P}}}else if(T+=h-S,S<M){M-=S;do P[s++]=f[T++];while(--S);T=s-E,k=P}for(;M>2;)P[s++]=k[T++],P[s++]=k[T++],P[s++]=k[T++],M-=3;M&&(P[s++]=k[T++],M>1&&(P[s++]=k[T++]))}else{T=s-E;do P[s++]=P[T++],P[s++]=P[T++],P[s++]=P[T++],M-=3;while(M>2);M&&(P[s++]=P[T++],M>1&&(P[s++]=P[T++]))}}else if((S&64)===0){x=y[(x&65535)+(d&(1<<S)-1)];continue n}else{t.msg="invalid distance code",F.mode=AS;break e}break}}else if((S&64)===0){x=m[(x&65535)+(d&(1<<S)-1)];continue t}else if(S&32){F.mode=u4e;break e}else{t.msg="invalid literal/length code",F.mode=AS;break e}break}}while(r<i&&s<a);M=p>>3,r-=M,p-=M<<3,d&=(1<<p)-1,t.next_in=r,t.next_out=s,t.avail_in=r<i?5+(i-r):5-(r-i),t.avail_out=s<a?257+(a-s):257-(s-a),F.hold=d,F.bits=p};const A0=15,Y7=852,K7=592,Z7=0,k3=1,Q7=2,f4e=new Uint16Array([3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,0,0]),d4e=new Uint8Array([16,16,16,16,16,16,16,16,17,17,17,17,18,18,18,18,19,19,19,19,20,20,20,20,21,21,21,21,16,72,78]),p4e=new Uint16Array([1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0]),m4e=new Uint8Array([16,16,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23,24,24,25,25,26,26,27,27,28,28,29,29,64,64]),g4e=(e,t,n,r,i,s,o,a)=>{const l=a.bits;let c=0,u=0,h=0,f=0,d=0,p=0,m=0,y=0,_=0,b=0,x,S,M,E,T,k=null,R;const P=new Uint16Array(A0+1),F=new Uint16Array(A0+1);let L=null,j,V,U;for(c=0;c<=A0;c++)P[c]=0;for(u=0;u<r;u++)P[t[n+u]]++;for(d=l,f=A0;f>=1&&P[f]===0;f--);if(d>f&&(d=f),f===0)return i[s++]=1<<24|64<<16|0,i[s++]=1<<24|64<<16|0,a.bits=1,0;for(h=1;h<f&&P[h]===0;h++);for(d<h&&(d=h),y=1,c=1;c<=A0;c++)if(y<<=1,y-=P[c],y<0)return-1;if(y>0&&(e===Z7||f!==1))return-1;for(F[1]=0,c=1;c<A0;c++)F[c+1]=F[c]+P[c];for(u=0;u<r;u++)t[n+u]!==0&&(o[F[t[n+u]]++]=u);if(e===Z7?(k=L=o,R=20):e===k3?(k=f4e,L=d4e,R=257):(k=p4e,L=m4e,R=0),b=0,u=0,c=h,T=s,p=d,m=0,M=-1,_=1<<d,E=_-1,e===k3&&_>Y7||e===Q7&&_>K7)return 1;for(;;){j=c-m,o[u]+1<R?(V=0,U=o[u]):o[u]>=R?(V=L[o[u]-R],U=k[o[u]-R]):(V=96,U=0),x=1<<c-m,S=1<<p,h=S;do S-=x,i[T+(b>>m)+S]=j<<24|V<<16|U|0;while(S!==0);for(x=1<<c-1;b&x;)x>>=1;if(x!==0?(b&=x-1,b+=x):b=0,u++,--P[c]===0){if(c===f)break;c=t[n+o[u]]}if(c>d&&(b&E)!==M){for(m===0&&(m=d),T+=h,p=c-m,y=1<<p;p+m<f&&(y-=P[p+m],!(y<=0));)p++,y<<=1;if(_+=1<<p,e===k3&&_>Y7||e===Q7&&_>K7)return 1;M=b&E,i[M]=d<<24|p<<16|T-s|0}}return b!==0&&(i[T+b]=c-m<<24|64<<16|0),a.bits=d,0};var _v=g4e;const y4e=0,ZY=1,QY=2,{Z_FINISH:J7,Z_BLOCK:_4e,Z_TREES:TS,Z_OK:Hm,Z_STREAM_END:v4e,Z_NEED_DICT:b4e,Z_STREAM_ERROR:kc,Z_DATA_ERROR:JY,Z_MEM_ERROR:eK,Z_BUF_ERROR:x4e,Z_DEFLATED:ej}=$b,PE=16180,tj=16181,nj=16182,rj=16183,ij=16184,sj=16185,oj=16186,aj=16187,lj=16188,cj=16189,bM=16190,Jh=16191,R3=16192,uj=16193,D3=16194,hj=16195,fj=16196,dj=16197,pj=16198,kS=16199,RS=16200,mj=16201,gj=16202,yj=16203,_j=16204,vj=16205,N3=16206,bj=16207,xj=16208,ws=16209,tK=16210,nK=16211,w4e=852,S4e=592,M4e=15,E4e=M4e,wj=e=>(e>>>24&255)+(e>>>8&65280)+((e&65280)<<8)+((e&255)<<24);function C4e(){this.strm=null,this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new Uint16Array(320),this.work=new Uint16Array(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}const Jm=e=>{if(!e)return 1;const t=e.state;return!t||t.strm!==e||t.mode<PE||t.mode>nK?1:0},rK=e=>{if(Jm(e))return kc;const t=e.state;return e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=t.wrap&1),t.mode=PE,t.last=0,t.havedict=0,t.flags=-1,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new Int32Array(w4e),t.distcode=t.distdyn=new Int32Array(S4e),t.sane=1,t.back=-1,Hm},iK=e=>{if(Jm(e))return kc;const t=e.state;return t.wsize=0,t.whave=0,t.wnext=0,rK(e)},sK=(e,t)=>{let n;if(Jm(e))return kc;const r=e.state;return t<0?(n=0,t=-t):(n=(t>>4)+5,t<48&&(t&=15)),t&&(t<8||t>15)?kc:(r.window!==null&&r.wbits!==t&&(r.window=null),r.wrap=n,r.wbits=t,iK(e))},oK=(e,t)=>{if(!e)return kc;const n=new C4e;e.state=n,n.strm=e,n.window=null,n.mode=PE;const r=sK(e,t);return r!==Hm&&(e.state=null),r},A4e=e=>oK(e,E4e);let Sj=!0,L3,I3;const T4e=e=>{if(Sj){L3=new Int32Array(512),I3=new Int32Array(32);let t=0;for(;t<144;)e.lens[t++]=8;for(;t<256;)e.lens[t++]=9;for(;t<280;)e.lens[t++]=7;for(;t<288;)e.lens[t++]=8;for(_v(ZY,e.lens,0,288,L3,0,e.work,{bits:9}),t=0;t<32;)e.lens[t++]=5;_v(QY,e.lens,0,32,I3,0,e.work,{bits:5}),Sj=!1}e.lencode=L3,e.lenbits=9,e.distcode=I3,e.distbits=5},aK=(e,t,n,r)=>{let i;const s=e.state;return s.window===null&&(s.wsize=1<<s.wbits,s.wnext=0,s.whave=0,s.window=new Uint8Array(s.wsize)),r>=s.wsize?(s.window.set(t.subarray(n-s.wsize,n),0),s.wnext=0,s.whave=s.wsize):(i=s.wsize-s.wnext,i>r&&(i=r),s.window.set(t.subarray(n-r,n-r+i),s.wnext),r-=i,r?(s.window.set(t.subarray(n-r,n),0),s.wnext=r,s.whave=s.wsize):(s.wnext+=i,s.wnext===s.wsize&&(s.wnext=0),s.whave<s.wsize&&(s.whave+=i))),0},k4e=(e,t)=>{let n,r,i,s,o,a,l,c,u,h,f,d,p,m,y=0,_,b,x,S,M,E,T,k;const R=new Uint8Array(4);let P,F;const L=new Uint8Array([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]);if(Jm(e)||!e.output||!e.input&&e.avail_in!==0)return kc;n=e.state,n.mode===Jh&&(n.mode=R3),o=e.next_out,i=e.output,l=e.avail_out,s=e.next_in,r=e.input,a=e.avail_in,c=n.hold,u=n.bits,h=a,f=l,k=Hm;e:for(;;)switch(n.mode){case PE:if(n.wrap===0){n.mode=R3;break}for(;u<16;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if(n.wrap&2&&c===35615){n.wbits===0&&(n.wbits=15),n.check=0,R[0]=c&255,R[1]=c>>>8&255,n.check=zo(n.check,R,2,0),c=0,u=0,n.mode=tj;break}if(n.head&&(n.head.done=!1),!(n.wrap&1)||(((c&255)<<8)+(c>>8))%31){e.msg="incorrect header check",n.mode=ws;break}if((c&15)!==ej){e.msg="unknown compression method",n.mode=ws;break}if(c>>>=4,u-=4,T=(c&15)+8,n.wbits===0&&(n.wbits=T),T>15||T>n.wbits){e.msg="invalid window size",n.mode=ws;break}n.dmax=1<<n.wbits,n.flags=0,e.adler=n.check=1,n.mode=c&512?cj:Jh,c=0,u=0;break;case tj:for(;u<16;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if(n.flags=c,(n.flags&255)!==ej){e.msg="unknown compression method",n.mode=ws;break}if(n.flags&57344){e.msg="unknown header flags set",n.mode=ws;break}n.head&&(n.head.text=c>>8&1),n.flags&512&&n.wrap&4&&(R[0]=c&255,R[1]=c>>>8&255,n.check=zo(n.check,R,2,0)),c=0,u=0,n.mode=nj;case nj:for(;u<32;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}n.head&&(n.head.time=c),n.flags&512&&n.wrap&4&&(R[0]=c&255,R[1]=c>>>8&255,R[2]=c>>>16&255,R[3]=c>>>24&255,n.check=zo(n.check,R,4,0)),c=0,u=0,n.mode=rj;case rj:for(;u<16;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}n.head&&(n.head.xflags=c&255,n.head.os=c>>8),n.flags&512&&n.wrap&4&&(R[0]=c&255,R[1]=c>>>8&255,n.check=zo(n.check,R,2,0)),c=0,u=0,n.mode=ij;case ij:if(n.flags&1024){for(;u<16;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}n.length=c,n.head&&(n.head.extra_len=c),n.flags&512&&n.wrap&4&&(R[0]=c&255,R[1]=c>>>8&255,n.check=zo(n.check,R,2,0)),c=0,u=0}else n.head&&(n.head.extra=null);n.mode=sj;case sj:if(n.flags&1024&&(d=n.length,d>a&&(d=a),d&&(n.head&&(T=n.head.extra_len-n.length,n.head.extra||(n.head.extra=new Uint8Array(n.head.extra_len)),n.head.extra.set(r.subarray(s,s+d),T)),n.flags&512&&n.wrap&4&&(n.check=zo(n.check,r,d,s)),a-=d,s+=d,n.length-=d),n.length))break e;n.length=0,n.mode=oj;case oj:if(n.flags&2048){if(a===0)break e;d=0;do T=r[s+d++],n.head&&T&&n.length<65536&&(n.head.name+=String.fromCharCode(T));while(T&&d<a);if(n.flags&512&&n.wrap&4&&(n.check=zo(n.check,r,d,s)),a-=d,s+=d,T)break e}else n.head&&(n.head.name=null);n.length=0,n.mode=aj;case aj:if(n.flags&4096){if(a===0)break e;d=0;do T=r[s+d++],n.head&&T&&n.length<65536&&(n.head.comment+=String.fromCharCode(T));while(T&&d<a);if(n.flags&512&&n.wrap&4&&(n.check=zo(n.check,r,d,s)),a-=d,s+=d,T)break e}else n.head&&(n.head.comment=null);n.mode=lj;case lj:if(n.flags&512){for(;u<16;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if(n.wrap&4&&c!==(n.check&65535)){e.msg="header crc mismatch",n.mode=ws;break}c=0,u=0}n.head&&(n.head.hcrc=n.flags>>9&1,n.head.done=!0),e.adler=n.check=0,n.mode=Jh;break;case cj:for(;u<32;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}e.adler=n.check=wj(c),c=0,u=0,n.mode=bM;case bM:if(n.havedict===0)return e.next_out=o,e.avail_out=l,e.next_in=s,e.avail_in=a,n.hold=c,n.bits=u,b4e;e.adler=n.check=1,n.mode=Jh;case Jh:if(t===_4e||t===TS)break e;case R3:if(n.last){c>>>=u&7,u-=u&7,n.mode=N3;break}for(;u<3;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}switch(n.last=c&1,c>>>=1,u-=1,c&3){case 0:n.mode=uj;break;case 1:if(T4e(n),n.mode=kS,t===TS){c>>>=2,u-=2;break e}break;case 2:n.mode=fj;break;case 3:e.msg="invalid block type",n.mode=ws}c>>>=2,u-=2;break;case uj:for(c>>>=u&7,u-=u&7;u<32;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if((c&65535)!==(c>>>16^65535)){e.msg="invalid stored block lengths",n.mode=ws;break}if(n.length=c&65535,c=0,u=0,n.mode=D3,t===TS)break e;case D3:n.mode=hj;case hj:if(d=n.length,d){if(d>a&&(d=a),d>l&&(d=l),d===0)break e;i.set(r.subarray(s,s+d),o),a-=d,s+=d,l-=d,o+=d,n.length-=d;break}n.mode=Jh;break;case fj:for(;u<14;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if(n.nlen=(c&31)+257,c>>>=5,u-=5,n.ndist=(c&31)+1,c>>>=5,u-=5,n.ncode=(c&15)+4,c>>>=4,u-=4,n.nlen>286||n.ndist>30){e.msg="too many length or distance symbols",n.mode=ws;break}n.have=0,n.mode=dj;case dj:for(;n.have<n.ncode;){for(;u<3;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}n.lens[L[n.have++]]=c&7,c>>>=3,u-=3}for(;n.have<19;)n.lens[L[n.have++]]=0;if(n.lencode=n.lendyn,n.lenbits=7,P={bits:n.lenbits},k=_v(y4e,n.lens,0,19,n.lencode,0,n.work,P),n.lenbits=P.bits,k){e.msg="invalid code lengths set",n.mode=ws;break}n.have=0,n.mode=pj;case pj:for(;n.have<n.nlen+n.ndist;){for(;y=n.lencode[c&(1<<n.lenbits)-1],_=y>>>24,b=y>>>16&255,x=y&65535,!(_<=u);){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if(x<16)c>>>=_,u-=_,n.lens[n.have++]=x;else{if(x===16){for(F=_+2;u<F;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if(c>>>=_,u-=_,n.have===0){e.msg="invalid bit length repeat",n.mode=ws;break}T=n.lens[n.have-1],d=3+(c&3),c>>>=2,u-=2}else if(x===17){for(F=_+3;u<F;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}c>>>=_,u-=_,T=0,d=3+(c&7),c>>>=3,u-=3}else{for(F=_+7;u<F;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}c>>>=_,u-=_,T=0,d=11+(c&127),c>>>=7,u-=7}if(n.have+d>n.nlen+n.ndist){e.msg="invalid bit length repeat",n.mode=ws;break}for(;d--;)n.lens[n.have++]=T}}if(n.mode===ws)break;if(n.lens[256]===0){e.msg="invalid code -- missing end-of-block",n.mode=ws;break}if(n.lenbits=9,P={bits:n.lenbits},k=_v(ZY,n.lens,0,n.nlen,n.lencode,0,n.work,P),n.lenbits=P.bits,k){e.msg="invalid literal/lengths set",n.mode=ws;break}if(n.distbits=6,n.distcode=n.distdyn,P={bits:n.distbits},k=_v(QY,n.lens,n.nlen,n.ndist,n.distcode,0,n.work,P),n.distbits=P.bits,k){e.msg="invalid distances set",n.mode=ws;break}if(n.mode=kS,t===TS)break e;case kS:n.mode=RS;case RS:if(a>=6&&l>=258){e.next_out=o,e.avail_out=l,e.next_in=s,e.avail_in=a,n.hold=c,n.bits=u,h4e(e,f),o=e.next_out,i=e.output,l=e.avail_out,s=e.next_in,r=e.input,a=e.avail_in,c=n.hold,u=n.bits,n.mode===Jh&&(n.back=-1);break}for(n.back=0;y=n.lencode[c&(1<<n.lenbits)-1],_=y>>>24,b=y>>>16&255,x=y&65535,!(_<=u);){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if(b&&(b&240)===0){for(S=_,M=b,E=x;y=n.lencode[E+((c&(1<<S+M)-1)>>S)],_=y>>>24,b=y>>>16&255,x=y&65535,!(S+_<=u);){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}c>>>=S,u-=S,n.back+=S}if(c>>>=_,u-=_,n.back+=_,n.length=x,b===0){n.mode=vj;break}if(b&32){n.back=-1,n.mode=Jh;break}if(b&64){e.msg="invalid literal/length code",n.mode=ws;break}n.extra=b&15,n.mode=mj;case mj:if(n.extra){for(F=n.extra;u<F;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}n.length+=c&(1<<n.extra)-1,c>>>=n.extra,u-=n.extra,n.back+=n.extra}n.was=n.length,n.mode=gj;case gj:for(;y=n.distcode[c&(1<<n.distbits)-1],_=y>>>24,b=y>>>16&255,x=y&65535,!(_<=u);){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if((b&240)===0){for(S=_,M=b,E=x;y=n.distcode[E+((c&(1<<S+M)-1)>>S)],_=y>>>24,b=y>>>16&255,x=y&65535,!(S+_<=u);){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}c>>>=S,u-=S,n.back+=S}if(c>>>=_,u-=_,n.back+=_,b&64){e.msg="invalid distance code",n.mode=ws;break}n.offset=x,n.extra=b&15,n.mode=yj;case yj:if(n.extra){for(F=n.extra;u<F;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}n.offset+=c&(1<<n.extra)-1,c>>>=n.extra,u-=n.extra,n.back+=n.extra}if(n.offset>n.dmax){e.msg="invalid distance too far back",n.mode=ws;break}n.mode=_j;case _j:if(l===0)break e;if(d=f-l,n.offset>d){if(d=n.offset-d,d>n.whave&&n.sane){e.msg="invalid distance too far back",n.mode=ws;break}d>n.wnext?(d-=n.wnext,p=n.wsize-d):p=n.wnext-d,d>n.length&&(d=n.length),m=n.window}else m=i,p=o-n.offset,d=n.length;d>l&&(d=l),l-=d,n.length-=d;do i[o++]=m[p++];while(--d);n.length===0&&(n.mode=RS);break;case vj:if(l===0)break e;i[o++]=n.length,l--,n.mode=RS;break;case N3:if(n.wrap){for(;u<32;){if(a===0)break e;a--,c|=r[s++]<<u,u+=8}if(f-=l,e.total_out+=f,n.total+=f,n.wrap&4&&f&&(e.adler=n.check=n.flags?zo(n.check,i,f,o-f):lb(n.check,i,f,o-f)),f=l,n.wrap&4&&(n.flags?c:wj(c))!==n.check){e.msg="incorrect data check",n.mode=ws;break}c=0,u=0}n.mode=bj;case bj:if(n.wrap&&n.flags){for(;u<32;){if(a===0)break e;a--,c+=r[s++]<<u,u+=8}if(n.wrap&4&&c!==(n.total&4294967295)){e.msg="incorrect length check",n.mode=ws;break}c=0,u=0}n.mode=xj;case xj:k=v4e;break e;case ws:k=JY;break e;case tK:return eK;case nK:default:return kc}return e.next_out=o,e.avail_out=l,e.next_in=s,e.avail_in=a,n.hold=c,n.bits=u,(n.wsize||f!==e.avail_out&&n.mode<ws&&(n.mode<N3||t!==J7))&&aK(e,e.output,e.next_out,f-e.avail_out),h-=e.avail_in,f-=e.avail_out,e.total_in+=h,e.total_out+=f,n.total+=f,n.wrap&4&&f&&(e.adler=n.check=n.flags?zo(n.check,i,f,e.next_out-f):lb(n.check,i,f,e.next_out-f)),e.data_type=n.bits+(n.last?64:0)+(n.mode===Jh?128:0)+(n.mode===kS||n.mode===D3?256:0),(h===0&&f===0||t===J7)&&k===Hm&&(k=x4e),k},R4e=e=>{if(Jm(e))return kc;let t=e.state;return t.window&&(t.window=null),e.state=null,Hm},D4e=(e,t)=>{if(Jm(e))return kc;const n=e.state;return(n.wrap&2)===0?kc:(n.head=t,t.done=!1,Hm)},N4e=(e,t)=>{const n=t.length;let r,i,s;return Jm(e)||(r=e.state,r.wrap!==0&&r.mode!==bM)?kc:r.mode===bM&&(i=1,i=lb(i,t,n,0),i!==r.check)?JY:(s=aK(e,t,n,n),s?(r.mode=tK,eK):(r.havedict=1,Hm))};var L4e=iK,I4e=sK,P4e=rK,B4e=A4e,F4e=oK,z4e=k4e,U4e=R4e,O4e=D4e,j4e=N4e,H4e="pako inflate (from Nodeca project)",af={inflateReset:L4e,inflateReset2:I4e,inflateResetKeep:P4e,inflateInit:B4e,inflateInit2:F4e,inflate:z4e,inflateEnd:U4e,inflateGetHeader:O4e,inflateSetDictionary:j4e,inflateInfo:H4e};function $4e(){this.text=0,this.time=0,this.xflags=0,this.os=0,this.extra=null,this.extra_len=0,this.name="",this.comment="",this.hcrc=0,this.done=!1}var V4e=$4e;const lK=Object.prototype.toString,{Z_NO_FLUSH:W4e,Z_FINISH:q4e,Z_OK:hb,Z_STREAM_END:P3,Z_NEED_DICT:B3,Z_STREAM_ERROR:G4e,Z_DATA_ERROR:Mj,Z_MEM_ERROR:X4e}=$b;function qb(e){this.options=IE.assign({chunkSize:1024*64,windowBits:15,to:""},e||{});const t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,t.windowBits===0&&(t.windowBits=-15)),t.windowBits>=0&&t.windowBits<16&&!(e&&e.windowBits)&&(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&(t.windowBits&15)===0&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new YY,this.strm.avail_out=0;let n=af.inflateInit2(this.strm,t.windowBits);if(n!==hb)throw new Error(Om[n]);if(this.header=new V4e,af.inflateGetHeader(this.strm,this.header),t.dictionary&&(typeof t.dictionary=="string"?t.dictionary=ub.string2buf(t.dictionary):lK.call(t.dictionary)==="[object ArrayBuffer]"&&(t.dictionary=new Uint8Array(t.dictionary)),t.raw&&(n=af.inflateSetDictionary(this.strm,t.dictionary),n!==hb)))throw new Error(Om[n])}qb.prototype.push=function(e,t){const n=this.strm,r=this.options.chunkSize,i=this.options.dictionary;let s,o,a;if(this.ended)return!1;for(t===~~t?o=t:o=t===!0?q4e:W4e,lK.call(e)==="[object ArrayBuffer]"?n.input=new Uint8Array(e):n.input=e,n.next_in=0,n.avail_in=n.input.length;;){for(n.avail_out===0&&(n.output=new Uint8Array(r),n.next_out=0,n.avail_out=r),s=af.inflate(n,o),s===B3&&i&&(s=af.inflateSetDictionary(n,i),s===hb?s=af.inflate(n,o):s===Mj&&(s=B3));n.avail_in>0&&s===P3&&n.state.wrap>0&&e[n.next_in]!==0;)af.inflateReset(n),s=af.inflate(n,o);switch(s){case G4e:case Mj:case B3:case X4e:return this.onEnd(s),this.ended=!0,!1}if(a=n.avail_out,n.next_out&&(n.avail_out===0||s===P3))if(this.options.to==="string"){let l=ub.utf8border(n.output,n.next_out),c=n.next_out-l,u=ub.buf2string(n.output,l);n.next_out=c,n.avail_out=r-c,c&&n.output.set(n.output.subarray(l,l+c),0),this.onData(u)}else this.onData(n.output.length===n.next_out?n.output:n.output.subarray(0,n.next_out));if(!(s===hb&&a===0)){if(s===P3)return s=af.inflateEnd(this.strm),this.onEnd(s),this.ended=!0,!0;if(n.avail_in===0)break}}return!0};qb.prototype.onData=function(e){this.chunks.push(e)};qb.prototype.onEnd=function(e){e===hb&&(this.options.to==="string"?this.result=this.chunks.join(""):this.result=IE.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg};function BP(e,t){const n=new qb(t);if(n.push(e),n.err)throw n.msg||Om[n.err];return n.result}function Y4e(e,t){return t=t||{},t.raw=!0,BP(e,t)}var K4e=qb,Z4e=BP,Q4e=Y4e,J4e=BP,eBe={Inflate:K4e,inflate:Z4e,inflateRaw:Q4e,ungzip:J4e};const{Deflate:tBe,deflate:nBe,deflateRaw:rBe,gzip:iBe}=c4e,{Inflate:sBe,inflate:oBe,inflateRaw:aBe,ungzip:lBe}=eBe;var cBe=tBe,uBe=nBe,hBe=rBe,fBe=iBe,dBe=sBe,pBe=oBe,mBe=aBe,gBe=lBe,yBe=$b,_Be={Deflate:cBe,deflate:uBe,deflateRaw:hBe,gzip:fBe,Inflate:dBe,inflate:pBe,inflateRaw:mBe,ungzip:gBe,constants:yBe};const vBe=new TextEncoder;function bBe(e,t,n){const r=e.find(l=>l.id===n),i={files:e.map(l=>({name:l.name,content:L_(t.get(l.id)??new Uint8Array(0))})),activeFileName:r?.name??null},s=JSON.stringify(i),o=_Be.deflate(vBe.encode(s));let a=btoa(String.fromCharCode(...o));return a=a.replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,""),a}const xBe="https://numbl.org";function wBe(){const{files:e,activeFileId:t,loading:n,title:r,repository:i,maxInitialOutputPanelHeight:s,loadError:o,setActiveFileId:a,updateFileContent:l,addFile:c,addFolder:u,deleteFile:h,deleteFolder:f,renameFile:d,renameFolder:p,moveFile:m,duplicateFile:y,uploadFiles:_,loadFileContent:b,loadAllContents:x,contentCache:S}=YH(),[M,E]=ne.useState(!1);ne.useEffect(()=>{r&&(document.title=r)},[r]);const T=ne.useCallback(async()=>{try{const R=await x(),P=bBe(e,R,t),F=`${xBe}/share#${P}`;if(F.length>64e3){alert("Project is too large to share via URL. Try reducing the number or size of files.");return}await navigator.clipboard.writeText(F),E(!0),setTimeout(()=>E(!1),2e3)}catch(R){console.error("Failed to generate share URL:",R),alert("Failed to generate share URL.")}},[e,t,x]);if(n)return re.jsx(An,{sx:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:re.jsx(O0,{})});const k=re.jsxs(re.Fragment,{children:[re.jsxs(Sr,{variant:"body2",fontWeight:"medium",sx:{flexGrow:1},noWrap:!0,children:[r||"numbl project",o&&re.jsx(Sr,{component:"span",variant:"caption",color:"warning.main",sx:{ml:1},children:"(bundle failed to load)"})]}),i&&re.jsx(ku,{title:"View source repository",children:re.jsx(lo,{size:"small",component:"a",href:i,target:"_blank",rel:"noopener noreferrer",sx:{mr:.5},children:re.jsx(lH,{fontSize:"small"})})}),re.jsx(ku,{title:M?"Copied!":"Copy shareable URL",children:re.jsx(lo,{size:"small",onClick:T,sx:{mr:.5},children:re.jsx(ete,{fontSize:"small"})})}),re.jsx(Tv,{href:"https://numbl.org",target:"_blank",rel:"noopener noreferrer",variant:"caption",underline:"hover",sx:{opacity:.7,"&:hover":{opacity:1}},children:"powered by numbl"})]});return re.jsx(wPe,{files:e,activeFileId:t,setActiveFileId:a,updateFileContent:l,addFile:c,addFolder:u,deleteFile:h,deleteFolder:f,renameFile:d,renameFolder:p,moveFile:m,duplicateFile:y,uploadFiles:_,headerContent:k,loadFileContent:b,loadAllContents:x,contentCache:S,maxInitialOutputPanelHeight:s??void 0})}const SBe=oi(re.jsx("path",{d:"M9.4 16.6 4.8 12l4.6-4.6L8 6l-6 6 6 6zm5.2 0 4.6-4.6-4.6-4.6L16 6l6 6-6 6z"})),MBe="https://numbl.org";function EBe(e,t){if(e.length===0)return{spec:null,unknownSlug:!1};if(!t)return{spec:e[0],unknownSlug:!1};const n=e.find(r=>r.id===t);return n?{spec:n,unknownSlug:!1}:{spec:e[0],unknownSlug:!0}}function CBe({figureId:e}){const{files:t,loading:n,title:r,repository:i,figures:s,loadError:o,loadAllContents:a}=YH(),{reloadSystemFiles:l,getSystemVfsFiles:c,getSystemWorkspaceFiles:u}=MY();AY(l);const{spec:h,unknownSlug:f}=ne.useMemo(()=>EBe(s,e),[s,e]),[d,p]=ne.useState(""),[m,y]=ne.useState(!1),[_,b]=ne.useState(!1),[x,S]=ne.useState(!1),[M,E]=ne.useReducer(SI,rE),T=ne.useRef(null),k=ne.useRef(ZH()),R=ne.useRef(null),P=h?.name||r||"Figure";ne.useEffect(()=>{document.title=P},[P]);const F=ne.useMemo(()=>{const H=Object.keys(M.figs).map(Number).sort((O,G)=>O-G);return H.length===0?null:M.figs[H[H.length-1]]},[M.figs]),L=F!==null,j=ne.useCallback(H=>{E(H)},[]),V=ne.useCallback(H=>{H.onmessage=O=>{const G=O.data;if(G.type==="request-input"){const Z=prompt(G.prompt??"")??"";k.current&&QH(k.current,Z);return}if(G.type==="output"){p(Z=>Z+G.text);return}if(G.type==="drawnow"){if(G.plotInstructions?.length)for(const Z of G.plotInstructions)j(Z);return}if(G.type==="html_source_event"){document.querySelectorAll(`iframe[title="uihtml-${G.compId}"]`).forEach(ie=>ie.contentWindow?.postMessage({source:"numbl-host",compId:G.compId,name:G.name,dataJson:G.dataJson},"*"));return}if(G.type==="done"){if(y(!1),G.vfsChanges&&SY(G.vfsChanges).then(Z=>{Z&&l()}),G.plotInstructions?.length)for(const Z of G.plotInstructions)j(Z);return}if(G.type==="error"){y(!1),b(!0),S(!0),p(Z=>Z+`
|
|
4829
4829
|
${NV(G)}
|
|
4830
|
-
`);return}}},[j,l]);ne.useEffect(()=>{const H=new Worker(new URL(""+new URL("numbl-worker-
|
|
4830
|
+
`);return}}},[j,l]);ne.useEffect(()=>{const H=new Worker(new URL(""+new URL("numbl-worker-B-MPuV6f.js",import.meta.url).href,import.meta.url),{type:"module"});return T.current=H,V(H),R.current=null,()=>{H.terminate(),T.current=null}},[V]),ne.useEffect(()=>{const H=O=>{const G=O.data;!G||G.source!=="numbl-uihtml"||T.current?.postMessage({type:"html_event",compId:G.compId,kind:G.kind,name:G.name,data:G.data})};return window.addEventListener("message",H),()=>window.removeEventListener("message",H)},[]);const U=ne.useCallback(async()=>{const H=T.current;if(!H||!h)return;const O=t.find(X=>X.name===h.entry);if(!O){b(!0),S(!0),p(`Figure script not found in the project bundle: ${h.entry}
|
|
4831
4831
|
`);return}y(!0),b(!1),p(""),E({type:"clear"}),CY();const G=new TextDecoder("utf-8"),[Z,ie,Y]=await Promise.all([a(),c(),u()]),ce=[...t.map(X=>({path:X.name,content:Z.get(X.id)??new Uint8Array(0)})),...ie],pe=[...t.filter(X=>X.name.endsWith(".m")).map(X=>({name:X.name,source:G.decode(Z.get(X.id)??new Uint8Array(0))})),...Y],te=G.decode(Z.get(O.id)??new Uint8Array(0));H.postMessage({type:"update_workspace",workspaceFiles:pe,vfsFiles:ce}),H.postMessage({type:"run",code:te,options:{displayResults:!0,maxIterations:1e7,optimization:1},workspaceFiles:pe,vfsFiles:ce,mainFileName:O.name,persistent:!0,inputSAB:k.current??void 0})},[h,t,a,c,u]);ne.useEffect(()=>{n||!h||!T.current||R.current!==h.id&&(R.current=h.id,U())},[n,h,U]);const B=ne.useMemo(()=>window.location.pathname+window.location.search,[]);if(n)return re.jsx(An,{sx:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:re.jsx(O0,{})});if(!h)return re.jsxs(An,{sx:{display:"flex",flexDirection:"column",gap:1,justifyContent:"center",alignItems:"center",height:"100vh",textAlign:"center",px:2},children:[re.jsx(Sr,{variant:"h6",children:"No figure view configured"}),re.jsx(Sr,{variant:"body2",color:"text.secondary",children:o?"The project bundle failed to load.":'This project declares no "figures" in numbl-project.json.'}),re.jsx(Tv,{href:B,underline:"hover",children:"Open the full IDE"})]});const N=x||!L;return re.jsxs(An,{sx:{display:"flex",flexDirection:"column",height:"100vh"},children:[re.jsxs(An,{sx:{display:"flex",alignItems:"center",gap:1,px:1.5,py:.5,bgcolor:"grey.100",borderBottom:1,borderColor:"divider",minHeight:40},children:[re.jsx(Sr,{variant:"body2",fontWeight:"medium",noWrap:!0,children:P}),m&&re.jsxs(An,{sx:{display:"flex",alignItems:"center",gap:.5},children:[re.jsx(O0,{size:12}),re.jsx(Sr,{variant:"caption",color:"text.secondary",children:"Running…"})]}),re.jsx(An,{sx:{flexGrow:1}}),L&&re.jsx(kd,{size:"small",onClick:()=>S(H=>!H),sx:{textTransform:"none",fontSize:"0.75rem"},children:x?"Hide output":"Show output"}),re.jsx(ku,{title:"View / edit the code in the full IDE",children:re.jsx(kd,{size:"small",href:B,startIcon:re.jsx(SBe,{fontSize:"small"}),sx:{textTransform:"none",fontSize:"0.75rem"},children:"Code"})}),i&&re.jsx(ku,{title:"View source repository",children:re.jsx(lo,{size:"small",component:"a",href:i,target:"_blank",rel:"noopener noreferrer",children:re.jsx(lH,{fontSize:"small"})})}),re.jsx(Tv,{href:MBe,target:"_blank",rel:"noopener noreferrer",variant:"caption",underline:"hover",sx:{opacity:.7,"&:hover":{opacity:1}},children:"powered by numbl"})]}),f&&re.jsxs(An,{sx:{px:1.5,py:.5,bgcolor:"#fff8e1",borderBottom:"1px solid #f0e0a0",fontSize:13,color:"#5c4a00"},children:["Unknown figure “",e,"”. Showing “",P,"” instead."]}),re.jsxs(An,{sx:{flexGrow:1,position:"relative",minHeight:0},children:[L&&re.jsx(An,{sx:{position:"absolute",inset:0,display:"flex",justifyContent:"center",alignItems:"center",bgcolor:"#fff"},children:F&&re.jsx(LD,{figure:F})}),N&&re.jsxs(An,{sx:{position:"absolute",left:0,right:0,bottom:0,top:L?"auto":0,maxHeight:L?"45%":"100%",overflow:"auto",p:1.5,bgcolor:"#1e1e1e",fontFamily:"monospace",fontSize:13,color:_?"#f48771":"#d4d4d4",whiteSpace:"pre-wrap",wordBreak:"break-word",borderTop:L?"1px solid #333":void 0},children:[m&&!d&&re.jsxs(An,{sx:{display:"flex",alignItems:"center",gap:1},children:[re.jsx(O0,{size:14,sx:{color:"#d4d4d4"}}),re.jsx("span",{children:"Running…"})]}),d||!m&&re.jsx("span",{style:{opacity:.5},children:"—"})]})]})]})}function ABe(){const[e,t]=ne.useState(()=>window.location.hash);return ne.useEffect(()=>{const n=()=>t(window.location.hash);return window.addEventListener("hashchange",n),()=>window.removeEventListener("hashchange",n)},[]),e}function TBe(){const e=ABe(),t=/^#figure(?:\/(.*))?$/.exec(e);if(t){const n=t[1]?.split(/[?#]/)[0],r=n?decodeURIComponent(n):void 0;return re.jsx(CBe,{figureId:r})}return re.jsx(wBe,{})}BZ.createRoot(document.getElementById("root")).render(re.jsx(ne.StrictMode,{children:re.jsx(TBe,{})}));
|