@helix3/helix-cli 0.1.18-helix3.308 → 0.1.18-helix3.309
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/dist/init.js +136 -29
- package/dist/init.js.map +1 -1
- package/dist/screenshot/captureScreenshots.d.ts +4 -0
- package/dist/screenshot/captureScreenshots.js +27 -0
- package/dist/screenshot/captureScreenshots.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
package/dist/init.js
CHANGED
|
@@ -387,6 +387,7 @@ function indexHtml(title) {
|
|
|
387
387
|
background: #14161a; color: #cdd6e0; font: 13px/1.5 ui-monospace, monospace;
|
|
388
388
|
opacity: 1; transition: opacity 0.4s ease;
|
|
389
389
|
}
|
|
390
|
+
html[data-helix-hosted-loading] #loading { display: none; }
|
|
390
391
|
#loading.done { opacity: 0; pointer-events: none; }
|
|
391
392
|
#loading .card { width: min(360px, 76vw); text-align: center; }
|
|
392
393
|
#loading .eyebrow { font-size: 11px; letter-spacing: 0.18em; text-transform: uppercase; color: #6cc7ff; opacity: 0.75; }
|
|
@@ -402,6 +403,12 @@ function indexHtml(title) {
|
|
|
402
403
|
</style>
|
|
403
404
|
</head>
|
|
404
405
|
<body>
|
|
406
|
+
<script>
|
|
407
|
+
// The host owns the overlay only when it explicitly asks and this is an iframe.
|
|
408
|
+
if (window.parent !== window && new URLSearchParams(location.search).get('helixHostedLoading') === '1') {
|
|
409
|
+
document.documentElement.setAttribute('data-helix-hosted-loading', '');
|
|
410
|
+
}
|
|
411
|
+
</script>
|
|
405
412
|
<div id="loading">
|
|
406
413
|
<div class="card">
|
|
407
414
|
<div class="eyebrow">HELIX Instant</div>
|
|
@@ -417,8 +424,8 @@ function indexHtml(title) {
|
|
|
417
424
|
</html>
|
|
418
425
|
`;
|
|
419
426
|
}
|
|
420
|
-
const LOADING_TS = `//
|
|
421
|
-
//
|
|
427
|
+
const LOADING_TS = `// Standalone owns the HTML overlay; the hosted shell owns it with ?helixHostedLoading=1.
|
|
428
|
+
// Readiness means the first rendered frame, not the SDK handshake or an asset manager batch.
|
|
422
429
|
import * as THREE from 'three';
|
|
423
430
|
|
|
424
431
|
export type LoadingScreen = {
|
|
@@ -432,47 +439,129 @@ export function createLoadingScreen(): LoadingScreen {
|
|
|
432
439
|
const root = document.getElementById('loading');
|
|
433
440
|
const bar = document.getElementById('bar');
|
|
434
441
|
const text = document.getElementById('loading-text');
|
|
442
|
+
const hosted = window.parent !== window && new URLSearchParams(location.search).get('helixHostedLoading') === '1';
|
|
443
|
+
let parentOrigin = '*';
|
|
444
|
+
try {
|
|
445
|
+
const origin = new URL(document.referrer).origin;
|
|
446
|
+
if (origin !== 'null') parentOrigin = origin;
|
|
447
|
+
} catch { /* An opaque or absent referrer has no target origin; the shell validates our frame. */ }
|
|
435
448
|
let extraTotal = 0;
|
|
436
449
|
let extraDone = 0;
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
const
|
|
442
|
-
if (
|
|
443
|
-
|
|
444
|
-
bar.style.width = \`\${Math.min(100, Math.round((at / all) * 100))}%\`;
|
|
450
|
+
let assetsTotal = 0;
|
|
451
|
+
let assetsDone = 0;
|
|
452
|
+
let fraction = 0;
|
|
453
|
+
const progress = () => {
|
|
454
|
+
const total = assetsTotal + extraTotal;
|
|
455
|
+
if (total > 0) fraction = Math.max(fraction, Math.min(1, (assetsDone + extraDone) / total));
|
|
456
|
+
return { loaded: fraction * total, total };
|
|
445
457
|
};
|
|
458
|
+
let state: 'loading' | 'ready' | 'error' = 'loading';
|
|
459
|
+
let label = 'Starting…';
|
|
460
|
+
const manager = THREE.DefaultLoadingManager;
|
|
461
|
+
const previousProgress = manager.onProgress;
|
|
446
462
|
|
|
447
|
-
|
|
448
|
-
if (
|
|
449
|
-
|
|
463
|
+
const report = (error?: string) => {
|
|
464
|
+
if (!hosted) return;
|
|
465
|
+
const { total } = progress();
|
|
466
|
+
window.parent.postMessage({
|
|
467
|
+
type: 'helix:loading', state, label: label.slice(0, 160),
|
|
468
|
+
...(total > 0 ? { loaded: fraction, total: 1 } : {}),
|
|
469
|
+
...(error !== undefined ? { error: error.slice(0, 2000) } : {}),
|
|
470
|
+
}, parentOrigin);
|
|
471
|
+
};
|
|
472
|
+
const render = () => {
|
|
473
|
+
if (state !== 'loading') return;
|
|
474
|
+
const { total } = progress();
|
|
475
|
+
if (text) text.textContent = label;
|
|
476
|
+
if (root && bar && total > 0) {
|
|
477
|
+
root.classList.add('determinate');
|
|
478
|
+
bar.style.width = \`\${Math.min(100, Math.round(fraction * 100))}%\`;
|
|
479
|
+
}
|
|
480
|
+
report();
|
|
450
481
|
};
|
|
482
|
+
const fail = (message: string) => {
|
|
483
|
+
if (state !== 'loading') return;
|
|
484
|
+
const details = message || 'World startup failed';
|
|
485
|
+
state = 'error';
|
|
486
|
+
label = details;
|
|
487
|
+
root?.classList.add('error');
|
|
488
|
+
if (text) text.textContent = details;
|
|
489
|
+
report(details);
|
|
490
|
+
};
|
|
491
|
+
const onProgress: NonNullable<typeof manager.onProgress> = (url, loaded, total) => {
|
|
492
|
+
assetsDone = loaded;
|
|
493
|
+
assetsTotal = total;
|
|
494
|
+
label = 'Loading assets…';
|
|
495
|
+
render();
|
|
496
|
+
previousProgress?.call(manager, url, loaded, total);
|
|
497
|
+
};
|
|
498
|
+
manager.onProgress = onProgress;
|
|
499
|
+
// Claim the loading lifecycle synchronously, before Helix.init() sends its handshake.
|
|
500
|
+
report();
|
|
451
501
|
|
|
452
502
|
return {
|
|
453
|
-
task(
|
|
503
|
+
task(taskLabel) {
|
|
504
|
+
if (state !== 'loading') return () => {};
|
|
454
505
|
extraTotal += 1;
|
|
455
|
-
if (
|
|
506
|
+
if (taskLabel) label = taskLabel;
|
|
507
|
+
render();
|
|
456
508
|
let settled = false;
|
|
457
509
|
return () => {
|
|
458
|
-
if (settled) return;
|
|
510
|
+
if (settled || state !== 'loading') return;
|
|
459
511
|
settled = true;
|
|
460
512
|
extraDone += 1;
|
|
461
|
-
render(
|
|
513
|
+
render();
|
|
462
514
|
};
|
|
463
515
|
},
|
|
464
516
|
done() {
|
|
465
|
-
if (
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
517
|
+
if (state !== 'loading') return;
|
|
518
|
+
state = 'ready';
|
|
519
|
+
label = 'Ready';
|
|
520
|
+
if (text) text.textContent = label;
|
|
521
|
+
if (manager.onProgress === onProgress) manager.onProgress = previousProgress;
|
|
522
|
+
if (hosted) root?.remove();
|
|
523
|
+
else {
|
|
524
|
+
root?.classList.remove('working');
|
|
525
|
+
root?.classList.add('done');
|
|
526
|
+
setTimeout(() => root?.remove(), 500);
|
|
527
|
+
}
|
|
528
|
+
report();
|
|
473
529
|
},
|
|
530
|
+
error: fail,
|
|
474
531
|
};
|
|
475
532
|
}
|
|
533
|
+
|
|
534
|
+
// New facades expose honest initial equipped presentation readiness; older pinned facades
|
|
535
|
+
// have already assembled their compatible body by create(). Never wait on swap events.
|
|
536
|
+
export async function waitForInitialAvatar(character: unknown, loading: LoadingScreen, deadlineMs = 45_000): Promise<void> {
|
|
537
|
+
const facade = character as { initialAvatarReady?: PromiseLike<{ status: string }> };
|
|
538
|
+
if (!facade.initialAvatarReady || typeof facade.initialAvatarReady.then !== 'function') {
|
|
539
|
+
const finish = loading.task('Using compatible avatar…');
|
|
540
|
+
console.info('[HELIX] This character module uses its assembled compatible avatar; equipped-avatar readiness is unavailable.');
|
|
541
|
+
finish();
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
const finish = loading.task('Loading your avatar…');
|
|
545
|
+
let timeout: ReturnType<typeof setTimeout> | undefined;
|
|
546
|
+
try {
|
|
547
|
+
const result = await Promise.race([
|
|
548
|
+
facade.initialAvatarReady,
|
|
549
|
+
new Promise<never>((_, reject) => {
|
|
550
|
+
timeout = setTimeout(() => reject(new Error('Your avatar did not finish loading. Try again.')), deadlineMs);
|
|
551
|
+
}),
|
|
552
|
+
]);
|
|
553
|
+
if (!result || typeof result !== 'object') throw new Error('Your avatar reported an invalid readiness state. Try again.');
|
|
554
|
+
if (result.status === 'failed' || result.status === 'disposed') throw new Error('Your avatar could not be prepared. Try again.');
|
|
555
|
+
if (result.status !== 'ready' && result.status !== 'fallback') throw new Error('Your avatar reported an invalid readiness state. Try again.');
|
|
556
|
+
if (result.status === 'fallback') {
|
|
557
|
+
loading.task('Using compatible avatar…')();
|
|
558
|
+
console.info('[HELIX] The character module recovered a usable fallback avatar.');
|
|
559
|
+
}
|
|
560
|
+
finish();
|
|
561
|
+
} finally {
|
|
562
|
+
if (timeout !== undefined) clearTimeout(timeout);
|
|
563
|
+
}
|
|
564
|
+
}
|
|
476
565
|
`;
|
|
477
566
|
// The one line this scaffold is most careful about:
|
|
478
567
|
//
|
|
@@ -496,7 +585,7 @@ import {
|
|
|
496
585
|
import { world } from '@helix/engine-core/inspect';
|
|
497
586
|
import { screenshots } from '@helix/engine-core/screenshot';
|
|
498
587
|
import { SYSTEM_ASSET_BASE, TRANSCODER_PATH } from './helix.runtime';
|
|
499
|
-
import { createLoadingScreen } from './loading';
|
|
588
|
+
import { createLoadingScreen, waitForInitialAvatar } from './loading';
|
|
500
589
|
|
|
501
590
|
// ${title} — a HELIX Instant ${multiplayer ? 'multiplayer' : 'character'} world.
|
|
502
591
|
//
|
|
@@ -590,6 +679,7 @@ addEventListener('resize', () => {
|
|
|
590
679
|
});
|
|
591
680
|
|
|
592
681
|
async function main(): Promise<void> {
|
|
682
|
+
const finishStartup = loading.task('Preparing world…');
|
|
593
683
|
// RapierBody.create is a static async factory — the constructor is private.
|
|
594
684
|
const body = await RapierBody.create({ position: SPAWN });
|
|
595
685
|
body.addStaticCuboid({ x: 24, y: 0.5, z: 24 }, { x: 0, y: -0.5, z: 0 }); // floor, top at y=0
|
|
@@ -638,6 +728,13 @@ async function main(): Promise<void> {
|
|
|
638
728
|
},
|
|
639
729
|
});
|
|
640
730
|
|
|
731
|
+
// Keep rendering while the initial equipped avatar settles, and reveal only a frame
|
|
732
|
+
// rendered after readiness. The public Promise includes native fallback recovery.
|
|
733
|
+
let avatarBootReady = false;
|
|
734
|
+
void waitForInitialAvatar(character, loading).then(() => { avatarBootReady = true; }).catch((error: unknown) => {
|
|
735
|
+
loading.error(error instanceof Error ? error.message : String(error));
|
|
736
|
+
});
|
|
737
|
+
|
|
641
738
|
// CharacterMultiplayer registers the platform actions (including \`emote\`) on the injected
|
|
642
739
|
// InputService. Format binding-aware onboarding only after those actions exist.
|
|
643
740
|
const desktopHint = (captured: boolean): string => {
|
|
@@ -683,8 +780,9 @@ async function main(): Promise<void> {
|
|
|
683
780
|
character.update(dt);
|
|
684
781
|
if (body.position.y < -10) character.local.respawn(); // fell off the world
|
|
685
782
|
renderer.render(scene, camera);
|
|
686
|
-
if (firstFrame) {
|
|
783
|
+
if (firstFrame && avatarBootReady) {
|
|
687
784
|
firstFrame = false;
|
|
785
|
+
finishStartup();
|
|
688
786
|
loading.done();
|
|
689
787
|
}
|
|
690
788
|
hud.textContent = mobileControls.active
|
|
@@ -742,7 +840,7 @@ import { attachSceneVisuals, sceneVisualsConfig } from '@helix/scene/visual';
|
|
|
742
840
|
import { world } from '@helix/engine-core/inspect';
|
|
743
841
|
import { screenshots } from '@helix/engine-core/screenshot';
|
|
744
842
|
import { SYSTEM_ASSET_BASE, TRANSCODER_PATH } from './helix.runtime';
|
|
745
|
-
import { createLoadingScreen } from './loading';
|
|
843
|
+
import { createLoadingScreen, waitForInitialAvatar } from './loading';
|
|
746
844
|
|
|
747
845
|
// ${title} — a HELIX Instant SCENE world. Its ENVIRONMENT is a published HELIX Scene v2 document
|
|
748
846
|
// streamed by @helix/scene and lit by @helix/visual's runtime: geometry, materials, authored lights,
|
|
@@ -818,6 +916,7 @@ addEventListener('resize', () => {
|
|
|
818
916
|
});
|
|
819
917
|
|
|
820
918
|
async function main(): Promise<void> {
|
|
919
|
+
const finishStartup = loading.task('Preparing world…');
|
|
821
920
|
// Before the document: the shell's \`helix:init\` is where the platform API base comes from.
|
|
822
921
|
await Helix.init();
|
|
823
922
|
|
|
@@ -893,6 +992,13 @@ async function main(): Promise<void> {
|
|
|
893
992
|
},
|
|
894
993
|
});
|
|
895
994
|
|
|
995
|
+
// Keep rendering while the initial equipped avatar settles, and reveal only a frame
|
|
996
|
+
// rendered after readiness. The public Promise includes native fallback recovery.
|
|
997
|
+
let avatarBootReady = false;
|
|
998
|
+
void waitForInitialAvatar(character, loading).then(() => { avatarBootReady = true; }).catch((error: unknown) => {
|
|
999
|
+
loading.error(error instanceof Error ? error.message : String(error));
|
|
1000
|
+
});
|
|
1001
|
+
|
|
896
1002
|
const desktopHint = (captured: boolean): string => {
|
|
897
1003
|
const cameraHint = captured
|
|
898
1004
|
? 'Move mouse to look · Scroll to zoom'
|
|
@@ -933,8 +1039,9 @@ async function main(): Promise<void> {
|
|
|
933
1039
|
character.update(dt);
|
|
934
1040
|
if (body.position.y < -10) character.local.respawn(); // fell out of the scene
|
|
935
1041
|
visuals?.tick(dt); // the clock, the sun, the cadences — and the frame's own render
|
|
936
|
-
if (firstFrame) {
|
|
1042
|
+
if (firstFrame && avatarBootReady) {
|
|
937
1043
|
firstFrame = false;
|
|
1044
|
+
finishStartup();
|
|
938
1045
|
loading.done();
|
|
939
1046
|
}
|
|
940
1047
|
hud.textContent = mobileControls.active
|
package/dist/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4JA,0BAOC;AAyCD,8CAIC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,4 +26,8 @@ export type CaptureScreenshotsResult = {
|
|
|
26
26
|
declaredShots: string[];
|
|
27
27
|
};
|
|
28
28
|
export declare function composeTimeoutDiagnosis(state: HelperTimeoutState, errors: string[]): string;
|
|
29
|
+
export declare function screenshotLoadingState(): false | {
|
|
30
|
+
status: 'absent' | 'clear' | 'error';
|
|
31
|
+
error?: string;
|
|
32
|
+
};
|
|
29
33
|
export declare function captureScreenshots(opts: CaptureScreenshotsOptions): Promise<CaptureScreenshotsResult>;
|
|
@@ -35,6 +35,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.selectBrowserCandidates = exports.composeLaunchFailure = exports.browserCandidates = void 0;
|
|
37
37
|
exports.composeTimeoutDiagnosis = composeTimeoutDiagnosis;
|
|
38
|
+
exports.screenshotLoadingState = screenshotLoadingState;
|
|
38
39
|
exports.captureScreenshots = captureScreenshots;
|
|
39
40
|
// Headless capture for `helix screenshot`: serves the built bundle, drives the in-page screenshot
|
|
40
41
|
// helper (window.__helixScreenshots) via Playwright, and writes the resulting PNGs to disk. The
|
|
@@ -63,6 +64,20 @@ function composeTimeoutDiagnosis(state, errors) {
|
|
|
63
64
|
'failure, not a missing integration. Check that the world runs standalone.',
|
|
64
65
|
});
|
|
65
66
|
}
|
|
67
|
+
// Serializable browser predicate: false keeps waiting; a terminal value releases the wait.
|
|
68
|
+
// Recognizes the generated local overlay in both current and older standalone Worlds.
|
|
69
|
+
function screenshotLoadingState() {
|
|
70
|
+
const root = window.document.getElementById('loading');
|
|
71
|
+
if (!root)
|
|
72
|
+
return { status: 'absent' };
|
|
73
|
+
if (root.classList.contains('error')) {
|
|
74
|
+
return { status: 'error', error: String(window.document.getElementById('loading-text')?.textContent || 'World startup failed').slice(0, 300) };
|
|
75
|
+
}
|
|
76
|
+
const style = window.getComputedStyle(root);
|
|
77
|
+
if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0')
|
|
78
|
+
return { status: 'clear' };
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
66
81
|
async function captureScreenshots(opts) {
|
|
67
82
|
const onProgress = opts.onProgress ?? (() => undefined);
|
|
68
83
|
const width = opts.width ?? 1280;
|
|
@@ -119,6 +134,18 @@ async function captureScreenshots(opts) {
|
|
|
119
134
|
onProgress('⚠ BLIND CAPTURE — no screenshot helper detected on this world. This is a raw canvas snapshot after a fixed ' +
|
|
120
135
|
'delay, NOT a declared shot: framing is non-deterministic, do not treat it as a stable thumbnail source.');
|
|
121
136
|
await page.waitForTimeout(opts.blindMs);
|
|
137
|
+
// Blind means no screenshot-helper contract; it must still avoid capturing a boot overlay.
|
|
138
|
+
try {
|
|
139
|
+
const stateHandle = await page.waitForFunction(screenshotLoadingState, undefined, { timeout: timeoutMs });
|
|
140
|
+
const state = await stateHandle.jsonValue();
|
|
141
|
+
if (state && state.status === 'error')
|
|
142
|
+
throw new Error(`World loading failed before blind capture: ${state.error}`);
|
|
143
|
+
}
|
|
144
|
+
catch (error) {
|
|
145
|
+
if (error instanceof Error && error.message.startsWith('World loading failed'))
|
|
146
|
+
throw error;
|
|
147
|
+
throw new Error(`Timed out after ${timeoutMs}ms waiting for the World loading overlay to clear before blind capture. ${pageErrors.join(' | ')}`);
|
|
148
|
+
}
|
|
122
149
|
const buffer = await page.locator('canvas').first().screenshot();
|
|
123
150
|
const outPath = (0, node_path_1.join)(opts.outDir, 'blind.png');
|
|
124
151
|
(0, node_fs_1.writeFileSync)(outPath, buffer);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"captureScreenshots.js","sourceRoot":"","sources":["../../src/screenshot/captureScreenshots.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,0DAUC;AAED,
|
|
1
|
+
{"version":3,"file":"captureScreenshots.js","sourceRoot":"","sources":["../../src/screenshot/captureScreenshots.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,0DAUC;AAID,wDASC;AAED,gDAuHC;AAtMD,kGAAkG;AAClG,gGAAgG;AAChG,4FAA4F;AAC5F,yCAAyC;AACzC,qCAAmD;AACnD,yCAAiC;AAEjC,8CAM2B;AAC3B,8CAAqG;AAK5F,kGALA,0BAAiB,OAKA;AAAE,qGALA,6BAAoB,OAKA;AAAE,wGALA,gCAAuB,OAKA;AAJzE,+CAAkD;AAOlD,MAAM,aAAa,GAAG,IAAI,CAAC;AAC3B,MAAM,cAAc,GAAG,IAAI,CAAC;AAC5B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,yBAAyB,GAAG,GAAG,CAAC;AA2BtC,+FAA+F;AAC/F,6EAA6E;AAC7E,SAAgB,uBAAuB,CAAC,KAAyB,EAAE,MAAgB;IACjF,OAAO,IAAA,oCAA2B,EAAC,KAAK,EAAE,MAAM,EAAE;QAChD,MAAM,EACJ,oGAAoG;YACpG,wGAAwG;YACxG,gGAAgG;QAClG,OAAO,EACL,oGAAoG;YACpG,2EAA2E;KAC9E,CAAC,CAAC;AACL,CAAC;AAED,2FAA2F;AAC3F,sFAAsF;AACtF,SAAgB,sBAAsB;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;IACvC,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,IAAI,sBAAsB,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACjJ,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,KAAK,GAAG;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IACnH,OAAO,KAAK,CAAC;AACf,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAA+B;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,KAAK,CAAC;IAC1C,IAAA,mBAAS,EAAC,IAAI,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,UAAU,GAAG,wDAAa,YAAY,GAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,MAAM,IAAA,+BAAiB,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvD,IAAI,OAA4B,CAAC;IACjC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,aAAa,GAAa,EAAE,CAAC;IAEjC,IAAI,CAAC;QACH,MAAM,QAAQ,GAAoB,EAAE,CAAC;QACrC,KAAK,MAAM,SAAS,IAAI,IAAA,gCAAuB,EAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9D,IAAI,CAAC;gBACH,OAAO,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;gBACpE,UAAU,CAAC,SAAS,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC;gBACvC,MAAM;YACR,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,GAAG,EAAE,KAAK,EAAE,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC3H,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,IAAA,6BAAoB,EAAC,QAAQ,CAAC,CAAC,CAAC;QAE9D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,iBAAiB,EAAE,CAAC,EAAE,CAAC,CAAC;QAE1F,iGAAiG;QACjG,2FAA2F;QAC3F,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAQ,EAAE;YAC7C,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,yBAAyB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,yBAAyB,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAClH,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3B,IAAI,UAAU,CAAC,MAAM,GAAG,oBAAoB;gBAAE,UAAU,CAAC,KAAK,EAAE,CAAC;QACnE,CAAC,CAAC;QACF,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,EAAE;YACzB,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,OAAO;gBAAE,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QAEH,MAAM,IAAI,CAAC,IAAI,CAAC,oBAAoB,MAAM,CAAC,IAAI,qBAAqB,CAAC,CAAC;QAEtE,MAAM,YAAY,GAAG,CAAC,MAAqB,EAAE,OAAe,EAAQ,EAAE;YACpE,MAAM,KAAK,GAAG,2BAA2B,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/D,IAAI,CAAC,KAAK;gBAAE,MAAM,IAAI,KAAK,CAAC,gDAAgD,OAAO,EAAE,CAAC,CAAC;YACvF,IAAA,uBAAa,EAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,UAAU,CAAC,SAAS,OAAO,KAAK,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YAClE,IAAI,MAAM,CAAC,QAAQ,KAAK,cAAc,EAAE,CAAC;gBACvC,UAAU,CAAC,MAAM,MAAM,CAAC,IAAI,IAAI,OAAO,sEAAsE,CAAC,CAAC;YACjH,CAAC;QACH,CAAC,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YAC/B,UAAU,CACR,6GAA6G;gBAC3G,yGAAyG,CAC5G,CAAC;YACF,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACxC,2FAA2F;YAC3F,IAAI,CAAC;gBACH,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,sBAAsB,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;gBAC1G,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC5C,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;YACtH,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,sBAAsB,CAAC;oBAAE,MAAM,KAAK,CAAC;gBAC5F,MAAM,IAAI,KAAK,CAAC,mBAAmB,SAAS,2EAA2E,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnJ,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,CAAC;YACjE,MAAM,OAAO,GAAG,IAAA,gBAAI,EAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC/C,IAAA,uBAAa,EAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/B,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACtB,UAAU,CAAC,SAAS,OAAO,EAAE,CAAC,CAAC;YAC/B,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACpC,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,eAAe,CAAU,2CAA2C,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACtH,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAqB,GAAG,EAAE,CAC/D,OAAO,MAAM,CAAC,kBAAkB,KAAK,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CACxE,CAAC;YACF,MAAM,IAAI,KAAK,CACb,mBAAmB,SAAS,oFAAoF;gBAC9G,uBAAuB,CAAC,WAAW,EAAE,UAAU,CAAC,CACnD,CAAC;QACJ,CAAC;QACD,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAW,GAAG,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QAErF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,EAC3D,IAAI,CAAC,IAAI,CACV,CAAC;YACF,YAAY,CAAC,MAAM,EAAE,IAAA,gBAAI,EAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;YACtD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,IAAI,aAAa,CAAC;QAC5C,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,uBAAuB,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC,CAAC;YACtG,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAwB,CAAC,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC;YAC3H,YAAY,CAAC,MAAM,EAAE,IAAA,gBAAI,EAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC;YACvD,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACjB,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,QAAQ,CACvC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,EAC5F,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,cAAc,EAAE,CACxD,CAAC;gBACF,YAAY,CAAC,aAAa,EAAE,IAAA,gBAAI,EAAC,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;IACpC,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,KAAK,EAAE,CAAC;QACvB,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|