@ai-ecoverse/slicc-kernel 1.152.1 → 1.153.0
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 +26 -2
- package/dist/driver-worker.js +147 -10
- package/dist/driver-worker.js.map +4 -4
- package/dist/index.js +168 -14
- package/dist/index.js.map +4 -4
- package/dist/kernel-worker.js +828 -152
- package/dist/kernel-worker.js.map +4 -4
- package/dist/node-driver-worker.js +147 -10
- package/dist/node-driver-worker.js.map +4 -4
- package/dist/node-process-worker.js +71 -21
- package/dist/node-process-worker.js.map +3 -3
- package/dist/node.js +966 -167
- package/dist/node.js.map +4 -4
- package/dist/process-worker.js +71 -21
- package/dist/process-worker.js.map +3 -3
- package/dist/types/client/attach.d.ts +2 -0
- package/dist/types/client/protocol.d.ts +4 -0
- package/dist/types/client/serve-client.d.ts +2 -0
- package/dist/types/embedder-relay.d.ts +58 -0
- package/dist/types/fs/unlinked.d.ts +4 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/kernel/embedder.d.ts +100 -0
- package/dist/types/kernel/fd-table.d.ts +3 -1
- package/dist/types/kernel/host.d.ts +8 -0
- package/dist/types/kernel/process.d.ts +17 -0
- package/dist/types/launcher.d.ts +13 -0
- package/dist/types/mount/mount-fs.d.ts +1 -0
- package/dist/types/node.d.ts +3 -0
- package/dist/types/process/kernel-streams.d.ts +2 -1
- package/dist/types/process/wasi/wasi-fds.d.ts +1 -0
- package/dist/types/realm/sync-fs-token-registry.d.ts +1 -0
- package/dist/types/serve.d.ts +3 -0
- package/package.json +2 -2
|
@@ -2424,6 +2424,7 @@ var init_js_kernel = __esm({
|
|
|
2424
2424
|
"fd-write",
|
|
2425
2425
|
"fd-close",
|
|
2426
2426
|
"fd-open-clipboard",
|
|
2427
|
+
"fd-open-embedder",
|
|
2427
2428
|
"net-ws-ready",
|
|
2428
2429
|
"sock-tls",
|
|
2429
2430
|
"sock-tls-upgrade",
|
|
@@ -2759,6 +2760,7 @@ function* lookup(abs) {
|
|
|
2759
2760
|
if (DEVICES.includes(name2)) return { kind: "device" };
|
|
2760
2761
|
if (name2 === "tty") return { kind: "tty" };
|
|
2761
2762
|
if (name2 === "clipboard") return { kind: "clipboard" };
|
|
2763
|
+
if (name2 === "embedder") return { kind: "embedder" };
|
|
2762
2764
|
if (name2 === "sealed") return { kind: "sealed" };
|
|
2763
2765
|
const std = STDIO.indexOf(name2);
|
|
2764
2766
|
if (std >= 0) return { kind: "link", target: `${SELF_FD}/${std}`, fd: std };
|
|
@@ -2815,7 +2817,8 @@ function* fdTarget(fd, path) {
|
|
|
2815
2817
|
if (info.kind === "file") return (yield { op: "fd-vfs-stat", fd }).path;
|
|
2816
2818
|
if (info.terminal) return info.terminal;
|
|
2817
2819
|
if (info.meta && "device" in info.meta) return `/dev/${info.meta.device}`;
|
|
2818
|
-
if (info.kind === "clipboard" || info.kind === "sealed"
|
|
2820
|
+
if (info.kind === "clipboard" || info.kind === "sealed" || info.kind === "embedder")
|
|
2821
|
+
return `/dev/${info.kind}`;
|
|
2819
2822
|
return `${info.kind === "socket" ? "socket" : "pipe"}:[${fd}]`;
|
|
2820
2823
|
}
|
|
2821
2824
|
function devFdStat(fd) {
|
|
@@ -2832,6 +2835,7 @@ function* devStat(abs, follow3) {
|
|
|
2832
2835
|
case "device":
|
|
2833
2836
|
case "tty":
|
|
2834
2837
|
case "clipboard":
|
|
2838
|
+
case "embedder":
|
|
2835
2839
|
case "sealed":
|
|
2836
2840
|
return nodeStat(CHAR | 438);
|
|
2837
2841
|
case "terminal":
|
|
@@ -2877,7 +2881,18 @@ function* devReaddir(abs) {
|
|
|
2877
2881
|
if (node.kind !== "dir") throw new JsCallError("ENOTDIR", abs);
|
|
2878
2882
|
const names = yield { op: "fd-tty-names" };
|
|
2879
2883
|
const ttys = names.filter((n) => /^\/dev\/tty\d+$/.test(n)).map((n) => n.slice(5));
|
|
2880
|
-
return [
|
|
2884
|
+
return [
|
|
2885
|
+
...DEVICES,
|
|
2886
|
+
"clipboard",
|
|
2887
|
+
"embedder",
|
|
2888
|
+
"sealed",
|
|
2889
|
+
"tty",
|
|
2890
|
+
"fd",
|
|
2891
|
+
"pts",
|
|
2892
|
+
"shm",
|
|
2893
|
+
...STDIO,
|
|
2894
|
+
...ttys
|
|
2895
|
+
].sort();
|
|
2881
2896
|
}
|
|
2882
2897
|
function* aliasOf(fd, abs, o) {
|
|
2883
2898
|
const info = yield* fdInfo(fd, abs);
|
|
@@ -2918,6 +2933,11 @@ function* opened(abs, o) {
|
|
|
2918
2933
|
fd: yield { op: "fd-open-clipboard", flags: accessFlags(o) },
|
|
2919
2934
|
file: false
|
|
2920
2935
|
};
|
|
2936
|
+
case "embedder":
|
|
2937
|
+
return {
|
|
2938
|
+
fd: yield { op: "fd-open-embedder", flags: accessFlags(o) },
|
|
2939
|
+
file: false
|
|
2940
|
+
};
|
|
2921
2941
|
case "sealed":
|
|
2922
2942
|
return { fd: yield { op: "fd-open-sealed", flags: accessFlags(o) }, file: false };
|
|
2923
2943
|
case "terminal": {
|
|
@@ -3109,6 +3129,7 @@ var init_js_dev = __esm({
|
|
|
3109
3129
|
"device",
|
|
3110
3130
|
"tty",
|
|
3111
3131
|
"clipboard",
|
|
3132
|
+
"embedder",
|
|
3112
3133
|
"sealed"
|
|
3113
3134
|
]);
|
|
3114
3135
|
}
|
|
@@ -3384,7 +3405,7 @@ function deviceOf(path) {
|
|
|
3384
3405
|
}
|
|
3385
3406
|
function namedDevice(path) {
|
|
3386
3407
|
if (deviceOf(path) || stdioAlias(path) !== void 0) return true;
|
|
3387
|
-
return path
|
|
3408
|
+
return NAMED_PATHS.has(path);
|
|
3388
3409
|
}
|
|
3389
3410
|
function within(path, root) {
|
|
3390
3411
|
return path === root || path.startsWith(root === "/" ? "/" : `${root}/`);
|
|
@@ -3457,7 +3478,7 @@ function promoteRequest(fd, f, handed) {
|
|
|
3457
3478
|
...f.buffer.handle !== void 0 && f.ino !== void 0 ? { ino: f.ino } : {}
|
|
3458
3479
|
};
|
|
3459
3480
|
}
|
|
3460
|
-
var SYNTHETIC_DIRS, O_NONBLOCK, O_WRONLY2, O_RDWR2, O_APPEND2, SEALED_PATH, CLIPBOARD_PATH, WasiFds, GEN2;
|
|
3481
|
+
var SYNTHETIC_DIRS, O_NONBLOCK, O_WRONLY2, O_RDWR2, O_APPEND2, SEALED_PATH, CLIPBOARD_PATH, EMBEDDER_PATH, NAMED_PATHS, WasiFds, GEN2;
|
|
3461
3482
|
var init_wasi_fds = __esm({
|
|
3462
3483
|
"src/process/wasi/wasi-fds.ts"() {
|
|
3463
3484
|
"use strict";
|
|
@@ -3474,6 +3495,13 @@ var init_wasi_fds = __esm({
|
|
|
3474
3495
|
O_APPEND2 = 1024;
|
|
3475
3496
|
SEALED_PATH = "/dev/sealed";
|
|
3476
3497
|
CLIPBOARD_PATH = "/dev/clipboard";
|
|
3498
|
+
EMBEDDER_PATH = "/dev/embedder";
|
|
3499
|
+
NAMED_PATHS = /* @__PURE__ */ new Set([
|
|
3500
|
+
SEALED_PATH,
|
|
3501
|
+
CLIPBOARD_PATH,
|
|
3502
|
+
EMBEDDER_PATH,
|
|
3503
|
+
"/dev/tty"
|
|
3504
|
+
]);
|
|
3477
3505
|
WasiFds = class {
|
|
3478
3506
|
table = /* @__PURE__ */ new Map();
|
|
3479
3507
|
buffers = /* @__PURE__ */ new Map();
|
|
@@ -4086,7 +4114,7 @@ var init_wasi_fds = __esm({
|
|
|
4086
4114
|
return joined2.split("/").includes("..") ? physical(this.fs, joined2) : normalize(joined2);
|
|
4087
4115
|
}
|
|
4088
4116
|
openKernelDevice(path, oflags, fdflags, rights) {
|
|
4089
|
-
const { openSealed, openClipboard, openTty } = this.kernel.sys;
|
|
4117
|
+
const { openSealed, openClipboard, openEmbedder, openTty } = this.kernel.sys;
|
|
4090
4118
|
const nonblock = (fdflags & FDFLAGS.NONBLOCK) !== 0;
|
|
4091
4119
|
let fd;
|
|
4092
4120
|
let kind;
|
|
@@ -4096,6 +4124,9 @@ var init_wasi_fds = __esm({
|
|
|
4096
4124
|
} else if (path === CLIPBOARD_PATH && openClipboard) {
|
|
4097
4125
|
fd = this.openCharDevice(openClipboard, oflags, rights);
|
|
4098
4126
|
kind = "clipboard";
|
|
4127
|
+
} else if (path === EMBEDDER_PATH && openEmbedder) {
|
|
4128
|
+
fd = this.openCharDevice(openEmbedder, oflags, rights);
|
|
4129
|
+
kind = "embedder";
|
|
4099
4130
|
} else if (path === "/dev/tty" || /^\/dev\/tty\d+$/.test(path)) {
|
|
4100
4131
|
const exclusive = (oflags & OFLAGS.CREAT) !== 0 && (oflags & OFLAGS.EXCL) !== 0;
|
|
4101
4132
|
try {
|
|
@@ -5346,6 +5377,7 @@ function kernelFiletype(kind) {
|
|
|
5346
5377
|
case "tty":
|
|
5347
5378
|
case "sealed":
|
|
5348
5379
|
case "clipboard":
|
|
5380
|
+
case "embedder":
|
|
5349
5381
|
return { filetype: FILETYPE.CHARACTER_DEVICE, seeks: false };
|
|
5350
5382
|
case "device":
|
|
5351
5383
|
return { filetype: FILETYPE.CHARACTER_DEVICE, seeks: true };
|
|
@@ -6423,7 +6455,7 @@ var init_wasi_host = __esm({
|
|
|
6423
6455
|
return gone2 ? { ...out, nlink: 0n } : out;
|
|
6424
6456
|
}
|
|
6425
6457
|
synthetic(path) {
|
|
6426
|
-
return deviceOf(path) !== void 0 || path === SEALED_PATH && !!this.o.kernel.sys.openSealed || path === CLIPBOARD_PATH && !!this.o.kernel.sys.openClipboard;
|
|
6458
|
+
return deviceOf(path) !== void 0 || path === SEALED_PATH && !!this.o.kernel.sys.openSealed || path === CLIPBOARD_PATH && !!this.o.kernel.sys.openClipboard || path === EMBEDDER_PATH && !!this.o.kernel.sys.openEmbedder;
|
|
6427
6459
|
}
|
|
6428
6460
|
linkedDev(path, follow3) {
|
|
6429
6461
|
if (!follow3) return void 0;
|
|
@@ -7213,7 +7245,7 @@ var KERNEL_VERSION, OS_RELEASE;
|
|
|
7213
7245
|
var init_version = __esm({
|
|
7214
7246
|
"src/version.ts"() {
|
|
7215
7247
|
"use strict";
|
|
7216
|
-
KERNEL_VERSION = true ? "1.
|
|
7248
|
+
KERNEL_VERSION = true ? "1.153.0" : "0.0.0-dev";
|
|
7217
7249
|
OS_RELEASE = "6.0.0-slicc";
|
|
7218
7250
|
}
|
|
7219
7251
|
});
|
|
@@ -12843,7 +12875,7 @@ function sealedStat(minor = 250) {
|
|
|
12843
12875
|
const now = /* @__PURE__ */ new Date();
|
|
12844
12876
|
return {
|
|
12845
12877
|
dev: 22,
|
|
12846
|
-
ino: minor
|
|
12878
|
+
ino: DEVICE_INO[minor],
|
|
12847
12879
|
mode: 8630,
|
|
12848
12880
|
nlink: 1,
|
|
12849
12881
|
uid: 0,
|
|
@@ -12867,7 +12899,7 @@ function datesOf(real) {
|
|
|
12867
12899
|
dates[key] = new Date(value2);
|
|
12868
12900
|
return dates;
|
|
12869
12901
|
}
|
|
12870
|
-
var POLLIN, POLLOUT, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, TCSETSF, O_NONBLOCK2, SOCKET_MODE, PTY_PATH, TTY_PATH, PTS_MAJOR, TTY_NAME, SEALED_PATH2, STRERROR, CLIPBOARD_PATH2, O_CREAT2, O_EXCL2, O_NOCTTY, O_TRUNC3, O_DIRECTORY, KILLED_BY_SIGPIPE, ProcessExit, SyscallError, KernelStreams;
|
|
12902
|
+
var POLLIN, POLLOUT, POLLERR, POLLHUP, POLLRDNORM, POLLWRNORM, TCSETSF, O_NONBLOCK2, SOCKET_MODE, PTY_PATH, TTY_PATH, PTS_MAJOR, TTY_NAME, SEALED_PATH2, STRERROR, CLIPBOARD_PATH2, EMBEDDER_PATH2, DEVICE_INO, O_CREAT2, O_EXCL2, O_NOCTTY, O_TRUNC3, O_DIRECTORY, KILLED_BY_SIGPIPE, ProcessExit, SyscallError, KernelStreams;
|
|
12871
12903
|
var init_kernel_streams = __esm({
|
|
12872
12904
|
"src/process/kernel-streams.ts"() {
|
|
12873
12905
|
"use strict";
|
|
@@ -12897,6 +12929,8 @@ var init_kernel_streams = __esm({
|
|
|
12897
12929
|
EINTR: "Interrupted system call"
|
|
12898
12930
|
};
|
|
12899
12931
|
CLIPBOARD_PATH2 = "/dev/clipboard";
|
|
12932
|
+
EMBEDDER_PATH2 = "/dev/embedder";
|
|
12933
|
+
DEVICE_INO = { 250: 1, 251: 2, 252: 3 };
|
|
12900
12934
|
O_CREAT2 = 64;
|
|
12901
12935
|
O_EXCL2 = 128;
|
|
12902
12936
|
O_NOCTTY = 256;
|
|
@@ -12979,7 +13013,7 @@ var init_kernel_streams = __esm({
|
|
|
12979
13013
|
stream.stream_ops = { ...stream.stream_ops, getattr: () => this.Fs.stat?.(name2) ?? {} };
|
|
12980
13014
|
}
|
|
12981
13015
|
nameDevice(stream, kind) {
|
|
12982
|
-
this.nameStream(stream, kind
|
|
13016
|
+
this.nameStream(stream, `/dev/${kind}`);
|
|
12983
13017
|
}
|
|
12984
13018
|
listSealed() {
|
|
12985
13019
|
const fs = this.Fs;
|
|
@@ -12987,7 +13021,8 @@ var init_kernel_streams = __esm({
|
|
|
12987
13021
|
if (!analyzePath || !mkdev || !makedev) return;
|
|
12988
13022
|
const nodes = [
|
|
12989
13023
|
[SEALED_PATH2, 250, this.sys.openSealed],
|
|
12990
|
-
[CLIPBOARD_PATH2, 251, this.sys.openClipboard]
|
|
13024
|
+
[CLIPBOARD_PATH2, 251, this.sys.openClipboard],
|
|
13025
|
+
[EMBEDDER_PATH2, 252, this.sys.openEmbedder]
|
|
12991
13026
|
];
|
|
12992
13027
|
for (const [path, minor, opener] of nodes) {
|
|
12993
13028
|
if (!opener) continue;
|
|
@@ -13017,6 +13052,7 @@ var init_kernel_streams = __esm({
|
|
|
13017
13052
|
this.attach(stream, kfd, terminal);
|
|
13018
13053
|
this.nameStream(stream, path);
|
|
13019
13054
|
if (path === CLIPBOARD_PATH2) this.reportClose(kfd);
|
|
13055
|
+
if (path === EMBEDDER_PATH2) this.reportClose(kfd);
|
|
13020
13056
|
}
|
|
13021
13057
|
reporting = /* @__PURE__ */ new Set();
|
|
13022
13058
|
reportClose(kfd) {
|
|
@@ -13304,10 +13340,11 @@ var init_kernel_streams = __esm({
|
|
|
13304
13340
|
return this.vessel(open, kfd, { path, flags, mode }, false);
|
|
13305
13341
|
}
|
|
13306
13342
|
openClipboard(open, path, flags, mode) {
|
|
13307
|
-
const
|
|
13308
|
-
|
|
13343
|
+
const clipboard = path === CLIPBOARD_PATH2;
|
|
13344
|
+
const opener = clipboard ? this.sys.openClipboard : this.sys.openEmbedder;
|
|
13345
|
+
if (!clipboard && path !== EMBEDDER_PATH2 || !opener) return void 0;
|
|
13309
13346
|
if (flags & O_DIRECTORY) throw new this.Fs.ErrnoError(wasiErrno("ENOTDIR"));
|
|
13310
|
-
const kfd = this.call(() =>
|
|
13347
|
+
const kfd = this.call(() => opener.call(this.sys, flags & 3));
|
|
13311
13348
|
try {
|
|
13312
13349
|
const stream = this.vessel(open, kfd, { path, flags, mode }, false);
|
|
13313
13350
|
this.reportClose(kfd);
|
|
@@ -13343,6 +13380,7 @@ var init_kernel_streams = __esm({
|
|
|
13343
13380
|
fs[name2] = (path, ...rest2) => {
|
|
13344
13381
|
if (path === SEALED_PATH2 && this.sys.openSealed) return sealedStat();
|
|
13345
13382
|
if (path === CLIPBOARD_PATH2 && this.sys.openClipboard) return sealedStat(251);
|
|
13383
|
+
if (path === EMBEDDER_PATH2 && this.sys.openEmbedder) return sealedStat(252);
|
|
13346
13384
|
const owned = this.ownedTty(path);
|
|
13347
13385
|
if (owned && isPtyPath(path)) return this.owned(path, ptyStat(path));
|
|
13348
13386
|
if (!isPtyPath(path))
|
|
@@ -13636,8 +13674,7 @@ function placeholder(Fs, streams2, entry) {
|
|
|
13636
13674
|
const access = entry.flags ?? O_RDWR4;
|
|
13637
13675
|
if (entry.kind === "socket") return streams2.socketStream(access);
|
|
13638
13676
|
if (entry.kind === "tty") return Fs.open("/dev/tty", O_RDWR4);
|
|
13639
|
-
if (entry.kind === "stream" || entry.kind
|
|
13640
|
-
return Fs.open("/dev/null", access);
|
|
13677
|
+
if (entry.kind === "stream" || DEVICE_KINDS.has(entry.kind)) return Fs.open("/dev/null", access);
|
|
13641
13678
|
Fs.mkdirTree(PLACEHOLDER_DIR);
|
|
13642
13679
|
return Fs.open(`${PLACEHOLDER_DIR}/${entry.fd}`, access | O_CREAT3);
|
|
13643
13680
|
}
|
|
@@ -13661,8 +13698,9 @@ function placeKernelStream(Fs, streams2, entry) {
|
|
|
13661
13698
|
streams2.sizeFromKernel(stream, entry.kernel);
|
|
13662
13699
|
} else if (entry.kind === "socket") streams2.attachSocket(stream, entry.kernel);
|
|
13663
13700
|
else streams2.attach(stream, entry.kernel, entry.kind === "tty");
|
|
13664
|
-
if (entry.kind === "clipboard") streams2.reportClose(entry.kernel);
|
|
13665
|
-
if (
|
|
13701
|
+
if (entry.kind === "clipboard" || entry.kind === "embedder") streams2.reportClose(entry.kernel);
|
|
13702
|
+
if (DEVICE_KINDS.has(entry.kind))
|
|
13703
|
+
streams2.nameDevice(stream, entry.kind);
|
|
13666
13704
|
if (entry.kind === "tty") streams2.nameTerminal(stream);
|
|
13667
13705
|
if (entry.kind === "stream") {
|
|
13668
13706
|
asFifo(stream, streams2, entry.desc !== void 0 ? `d${entry.desc}` : `k${entry.kernel}`);
|
|
@@ -13689,7 +13727,7 @@ function restoreForkedStreams(Fs, streams2, table) {
|
|
|
13689
13727
|
}
|
|
13690
13728
|
}
|
|
13691
13729
|
}
|
|
13692
|
-
var O_RDWR4, O_ACCMODE4, O_CREAT3, O_EXCL3, O_TRUNC4, PLACEHOLDER_DIR, NAMED_DEVICES, ACCESS, DEVICES2, FIFO_MODE, nextStreamIno, streamInos;
|
|
13730
|
+
var O_RDWR4, O_ACCMODE4, O_CREAT3, O_EXCL3, O_TRUNC4, PLACEHOLDER_DIR, NAMED_DEVICES, DEVICE_KINDS, ACCESS, DEVICES2, FIFO_MODE, nextStreamIno, streamInos;
|
|
13693
13731
|
var init_process_fork = __esm({
|
|
13694
13732
|
"src/process/process-fork.ts"() {
|
|
13695
13733
|
"use strict";
|
|
@@ -13702,8 +13740,10 @@ var init_process_fork = __esm({
|
|
|
13702
13740
|
PLACEHOLDER_DIR = "/dev/slicc-fd";
|
|
13703
13741
|
NAMED_DEVICES = {
|
|
13704
13742
|
"/dev/sealed": "sealed",
|
|
13705
|
-
"/dev/clipboard": "clipboard"
|
|
13743
|
+
"/dev/clipboard": "clipboard",
|
|
13744
|
+
"/dev/embedder": "embedder"
|
|
13706
13745
|
};
|
|
13746
|
+
DEVICE_KINDS = /* @__PURE__ */ new Set(["sealed", "clipboard", "embedder"]);
|
|
13707
13747
|
ACCESS = { 0: "read", 1: "write" };
|
|
13708
13748
|
DEVICES2 = {
|
|
13709
13749
|
"/dev/null": "null",
|
|
@@ -14489,6 +14529,9 @@ function kernelSys(transport) {
|
|
|
14489
14529
|
clipboardAbort(fd) {
|
|
14490
14530
|
call2({ op: "fd-clipboard-abort", fd }, "fd-clipboard-abort");
|
|
14491
14531
|
},
|
|
14532
|
+
openEmbedder(flags) {
|
|
14533
|
+
return json2(call2({ op: "fd-open-embedder", flags }, "fd-open-embedder"));
|
|
14534
|
+
},
|
|
14492
14535
|
ptyNumbers() {
|
|
14493
14536
|
return json2(call2({ op: "pty-list" }, "pty-list"));
|
|
14494
14537
|
},
|
|
@@ -14984,7 +15027,14 @@ var init_process_runtime = __esm({
|
|
|
14984
15027
|
O_ACCMODE5 = 3;
|
|
14985
15028
|
O_DIRECTORY2 = 65536;
|
|
14986
15029
|
accessMode = (access) => access === "read" ? O_RDONLY2 : access === "write" ? O_WRONLY6 : O_RDWR6;
|
|
14987
|
-
PLACED = /* @__PURE__ */ new Set([
|
|
15030
|
+
PLACED = /* @__PURE__ */ new Set([
|
|
15031
|
+
"stream",
|
|
15032
|
+
"file",
|
|
15033
|
+
"socket",
|
|
15034
|
+
"clipboard",
|
|
15035
|
+
"embedder",
|
|
15036
|
+
"sealed"
|
|
15037
|
+
]);
|
|
14988
15038
|
GLUE_TRAILER = [
|
|
14989
15039
|
"if (typeof ENV !== 'undefined') Object.assign(ENV, Module.sliccEnv);",
|
|
14990
15040
|
"if (typeof thisProgram !== 'undefined' && Module.thisProgram === '') thisProgram = '';",
|