@developerz.ai/ts23d 0.1.0 → 0.2.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.
Files changed (162) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/CLAUDE.md +1 -1
  3. package/README.md +10 -5
  4. package/dist/{chunk-a8fxakcj.js → chunk-6b05mnmx.js} +2 -2
  5. package/dist/{chunk-kgvbpqqw.js → chunk-7rtfjh9f.js} +6 -5
  6. package/dist/chunk-7rtfjh9f.js.map +10 -0
  7. package/dist/{chunk-1ypfs7ga.js → chunk-8j4c28jt.js} +790 -276
  8. package/dist/chunk-8j4c28jt.js.map +46 -0
  9. package/dist/{chunk-wtqhq529.js → chunk-d1fv6hrm.js} +6 -6
  10. package/dist/{chunk-wtqhq529.js.map → chunk-d1fv6hrm.js.map} +1 -1
  11. package/dist/{chunk-gcyp9b4d.js → chunk-dbq4qf52.js} +362 -215
  12. package/dist/chunk-dbq4qf52.js.map +25 -0
  13. package/dist/{chunk-xnt2sdhf.js → chunk-drna2rny.js} +2 -2
  14. package/dist/{chunk-ravbb06q.js → chunk-dxvypr7y.js} +2 -2
  15. package/dist/{chunk-11v28977.js → chunk-f6yme003.js} +85 -71
  16. package/dist/{chunk-11v28977.js.map → chunk-f6yme003.js.map} +6 -6
  17. package/dist/{chunk-4ddzsqtc.js → chunk-hg7pf34j.js} +4 -3
  18. package/dist/{chunk-4ddzsqtc.js.map → chunk-hg7pf34j.js.map} +5 -5
  19. package/dist/{chunk-w1zyhj40.js → chunk-jq4e17tj.js} +2 -2
  20. package/dist/{chunk-kvcep7ft.js → chunk-y63c6zcv.js} +967 -218
  21. package/dist/chunk-y63c6zcv.js.map +53 -0
  22. package/dist/cli/args.d.ts +7 -1
  23. package/dist/cli/bin.js +66 -25
  24. package/dist/cli/bin.js.map +6 -5
  25. package/dist/cli/manifest.d.ts +5 -1
  26. package/dist/cli/texture-cache.d.ts +4 -0
  27. package/dist/core/definition.d.ts +7 -0
  28. package/dist/core/errors.d.ts +1 -1
  29. package/dist/core/index.js +1 -1
  30. package/dist/export/credits.d.ts +4 -0
  31. package/dist/export/glb-options.d.ts +48 -0
  32. package/dist/export/glb.d.ts +5 -35
  33. package/dist/export/hierarchy.d.ts +23 -0
  34. package/dist/export/index.d.ts +2 -1
  35. package/dist/export/index.js +21 -7
  36. package/dist/export/index.js.map +1 -1
  37. package/dist/export/lod-coverage.d.ts +12 -0
  38. package/dist/export/metadata.d.ts +2 -0
  39. package/dist/export/version.d.ts +2 -2
  40. package/dist/grammar/index.js +2 -2
  41. package/dist/index.js +63 -17
  42. package/dist/index.js.map +1 -1
  43. package/dist/kinds/head-armour.d.ts +3 -7
  44. package/dist/kinds/head-bust.d.ts +3 -2
  45. package/dist/kinds/head-face.d.ts +3 -1
  46. package/dist/kinds/head-garb.d.ts +4 -0
  47. package/dist/kinds/head-mesh.d.ts +4 -0
  48. package/dist/kinds/head-mouth.d.ts +4 -0
  49. package/dist/kinds/head-params.d.ts +9 -1
  50. package/dist/kinds/head-tone.d.ts +10 -0
  51. package/dist/kinds/head-torso.d.ts +35 -0
  52. package/dist/kinds/index.js +6 -6
  53. package/dist/material/cc0.d.ts +4 -0
  54. package/dist/material/define.d.ts +34 -0
  55. package/dist/material/generator.d.ts +1 -1
  56. package/dist/material/index.d.ts +8 -3
  57. package/dist/material/index.js +39 -7
  58. package/dist/material/index.js.map +1 -1
  59. package/dist/material/library.d.ts +7 -0
  60. package/dist/material/material-def.d.ts +30 -0
  61. package/dist/material/paint/canvas.d.ts +7 -0
  62. package/dist/material/paint/default-sheet.d.ts +3 -1
  63. package/dist/material/paint/fabric.d.ts +4 -0
  64. package/dist/material/paint/image-strip.d.ts +4 -0
  65. package/dist/material/paint/kit.d.ts +5 -0
  66. package/dist/material/paint/metal.d.ts +3 -0
  67. package/dist/material/paint/orm.d.ts +1 -1
  68. package/dist/material/paint/strip.d.ts +1 -1
  69. package/dist/material/paint/types.d.ts +32 -2
  70. package/dist/material/palette.d.ts +2 -0
  71. package/dist/material/slots.d.ts +5 -0
  72. package/dist/material/texture-source.d.ts +34 -0
  73. package/dist/material/trim-sheet.d.ts +20 -4
  74. package/dist/neural/index.js +2 -2
  75. package/dist/passes/index.js +2 -2
  76. package/dist/primitives/index.js +3 -3
  77. package/dist/qa/index.js +2 -2
  78. package/dist/render/beauty.d.ts +1 -1
  79. package/dist/render/index.js +3 -3
  80. package/dist/render/lighting.d.ts +7 -0
  81. package/dist/render/shade.d.ts +1 -1
  82. package/dist/testing/index.js +5 -5
  83. package/docs/README.md +4 -0
  84. package/docs/architecture/gltf-capabilities.md +38 -1
  85. package/docs/architecture/materials.md +151 -0
  86. package/docs/idea/10-sculpting.md +166 -0
  87. package/docs/idea/11-materials-authoring.md +132 -0
  88. package/docs/idea/12-blender-bridge.md +136 -0
  89. package/docs/idea/13-asset-pipeline-research.md +89 -0
  90. package/docs/plans/roadmap.md +12 -0
  91. package/package.json +2 -1
  92. package/recipes/boxcar/README.md +7 -0
  93. package/recipes/boxcar/boxcar.ts +118 -34
  94. package/recipes/goblin_head/README.md +27 -14
  95. package/recipes/goblin_head/goblin_head.ts +11 -9
  96. package/recipes/human_head/README.md +8 -4
  97. package/recipes/human_head/human_head.ts +4 -3
  98. package/recipes/material_swatches/material_swatches.ts +11 -5
  99. package/recipes/orc_head/README.md +32 -20
  100. package/recipes/orc_head/orc_head.ts +9 -7
  101. package/src/cli/args.ts +16 -3
  102. package/src/cli/manifest.ts +6 -0
  103. package/src/cli/run.ts +33 -9
  104. package/src/cli/texture-cache.ts +24 -0
  105. package/src/core/asset.ts +1 -0
  106. package/src/core/definition.ts +7 -0
  107. package/src/core/errors.ts +6 -1
  108. package/src/export/credits.ts +25 -0
  109. package/src/export/glb-options.ts +53 -0
  110. package/src/export/glb.ts +100 -113
  111. package/src/export/hierarchy.ts +122 -0
  112. package/src/export/index.ts +17 -1
  113. package/src/export/lod-coverage.ts +71 -0
  114. package/src/export/metadata.ts +3 -0
  115. package/src/export/version.ts +1 -1
  116. package/src/kinds/head-armour.ts +103 -73
  117. package/src/kinds/head-bust.ts +49 -86
  118. package/src/kinds/head-face.ts +94 -74
  119. package/src/kinds/head-garb.ts +181 -0
  120. package/src/kinds/head-hair.ts +74 -33
  121. package/src/kinds/head-mesh.ts +43 -5
  122. package/src/kinds/head-mouth.ts +111 -0
  123. package/src/kinds/head-params.ts +11 -2
  124. package/src/kinds/head-presets.ts +30 -27
  125. package/src/kinds/head-tone.ts +52 -0
  126. package/src/kinds/head-torso.ts +230 -0
  127. package/src/kinds/head.ts +8 -3
  128. package/src/material/cc0.ts +41 -0
  129. package/src/material/define.ts +130 -0
  130. package/src/material/generator.ts +15 -8
  131. package/src/material/index.ts +34 -3
  132. package/src/material/library.ts +196 -0
  133. package/src/material/material-def.ts +84 -0
  134. package/src/material/paint/canvas.ts +11 -1
  135. package/src/material/paint/compose.ts +1 -1
  136. package/src/material/paint/decode-png.ts +19 -13
  137. package/src/material/paint/default-sheet.ts +40 -28
  138. package/src/material/paint/fabric.ts +63 -0
  139. package/src/material/paint/image-strip.ts +88 -0
  140. package/src/material/paint/kit.ts +37 -0
  141. package/src/material/paint/masks.ts +3 -1
  142. package/src/material/paint/metal.ts +109 -0
  143. package/src/material/paint/orm.ts +14 -1
  144. package/src/material/paint/planks.ts +49 -4
  145. package/src/material/paint/strip.ts +35 -29
  146. package/src/material/paint/types.ts +45 -2
  147. package/src/material/paint/validate.ts +19 -3
  148. package/src/material/palette.ts +3 -0
  149. package/src/material/slots.ts +18 -0
  150. package/src/material/texture-source.ts +86 -0
  151. package/src/material/trim-sheet.ts +79 -13
  152. package/src/render/beauty.ts +2 -2
  153. package/src/render/lighting.ts +26 -0
  154. package/src/render/shade.ts +10 -5
  155. package/dist/chunk-1ypfs7ga.js.map +0 -42
  156. package/dist/chunk-gcyp9b4d.js.map +0 -22
  157. package/dist/chunk-kgvbpqqw.js.map +0 -10
  158. package/dist/chunk-kvcep7ft.js.map +0 -43
  159. /package/dist/{chunk-a8fxakcj.js.map → chunk-6b05mnmx.js.map} +0 -0
  160. /package/dist/{chunk-xnt2sdhf.js.map → chunk-drna2rny.js.map} +0 -0
  161. /package/dist/{chunk-ravbb06q.js.map → chunk-dxvypr7y.js.map} +0 -0
  162. /package/dist/{chunk-w1zyhj40.js.map → chunk-jq4e17tj.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -4,6 +4,17 @@ All notable changes to `@developerz.ai/ts23d`. Format: [Keep a Changelog](https:
4
4
 
5
5
  ## [Unreleased]
6
6
 
7
+ ## [0.2.0] - 2026-11-07
8
+
9
+ ### Added
10
+ - Package published as `@developerz.ai/ts23d` (the npm organisation's scope).
11
+ - Material library v2: 16 new PBR strips on a 2048² trim sheet (oak, pine, weathered and painted wood; rusty, cast, painted and galvanised iron/steel; brass, copper, aluminium, chrome; rubber, canvas, leather, plastic) with their own roughness and metalness. `defineMaterial()` registers project materials; opt-in CC0 photo strips (Poly Haven) via `bun run textures` — sha256-pinned, offline compile, credited in the GLB. The beauty renderer reflects metals. `t3d` paints the sheet at 2048² by default.
12
+ - Orc and goblin busts re-sculpted (anatomy, faces, mouths, gear, collectible plinth, painted tone pass); `head` gains `bust.mass`, `wrinkles`, `'vest'` bust style.
13
+ - Boxcar reads as painted planks, weathered roof walk, cast and rusty iron.
14
+ - Gallery: per-category studio lighting, PBR Neutral tone mapping, contact shadows, GTAO + MSAA on a high-quality tier with a phone fallback.
15
+ - Research docs: sculpting, material authoring, Blender bridge design, pro asset pipeline and CC0 libraries.
16
+ - One GLB with all three LODs: `t3d build` also writes `<out>/<asset>/<asset>.glb` — LOD0 in the scene, LOD1/LOD2 as `MSFT_lod` alternates outside it (listed in `extensionsUsed`, never required, so viewers without the extension show LOD0 only), `MSFT_screencoverage` view-distance hints, one shared material/texture set, motion channels on every LOD. `--lods split|single|both` (default `both`); the manifest records `files.single` and `lodCoverage`. API: `toLodGlb` / `exportLodGlb`; recipes may set `lodCoverage: [lod0→1, lod1→2, cull]`, otherwise it is derived from triangle density and size. tiger_1: one 7.07 MB file vs 7.09 MB for three split files (shared sheet); with `--sheet embed`, 10.7 MB vs 17.9 MB.
17
+
7
18
  ## [0.1.0] - 2026-11-07
8
19
 
9
20
  ### Added
package/CLAUDE.md CHANGED
@@ -35,7 +35,7 @@ project that installed the package.
35
35
  |---|---|
36
36
  | Fresh clone → ready | `bun run setup` |
37
37
  | Gate (≡ CI) | `bun run verify` · one step: `bun run verify --only <step>` · `--json` |
38
- | Compile + QA recipe | `bun run t3d build recipes/t34/t34.ts --out out` |
38
+ | Compile + QA recipe | `bun run t3d build recipes/t34/t34.ts --out out` (lod0/1/2.glb + one `<asset>.glb` with all LODs via MSFT_lod; `--lods split\|single\|both`) |
39
39
  | Contact sheet (READ the PNG) | `bun run t3d shot recipes/t34/t34.ts --out renders` |
40
40
  | Beauty render (3/4, textured, shadowed) | `bun run t3d hero recipes/t34/t34.ts --out renders` |
41
41
  | AI review pack (READ `review/*.png`, follow `review.md`) | `bun run t3d review recipes/t34/t34.ts --out review` |
package/README.md CHANGED
@@ -97,7 +97,7 @@ The agent looks up real dimensions and photos into `recipes/<name>/README.md`, w
97
97
 
98
98
  ### 3. Use the GLB in your engine
99
99
 
100
- `out/<asset>/lod0.glb` (and `lod1`, `lod2`) are plain glTF 2.0, core extensions only. The hooks your engine code can use:
100
+ `out/<asset>/lod0.glb` (and `lod1`, `lod2`) are plain glTF 2.0; `out/<asset>/<asset>.glb` holds all three in one file (LOD0 in the scene, LOD1/2 as `MSFT_lod` alternates with screen-coverage switch hints; viewers without the extension show LOD0 only; `--lods split|single|both`, default both). The hooks your engine code can use:
101
101
 
102
102
  | Hook | In the GLB |
103
103
  |---|---|
@@ -126,7 +126,7 @@ Each ts23d row names how it's verified. The image-to-3D column cites only what v
126
126
  | Property | ts23d | How it's verified | Typical image-to-3D output (per vendor docs) |
127
127
  |---|---|---|---|
128
128
  | Draw calls per asset | Static assets: 1. Vehicles: one per movable part (one shared material; static geometry batched into its pivot) | `toGlb` merges static parts by default (`mergeToPivots`); counts measured by `bun run bench` | One PBR material per generated model (e.g. Meshy: albedo / normal / metal / rough) |
129
- | LODs | 3 from the same source | `t3d build` writes `lod0/1/2`, each under its own triangle budget | One mesh per generation; polycount presets or a low-poly mode (Rodin, Meshy) |
129
+ | LODs | 3 from the same source | `t3d build` writes `lod0/1/2` plus one `MSFT_lod` file holding all three, each under its own triangle budget | One mesh per generation; polycount presets or a low-poly mode (Rodin, Meshy) |
130
130
  | Named, pivoted, animatable parts | Yes | `part-names` gate; `clashes` gate sweeps every moving part | Usually one mesh; part-based output reported for CSM (3rd-party source) |
131
131
  | Deterministic rebuild | Byte-identical | `scripts/recipes.ts` builds every recipe twice and compares hashes, in CI | Not stated |
132
132
  | Real-world dimensions | Gated: ±5% overall, ±2% per measure | `proportions` and `measures` gates | Not stated |
@@ -220,11 +220,16 @@ Row 2: top, 3/4 rear, LOD2 at distance. Layout: [docs/idea/05-agent-loop.md](doc
220
220
  `t3d hero` adds the beauty shot, and `t3d review` packs hero, sheet, close-ups, an LOD strip and a
221
221
  checklist prompt into `out/<asset>/review/` for a second, fresh-eyes vision pass.
222
222
 
223
- ## The quality bar
223
+ ## Materials
224
224
 
225
- ![4-4-0 locomotive: reference photo, procedural model, overlay](https://raw.githubusercontent.com/developerz-ai/ts23d/main/docs/reference/loco-photo-match.png)
225
+ ![The material library: woods, metals, rubber, canvas, leather on one trim sheet](docs/media/materials.png)
226
226
 
227
- **Not output of this library yet.** This is from the in-house predecessor (a JSON recipe compiler for railroads): a 4-4-0 with tender. Top: reference photo. Middle: the procedural model. Bottom: overlay. That GLB is ~16k triangles, 17 named nodes (axles, side and main rods, crossheads, tender axles, track), one `trim_sheet` material with embedded albedo / normal / ORM textures, and a baked `run` animation. ts23d now has its own [`loco_440`](recipes/loco_440/loco_440.ts) (the Jupiter, drivers 1.626 m sourced) and the trim-sheet painter; photo match is next (M2, [roadmap](docs/plans/roadmap.md)).
227
+ One shared 2048² trim sheet holds 24 physically based materials: oak, pine, weathered and painted
228
+ wood; rusty, cast, painted and galvanised iron and steel; brass, copper, aluminium, chrome; rubber,
229
+ canvas, leather, plastic; plus brick, stone, slate, concrete and glass. Each has its own roughness and
230
+ metalness, so chrome mirrors and wood stays matte. Projects add their own with `defineMaterial`, or
231
+ pull a CC0 photo set from Poly Haven with `bun run textures` (hash-pinned, credited in the GLB). See
232
+ [materials.md](docs/architecture/materials.md).
228
233
 
229
234
  ## Quickstart
230
235
 
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  notImplemented2
3
- } from "./chunk-4ddzsqtc.js";
3
+ } from "./chunk-hg7pf34j.js";
4
4
 
5
5
  // src/neural/generator.ts
6
6
  function localGenerator2(_o) {
@@ -16,4 +16,4 @@ function kubeezImages2(_o) {
16
16
  export { localGenerator2, importGlb2, kubeezImages2 };
17
17
 
18
18
  //# debugId=FD2490AA59A2DB1D64756E2164756E21
19
- //# sourceMappingURL=chunk-a8fxakcj.js.map
19
+ //# sourceMappingURL=chunk-6b05mnmx.js.map
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  mergeToPivots2
3
- } from "./chunk-gcyp9b4d.js";
3
+ } from "./chunk-dbq4qf52.js";
4
4
  import {
5
5
  measure2
6
- } from "./chunk-w1zyhj40.js";
6
+ } from "./chunk-jq4e17tj.js";
7
7
 
8
8
  // src/cli/manifest.ts
9
9
  var tris = (a) => a.parts.reduce((s, p) => s + (p.mesh ? p.mesh.indices.length / 3 : 0), 0);
10
- function manifestOf2(asset, lods, files, findings) {
10
+ function manifestOf2(asset, lods, files, findings, lodCoverage) {
11
11
  const top = lods[0];
12
12
  const merged = top ? mergeToPivots2(top) : null;
13
13
  return {
@@ -17,6 +17,7 @@ function manifestOf2(asset, lods, files, findings) {
17
17
  tags: asset.tags ?? [],
18
18
  files,
19
19
  triangles: lods.map(tris),
20
+ ...lodCoverage?.length ? { lodCoverage } : {},
20
21
  drawCalls: lods.map((l) => mergeToPivots2(l, (l.glow ?? []).map((g) => g.parts)).parts.filter((p) => p.mesh).length),
21
22
  pivots: (merged?.parts ?? []).filter((p) => !p.emitter && !p.socket).map((p) => ({
22
23
  name: p.name,
@@ -40,5 +41,5 @@ function manifestOf2(asset, lods, files, findings) {
40
41
 
41
42
  export { manifestOf2 };
42
43
 
43
- //# debugId=E9A05EE7585826EF64756E2164756E21
44
- //# sourceMappingURL=chunk-kgvbpqqw.js.map
44
+ //# debugId=DCAF218A5B7D9F6B64756E2164756E21
45
+ //# sourceMappingURL=chunk-7rtfjh9f.js.map
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/manifest.ts"],
4
+ "sourcesContent": [
5
+ "// manifest.json per asset: what an engine pipeline or an agent needs without opening a GLB —\n// files, triangles per LOD, pivots (the names game code binds to), emitters, surfaces, QA,\n// measures with their measured values, sources.\n\nimport type { Asset, CompiledAsset } from '../core/index.ts';\nimport { mergeToPivots } from '../export/index.ts';\nimport { type Finding, measure } from '../qa/index.ts';\n\nexport interface AssetManifest {\n readonly name: string;\n readonly kind: string;\n readonly description?: string;\n readonly tags: readonly string[];\n readonly files: {\n readonly lods: readonly string[];\n /** All built LODs in one GLB (MSFT_lod), when `--lods single|both`. */\n readonly single?: string;\n readonly hero?: string;\n readonly sheet?: string;\n readonly thumb?: string;\n };\n readonly triangles: readonly number[];\n /** MSFT_screencoverage written into `files.single`: where each LOD hands over (last = cull). */\n readonly lodCoverage?: readonly number[];\n readonly drawCalls: readonly number[];\n readonly pivots: readonly { name: string; parent: string | null; motion?: string }[];\n readonly emitters: readonly { name: string; kind: string; when: string }[];\n readonly sockets: readonly { name: string; kind: string; parent: string | null }[];\n readonly surfaces: readonly string[];\n readonly real?: { length: number; width: number; height: number };\n readonly measures: readonly {\n label: string;\n spec: number;\n measured: number | null;\n source?: string;\n }[];\n readonly sources: readonly string[];\n readonly qa: { readonly pass: boolean; readonly findings: readonly Finding[] };\n}\n\nconst tris = (a: CompiledAsset): number =>\n a.parts.reduce((s, p) => s + (p.mesh ? p.mesh.indices.length / 3 : 0), 0);\n\nexport function manifestOf(\n asset: Asset,\n lods: readonly CompiledAsset[],\n files: AssetManifest['files'],\n findings: readonly Finding[],\n lodCoverage?: readonly number[],\n): AssetManifest {\n const top = lods[0];\n const merged = top ? mergeToPivots(top) : null;\n return {\n name: asset.name,\n kind: asset.kind,\n ...(asset.description ? { description: asset.description } : {}),\n tags: asset.tags ?? [],\n files,\n triangles: lods.map(tris),\n ...(lodCoverage?.length ? { lodCoverage } : {}),\n // One draw per merged mesh, glowing parts in their own emissive layer (as the GLB writes them).\n drawCalls: lods.map(\n (l) =>\n mergeToPivots(\n l,\n (l.glow ?? []).map((g) => g.parts),\n ).parts.filter((p) => p.mesh).length,\n ),\n pivots: (merged?.parts ?? [])\n .filter((p) => !p.emitter && !p.socket)\n .map((p) => ({\n name: p.name,\n parent: p.parent,\n ...(p.motion ? { motion: p.motion.kind } : {}),\n })),\n emitters: (top?.parts ?? []).flatMap((p) =>\n p.emitter ? [{ name: p.name, kind: p.emitter.kind, when: p.emitter.when ?? 'always' }] : [],\n ),\n sockets: (top?.parts ?? []).flatMap((p) =>\n p.socket ? [{ name: p.name, kind: p.socket.kind, parent: p.parent }] : [],\n ),\n surfaces: [...new Set((top?.parts ?? []).map((p) => p.surface ?? 'opaque'))].sort(),\n ...(asset.real\n ? { real: { length: asset.real.length, width: asset.real.width, height: asset.real.height } }\n : {}),\n measures: (asset.real?.measures ?? []).map((m) => ({\n label: m.label,\n spec: m.value,\n measured: top ? measure(top, m) : null,\n ...(m.source ? { source: m.source } : {}),\n })),\n sources: asset.sources ?? [],\n qa: { pass: findings.length === 0, findings },\n };\n}\n"
6
+ ],
7
+ "mappings": ";;;;;;;;AAwCA,IAAM,OAAO,CAAC,MACZ,EAAE,MAAM,OAAO,CAAC,GAAG,MAAM,KAAK,EAAE,OAAO,EAAE,KAAK,QAAQ,SAAS,IAAI,IAAI,CAAC;AAEnE,SAAS,WAAU,CACxB,OACA,MACA,OACA,UACA,aACe;AAAA,EACf,MAAM,MAAM,KAAK;AAAA,EACjB,MAAM,SAAS,MAAM,eAAc,GAAG,IAAI;AAAA,EAC1C,OAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM;AAAA,OACR,MAAM,cAAc,EAAE,aAAa,MAAM,YAAY,IAAI,CAAC;AAAA,IAC9D,MAAM,MAAM,QAAQ,CAAC;AAAA,IACrB;AAAA,IACA,WAAW,KAAK,IAAI,IAAI;AAAA,OACpB,aAAa,SAAS,EAAE,YAAY,IAAI,CAAC;AAAA,IAE7C,WAAW,KAAK,IACd,CAAC,MACC,eACE,IACC,EAAE,QAAQ,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CACnC,EAAE,MAAM,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,MAClC;AAAA,IACA,SAAS,QAAQ,SAAS,CAAC,GACxB,OAAO,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,EAAE,MAAM,EACrC,IAAI,CAAC,OAAO;AAAA,MACX,MAAM,EAAE;AAAA,MACR,QAAQ,EAAE;AAAA,SACN,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,IAC9C,EAAE;AAAA,IACJ,WAAW,KAAK,SAAS,CAAC,GAAG,QAAQ,CAAC,MACpC,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,QAAQ,SAAS,CAAC,IAAI,CAAC,CAC5F;AAAA,IACA,UAAU,KAAK,SAAS,CAAC,GAAG,QAAQ,CAAC,MACnC,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,OAAO,MAAM,QAAQ,EAAE,OAAO,CAAC,IAAI,CAAC,CAC1E;AAAA,IACA,UAAU,CAAC,GAAG,IAAI,KAAK,KAAK,SAAS,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,QAAQ,CAAC,CAAC,EAAE,KAAK;AAAA,OAC9E,MAAM,OACN,EAAE,MAAM,EAAE,QAAQ,MAAM,KAAK,QAAQ,OAAO,MAAM,KAAK,OAAO,QAAQ,MAAM,KAAK,OAAO,EAAE,IAC1F,CAAC;AAAA,IACL,WAAW,MAAM,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC,OAAO;AAAA,MACjD,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,UAAU,MAAM,SAAQ,KAAK,CAAC,IAAI;AAAA,SAC9B,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,IAAI,CAAC;AAAA,IACzC,EAAE;AAAA,IACF,SAAS,MAAM,WAAW,CAAC;AAAA,IAC3B,IAAI,EAAE,MAAM,SAAS,WAAW,GAAG,SAAS;AAAA,EAC9C;AAAA;",
8
+ "debugId": "DCAF218A5B7D9F6B64756E2164756E21",
9
+ "names": []
10
+ }