@bitmagic/cli 0.1.20 → 0.1.22
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 +44 -9
- package/dist/commands/edit.js +1 -0
- package/dist/commands/edit.js.map +1 -1
- package/dist/commands/generate.d.ts +20 -0
- package/dist/commands/generate.js +116 -33
- package/dist/commands/generate.js.map +1 -1
- package/dist/editor/journal.d.ts +29 -3
- package/dist/editor/journal.js +6 -0
- package/dist/editor/journal.js.map +1 -1
- package/dist/editor/server.d.ts +3 -0
- package/dist/editor/server.js +110 -18
- package/dist/editor/server.js.map +1 -1
- package/dist/editor/shell-page.js +57 -13
- package/dist/editor/shell-page.js.map +1 -1
- package/dist/generate/prop.d.ts +22 -0
- package/dist/generate/prop.js +32 -0
- package/dist/generate/prop.js.map +1 -1
- package/dist/generate/stream.d.ts +16 -3
- package/dist/generate/stream.js +22 -1
- package/dist/generate/stream.js.map +1 -1
- package/dist/generate/vehicle.d.ts +53 -0
- package/dist/generate/vehicle.js +227 -0
- package/dist/generate/vehicle.js.map +1 -0
- package/dist/scaffold/project-files.js +29 -11
- package/dist/scaffold/project-files.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `bitmagic generate vehicle` — design a drivable vehicle and register it as an asset.
|
|
3
|
+
*
|
|
4
|
+
* Three steps, the same shape `generate prop` uses:
|
|
5
|
+
*
|
|
6
|
+
* 1. Ask api-server to design + build the vehicle (`POST /api/cli/v1/assets/vehicle/stream`).
|
|
7
|
+
* The designer LLM and the Asset Forger credentials live there and never reach this machine.
|
|
8
|
+
* 2. Voxelize the GLB in a browser. Only the engine can do this, so the CLI drives its own
|
|
9
|
+
* headless Chrome — the same arrangement `bitmagic forge` and `generate prop` use.
|
|
10
|
+
* 3. Upsert the finished asset into `assets[]`.
|
|
11
|
+
*
|
|
12
|
+
* Where this deliberately differs from `prop`, which upgrades an EXISTING asset in place:
|
|
13
|
+
*
|
|
14
|
+
* - No asset is looked up first, and none is required. A vehicle is a NEW asset; requiring a
|
|
15
|
+
* placeholder to already exist would make the command unusable.
|
|
16
|
+
* - No `fitBox` and no `assetId` are sent. The engine derives the vehicle's physics fitment from
|
|
17
|
+
* the GLB's own `bmVehicle` scene extras and mints the id. Passing a fitBox would rescale the
|
|
18
|
+
* body off its authored ride stance and silently produce wrong physics.
|
|
19
|
+
* - The bake resolution comes from the server frame, not a constant: it is derived from the
|
|
20
|
+
* vehicle's own proportions (a semi tractor and a go-kart do not bake at the same voxel size).
|
|
21
|
+
*
|
|
22
|
+
* The GLB survives a failure in steps 2-3: it is reported in the error so a retry can be pointed at
|
|
23
|
+
* it with `--glb-url` rather than paying for the design twice.
|
|
24
|
+
*/
|
|
25
|
+
import { spawn } from 'child_process';
|
|
26
|
+
import { CliError } from '../errors.js';
|
|
27
|
+
import { applyModificationsToWorld } from '../forge/apply-modifications.js';
|
|
28
|
+
import { ForgeBrowserHost, readProjectGameData } from '../forge/browser-host.js';
|
|
29
|
+
import { projectWorldJsonPath } from '../forge/run-pipeline.js';
|
|
30
|
+
import { startUploadProxy } from '../forge/upload-proxy.js';
|
|
31
|
+
import { requestGeneration } from './stream.js';
|
|
32
|
+
import { reserveCorsAllowedPort } from '../local-port.js';
|
|
33
|
+
import { projectBin } from '../project/context.js';
|
|
34
|
+
import { waitForServer } from '../verify/wait-for-server.js';
|
|
35
|
+
/** Voxelizing a dense mesh is minutes of work in the browser, not seconds. */
|
|
36
|
+
const VOXELIZE_TIMEOUT_MS = 10 * 60 * 1000;
|
|
37
|
+
/**
|
|
38
|
+
* A vehicle body is a closed shell around a cabin; baked hollow it reads as a shell the moment the
|
|
39
|
+
* camera clips inside, and every preset is well under the size where a solid fill gets expensive.
|
|
40
|
+
* Matches what the agent lane's vehicle pipeline has always passed.
|
|
41
|
+
*/
|
|
42
|
+
const FILL_INTERIOR = true;
|
|
43
|
+
function isRecord(value) {
|
|
44
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Steps 1-3. Everything the caller must resolve first (project, environment, token) is a parameter,
|
|
48
|
+
* so this stays free of CLI output plumbing and of how the token was obtained.
|
|
49
|
+
*/
|
|
50
|
+
export async function generateAndInstallVehicle(options) {
|
|
51
|
+
const { context, environment, token, prompt, presetName, name, log } = options;
|
|
52
|
+
if (options.glbUrl !== undefined) {
|
|
53
|
+
if (options.minVoxelSize === undefined) {
|
|
54
|
+
throw new CliError('--glb-url needs --voxel-size too: the bake resolution is derived from the vehicle\'s own '
|
|
55
|
+
+ 'proportions during the design step, so it cannot be recovered from the other flags. '
|
|
56
|
+
+ 'The failed run printed the exact command to retry with.');
|
|
57
|
+
}
|
|
58
|
+
if (name === undefined) {
|
|
59
|
+
throw new CliError('--glb-url needs --name too, so the asset can be registered under the right name.');
|
|
60
|
+
}
|
|
61
|
+
log(`Reusing the vehicle at ${options.glbUrl} — skipping the design step.`);
|
|
62
|
+
const result = await voxelizeAndInstallVehicle({
|
|
63
|
+
context,
|
|
64
|
+
environment,
|
|
65
|
+
token,
|
|
66
|
+
name,
|
|
67
|
+
glbUrl: options.glbUrl,
|
|
68
|
+
minVoxelSize: options.minVoxelSize,
|
|
69
|
+
// Unlike minVoxelSize this is a fixed LOD ceiling, so a retry can restate it.
|
|
70
|
+
maxVoxelSize: 0.5,
|
|
71
|
+
description: prompt ?? presetName ?? name,
|
|
72
|
+
log,
|
|
73
|
+
});
|
|
74
|
+
return { ...result, glbUrl: options.glbUrl };
|
|
75
|
+
}
|
|
76
|
+
const outcome = await requestGeneration(environment, token, 'vehicle', {
|
|
77
|
+
gameId: context.metadata.gameId,
|
|
78
|
+
...(prompt !== undefined ? { prompt } : {}),
|
|
79
|
+
...(presetName !== undefined ? { presetName } : {}),
|
|
80
|
+
...(name !== undefined ? { name } : {}),
|
|
81
|
+
}, { fetch: options.fetchImpl ?? globalThis.fetch, onProgress: log });
|
|
82
|
+
if (!outcome.success)
|
|
83
|
+
throw new CliError(`${outcome.message} world.json is unchanged.`);
|
|
84
|
+
if (!outcome.glbUrl || !outcome.vehicle) {
|
|
85
|
+
throw new CliError('The generator reported success but returned no vehicle mesh. world.json is unchanged.');
|
|
86
|
+
}
|
|
87
|
+
const glbUrl = outcome.glbUrl;
|
|
88
|
+
const { vehicle } = outcome;
|
|
89
|
+
log(`Vehicle built: ${glbUrl}`);
|
|
90
|
+
for (const note of vehicle.notes)
|
|
91
|
+
log(` note: ${note}`);
|
|
92
|
+
const result = await voxelizeAndInstallVehicle({
|
|
93
|
+
context,
|
|
94
|
+
environment,
|
|
95
|
+
token,
|
|
96
|
+
name: vehicle.name,
|
|
97
|
+
glbUrl,
|
|
98
|
+
minVoxelSize: vehicle.minVoxelSize,
|
|
99
|
+
maxVoxelSize: vehicle.maxVoxelSize,
|
|
100
|
+
description: prompt ?? presetName ?? vehicle.name,
|
|
101
|
+
log,
|
|
102
|
+
});
|
|
103
|
+
return { ...result, glbUrl, notes: [...vehicle.notes, ...result.notes] };
|
|
104
|
+
}
|
|
105
|
+
/** How a failed voxelize tells the caller to retry without paying for the design again. */
|
|
106
|
+
function retryHint(name, glbUrl, minVoxelSize) {
|
|
107
|
+
return `The vehicle mesh is kept — retry the browser step with:\n`
|
|
108
|
+
+ ` bitmagic generate vehicle --glb-url ${glbUrl} --voxel-size ${minVoxelSize} --name "${name}"`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Steps 2 and 3. Split from the command so the browser work is callable directly on a retry that
|
|
112
|
+
* already has a GLB, and so the command file stays about flags and output.
|
|
113
|
+
*/
|
|
114
|
+
export async function voxelizeAndInstallVehicle(options) {
|
|
115
|
+
const { context, environment, token, name, glbUrl, minVoxelSize, maxVoxelSize, description, log } = options;
|
|
116
|
+
const worldPath = projectWorldJsonPath(context.root);
|
|
117
|
+
const port = await reserveCorsAllowedPort();
|
|
118
|
+
if (port === null) {
|
|
119
|
+
throw new CliError('No free port between 3000 and 3199, which is the only range the asset CDN serves. '
|
|
120
|
+
+ `Stop something in that range and retry.\n${retryHint(name, glbUrl, minVoxelSize)}`);
|
|
121
|
+
}
|
|
122
|
+
const vite = projectBin(context.root, 'vite');
|
|
123
|
+
let server;
|
|
124
|
+
let host;
|
|
125
|
+
let uploadProxy;
|
|
126
|
+
try {
|
|
127
|
+
server = spawn(vite, ['--port', String(port), '--strictPort'], {
|
|
128
|
+
cwd: context.root,
|
|
129
|
+
stdio: ['ignore', 'ignore', 'pipe'],
|
|
130
|
+
});
|
|
131
|
+
let viteStderr = '';
|
|
132
|
+
server.stderr?.on('data', (chunk) => { viteStderr += String(chunk); });
|
|
133
|
+
try {
|
|
134
|
+
await waitForServer(port, 30_000);
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
throw new CliError(`The project's dev server did not come up on port ${port}, so the vehicle cannot be voxelized.`
|
|
138
|
+
+ (viteStderr.trim() ? `\n${viteStderr.trim()}` : '')
|
|
139
|
+
+ `\n${retryHint(name, glbUrl, minVoxelSize)}`);
|
|
140
|
+
}
|
|
141
|
+
// The engine uploads the baked .vxl itself, to a presigned URL it asks for at a hardcoded
|
|
142
|
+
// path with no credentials. The proxy translates that into the authenticated api-server route
|
|
143
|
+
// and keeps the token out of the page — see forge/upload-proxy.ts.
|
|
144
|
+
uploadProxy = await startUploadProxy({
|
|
145
|
+
apiUrl: environment.apiUrl,
|
|
146
|
+
token,
|
|
147
|
+
gameId: context.metadata.gameId,
|
|
148
|
+
log,
|
|
149
|
+
});
|
|
150
|
+
host = new ForgeBrowserHost({
|
|
151
|
+
gamePort: port,
|
|
152
|
+
gameId: context.metadata.gameId,
|
|
153
|
+
gameData: readProjectGameData(context.root, context.metadata),
|
|
154
|
+
agentUrl: uploadProxy.url,
|
|
155
|
+
log,
|
|
156
|
+
});
|
|
157
|
+
await host.launch();
|
|
158
|
+
await host.loadGame();
|
|
159
|
+
log(`Voxelizing "${name}" at ${minVoxelSize}m…`);
|
|
160
|
+
const result = await host.transport.sendAndWait({
|
|
161
|
+
type: 'CREATE_ASSET_FROM_GLB_URL',
|
|
162
|
+
requestId: `vehicle-${port}`,
|
|
163
|
+
name,
|
|
164
|
+
glbUrl,
|
|
165
|
+
// No `assetId`: the engine mints one, and no `fitBox`: fitment comes from the GLB's own
|
|
166
|
+
// bmVehicle extras. See this file's header for why both matter.
|
|
167
|
+
options: {
|
|
168
|
+
minVoxelSize,
|
|
169
|
+
maxVoxelSize,
|
|
170
|
+
fillInterior: FILL_INTERIOR,
|
|
171
|
+
placeholder: false,
|
|
172
|
+
},
|
|
173
|
+
}, 'ASSET_FROM_GLB_URL_RESULT', VOXELIZE_TIMEOUT_MS, { maxRetries: 1 });
|
|
174
|
+
if (!result) {
|
|
175
|
+
throw new CliError(`Voxelizing "${name}" timed out.\n${retryHint(name, glbUrl, minVoxelSize)}`);
|
|
176
|
+
}
|
|
177
|
+
if (result.success === false || !isRecord(result.asset)) {
|
|
178
|
+
const reason = typeof result.error === 'string' ? result.error : 'unknown error';
|
|
179
|
+
throw new CliError(`Voxelizing "${name}" failed: ${reason}.\n${retryHint(name, glbUrl, minVoxelSize)}`);
|
|
180
|
+
}
|
|
181
|
+
const engineAsset = result.asset;
|
|
182
|
+
const assetId = typeof engineAsset.id === 'string' ? engineAsset.id : '';
|
|
183
|
+
if (assetId === '') {
|
|
184
|
+
throw new CliError(`The engine registered "${name}" but returned no asset id, so it cannot be written to `
|
|
185
|
+
+ `world.json.\n${retryHint(name, glbUrl, minVoxelSize)}`);
|
|
186
|
+
}
|
|
187
|
+
const asset = {
|
|
188
|
+
...engineAsset,
|
|
189
|
+
description: typeof engineAsset.description === 'string' && engineAsset.description.trim() !== ''
|
|
190
|
+
? engineAsset.description
|
|
191
|
+
: description,
|
|
192
|
+
};
|
|
193
|
+
const modification = {
|
|
194
|
+
type: 'upsertRoot',
|
|
195
|
+
path: ['assets'],
|
|
196
|
+
predicate: (item) => isRecord(item) && item.id === assetId,
|
|
197
|
+
value: asset,
|
|
198
|
+
};
|
|
199
|
+
applyModificationsToWorld(worldPath, [modification]);
|
|
200
|
+
// No fitment means the asset registered but will not drive. Reported rather than thrown: the
|
|
201
|
+
// asset is real, and the usual cause is a project whose vendored engine predates fitment
|
|
202
|
+
// derivation — which `bitmagic upgrade` fixes without regenerating anything.
|
|
203
|
+
const drivable = isRecord(engineAsset.vehicleFitment);
|
|
204
|
+
const notes = drivable
|
|
205
|
+
? []
|
|
206
|
+
: ['The engine returned no vehicleFitment, so this asset will not drive. '
|
|
207
|
+
+ 'Run `bitmagic upgrade` to update the project\'s vendored engine, then regenerate.'];
|
|
208
|
+
return {
|
|
209
|
+
assetId,
|
|
210
|
+
assetName: name,
|
|
211
|
+
...(typeof asset.url === 'string' ? { assetUrl: asset.url } : {}),
|
|
212
|
+
drivable,
|
|
213
|
+
notes,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
// Ordered: the page first (it may still be mid-upload), then the proxy it was uploading
|
|
218
|
+
// through, then the server underneath both.
|
|
219
|
+
if (host)
|
|
220
|
+
await host.close();
|
|
221
|
+
if (uploadProxy)
|
|
222
|
+
await uploadProxy.close();
|
|
223
|
+
if (server)
|
|
224
|
+
server.kill('SIGTERM');
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=vehicle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vehicle.js","sourceRoot":"","sources":["../../src/generate/vehicle.ts"],"names":[],"mappings":"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"}
|
|
@@ -392,21 +392,25 @@ own output. Read it to find out what the human did — and, for one event, what
|
|
|
392
392
|
{"at":"…","event":"hq.requested","assetId":"asset_…","prompt":"…","command":"bitmagic generate prop …"}
|
|
393
393
|
\`\`\`
|
|
394
394
|
|
|
395
|
-
|
|
396
|
-
|
|
395
|
+
Almost every line is history — world.json already says so, and the line exists to tell you WHO
|
|
396
|
+
changed it and from what. Nothing is expected of you.
|
|
397
397
|
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
398
|
+
\`hq.started\` / \`hq.completed\` mean the human pressed "Generate high-quality version" and the
|
|
399
|
+
editor ran it: an asset's mesh was regenerated and every placed instance upgraded with it. Read
|
|
400
|
+
these rather than being surprised by an asset that changed on its own. Nothing is expected of you
|
|
401
|
+
here either.
|
|
402
|
+
|
|
403
|
+
**\`hq.requested\` is the one line that asks something of you.** It appears only when the editor
|
|
404
|
+
could NOT run the generation — normally because nobody is logged in. It carries the command:
|
|
401
405
|
|
|
402
406
|
\`\`\`
|
|
403
407
|
bitmagic generate prop --asset <assetId> --prompt "<prompt>" --json
|
|
404
408
|
\`\`\`
|
|
405
409
|
|
|
406
|
-
|
|
407
|
-
same asset id, so every placed instance upgrades at once. It **costs sparks
|
|
408
|
-
|
|
409
|
-
|
|
410
|
+
That generates the mesh, voxelizes it to the asset's recorded \`fitBox\`, and upserts it under the
|
|
411
|
+
same asset id, so every placed instance upgrades at once. It **costs sparks**: run it because the
|
|
412
|
+
human asked, not on your own initiative, and never twice for the same request. If it fails after
|
|
413
|
+
the mesh was generated, the error and the JSON result carry the mesh URL — retry with
|
|
410
414
|
\`--glb-url <url>\` to skip the paid step.
|
|
411
415
|
|
|
412
416
|
The file is append-only and never rewritten, so you can re-read it from where you left off.
|
|
@@ -484,6 +488,7 @@ bitmagic generate sound --prompt "heavy wooden door slamming" [--duration 3]
|
|
|
484
488
|
bitmagic generate image --name hero-portrait --prompt "..." [--width 512] [--height 512]
|
|
485
489
|
bitmagic generate character --name guard --prompt "..." [--apply-to-player]
|
|
486
490
|
bitmagic generate animation --description "a slow ceremonial bow" [--length 4] [--loop]
|
|
491
|
+
bitmagic generate vehicle --prompt "a rusty orange pickup" | --preset VAN
|
|
487
492
|
\`\`\`
|
|
488
493
|
|
|
489
494
|
Run \`bitmagic generate <type> --help\` for the full flags of any one.
|
|
@@ -543,12 +548,12 @@ one you can move through.
|
|
|
543
548
|
export function renderGenerateSkill() {
|
|
544
549
|
return `---
|
|
545
550
|
name: generating-assets
|
|
546
|
-
description: Use when this Bitmagic game needs a new skybox, sound effect, image, character or
|
|
551
|
+
description: Use when this Bitmagic game needs a new skybox, sound effect, image, character, animation or drivable vehicle — anything that would otherwise require the web editor.
|
|
547
552
|
---
|
|
548
553
|
|
|
549
554
|
# Generating game assets
|
|
550
555
|
|
|
551
|
-
The \`bitmagic\` CLI generates content directly into this project.
|
|
556
|
+
The \`bitmagic\` CLI generates content directly into this project. Six types work today:
|
|
552
557
|
|
|
553
558
|
| Command | Makes | Lands in |
|
|
554
559
|
|---|---|---|
|
|
@@ -557,9 +562,22 @@ The \`bitmagic\` CLI generates content directly into this project. Five types wo
|
|
|
557
562
|
| \`bitmagic generate image --name <id> --prompt "..."\` | a 2D image | \`assets[]\` |
|
|
558
563
|
| \`bitmagic generate character --name <id> --prompt "..."\` | a rigged character | \`assets[]\` |
|
|
559
564
|
| \`bitmagic generate animation --description "..."\` | an animation clip | \`assets[]\` |
|
|
565
|
+
| \`bitmagic generate vehicle --prompt "..."\` | a drivable vehicle | \`assets[]\` |
|
|
560
566
|
|
|
561
567
|
\`--help\` on any subcommand lists its full flags.
|
|
562
568
|
|
|
569
|
+
\`vehicle\` is the one that needs more than a prompt to be useful. It creates a NEW asset (it does
|
|
570
|
+
not upgrade an existing one), it needs Chrome and a free port between 3000 and 3199 because only
|
|
571
|
+
the engine can voxelize, and \`--preset VAN\` builds a standard vehicle without calling the designer
|
|
572
|
+
at all — free, and the right choice when the request does not need a bespoke look. Once it lands,
|
|
573
|
+
spawn it by name:
|
|
574
|
+
|
|
575
|
+
\`\`\`js
|
|
576
|
+
engine.getVehicleSpawner().spawnAndEnterFromAsset({ x: 0, z: 0 }, '<assetName>', playerController);
|
|
577
|
+
\`\`\`
|
|
578
|
+
|
|
579
|
+
Headlights, taillights and beacons are built and lit automatically — never ask for them.
|
|
580
|
+
|
|
563
581
|
Cover art is the one generation that is **not** a \`generate\` subcommand:
|
|
564
582
|
|
|
565
583
|
| Command | Makes | Lands in |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"project-files.js","sourceRoot":"","sources":["../../src/scaffold/project-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAEjF;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,YAAY,GAA2B;IAClD,2BAA2B,EAAE,SAAS;IACtC,2BAA2B,EAAE,SAAS;IACtC,kBAAkB,EAAE,QAAQ;IAC5B,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,kCAAkC,EAAE,QAAQ;IAC5C,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,UAAU;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,aAAa,EAAE,UAAU;IACzB,cAAc,EAAE,UAAU;IAC1B,8FAA8F;IAC9F,cAAc,EAAE,QAAQ;IACxB,4FAA4F;IAC5F,mFAAmF;IACnF,eAAe,EAAE,SAAS;IAC1B,UAAU,EAAE,QAAQ;IACpB,IAAI,EAAE,QAAQ;IACd,wBAAwB,EAAE,QAAQ;CACnC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC;;;;;;;;;GASG;AACH,MAAM,UAAU,GAAG;IACjB,uBAAuB;IACvB,oCAAoC,aAAa,WAAW;IAC5D,kDAAkD,aAAa,2CAA2C;IAC1G,8CAA8C,aAAa,uCAAuC;IAClG,gDAAgD,aAAa,wCAAwC;CACtG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAEX,oGAAoG;AACpG,MAAM,WAAW,GAA2B;IAC1C,2FAA2F;IAC3F,4FAA4F;IAC5F,4FAA4F;IAC5F,KAAK,EAAE,UAAU;IACjB,cAAc,EAAE,wBAAwB,aAAa,SAAS;IAC9D,WAAW,EAAE,wBAAwB,aAAa,MAAM;IACxD,2FAA2F;IAC3F,6FAA6F;IAC7F,+FAA+F;IAC/F,4FAA4F;IAC5F,6FAA6F;IAC7F,6FAA6F;IAC7F,eAAe,EAAE,yBAAyB,aAAa,UAAU;IACjE,qBAAqB,EAAE,yBAAyB,aAAa,gBAAgB;IAC7E,QAAQ,EAAE,wBAAwB,aAAa,GAAG;IAClD,2BAA2B,EAAE,iDAAiD;IAC9E,2BAA2B,EAAE,iDAAiD;IAC9E,OAAO,EAAE,+BAA+B;IACxC,kCAAkC,EAAE,uDAAuD;IAC3F,kBAAkB,EAAE,uCAAuC;IAC3D,MAAM,EAAE,6BAA6B;CACtC,CAAC;AAEF,sFAAsF;AACtF,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,UAAU,CAAC;QAChB,IAAI;QACJ,OAAO,EAAE,OAAO;QAChB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE;YACP,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,cAAc;YACrB,GAAG,EAAE,MAAM;SACZ;QACD,YAAY,EAAE,YAAY;QAC1B,eAAe,EAAE,gBAAgB;KAClC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,UAAU,CAAC;QAChB,eAAe,EAAE;YACf,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,QAAQ;YAChB,GAAG,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;YACtB,OAAO,EAAE,GAAG;YACZ,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,aAAa,EAAE;YACtB,gBAAgB,EAAE,SAAS;YAC3B,MAAM,EAAE,IAAI;YACZ,wBAAwB,EAAE,IAAI;YAC9B,0BAA0B,EAAE,KAAK;YACjC,oBAAoB,EAAE,IAAI;YAC1B,eAAe,EAAE,IAAI;YACrB,eAAe,EAAE,OAAO;YACxB,YAAY,EAAE,IAAI;YAClB,eAAe,EAAE,IAAI;YACrB,4BAA4B,EAAE,IAAI;YAClC,gCAAgC,EAAE,IAAI;YACtC,aAAa,EAAE,IAAI;YACnB,iBAAiB,EAAE,IAAI;YACvB,SAAS,EAAE,IAAI;YACf,wFAAwF;YACxF,yFAAyF;YACzF,wFAAwF;YACxF,0FAA0F;YAC1F,sFAAsF;YACtF,yFAAyF;YACzF,gFAAgF;YAChF,KAAK,EAAE,CAAC,eAAe,CAAC;YACxB,SAAS,EAAE,CAAC,cAAc,EAAE,qBAAqB,EAAE,wCAAwC,CAAC;SAC7F;QACD,OAAO,EAAE,CAAC,UAAU,EAAE,aAAa,CAAC;QACpC,uFAAuF;QACvF,uFAAuF;QACvF,oFAAoF;QACpF,wFAAwF;QACxF,wDAAwD;QACxD,OAAO,EAAE;YACP,cAAc;YACd,MAAM;YACN,qBAAqB;YACrB,0BAA0B;YAC1B,kBAAkB;YAClB,uBAAuB;YACvB,oBAAoB;SACrB;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,YAAY,GAAG,gBAAgB,EAAE,CAAC;IACxC,MAAM,OAAO,GAAG,EAAE,GAAG,WAAW,EAAE,GAAG,YAAY,EAAE,CAAC;IACpD,6FAA6F;IAC7F,yFAAyF;IACzF,MAAM,gBAAgB,GAAG,GAAG,YAAY,CAAC,SAAS,CAAC,iBAAiB,CAAC;IACrE,0FAA0F;IAC1F,0FAA0F;IAC1F,wFAAwF;IACxF,2FAA2F;IAC3F,mDAAmD;IACnD,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BP,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;;;iCAG5B,gBAAgB;;;CAGhD,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,SAAS,kBAAkB;IACzB,OAAO,MAAM,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,UAAU,GAAG,OAAO,MAAM,GAAG,CAAC;SACrD,IAAI,CAAC,KAAK,CAAC,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,OAAO;;;;;;;;;;;EAWP,OAAO;;;;;;;CAOR,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,uBAAuB;IACrC,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC;IACrC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BP,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjF,CAAC;AAiBD,MAAM,UAAU,kBAAkB,CAAC,QAAyB;IAC1D,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6PR,CAAC;AACF,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuER,CAAC;AACF,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAa;IAC9C,MAAM,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;IAC3B,OAAO;;EAEP,KAAK;QACH,CAAC,CAAC,8GAA8G;QAChH,CAAC,CAAC,0KAA0K;;;;EAI9K,KAAK,IAAI,iEAAiE;;;;;;;;;;;;;;CAc3E,CAAC;AACF,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO;;;;;;;;;;;;;;CAcR,CAAC;AACF,CAAC"}
|