luau2ts 0.1.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/LICENSE +21 -0
- package/README.md +107 -0
- package/dist/cli/args.d.ts +19 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +130 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +65 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/modes.d.ts +17 -0
- package/dist/cli/modes.d.ts.map +1 -0
- package/dist/cli/modes.js +134 -0
- package/dist/cli/modes.js.map +1 -0
- package/dist/compile/class-shape.d.ts +31 -0
- package/dist/compile/class-shape.d.ts.map +1 -0
- package/dist/compile/class-shape.js +291 -0
- package/dist/compile/class-shape.js.map +1 -0
- package/dist/compile/context.d.ts +86 -0
- package/dist/compile/context.d.ts.map +1 -0
- package/dist/compile/context.js +144 -0
- package/dist/compile/context.js.map +1 -0
- package/dist/compile/index.d.ts +43 -0
- package/dist/compile/index.d.ts.map +1 -0
- package/dist/compile/index.js +2028 -0
- package/dist/compile/index.js.map +1 -0
- package/dist/compile/macros/datatypes.d.ts +2 -0
- package/dist/compile/macros/datatypes.d.ts.map +1 -0
- package/dist/compile/macros/datatypes.js +76 -0
- package/dist/compile/macros/datatypes.js.map +1 -0
- package/dist/compile/macros/index.d.ts +33 -0
- package/dist/compile/macros/index.d.ts.map +1 -0
- package/dist/compile/macros/index.js +71 -0
- package/dist/compile/macros/index.js.map +1 -0
- package/dist/compile/macros/instance.d.ts +2 -0
- package/dist/compile/macros/instance.d.ts.map +1 -0
- package/dist/compile/macros/instance.js +58 -0
- package/dist/compile/macros/instance.js.map +1 -0
- package/dist/compile/macros/stdlib.d.ts +2 -0
- package/dist/compile/macros/stdlib.d.ts.map +1 -0
- package/dist/compile/macros/stdlib.js +140 -0
- package/dist/compile/macros/stdlib.js.map +1 -0
- package/dist/compile/rbxts-runtime.d.ts +2 -0
- package/dist/compile/rbxts-runtime.d.ts.map +1 -0
- package/dist/compile/rbxts-runtime.js +163 -0
- package/dist/compile/rbxts-runtime.js.map +1 -0
- package/dist/compile/sourcemap.d.ts +25 -0
- package/dist/compile/sourcemap.d.ts.map +1 -0
- package/dist/compile/sourcemap.js +71 -0
- package/dist/compile/sourcemap.js.map +1 -0
- package/dist/compile/type.d.ts +6 -0
- package/dist/compile/type.d.ts.map +1 -0
- package/dist/compile/type.js +122 -0
- package/dist/compile/type.js.map +1 -0
- package/dist/compile/util.d.ts +38 -0
- package/dist/compile/util.d.ts.map +1 -0
- package/dist/compile/util.js +153 -0
- package/dist/compile/util.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +227 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/types.d.ts +430 -0
- package/dist/parser/types.d.ts.map +1 -0
- package/dist/parser/types.js +14 -0
- package/dist/parser/types.js.map +1 -0
- package/dist/parser/wasm/luau-parser.d.mts +21 -0
- package/dist/parser/wasm/luau-parser.mjs +2 -0
- package/dist/parser/wasm/luau-parser.wasm +0 -0
- package/dist/rojo/index.d.ts +4 -0
- package/dist/rojo/index.d.ts.map +1 -0
- package/dist/rojo/index.js +3 -0
- package/dist/rojo/index.js.map +1 -0
- package/dist/rojo/load-project.d.ts +12 -0
- package/dist/rojo/load-project.d.ts.map +1 -0
- package/dist/rojo/load-project.js +35 -0
- package/dist/rojo/load-project.js.map +1 -0
- package/dist/rojo/types.d.ts +39 -0
- package/dist/rojo/types.d.ts.map +1 -0
- package/dist/rojo/types.js +2 -0
- package/dist/rojo/types.js.map +1 -0
- package/dist/rojo/walk-tree.d.ts +40 -0
- package/dist/rojo/walk-tree.d.ts.map +1 -0
- package/dist/rojo/walk-tree.js +164 -0
- package/dist/rojo/walk-tree.js.map +1 -0
- package/dist/runtime/arith.d.ts +13 -0
- package/dist/runtime/arith.d.ts.map +1 -0
- package/dist/runtime/arith.js +151 -0
- package/dist/runtime/arith.js.map +1 -0
- package/dist/runtime/index-helper.d.ts +3 -0
- package/dist/runtime/index-helper.d.ts.map +1 -0
- package/dist/runtime/index-helper.js +40 -0
- package/dist/runtime/index-helper.js.map +1 -0
- package/dist/runtime/index.d.ts +13 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +13 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/iterator.d.ts +58 -0
- package/dist/runtime/iterator.d.ts.map +1 -0
- package/dist/runtime/iterator.js +181 -0
- package/dist/runtime/iterator.js.map +1 -0
- package/dist/runtime/length.d.ts +2 -0
- package/dist/runtime/length.d.ts.map +1 -0
- package/dist/runtime/length.js +15 -0
- package/dist/runtime/length.js.map +1 -0
- package/dist/runtime/lua-stdlib.d.ts +186 -0
- package/dist/runtime/lua-stdlib.d.ts.map +1 -0
- package/dist/runtime/lua-stdlib.js +502 -0
- package/dist/runtime/lua-stdlib.js.map +1 -0
- package/dist/runtime/metatable.d.ts +16 -0
- package/dist/runtime/metatable.d.ts.map +1 -0
- package/dist/runtime/metatable.js +129 -0
- package/dist/runtime/metatable.js.map +1 -0
- package/dist/runtime/pattern.d.ts +21 -0
- package/dist/runtime/pattern.d.ts.map +1 -0
- package/dist/runtime/pattern.js +375 -0
- package/dist/runtime/pattern.js.map +1 -0
- package/dist/runtime/pcall.d.ts +12 -0
- package/dist/runtime/pcall.d.ts.map +1 -0
- package/dist/runtime/pcall.js +54 -0
- package/dist/runtime/pcall.js.map +1 -0
- package/dist/runtime/string-lib.d.ts +31 -0
- package/dist/runtime/string-lib.d.ts.map +1 -0
- package/dist/runtime/string-lib.js +296 -0
- package/dist/runtime/string-lib.js.map +1 -0
- package/dist/runtime/table-lib.d.ts +18 -0
- package/dist/runtime/table-lib.d.ts.map +1 -0
- package/dist/runtime/table-lib.js +133 -0
- package/dist/runtime/table-lib.js.map +1 -0
- package/dist/runtime/tostring.d.ts +3 -0
- package/dist/runtime/tostring.d.ts.map +1 -0
- package/dist/runtime/tostring.js +82 -0
- package/dist/runtime/tostring.js.map +1 -0
- package/dist/runtime/truthy.d.ts +13 -0
- package/dist/runtime/truthy.d.ts.map +1 -0
- package/dist/runtime/truthy.js +26 -0
- package/dist/runtime/truthy.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { LuauScriptEntry, RojoProjectNode, ScriptKind } from './types.js';
|
|
2
|
+
/** Classify a single filename by its Rojo-style suffix.
|
|
3
|
+
*
|
|
4
|
+
* Returns:
|
|
5
|
+
* - `{ kind, baseName, isInit }` for recognised script files
|
|
6
|
+
* - `null` for anything we don't translate (json, csv, txt, unknown).
|
|
7
|
+
*
|
|
8
|
+
* Suffix grammar (Rojo 7+ convention):
|
|
9
|
+
* - `init.luau` / `init.lua` → ModuleScript (folder collapses)
|
|
10
|
+
* - `init.server.luau` / `init.server.lua` → Script
|
|
11
|
+
* - `init.client.luau` / `init.client.lua` → LocalScript
|
|
12
|
+
* - `<name>.luau` / `<name>.lua` → ModuleScript named <name>
|
|
13
|
+
* - `<name>.server.luau` / `<name>.server.lua` → Script named <name>
|
|
14
|
+
* - `<name>.client.luau` / `<name>.client.lua` → LocalScript named <name>
|
|
15
|
+
*
|
|
16
|
+
* Order matters: `foo.server.luau` must match `.server.luau` before
|
|
17
|
+
* `.luau` so we check the longer suffix first.
|
|
18
|
+
*/
|
|
19
|
+
export declare function classifyFile(filename: string): {
|
|
20
|
+
kind: ScriptKind;
|
|
21
|
+
baseName: string;
|
|
22
|
+
isInit: boolean;
|
|
23
|
+
} | null;
|
|
24
|
+
/** Walk a single Rojo tree node, accumulating script entries.
|
|
25
|
+
*
|
|
26
|
+
* - If the node has a `$path` pointing to a `.luau`/`.lua` file, record a
|
|
27
|
+
* single script entry at the current instance path.
|
|
28
|
+
* - If `$path` points to a directory, walk it: subdirectories nest as
|
|
29
|
+
* Folder instances; files become scripts; `init.*` files collapse the
|
|
30
|
+
* containing folder into a script of the matching kind.
|
|
31
|
+
* - If the node has children (keys that don't start with `$`), recurse
|
|
32
|
+
* into each child with its key as the next path component.
|
|
33
|
+
*/
|
|
34
|
+
export declare function walkNode(node: RojoProjectNode, instancePath: string[], projectDir: string, out: LuauScriptEntry[]): Promise<void>;
|
|
35
|
+
/** Resolve the project file path: accept either a direct path to a
|
|
36
|
+
* `*.project.json` file or a directory containing `default.project.json`. */
|
|
37
|
+
export declare function resolveProjectFile(arg: string): Promise<string>;
|
|
38
|
+
export declare function projectDirOf(projectFile: string): string;
|
|
39
|
+
export declare function defaultProjectName(projectFile: string): string;
|
|
40
|
+
//# sourceMappingURL=walk-tree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-tree.d.ts","sourceRoot":"","sources":["../../src/rojo/walk-tree.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,UAAU,EACX,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG;IAC9C,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;CACjB,GAAG,IAAI,CAkBP;AAUD;;;;;;;;;GASG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,eAAe,EACrB,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,eAAe,EAAE,GACrB,OAAO,CAAC,IAAI,CAAC,CAgBf;AAwED;8EAC8E;AAC9E,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMrE;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAExD;AAED,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAY9D"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { readdir, readFile, stat } from 'node:fs/promises';
|
|
2
|
+
import { basename, dirname, extname, join, resolve } from 'node:path';
|
|
3
|
+
/** Classify a single filename by its Rojo-style suffix.
|
|
4
|
+
*
|
|
5
|
+
* Returns:
|
|
6
|
+
* - `{ kind, baseName, isInit }` for recognised script files
|
|
7
|
+
* - `null` for anything we don't translate (json, csv, txt, unknown).
|
|
8
|
+
*
|
|
9
|
+
* Suffix grammar (Rojo 7+ convention):
|
|
10
|
+
* - `init.luau` / `init.lua` → ModuleScript (folder collapses)
|
|
11
|
+
* - `init.server.luau` / `init.server.lua` → Script
|
|
12
|
+
* - `init.client.luau` / `init.client.lua` → LocalScript
|
|
13
|
+
* - `<name>.luau` / `<name>.lua` → ModuleScript named <name>
|
|
14
|
+
* - `<name>.server.luau` / `<name>.server.lua` → Script named <name>
|
|
15
|
+
* - `<name>.client.luau` / `<name>.client.lua` → LocalScript named <name>
|
|
16
|
+
*
|
|
17
|
+
* Order matters: `foo.server.luau` must match `.server.luau` before
|
|
18
|
+
* `.luau` so we check the longer suffix first.
|
|
19
|
+
*/
|
|
20
|
+
export function classifyFile(filename) {
|
|
21
|
+
const lower = filename.toLowerCase();
|
|
22
|
+
const suffixes = [
|
|
23
|
+
{ tail: '.server.luau', kind: 'Script' },
|
|
24
|
+
{ tail: '.server.lua', kind: 'Script' },
|
|
25
|
+
{ tail: '.client.luau', kind: 'LocalScript' },
|
|
26
|
+
{ tail: '.client.lua', kind: 'LocalScript' },
|
|
27
|
+
{ tail: '.luau', kind: 'ModuleScript' },
|
|
28
|
+
{ tail: '.lua', kind: 'ModuleScript' },
|
|
29
|
+
];
|
|
30
|
+
for (const { tail, kind } of suffixes) {
|
|
31
|
+
if (lower.endsWith(tail)) {
|
|
32
|
+
const baseName = filename.slice(0, filename.length - tail.length);
|
|
33
|
+
const isInit = baseName === 'init';
|
|
34
|
+
return { kind, baseName, isInit };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
/** `$className` strings Rojo uses for explicit script-class assignment.
|
|
40
|
+
* A node's `$className` overrides the kind inferred from its `$path`. */
|
|
41
|
+
const SCRIPT_CLASS_NAMES = {
|
|
42
|
+
ModuleScript: 'ModuleScript',
|
|
43
|
+
Script: 'Script',
|
|
44
|
+
LocalScript: 'LocalScript',
|
|
45
|
+
};
|
|
46
|
+
/** Walk a single Rojo tree node, accumulating script entries.
|
|
47
|
+
*
|
|
48
|
+
* - If the node has a `$path` pointing to a `.luau`/`.lua` file, record a
|
|
49
|
+
* single script entry at the current instance path.
|
|
50
|
+
* - If `$path` points to a directory, walk it: subdirectories nest as
|
|
51
|
+
* Folder instances; files become scripts; `init.*` files collapse the
|
|
52
|
+
* containing folder into a script of the matching kind.
|
|
53
|
+
* - If the node has children (keys that don't start with `$`), recurse
|
|
54
|
+
* into each child with its key as the next path component.
|
|
55
|
+
*/
|
|
56
|
+
export async function walkNode(node, instancePath, projectDir, out) {
|
|
57
|
+
if (node.$path !== undefined) {
|
|
58
|
+
const abs = resolve(projectDir, node.$path);
|
|
59
|
+
await walkPath(abs, instancePath, node.$className, out);
|
|
60
|
+
}
|
|
61
|
+
// Recurse into named children (anything not starting with `$`).
|
|
62
|
+
// Sort keys for deterministic output across filesystems / platforms.
|
|
63
|
+
const childKeys = Object.keys(node)
|
|
64
|
+
.filter((k) => !k.startsWith('$'))
|
|
65
|
+
.sort();
|
|
66
|
+
for (const childName of childKeys) {
|
|
67
|
+
const childNode = node[childName];
|
|
68
|
+
if (typeof childNode !== 'object' || childNode === null)
|
|
69
|
+
continue;
|
|
70
|
+
await walkNode(childNode, [...instancePath, childName], projectDir, out);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Walk a filesystem entry pointed at by a `$path`. */
|
|
74
|
+
async function walkPath(absPath, instancePath, explicitClassName, out) {
|
|
75
|
+
let st;
|
|
76
|
+
try {
|
|
77
|
+
st = await stat(absPath);
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
// Missing $path is a Rojo project error, but we tolerate it here so a
|
|
81
|
+
// partial project still yields the scripts it does have. The CLI can
|
|
82
|
+
// surface a warning to the user.
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (st.isFile()) {
|
|
86
|
+
const cls = classifyFile(basename(absPath));
|
|
87
|
+
if (!cls)
|
|
88
|
+
return;
|
|
89
|
+
const kind = (explicitClassName && SCRIPT_CLASS_NAMES[explicitClassName])
|
|
90
|
+
|| cls.kind;
|
|
91
|
+
const source = await readFile(absPath, 'utf8');
|
|
92
|
+
out.push({ instancePath, scriptKind: kind, filePath: absPath, source });
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (!st.isDirectory())
|
|
96
|
+
return;
|
|
97
|
+
// Directory: scan for init.* first to decide whether the directory
|
|
98
|
+
// itself collapses into a script, then recurse into children.
|
|
99
|
+
const entries = (await readdir(absPath)).sort();
|
|
100
|
+
let initKind = null;
|
|
101
|
+
let initFile = null;
|
|
102
|
+
for (const entry of entries) {
|
|
103
|
+
const cls = classifyFile(entry);
|
|
104
|
+
if (cls && cls.isInit) {
|
|
105
|
+
initKind = cls.kind;
|
|
106
|
+
initFile = join(absPath, entry);
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (initFile) {
|
|
111
|
+
const kind = (explicitClassName && SCRIPT_CLASS_NAMES[explicitClassName])
|
|
112
|
+
|| initKind;
|
|
113
|
+
const source = await readFile(initFile, 'utf8');
|
|
114
|
+
out.push({ instancePath, scriptKind: kind, filePath: initFile, source });
|
|
115
|
+
}
|
|
116
|
+
for (const entry of entries) {
|
|
117
|
+
const entryPath = join(absPath, entry);
|
|
118
|
+
const entryStat = await stat(entryPath);
|
|
119
|
+
if (entryStat.isDirectory()) {
|
|
120
|
+
await walkPath(entryPath, [...instancePath, entry], undefined, out);
|
|
121
|
+
continue;
|
|
122
|
+
}
|
|
123
|
+
if (!entryStat.isFile())
|
|
124
|
+
continue;
|
|
125
|
+
const cls = classifyFile(entry);
|
|
126
|
+
if (!cls || cls.isInit)
|
|
127
|
+
continue;
|
|
128
|
+
const source = await readFile(entryPath, 'utf8');
|
|
129
|
+
out.push({
|
|
130
|
+
instancePath: [...instancePath, cls.baseName],
|
|
131
|
+
scriptKind: cls.kind,
|
|
132
|
+
filePath: entryPath,
|
|
133
|
+
source,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/** Resolve the project file path: accept either a direct path to a
|
|
138
|
+
* `*.project.json` file or a directory containing `default.project.json`. */
|
|
139
|
+
export async function resolveProjectFile(arg) {
|
|
140
|
+
const abs = resolve(arg);
|
|
141
|
+
const st = await stat(abs);
|
|
142
|
+
if (st.isFile())
|
|
143
|
+
return abs;
|
|
144
|
+
if (st.isDirectory())
|
|
145
|
+
return join(abs, 'default.project.json');
|
|
146
|
+
throw new Error(`Project path is neither file nor directory: ${arg}`);
|
|
147
|
+
}
|
|
148
|
+
export function projectDirOf(projectFile) {
|
|
149
|
+
return dirname(projectFile);
|
|
150
|
+
}
|
|
151
|
+
export function defaultProjectName(projectFile) {
|
|
152
|
+
const base = basename(projectFile);
|
|
153
|
+
// Strip `.project.json` to derive a stable project name.
|
|
154
|
+
const ext = extname(base);
|
|
155
|
+
if (ext === '.json') {
|
|
156
|
+
const withoutJson = base.slice(0, -ext.length);
|
|
157
|
+
if (withoutJson.endsWith('.project')) {
|
|
158
|
+
return withoutJson.slice(0, -'.project'.length) || 'project';
|
|
159
|
+
}
|
|
160
|
+
return withoutJson;
|
|
161
|
+
}
|
|
162
|
+
return base;
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=walk-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"walk-tree.js","sourceRoot":"","sources":["../../src/rojo/walk-tree.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare function luaAdd(a: unknown, b: unknown): number | unknown;
|
|
2
|
+
export declare function luaSub(a: unknown, b: unknown): number | unknown;
|
|
3
|
+
export declare function luaMul(a: unknown, b: unknown): number | unknown;
|
|
4
|
+
export declare function luaDiv(a: unknown, b: unknown): number | unknown;
|
|
5
|
+
export declare function luaIdiv(a: unknown, b: unknown): number | unknown;
|
|
6
|
+
export declare function luaMod(a: unknown, b: unknown): number | unknown;
|
|
7
|
+
export declare function luaPow(a: unknown, b: unknown): number | unknown;
|
|
8
|
+
export declare function luaUnm(a: unknown): number | unknown;
|
|
9
|
+
export declare function luaConcat(a: unknown, b: unknown): string | unknown;
|
|
10
|
+
export declare function luaEq(a: unknown, b: unknown): boolean;
|
|
11
|
+
export declare function luaLt(a: unknown, b: unknown): boolean;
|
|
12
|
+
export declare function luaLe(a: unknown, b: unknown): boolean;
|
|
13
|
+
//# sourceMappingURL=arith.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arith.d.ts","sourceRoot":"","sources":["../../src/runtime/arith.ts"],"names":[],"mappings":"AAyFA,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AACD,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAEhE;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAG/D;AACD,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAOnD;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAIlE;AAID,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAerD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAMrD;AAED,wBAAgB,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAWrD"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { error, LuaError } from './pcall.js';
|
|
2
|
+
import { getMetamethod } from './metatable.js';
|
|
3
|
+
function toNumber(v) {
|
|
4
|
+
if (typeof v === 'number')
|
|
5
|
+
return v;
|
|
6
|
+
if (typeof v === 'string') {
|
|
7
|
+
const n = Number(v);
|
|
8
|
+
return Number.isNaN(n) ? undefined : n;
|
|
9
|
+
}
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
// Operations that are commutative — for these we try the second operand
|
|
13
|
+
// as the receiver if the first doesn't provide the fluent method. Lets
|
|
14
|
+
// `2 * vec3` route to `vec3.mul(2)`.
|
|
15
|
+
const COMMUTATIVE = {
|
|
16
|
+
__add: true,
|
|
17
|
+
__mul: true,
|
|
18
|
+
__eq: true,
|
|
19
|
+
};
|
|
20
|
+
function callBinMetamethod(meta, opLabel, a, b) {
|
|
21
|
+
// First try a direct fluent method (.add/.sub/.mul/.div etc.) on either
|
|
22
|
+
// operand — this is what Roblox's Vector3 / CFrame / Color3 expose.
|
|
23
|
+
// For commutative ops we also try b's method if a doesn't have one.
|
|
24
|
+
const fluent = FLUENT_METHOD[meta];
|
|
25
|
+
if (fluent) {
|
|
26
|
+
const fluentA = a?.[fluent];
|
|
27
|
+
if (typeof fluentA === 'function') {
|
|
28
|
+
return fluentA.call(a, b);
|
|
29
|
+
}
|
|
30
|
+
if (COMMUTATIVE[meta]) {
|
|
31
|
+
const fluentB = b?.[fluent];
|
|
32
|
+
if (typeof fluentB === 'function') {
|
|
33
|
+
return fluentB.call(b, a);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
const mm = getMetamethod(a, meta) ?? getMetamethod(b, meta);
|
|
38
|
+
if (typeof mm === 'function') {
|
|
39
|
+
return mm(a, b);
|
|
40
|
+
}
|
|
41
|
+
// One operand is null/undefined — common in real places where a
|
|
42
|
+
// FindFirstChild lookup didn't resolve. Logging once and returning the
|
|
43
|
+
// other operand keeps the script alive instead of taking down the page
|
|
44
|
+
// on what was probably a missing-instance issue elsewhere.
|
|
45
|
+
if (a == null || b == null) {
|
|
46
|
+
return a ?? b ?? 0;
|
|
47
|
+
}
|
|
48
|
+
return error(`attempt to perform arithmetic (${opLabel}) on incompatible values`);
|
|
49
|
+
}
|
|
50
|
+
const FLUENT_METHOD = {
|
|
51
|
+
__add: 'add',
|
|
52
|
+
__sub: 'sub',
|
|
53
|
+
__mul: 'mul',
|
|
54
|
+
__div: 'div',
|
|
55
|
+
__concat: 'concat',
|
|
56
|
+
__eq: 'eq',
|
|
57
|
+
__lt: 'lt',
|
|
58
|
+
__le: 'le',
|
|
59
|
+
};
|
|
60
|
+
function binNumeric(meta, opLabel, a, b, fn) {
|
|
61
|
+
const an = toNumber(a);
|
|
62
|
+
const bn = toNumber(b);
|
|
63
|
+
if (an !== undefined && bn !== undefined)
|
|
64
|
+
return fn(an, bn);
|
|
65
|
+
return callBinMetamethod(meta, opLabel, a, b);
|
|
66
|
+
}
|
|
67
|
+
export function luaAdd(a, b) {
|
|
68
|
+
return binNumeric('__add', 'add', a, b, (x, y) => x + y);
|
|
69
|
+
}
|
|
70
|
+
export function luaSub(a, b) {
|
|
71
|
+
return binNumeric('__sub', 'sub', a, b, (x, y) => x - y);
|
|
72
|
+
}
|
|
73
|
+
export function luaMul(a, b) {
|
|
74
|
+
return binNumeric('__mul', 'mul', a, b, (x, y) => x * y);
|
|
75
|
+
}
|
|
76
|
+
export function luaDiv(a, b) {
|
|
77
|
+
return binNumeric('__div', 'div', a, b, (x, y) => x / y);
|
|
78
|
+
}
|
|
79
|
+
export function luaIdiv(a, b) {
|
|
80
|
+
return binNumeric('__idiv', 'idiv', a, b, (x, y) => Math.floor(x / y));
|
|
81
|
+
}
|
|
82
|
+
export function luaMod(a, b) {
|
|
83
|
+
// Lua's % is floor modulo: ((a % b) + b) % b. JS's % is truncated.
|
|
84
|
+
return binNumeric('__mod', 'mod', a, b, (x, y) => x - Math.floor(x / y) * y);
|
|
85
|
+
}
|
|
86
|
+
export function luaPow(a, b) {
|
|
87
|
+
return binNumeric('__pow', 'pow', a, b, (x, y) => x ** y);
|
|
88
|
+
}
|
|
89
|
+
export function luaUnm(a) {
|
|
90
|
+
if (typeof a === 'number')
|
|
91
|
+
return -a;
|
|
92
|
+
const an = toNumber(a);
|
|
93
|
+
if (an !== undefined)
|
|
94
|
+
return -an;
|
|
95
|
+
const mm = getMetamethod(a, '__unm');
|
|
96
|
+
if (typeof mm === 'function')
|
|
97
|
+
return mm(a);
|
|
98
|
+
return error('attempt to perform arithmetic (unm) on incompatible value');
|
|
99
|
+
}
|
|
100
|
+
export function luaConcat(a, b) {
|
|
101
|
+
const ok = (v) => typeof v === 'string' || typeof v === 'number';
|
|
102
|
+
if (ok(a) && ok(b))
|
|
103
|
+
return `${a}${b}`;
|
|
104
|
+
return callBinMetamethod('__concat', 'concat', a, b);
|
|
105
|
+
}
|
|
106
|
+
// ─── Comparison helpers ─────────────────────────────────────────────────────
|
|
107
|
+
export function luaEq(a, b) {
|
|
108
|
+
if (a === b)
|
|
109
|
+
return true;
|
|
110
|
+
// Lua maps JS null and undefined to nil; nil == nil is true, but JS
|
|
111
|
+
// `null === undefined` is false. Without this, a `FindFirstChild` result
|
|
112
|
+
// (null on miss) compared to `nil` via `x == nil` reads false, leaving
|
|
113
|
+
// scripts to dereference the miss.
|
|
114
|
+
if (a == null && b == null)
|
|
115
|
+
return true;
|
|
116
|
+
if (Number.isNaN(a) || Number.isNaN(b))
|
|
117
|
+
return false;
|
|
118
|
+
// Lua only consults __eq when types match and both are tables/userdata.
|
|
119
|
+
const sameType = typeof a === typeof b && a !== null && b !== null && typeof a === 'object';
|
|
120
|
+
if (sameType) {
|
|
121
|
+
const mm = getMetamethod(a, '__eq') ?? getMetamethod(b, '__eq');
|
|
122
|
+
if (typeof mm === 'function')
|
|
123
|
+
return Boolean(mm(a, b));
|
|
124
|
+
}
|
|
125
|
+
return false;
|
|
126
|
+
}
|
|
127
|
+
export function luaLt(a, b) {
|
|
128
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
129
|
+
return a < b;
|
|
130
|
+
if (typeof a === 'string' && typeof b === 'string')
|
|
131
|
+
return a < b;
|
|
132
|
+
const mm = getMetamethod(a, '__lt') ?? getMetamethod(b, '__lt');
|
|
133
|
+
if (typeof mm === 'function')
|
|
134
|
+
return Boolean(mm(a, b));
|
|
135
|
+
throw new LuaError('attempt to compare incompatible values');
|
|
136
|
+
}
|
|
137
|
+
export function luaLe(a, b) {
|
|
138
|
+
if (typeof a === 'number' && typeof b === 'number')
|
|
139
|
+
return a <= b;
|
|
140
|
+
if (typeof a === 'string' && typeof b === 'string')
|
|
141
|
+
return a <= b;
|
|
142
|
+
const mmLe = getMetamethod(a, '__le') ?? getMetamethod(b, '__le');
|
|
143
|
+
if (typeof mmLe === 'function')
|
|
144
|
+
return Boolean(mmLe(a, b));
|
|
145
|
+
// Fall back to !(b < a) with __lt
|
|
146
|
+
const mmLt = getMetamethod(a, '__lt') ?? getMetamethod(b, '__lt');
|
|
147
|
+
if (typeof mmLt === 'function')
|
|
148
|
+
return !Boolean(mmLt(b, a));
|
|
149
|
+
throw new LuaError('attempt to compare incompatible values');
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=arith.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"arith.js","sourceRoot":"","sources":["../../src/runtime/arith.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-helper.d.ts","sourceRoot":"","sources":["../../src/runtime/index-helper.ts"],"names":[],"mappings":"AAkBA,wBAAgB,QAAQ,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,CAAC,CAM/D;AAKD,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAQvE"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// luaIndex(t, k) — table[k] lookup with Lua-correct array indexing.
|
|
2
|
+
//
|
|
3
|
+
// Lua tables are 1-indexed; JS arrays are 0-indexed. The luau-to-ts
|
|
4
|
+
// compiler used to emit an inline conditional that subtracted 1 from
|
|
5
|
+
// every runtime numeric key:
|
|
6
|
+
//
|
|
7
|
+
// t[(typeof k === "number" ? k - 1 : k)]
|
|
8
|
+
//
|
|
9
|
+
// That's correct for Lua sequence-style tables compiled to JS arrays
|
|
10
|
+
// (where Lua `arr[1]` should hit JS `arr[0]`), but it's catastrophically
|
|
11
|
+
// wrong for dictionary-style tables keyed by large numeric values —
|
|
12
|
+
// Roblox developer-product IDs (3582943767), asset IDs, gamepass IDs, etc.
|
|
13
|
+
// `productCash[3582943767]` ends up as `productCash[3582943766]` → undefined.
|
|
14
|
+
//
|
|
15
|
+
// This helper picks the right behavior dynamically:
|
|
16
|
+
// • Plain JS array, numeric key in range → subtract 1 (sequence access)
|
|
17
|
+
// • Anything else → pass through (dictionary access, string keys, etc.)
|
|
18
|
+
export function luaIndex(t, k) {
|
|
19
|
+
if (t === null || t === undefined)
|
|
20
|
+
return undefined;
|
|
21
|
+
if (typeof k === 'number' && Array.isArray(t)) {
|
|
22
|
+
return t[k - 1];
|
|
23
|
+
}
|
|
24
|
+
return t[k];
|
|
25
|
+
}
|
|
26
|
+
// Companion to luaIndex for the `t[k] = v` write position. Same arrays-vs-
|
|
27
|
+
// dictionaries discrimination — only Lua sequences compiled to JS arrays
|
|
28
|
+
// get the 1-index subtraction.
|
|
29
|
+
export function luaIndexSet(t, k, v) {
|
|
30
|
+
if (t === null || t === undefined)
|
|
31
|
+
return v;
|
|
32
|
+
if (typeof k === 'number' && Array.isArray(t)) {
|
|
33
|
+
t[k - 1] = v;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
t[k] = v;
|
|
37
|
+
}
|
|
38
|
+
return v;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=index-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-helper.js","sourceRoot":"","sources":["../../src/runtime/index-helper.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,EAAE;AACF,oEAAoE;AACpE,qEAAqE;AACrE,6BAA6B;AAC7B,EAAE;AACF,2CAA2C;AAC3C,EAAE;AACF,qEAAqE;AACrE,yEAAyE;AACzE,oEAAoE;AACpE,2EAA2E;AAC3E,8EAA8E;AAC9E,EAAE;AACF,oDAAoD;AACpD,0EAA0E;AAC1E,0EAA0E;AAE1E,MAAM,UAAU,QAAQ,CAAc,CAAU,EAAE,CAAU;IAC1D,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAc,CAAC;IACzD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,OAAQ,CAAe,CAAC,CAAC,GAAG,CAAC,CAAM,CAAC;IACtC,CAAC;IACD,OAAQ,CAAsC,CAAC,CAAoB,CAAM,CAAC;AAC5E,CAAC;AAED,2EAA2E;AAC3E,yEAAyE;AACzE,+BAA+B;AAC/B,MAAM,UAAU,WAAW,CAAC,CAAU,EAAE,CAAU,EAAE,CAAU;IAC5D,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC;IAC5C,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7C,CAAe,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACL,CAAsC,CAAC,CAAoB,CAAC,GAAG,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './truthy.js';
|
|
2
|
+
export * from './length.js';
|
|
3
|
+
export * from './pcall.js';
|
|
4
|
+
export * from './iterator.js';
|
|
5
|
+
export * from './tostring.js';
|
|
6
|
+
export * from './metatable.js';
|
|
7
|
+
export * from './arith.js';
|
|
8
|
+
export * from './table-lib.js';
|
|
9
|
+
export * from './pattern.js';
|
|
10
|
+
export * from './string-lib.js';
|
|
11
|
+
export * from './lua-stdlib.js';
|
|
12
|
+
export * from './index-helper.js';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './truthy.js';
|
|
2
|
+
export * from './length.js';
|
|
3
|
+
export * from './pcall.js';
|
|
4
|
+
export * from './iterator.js';
|
|
5
|
+
export * from './tostring.js';
|
|
6
|
+
export * from './metatable.js';
|
|
7
|
+
export * from './arith.js';
|
|
8
|
+
export * from './table-lib.js';
|
|
9
|
+
export * from './pattern.js';
|
|
10
|
+
export * from './string-lib.js';
|
|
11
|
+
export * from './lua-stdlib.js';
|
|
12
|
+
export * from './index-helper.js';
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/runtime/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
type KeyReifier = (rawKey: unknown) => unknown;
|
|
2
|
+
export declare function registerKeyReifier(fn: KeyReifier): void;
|
|
3
|
+
export type IpairsState<T> = readonly [
|
|
4
|
+
iterFn: (state: readonly T[], i: number) => [number, T] | undefined,
|
|
5
|
+
state: readonly T[],
|
|
6
|
+
initial: number
|
|
7
|
+
];
|
|
8
|
+
export type PairsState<T> = readonly [
|
|
9
|
+
iterFn: (state: T, prev: keyof T | null) => [keyof T, T[keyof T]] | undefined,
|
|
10
|
+
state: T,
|
|
11
|
+
initial: null
|
|
12
|
+
];
|
|
13
|
+
export declare function ipairs<T>(t: readonly T[] | null | undefined): IpairsState<T>;
|
|
14
|
+
export declare function pairs<T extends object>(t: T | null | undefined): PairsState<T>;
|
|
15
|
+
export declare function next<T extends object>(t: T | null | undefined, k?: keyof T | null): [keyof T, T[keyof T]] | undefined;
|
|
16
|
+
/** Generic-for protocol adapter. Luau lets you write
|
|
17
|
+
* `for k, v in expr do … end` where `expr` can be any of:
|
|
18
|
+
* - an iterator triple `(iterFn, state, initialCtrl)` returned by
|
|
19
|
+
* `pairs(t)` / `ipairs(t)` / custom iterator constructors,
|
|
20
|
+
* - a callable that mimics the iterator function directly,
|
|
21
|
+
* - a table with an `__iter` metamethod,
|
|
22
|
+
* - a plain array (Luau extension — common in Roblox code like
|
|
23
|
+
* `for _, x in CollectionService:GetTagged("Tag") do`),
|
|
24
|
+
* - a plain dictionary (Luau extension; same as `pairs(t)`).
|
|
25
|
+
*
|
|
26
|
+
* The compiler used to emit a raw `[__iter, __state, __ctrl] = expr`
|
|
27
|
+
* destructure that only worked for the triple form. Arrays and bare
|
|
28
|
+
* tables silently iterated zero times because the first element
|
|
29
|
+
* wasn't a function. This adapter normalizes every shape to a real
|
|
30
|
+
* triple. */
|
|
31
|
+
export declare function genericIter(value: unknown): readonly [
|
|
32
|
+
(state: unknown, ctrl: unknown) => unknown,
|
|
33
|
+
unknown,
|
|
34
|
+
unknown
|
|
35
|
+
];
|
|
36
|
+
/** Multi-return adapter for `local a, b = f()` where `f` returns a single
|
|
37
|
+
* value (not a tuple). Luau pads missing returns with nil; JS destructuring
|
|
38
|
+
* on a non-iterable throws. Wrap the call result so destructuring works:
|
|
39
|
+
* `[a, b] = multiret(f())` → `a = result`, `b = undefined` when `f` returns
|
|
40
|
+
* a non-array, and stays a no-op when `f` already returns an array tuple. */
|
|
41
|
+
export declare function multiret(v: unknown): unknown[];
|
|
42
|
+
/** Drop-in replacement for `Object.keys(t)` for the compiler's inlined
|
|
43
|
+
* `for k in pairs(t)` form. Returns the original Instance object as the
|
|
44
|
+
* key when the table was indexed with one, via the global key reifier
|
|
45
|
+
* a host Roblox runtime installs. Without this, Instance-keyed
|
|
46
|
+
* Lua tables collapse on shared Name (two parts named "Handle" share
|
|
47
|
+
* the same string key) AND iteration yields the string key, so
|
|
48
|
+
* `part.CFrame = ...` fails with "Cannot create property on string".
|
|
49
|
+
*
|
|
50
|
+
* Falls back to the raw string for primitive keys and for the slow
|
|
51
|
+
* path before the runtime has loaded. */
|
|
52
|
+
export declare function pairKeys(t: unknown): unknown[];
|
|
53
|
+
/** Companion lookup: `t[k]` where k may be a reified Instance. We use
|
|
54
|
+
* String(k) to recover the original property key. For numeric keys the
|
|
55
|
+
* compiler emits `t[k-1]` directly, so we only handle the reified case. */
|
|
56
|
+
export declare function pairValue(t: unknown, k: unknown): unknown;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=iterator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"iterator.d.ts","sourceRoot":"","sources":["../../src/runtime/iterator.ts"],"names":[],"mappings":"AAAA,KAAK,UAAU,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;AAG/C,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAEvD;AAkBD,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,SAAS;IACpC,MAAM,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,SAAS;IACnE,KAAK,EAAE,SAAS,CAAC,EAAE;IACnB,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,SAAS;IACnC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS;IAC7E,KAAK,EAAE,CAAC;IACR,OAAO,EAAE,IAAI;CACd,CAAC;AAEF,wBAAgB,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAE5E;AAWD,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAE9E;AAMD,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EACnC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EACvB,CAAC,GAAE,MAAM,CAAC,GAAG,IAAW,GACvB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAEnC;AA4CD;;;;;;;;;;;;;;cAcc;AACd,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,SAAS;IACpD,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO;IAC1C,OAAO;IACP,OAAO;CACR,CAmCA;AAMD;;;;8EAI8E;AAC9E,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAE9C;AAED;;;;;;;;;0CAS0C;AAC1C,wBAAgB,QAAQ,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,EAAE,CAe9C;AAED;;4EAE4E;AAC5E,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,GAAG,OAAO,CAOzD"}
|