ldr 0.33.12 → 0.33.13

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.
@@ -1,4 +1,4 @@
1
- // ../../../../../../../tmp/ldr-build-HYKc29/src/spec.ts
1
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/spec.ts
2
2
  var norm = (s) => s.trim().toLowerCase().replace(/\\/g, "/").replace(/\/+/g, "/");
3
3
  var COLOUR_ID_RE = /^[A-Za-z][A-Za-z0-9_]*$/;
4
4
  var namedCodes = new Map;
@@ -802,7 +802,7 @@ function fileStepViews(f) {
802
802
  viewMemo.set(f, out);
803
803
  return out;
804
804
  }
805
- // ../../../../../../../tmp/ldr-build-HYKc29/src/model.ts
805
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/model.ts
806
806
  class ModelLimitError extends Error {
807
807
  limit;
808
808
  code = "ldr-model-limit";
@@ -1243,7 +1243,7 @@ function blendedColourHex(code) {
1243
1243
  const a = LDRAW_EXE_16[code - 256 >> 4], b = LDRAW_EXE_16[code - 256 & 15];
1244
1244
  return "#" + [0, 1, 2].map((k) => (a[k] + b[k] >> 1).toString(16).padStart(2, "0")).join("").toUpperCase();
1245
1245
  }
1246
- // ../../../../../../../tmp/ldr-build-HYKc29/src/instructions.ts
1246
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/instructions.ts
1247
1247
  var MIN_VIS = 0.5;
1248
1248
  var REORIENT = 0.35;
1249
1249
  var deg = Math.PI / 180;
@@ -1611,10 +1611,10 @@ function planStepViews(insts, parts, stepOf, nSteps, o = {}) {
1611
1611
  }
1612
1612
  };
1613
1613
  }
1614
- // ../../../../../../../tmp/ldr-build-HYKc29/src/render.ts
1614
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/render.ts
1615
1615
  import * as THREE from "three";
1616
1616
 
1617
- // ../../../../../../../tmp/ldr-build-HYKc29/src/pack-io.ts
1617
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/pack-io.ts
1618
1618
  import { decompress } from "fzstd";
1619
1619
  async function decompressPack(data) {
1620
1620
  const u = data instanceof Uint8Array ? data : new Uint8Array(data);
@@ -1637,7 +1637,7 @@ function decodePack(buf) {
1637
1637
  return { header, arr, bytes: buf.byteLength, buffer: buf };
1638
1638
  }
1639
1639
 
1640
- // ../../../../../../../tmp/ldr-build-HYKc29/src/cull.ts
1640
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/cull.ts
1641
1641
  var upright = (m, o = 0) => Math.abs(m[o + 7] - 1) < 0.001 && Math.abs(m[o + 4]) < 0.001 && Math.abs(m[o + 10]) < 0.001;
1642
1642
  var prepCache = new WeakMap;
1643
1643
  var lastH = null;
@@ -1679,7 +1679,15 @@ function prepPart(H, part) {
1679
1679
  for (let i = 0;i < bits.length; i++)
1680
1680
  mask[i] = bits.charCodeAt(i) === 49 ? 1 : 0;
1681
1681
  }
1682
- c.set(part, r = { nStuds: n, studM, kind, color, mask, nx, nz });
1682
+ let full = !!mask;
1683
+ if (mask) {
1684
+ for (let i = 0;i < mask.length; i++)
1685
+ if (mask[i] !== 1) {
1686
+ full = false;
1687
+ break;
1688
+ }
1689
+ }
1690
+ c.set(part, r = { nStuds: n, studM, kind, color, mask, nx, nz, full });
1683
1691
  lastH = H;
1684
1692
  lastPart = part;
1685
1693
  lastPrep = r;
@@ -1786,6 +1794,98 @@ class Int3Table {
1786
1794
  }
1787
1795
  }
1788
1796
  }
1797
+
1798
+ class StudTopSet {
1799
+ grp = new Int3Table(64);
1800
+ gBits = [];
1801
+ gX0 = [];
1802
+ gZ0 = [];
1803
+ gNz = [];
1804
+ gNx = [];
1805
+ bits;
1806
+ rest;
1807
+ lk = NaN;
1808
+ lpx = NaN;
1809
+ lpz = NaN;
1810
+ lg = -1;
1811
+ group(y, px, pz) {
1812
+ if (y !== this.lk || px !== this.lpx || pz !== this.lpz) {
1813
+ this.lk = y;
1814
+ this.lpx = px;
1815
+ this.lpz = pz;
1816
+ this.lg = this.grp.get(y, px, pz);
1817
+ }
1818
+ return this.lg;
1819
+ }
1820
+ constructor(X, Y, Z, n) {
1821
+ const cnt = [], x0 = [], x1 = [], z0 = [], z1 = [];
1822
+ for (let i = 0;i < n; i++) {
1823
+ const x = X[i], y = Y[i], z = Z[i], px = (x % 20 + 20) % 20, pz = (z % 20 + 20) % 20;
1824
+ let g = this.group(y, px, pz);
1825
+ if (g < 0) {
1826
+ g = cnt.length;
1827
+ this.grp.put(y, px, pz, g);
1828
+ this.lg = g;
1829
+ cnt.push(0);
1830
+ x0.push(x);
1831
+ x1.push(x);
1832
+ z0.push(z);
1833
+ z1.push(z);
1834
+ }
1835
+ cnt[g]++;
1836
+ if (x < x0[g])
1837
+ x0[g] = x;
1838
+ else if (x > x1[g])
1839
+ x1[g] = x;
1840
+ if (z < z0[g])
1841
+ z0[g] = z;
1842
+ else if (z > z1[g])
1843
+ z1[g] = z;
1844
+ }
1845
+ let total = 0, nRest = 0;
1846
+ for (let g = 0;g < cnt.length; g++) {
1847
+ const nx = (x1[g] - x0[g]) / 20 + 1, nz = (z1[g] - z0[g]) / 20 + 1, b = nx * nz;
1848
+ this.gX0.push(x0[g]);
1849
+ this.gZ0.push(z0[g]);
1850
+ this.gNx.push(nx);
1851
+ this.gNz.push(nz);
1852
+ if (b <= 64 * cnt[g] + 1024 && total + b < 2 ** 31) {
1853
+ this.gBits.push(total);
1854
+ total += b;
1855
+ } else {
1856
+ this.gBits.push(-1);
1857
+ nRest += cnt[g];
1858
+ }
1859
+ }
1860
+ this.bits = new Uint8Array(Math.ceil(total / 8));
1861
+ this.rest = new Int3Table(nRest);
1862
+ for (let i = 0;i < n; i++) {
1863
+ const x = X[i], y = Y[i], z = Z[i];
1864
+ const g = this.group(y, (x % 20 + 20) % 20, (z % 20 + 20) % 20);
1865
+ const o = this.gBits[g];
1866
+ if (o < 0) {
1867
+ this.rest.put(x, y, z, 1);
1868
+ continue;
1869
+ }
1870
+ const k = o + (x - this.gX0[g]) / 20 * this.gNz[g] + (z - this.gZ0[g]) / 20;
1871
+ this.bits[k >>> 3] |= 1 << (k & 7);
1872
+ }
1873
+ }
1874
+ has(x, y, z) {
1875
+ const g = this.group(y, (x % 20 + 20) % 20, (z % 20 + 20) % 20);
1876
+ if (g < 0)
1877
+ return false;
1878
+ const o = this.gBits[g];
1879
+ if (o < 0)
1880
+ return this.rest.get(x, y, z) >= 0;
1881
+ const a = (x - this.gX0[g]) / 20, c = (z - this.gZ0[g]) / 20;
1882
+ if (a < 0 || c < 0 || a >= this.gNx[g] || c >= this.gNz[g])
1883
+ return false;
1884
+ const k = o + a * this.gNz[g] + c;
1885
+ return (this.bits[k >>> 3] & 1 << (k & 7)) !== 0;
1886
+ }
1887
+ }
1888
+ var quarterTurn = (a, c, g, i) => a === 0 && i === 0 && (c === 1 || c === -1) && (g === 1 || g === -1) || c === 0 && g === 0 && (a === 1 || a === -1) && (i === 1 || i === -1);
1789
1889
  var inRange = (x, y, z) => x > -BIG && x < BIG && y > -BIG && y < BIG && z > -BIG && z < BIG;
1790
1890
  var STEP_NEVER = 2147483647;
1791
1891
  function forEachStud(insts, H, fn) {
@@ -1820,6 +1920,7 @@ function cullCore(insts, H, steps) {
1820
1920
  };
1821
1921
  const rx0 = [], rx1 = [], rz0 = [], rz1 = [], rInst = [], rInst2 = [], rPrep = [], rBx = [], rBz = [];
1822
1922
  const rLv = [], rM = [];
1923
+ const rFast = [];
1823
1924
  const cells = new Int3Table(insts.length * 2);
1824
1925
  const nextE = [], rectE = [];
1825
1926
  for (let idx = 0;idx < insts.length; idx++) {
@@ -1886,6 +1987,7 @@ function cullCore(insts, H, steps) {
1886
1987
  rBz.push(b[2]);
1887
1988
  rLv.push(lv2);
1888
1989
  rM.push(m[0], m[1], m[2], m[3], m[6], m[9], m[5], m[8], m[11]);
1990
+ rFast.push(pp.full && b[3] - b[0] <= 20 * pp.nx && b[5] - b[2] <= 20 * pp.nz && m[4] === 0 && m[6] === 0 && m[8] === 0 && m[10] === 0 && quarterTurn(m[3], m[5], m[9], m[11]) ? 1 : 0);
1889
1991
  for (let cx = cx0;cx <= cx1; cx++)
1890
1992
  for (let cz = cz0;cz <= cz1; cz++) {
1891
1993
  if (!inRange(lv2, cx, cz))
@@ -1899,6 +2001,8 @@ function cullCore(insts, H, steps) {
1899
2001
  const covers = (ri, x, y, z) => {
1900
2002
  if (!(x - 6 >= rx0[ri] - 0.5 && x + 6 <= rx1[ri] + 0.5 && z - 6 >= rz0[ri] - 0.5 && z + 6 <= rz1[ri] + 0.5))
1901
2003
  return false;
2004
+ if (rFast[ri] === 1)
2005
+ return true;
1902
2006
  const o = ri * 9, pp = rPrep[ri], bx = rBx[ri], bz = rBz[ri];
1903
2007
  const dx = x - rM[o], dy = y - rM[o + 1], dz = z - rM[o + 2];
1904
2008
  const lx = rM[o + 3] * dx + rM[o + 4] * dy + rM[o + 5] * dz, lz = rM[o + 6] * dx + rM[o + 7] * dy + rM[o + 8] * dz;
@@ -1949,8 +2053,10 @@ function cullCore(insts, H, steps) {
1949
2053
  nStuds += pp.nStuds;
1950
2054
  }
1951
2055
  const studHidden = new Uint8Array(nStuds), studUp = new Uint8Array(nStuds);
1952
- const tops = new Int3Table(nStuds, 4);
1953
2056
  let studsHidden = 0;
2057
+ const tops = steps ? new Int3Table(nStuds, 4) : null;
2058
+ const TX = steps ? null : new Int32Array(nStuds), TY = steps ? null : new Int32Array(nStuds), TZ = steps ? null : new Int32Array(nStuds);
2059
+ let nT = 0;
1954
2060
  const studHideStep = steps ? new Int32Array(nStuds).fill(STEP_NEVER) : undefined;
1955
2061
  for (let idx = 0, j = 0;idx < insts.length; idx++) {
1956
2062
  const it = insts[idx];
@@ -1977,8 +2083,10 @@ function cullCore(insts, H, steps) {
1977
2083
  const rx = Math.round(x), ry = Math.round(y), rz = Math.round(z);
1978
2084
  if (!inRange(rx, ry, rz))
1979
2085
  continue;
1980
- if (!steps) {
1981
- tops.put(rx, ry, rz, 1);
2086
+ if (!tops) {
2087
+ TX[nT] = rx;
2088
+ TY[nT] = ry;
2089
+ TZ[nT++] = rz;
1982
2090
  continue;
1983
2091
  }
1984
2092
  const st = steps[idx], t = tops.get(rx, ry, rz);
@@ -1986,6 +2094,7 @@ function cullCore(insts, H, steps) {
1986
2094
  tops.put(rx, ry, rz, st);
1987
2095
  }
1988
2096
  }
2097
+ const topSet = tops ? null : new StudTopSet(TX, TY, TZ, nT);
1989
2098
  const underHidden = new Uint8Array(insts.length);
1990
2099
  const underHideStep = steps ? new Int32Array(insts.length).fill(STEP_NEVER) : undefined;
1991
2100
  for (let idx = 0;idx < insts.length; idx++) {
@@ -2004,7 +2113,7 @@ function cullCore(insts, H, steps) {
2004
2113
  const lx = b[0] + 10 + 20 * a, lz = b[2] + 10 + 20 * c;
2005
2114
  const x = m[0] + m[3] * lx + m[5] * lz, z = m[2] + m[9] * lx + m[11] * lz;
2006
2115
  const rx = Math.round(x), rz = Math.round(z);
2007
- const t = inRange(rx, ry, rz) ? tops.get(rx, ry, rz) : -1;
2116
+ const t = !inRange(rx, ry, rz) ? -1 : tops ? tops.get(rx, ry, rz) : topSet.has(rx, ry, rz) ? 1 : -1;
2008
2117
  if (t < 0) {
2009
2118
  all = false;
2010
2119
  break;
@@ -2051,7 +2160,7 @@ function precomputeCull(instances, H, useTex = true) {
2051
2160
  return cullCore(s.all, H, s.nSteps > 1 ? s.stepOf : undefined);
2052
2161
  }
2053
2162
 
2054
- // ../../../../../../../tmp/ldr-build-HYKc29/src/render.ts
2163
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/render.ts
2055
2164
  async function loadPack(url) {
2056
2165
  const res = await fetch(url);
2057
2166
  if (!res.ok)
@@ -2446,54 +2555,16 @@ function newIM(g, mat, n) {
2446
2555
  im.count = n;
2447
2556
  return im;
2448
2557
  }
2449
- function trimCulledIM(im, vis, linked) {
2450
- if (vis >= im.instanceMatrix.count || !im.instanceColor)
2451
- return false;
2452
- const M = im.instanceMatrix.array.slice(0, vis * 16), C = im.instanceColor.array.slice(0, vis * 3);
2453
- im.instanceMatrix = new THREE.InstancedBufferAttribute(M, 16);
2454
- im.instanceColor = new THREE.InstancedBufferAttribute(C, 3);
2455
- im.count = vis;
2456
- for (const o of linked) {
2457
- if (o.isInstancedMesh) {
2458
- o.instanceMatrix = im.instanceMatrix;
2459
- o.instanceColor = im.instanceColor;
2460
- o.count = vis;
2461
- } else if (o.geometry) {
2462
- o.geometry.setAttribute("instanceMatrix", im.instanceMatrix);
2463
- o.geometry.instanceCount = vis;
2464
- }
2465
- }
2466
- return true;
2467
- }
2468
- function instancedBoundingSphere(im) {
2469
- const g = im.geometry;
2558
+ function sphereState(g) {
2470
2559
  if (!g.boundingSphere)
2471
2560
  g.computeBoundingSphere();
2472
2561
  const gs = g.boundingSphere;
2473
- const gx = gs.center.x, gy = gs.center.y, gz = gs.center.z, gr = gs.radius;
2474
- const A = im.instanceMatrix.array;
2475
- let cx = 0, cy = 0, cz = 0, r = -1;
2476
- const expand = (px, py, pz) => {
2477
- if (r < 0) {
2478
- cx = px;
2479
- cy = py;
2480
- cz = pz;
2481
- r = 0;
2482
- return;
2483
- }
2484
- const vx = px - cx, vy = py - cy, vz = pz - cz;
2485
- const l2 = vx * vx + vy * vy + vz * vz;
2486
- if (l2 > r * r) {
2487
- const l = Math.sqrt(l2);
2488
- const d = (l - r) * 0.5;
2489
- const f = d / l;
2490
- cx += vx * f;
2491
- cy += vy * f;
2492
- cz += vz * f;
2493
- r += d;
2494
- }
2495
- };
2496
- for (let i = 0, n = im.count;i < n; i++) {
2562
+ return Float64Array.of(0, 0, 0, -1, gs.center.x, gs.center.y, gs.center.z, gs.radius);
2563
+ }
2564
+ function sphereUnion(S, A, n) {
2565
+ const gx = S[4], gy = S[5], gz = S[6], gr = S[7];
2566
+ let cx = S[0], cy = S[1], cz = S[2], r = S[3];
2567
+ for (let i = 0;i < n; i++) {
2497
2568
  const o = i * 16;
2498
2569
  const e0 = A[o], e1 = A[o + 1], e2 = A[o + 2], e3 = A[o + 3], e4 = A[o + 4], e5 = A[o + 5], e6 = A[o + 6], e7 = A[o + 7], e8 = A[o + 8], e9 = A[o + 9], e10 = A[o + 10], e11 = A[o + 11];
2499
2570
  const w = 1 / (e3 * gx + e7 * gy + e11 * gz + A[o + 15]);
@@ -2515,30 +2586,65 @@ function instancedBoundingSphere(im) {
2515
2586
  dx = dx * inv * sr;
2516
2587
  dy = dy * inv * sr;
2517
2588
  dz = dz * inv * sr;
2518
- expand(x + dx, y + dy, z + dz);
2519
- expand(x - dx, y - dy, z - dz);
2589
+ for (let k = 0;k < 2; k++) {
2590
+ const px = k ? x - dx : x + dx, py = k ? y - dy : y + dy, pz = k ? z - dz : z + dz;
2591
+ if (r < 0) {
2592
+ cx = px;
2593
+ cy = py;
2594
+ cz = pz;
2595
+ r = 0;
2596
+ continue;
2597
+ }
2598
+ const vx = px - cx, vy = py - cy, vz = pz - cz;
2599
+ const l2 = vx * vx + vy * vy + vz * vz;
2600
+ if (l2 > r * r) {
2601
+ const l = Math.sqrt(l2);
2602
+ const d = (l - r) * 0.5;
2603
+ const f = d / l;
2604
+ cx += vx * f;
2605
+ cy += vy * f;
2606
+ cz += vz * f;
2607
+ r += d;
2608
+ }
2609
+ }
2520
2610
  }
2611
+ S[0] = cx;
2612
+ S[1] = cy;
2613
+ S[2] = cz;
2614
+ S[3] = r;
2615
+ }
2616
+ function setSphere(im, S) {
2521
2617
  const sph = im.boundingSphere ?? new THREE.Sphere;
2522
- sph.center.set(cx, cy, cz);
2523
- sph.radius = r;
2524
- if (r < 0)
2618
+ sph.center.set(S[0], S[1], S[2]);
2619
+ sph.radius = S[3];
2620
+ if (S[3] < 0)
2525
2621
  sph.makeEmpty();
2526
2622
  im.boundingSphere = sph;
2527
2623
  return sph;
2528
2624
  }
2625
+ function instancedBoundingSphere(im, S = sphereState(im.geometry), set = true) {
2626
+ sphereUnion(S, im.instanceMatrix.array, im.count);
2627
+ return set ? setSphere(im, S) : S;
2628
+ }
2529
2629
  function instancedBoundingBox(im) {
2530
- const g = im.geometry;
2630
+ const B = boxState(im.geometry);
2631
+ if (!B)
2632
+ return;
2633
+ boxUnion(B, im.instanceMatrix.array, im.instanceMatrix.count);
2634
+ return boxOf(B);
2635
+ }
2636
+ function boxState(g) {
2531
2637
  if (!g.boundingBox)
2532
2638
  g.computeBoundingBox();
2533
2639
  const gb = g.boundingBox;
2534
2640
  if (gb.isEmpty())
2535
- return;
2536
- const hx = (gb.max.x - gb.min.x) / 2, hy = (gb.max.y - gb.min.y) / 2, hz = (gb.max.z - gb.min.z) / 2, gx = gb.min.x + hx, gy = gb.min.y + hy, gz = gb.min.z + hz;
2537
- const A = im.instanceMatrix.array;
2538
- const n = im.instanceMatrix.count;
2539
- if (!n)
2540
- return;
2541
- let x0 = Infinity, y0 = Infinity, z0 = Infinity, x1 = -Infinity, y1 = -Infinity, z1 = -Infinity;
2641
+ return null;
2642
+ const hx = (gb.max.x - gb.min.x) / 2, hy = (gb.max.y - gb.min.y) / 2, hz = (gb.max.z - gb.min.z) / 2;
2643
+ return Float64Array.of(Infinity, Infinity, Infinity, -Infinity, -Infinity, -Infinity, hx, hy, hz, gb.min.x + hx, gb.min.y + hy, gb.min.z + hz, 0);
2644
+ }
2645
+ function boxUnion(B, A, n) {
2646
+ const hx = B[6], hy = B[7], hz = B[8], gx = B[9], gy = B[10], gz = B[11];
2647
+ let x0 = B[0], y0 = B[1], z0 = B[2], x1 = B[3], y1 = B[4], z1 = B[5];
2542
2648
  for (let i = 0;i < n; i++) {
2543
2649
  const o = i * 16;
2544
2650
  const cx = A[o] * gx + A[o + 4] * gy + A[o + 8] * gz + A[o + 12], cy = A[o + 1] * gx + A[o + 5] * gy + A[o + 9] * gz + A[o + 13], cz = A[o + 2] * gx + A[o + 6] * gy + A[o + 10] * gz + A[o + 14];
@@ -2556,8 +2662,15 @@ function instancedBoundingBox(im) {
2556
2662
  if (cz + ez > z1)
2557
2663
  z1 = cz + ez;
2558
2664
  }
2559
- return Float32Array.of(x0, y0, z0, x1, y1, z1);
2665
+ B[0] = x0;
2666
+ B[1] = y0;
2667
+ B[2] = z0;
2668
+ B[3] = x1;
2669
+ B[4] = y1;
2670
+ B[5] = z1;
2671
+ B[12] += n;
2560
2672
  }
2673
+ var boxOf = (B) => B && B[12] > 0 ? Float32Array.of(B[0], B[1], B[2], B[3], B[4], B[5]) : undefined;
2561
2674
  function batchedBoundingBox(bm) {
2562
2675
  bm.computeBoundingBox();
2563
2676
  const bb = bm.boundingBox;
@@ -3116,7 +3229,7 @@ function fillBucketIds(bIds, fill, studBucket, j0, j1) {
3116
3229
  bIds[b][fill[b]++] = j;
3117
3230
  }
3118
3231
  }
3119
- function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex) {
3232
+ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colorIndex, trim = false) {
3120
3233
  const bKind = [], bMat = [];
3121
3234
  const bAll = [];
3122
3235
  const studBucket = new Uint16Array(cull.nStuds);
@@ -3222,10 +3335,10 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
3222
3335
  sMesh.push(null);
3223
3336
  continue;
3224
3337
  }
3225
- const im = newIM(g, bMat[b], c.length);
3226
- im.instanceColor = new THREE.InstancedBufferAttribute(new Float32Array(c.length * 3), 3);
3227
- const n = c.length;
3228
- sMesh.push({ im, kind, vis: v, ...steps ? { slots: { own: new Int32Array(n), hide: new Int32Array(n), inst: new Int32Array(n), stud: new Int16Array(n), col: new Uint16Array(n) } } : {} });
3338
+ const n = trim ? v : c.length;
3339
+ const im = newIM(g, bMat[b], n);
3340
+ im.instanceColor = new THREE.InstancedBufferAttribute(new Float32Array(n * 3), 3);
3341
+ sMesh.push({ im, kind, vis: v, all: c.length, ...steps ? { slots: { own: new Int32Array(n), hide: new Int32Array(n), inst: new Int32Array(n), stud: new Int16Array(n), col: new Uint16Array(n) } } : {} });
3229
3342
  }
3230
3343
  };
3231
3344
  for (let b = 0;b < bKind.length; b++) {
@@ -3251,6 +3364,12 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
3251
3364
  return x;
3252
3365
  };
3253
3366
  yield;
3367
+ let nH = 0;
3368
+ if (trim)
3369
+ for (let j = 0;j < cull.nStuds; j++)
3370
+ nH += cull.studHidden[j];
3371
+ const hidI = new Int32Array(nH), hidS = new Int32Array(nH), hidC = new Int32Array(nH);
3372
+ let nHid = 0;
3254
3373
  {
3255
3374
  const w = new Float64Array(12);
3256
3375
  let j = 0;
@@ -3262,6 +3381,14 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
3262
3381
  for (let si = 0;si < pp.nStuds; si++, j++) {
3263
3382
  if ((j & 32767) === 0 && j)
3264
3383
  yield;
3384
+ if (trim && cull.studHidden[j]) {
3385
+ if (sMesh[studCl[j]]) {
3386
+ hidI[nHid] = idx;
3387
+ hidS[nHid] = si;
3388
+ hidC[nHid++] = studCl[j];
3389
+ }
3390
+ continue;
3391
+ }
3265
3392
  mul12To(it.m, pp.studM, si * 12, w);
3266
3393
  const sm = sMesh[studCl[j]];
3267
3394
  if (!sm)
@@ -3283,8 +3410,41 @@ function* buildStudMeshesGen(insts, H, cull, arr, LOD, color, matOf, steps, colo
3283
3410
  }
3284
3411
  }
3285
3412
  }
3413
+ if (trim) {
3414
+ for (let c0 = 0;c0 < sMesh.length; c0 += 8) {
3415
+ yield;
3416
+ for (let ci = c0;ci < Math.min(sMesh.length, c0 + 8); ci++) {
3417
+ const sm = sMesh[ci];
3418
+ if (sm) {
3419
+ sm.S = instancedBoundingSphere(sm.im, undefined, false);
3420
+ if (LOD) {
3421
+ sm.B = boxState(sm.im.geometry);
3422
+ if (sm.B)
3423
+ boxUnion(sm.B, sm.im.instanceMatrix.array, sm.im.count);
3424
+ }
3425
+ }
3426
+ }
3427
+ }
3428
+ for (let k0 = 0;k0 < nHid; k0 += 65536) {
3429
+ yield;
3430
+ hiddenStudSpheres(insts, H, hidI, hidS, hidC, sMesh, k0, Math.min(nHid, k0 + 65536));
3431
+ }
3432
+ }
3286
3433
  return sMesh;
3287
3434
  }
3435
+ function hiddenStudSpheres(insts, H, hidI, hidS, hidC, sMesh, k0, k1) {
3436
+ const w = new Float64Array(12), A = new Float32Array(16);
3437
+ for (let k = k0;k < k1; k++) {
3438
+ const it = insts[hidI[k]];
3439
+ const pp = prepPart(H, it.part);
3440
+ const sm = sMesh[hidC[k]];
3441
+ mul12To(it.m, pp.studM, hidS[k] * 12, w);
3442
+ writeM4(A, 0, w);
3443
+ sphereUnion(sm.S, A, 1);
3444
+ if (sm.B)
3445
+ boxUnion(sm.B, A, 1);
3446
+ }
3447
+ }
3288
3448
  function undersideGroups(ids, insts) {
3289
3449
  const by = new Map;
3290
3450
  const rest = [];
@@ -3718,15 +3878,35 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3718
3878
  const vis = uids.length - uids.reduce((a, i) => a + cull.underHidden[i], 0);
3719
3879
  stats.undersTotal += uids.length;
3720
3880
  stats.undersHidden += uids.length - vis;
3721
- const im = newIM(under, mat, uids.length);
3722
- fillInstances(im, ord, insts, color);
3881
+ const trimU = !steps && !!P.cullUnder;
3882
+ const im = newIM(under, mat, trimU ? vis : uids.length);
3883
+ fillInstances(im, trimU ? ord.slice(0, vis) : ord, insts, color);
3723
3884
  im.onBeforeRender = trackVp;
3724
3885
  im.userData.ldrUnder = true;
3725
3886
  im.userData.ldrPart = part;
3726
- instancedBoundingSphere(im);
3887
+ let uB;
3888
+ if (trimU) {
3889
+ im.count = vis;
3890
+ const S = instancedBoundingSphere(im, undefined, false), A = new Float32Array(16);
3891
+ if (LOD) {
3892
+ uB = boxState(im.geometry);
3893
+ if (uB)
3894
+ boxUnion(uB, im.instanceMatrix.array, vis);
3895
+ }
3896
+ for (let k = vis;k < ord.length; k++) {
3897
+ writeM4(A, 0, insts[ord[k]].m);
3898
+ sphereUnion(S, A, 1);
3899
+ if (uB)
3900
+ boxUnion(uB, A, 1);
3901
+ }
3902
+ setSphere(im, S);
3903
+ } else
3904
+ instancedBoundingSphere(im);
3727
3905
  im.count = P.cullUnder ? vis : uids.length;
3728
3906
  root.add(im);
3729
3907
  const cl = newCluster(im.boundingSphere, im);
3908
+ if (uB !== undefined)
3909
+ cl.b = boxOf(uB);
3730
3910
  cl.lv.push({ objs: [im], err: 0 }, ...lodLevels(p.under, im, mat));
3731
3911
  {
3732
3912
  const bl = p.body?.lod;
@@ -3749,7 +3929,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
3749
3929
  if (!o.isInstancedMesh)
3750
3930
  o.geometry.instanceCount = im.count;
3751
3931
  });
3752
- const trim = !steps && P.cullUnder && trimCulledIM(im, vis, objs);
3932
+ const trim = trimU && vis < uids.length;
3753
3933
  if (trim)
3754
3934
  trimmed.under = true;
3755
3935
  toggles.push({ mesh: countTo(() => objs), all: trim ? vis : uids.length, visible: vis, flag: "under" });
@@ -4043,7 +4223,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
4043
4223
  }
4044
4224
  }
4045
4225
  yield root;
4046
- const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex);
4226
+ const _studGen = buildStudMeshesGen(insts, H, cull, arr, LOD, color, (c, mirror) => materialFor(c, mirror, false), steps, steps && colorIndex, !steps && !!P.cullStuds);
4047
4227
  let _studR = _studGen.next();
4048
4228
  while (!_studR.done) {
4049
4229
  yield root;
@@ -4067,13 +4247,18 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
4067
4247
  const im = sm.im;
4068
4248
  const kind = sKind[ci];
4069
4249
  const k = H.studKinds[kind];
4070
- const vis = sVis[ci], all = im.instanceMatrix.count;
4071
- instancedBoundingSphere(im);
4250
+ const vis = sVis[ci], all = sm.all;
4251
+ if (sm.S)
4252
+ setSphere(im, sm.S);
4253
+ else
4254
+ instancedBoundingSphere(im);
4072
4255
  im.count = P.cullStuds ? vis : all;
4073
4256
  im.onBeforeRender = trackVp;
4074
4257
  im.userData.ldrStud = true;
4075
4258
  root.add(im);
4076
4259
  const cl = newCluster(im.boundingSphere, im);
4260
+ if (sm.B !== undefined)
4261
+ cl.b = boxOf(sm.B);
4077
4262
  cl.studLineLv = 0;
4078
4263
  cl.lv.push({ objs: [im], err: 0 });
4079
4264
  const discObjs = [];
@@ -4128,7 +4313,7 @@ function* buildLdrSceneGen(insts, pack, P, color, mark) {
4128
4313
  if (!o.isInstancedMesh)
4129
4314
  o.geometry.instanceCount = im.count;
4130
4315
  });
4131
- const trim = !steps && P.cullStuds && trimCulledIM(im, vis, objs);
4316
+ const trim = !steps && P.cullStuds && vis < all;
4132
4317
  if (trim)
4133
4318
  trimmed.studs = true;
4134
4319
  toggles.push({ mesh: countTo(() => objs), all: trim ? vis : all, visible: vis, flag: "studs" });
@@ -4388,7 +4573,7 @@ async function warmPackGeometry(pack, stop = () => false, sliceMs = 8) {
4388
4573
  await new Promise((r) => setTimeout(r, 0));
4389
4574
  }
4390
4575
  }
4391
- // ../../../../../../../tmp/ldr-build-HYKc29/src/scene.ts
4576
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/scene.ts
4392
4577
  import * as THREE2 from "three";
4393
4578
  var _box = new THREE2.Box3;
4394
4579
  var _m4 = new THREE2.Matrix4;
@@ -4743,10 +4928,10 @@ function createLdrObjectInner(instances, pack, options, progressive) {
4743
4928
  return finish();
4744
4929
  })();
4745
4930
  }
4746
- // ../../../../../../../tmp/ldr-build-HYKc29/src/parts-cdn.ts
4931
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/parts-cdn.ts
4747
4932
  import { decompress as decompress2 } from "fzstd";
4748
4933
 
4749
- // ../../../../../../../tmp/ldr-build-HYKc29/src/embedded.ts
4934
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/embedded.ts
4750
4935
  function splitFiles(text, fallback) {
4751
4936
  const files = new Map;
4752
4937
  let cur = null, saw = false, skip = false;
@@ -4821,7 +5006,7 @@ function embeddedKeys(text, names, fallback = "main.ldr") {
4821
5006
  return out;
4822
5007
  }
4823
5008
 
4824
- // ../../../../../../../tmp/ldr-build-HYKc29/src/parts-cdn.ts
5009
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/parts-cdn.ts
4825
5010
  var DEFAULT_PARTS_CDN = "https://ldr-demo.vercel.app/cdn/v1/";
4826
5011
  var indexCache = new Map;
4827
5012
  var shardCache = new Map;
@@ -5075,10 +5260,10 @@ async function prepareModel(source, o = {}) {
5075
5260
  return { insts, pack, tier, missing, requests, bytes, cull, timings: { fetchModel: t1 - t0, parse: t2 - t1, parts: t3 - t2, ...cull ? { cull: performance.now() - t3 } : {} } };
5076
5261
  }
5077
5262
 
5078
- // ../../../../../../../tmp/ldr-build-HYKc29/src/load-worker.gen.ts
5079
- var load_worker_gen_default = 'var zt=ArrayBuffer,Q=Uint8Array,Me=Uint16Array,$t=Int16Array;var Ae=Int32Array,De=function(e,t,n){if(Q.prototype.slice)return Q.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new Q(n-t);return r.set(e.subarray(t,n)),r},he=function(e,t,n,r){if(Q.prototype.fill)return Q.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},jt=function(e,t,n,r){if(Q.prototype.copyWithin)return Q.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Vt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],q=function(e,t,n){var r=Error(t||Vt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,q);if(!n)throw r;return r},ot=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},_t=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Gt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,c=r>>6;if(r&8)q(0);var u=6-s,f=i==3?4:i,a=ot(e,u,f);u+=f;var l=c?1<<c:s,m=ot(e,u,l)+(c==1&&256),g=m;if(!s){var b=1<<10+(e[5]>>3);g=b+(b>>3)*(e[5]&7)}if(g>2145386496)q(1);var y=new Q((t==1?m||g:t?0:g)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+l,y:0,l:0,d:a,w:t&&t!=1?t:y.subarray(12),e:g,o:new Ae(y.buffer,0,3),u:m,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return _t(e,4)+8;q(0)},ue=function(e){var t=0;for(;1<<t<=e;++t);return t-1},ge=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)q(3);var o=1<<s,i=o,c=-1,u=-1,f=-1,a=o,l=new zt(512+(o<<2)),m=new $t(l,0,256),g=new Me(l,0,256),b=new Me(l,512,o),y=512+(o<<1),A=new Q(l,y,o),v=new Q(l,y+o);while(c<255&&i>0){var p=ue(i+1),h=r>>3,M=(1<<p+1)-1,z=(e[h]|e[h+1]<<8|e[h+2]<<16)>>(r&7)&M,C=(1<<p)-1,L=M-i-1,I=z&C;if(I<L)r+=p,z=I;else if(r+=p+1,z>C)z-=L;if(m[++c]=--z,z==-1)i+=z,A[--a]=c;else i-=z;if(!z)do{var S=r>>3;u=(e[S]|e[S+1]<<8)>>(r&7)&3,r+=2,c+=u}while(u==3)}if(c>255||i)q(0);var w=0,x=(o>>1)+(o>>3)+3,P=o-1;for(var O=0;O<=c;++O){var E=m[O];if(E<1){g[O]=-E;continue}for(f=0;f<E;++f){A[w]=O;do w=w+x&P;while(w>=a)}}if(w)q(0);for(f=0;f<o;++f){var F=g[A[f]]++,X=v[f]=s-ue(F);b[f]=(F<<X)-o}return[r+7>>3,{b:s,s:A,n:v,t:b}]},Ht=function(e,t){var n=0,r=-1,s=new Q(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),u=new Me(s.buffer,268);if(o<128){var f=ge(e,t+1,6),a=f[0],l=f[1];t+=o;var m=a<<3,g=e[t];if(!g)q(0);var b=0,y=0,A=l.b,v=A,p=(++t<<3)-8+ue(g);for(;;){if(p-=A,p<m)break;var h=p>>3;if(b+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<A)-1,i[++r]=l.s[b],p-=v,p<m)break;h=p>>3,y+=(e[h]|e[h+1]<<8)>>(p&7)&(1<<v)-1,i[++r]=l.s[y],A=l.n[b],b=l.t[b],v=l.n[y],y=l.t[y]}if(++r>255)q(0)}else{r=o-127;for(;n<r;n+=2){var M=e[++t];i[n]=M>>4,i[n+1]=M&15}++t}var z=0;for(n=0;n<r;++n){var C=i[n];if(C>11)q(0);z+=C&&1<<C-1}var L=ue(z)+1,I=1<<L,S=I-z;if(S&S-1)q(0);i[r++]=ue(S)+1;for(n=0;n<r;++n){var C=i[n];++c[i[n]=C&&L+1-C]}var w=new Q(I<<1),x=w.subarray(0,I),P=w.subarray(I);u[L]=0;for(n=L;n>0;--n){var O=u[n];he(P,n,O,u[n-1]=O+c[n]*(1<<L-n))}if(u[0]!=I)q(0);for(n=0;n<r;++n){var E=i[n];if(E){var F=u[E];he(x,n,F,u[E]=F+(1<<L-E))}}return[t,{n:P,b:L,s:x}]},Wt=ge(new Q([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],Kt=ge(new Q([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],Xt=ge(new Q([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],it=function(e,t){var n=e.length,r=new Ae(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ue=new Q(new Ae([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),Zt=it(Ue,0),Oe=new Q(new Ae([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),Yt=it(Oe,3),me=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)q(0);var u=0,f=n.b,a=(r<<3)-8+ue(o)-f,l=-1;for(;a>c&&l<s;){var m=a>>3,g=(e[m]|e[m+1]<<8|e[m+2]<<16)>>(a&7);u=(u<<f|g)&i,t[++l]=n.s[u],a-=f=n.n[u]}if(a!=c||l+1!=s)q(0)},Jt=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;me(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),me(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),me(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),me(e.subarray(r),t.subarray(c),n)},Qt=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return he(n,e[s],t.y,t.y+=c),n;return he(new Q(c),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=c,n;return De(e,s,u)}if(i==2){var f=e[s],a=f&3,l=f>>2&3,m=f>>4,g=0,b=0;if(a<2)if(l&1)m|=e[++s]<<4|(l&2&&e[++s]<<12);else m=f>>3;else if(b=l,l<2)m|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(l==2)m|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else m|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new Q(t.m),A=y.length-m;if(a==0)y.set(e.subarray(s,s+=m),A);else if(a==1)he(y,e[s++],A);else{var v=t.h;if(a==2){var p=Ht(e,s);g+=s-(s=p[0]),t.h=v=p[1]}else if(!v)q(0);(b?Jt:me)(e.subarray(s,s+=g),y.subarray(A),v)}var h=e[s++];if(h){if(h==255)h=(e[s++]|e[s++]<<8)+32512;else if(h>127)h=h-128<<8|e[s++];var M=e[s++];if(M&3)q(0);var z=[Kt,Xt,Wt];for(var C=2;C>-1;--C){var L=M>>(C<<1)+2&3;if(L==1){var I=new Q([0,0,e[s++]]);z[C]={s:I.subarray(2,3),n:I.subarray(0,1),t:new Me(I.buffer,0,1),b:0}}else if(L==2)r=ge(e,s,9-(C&1)),s=r[0],z[C]=r[1];else if(L==3){if(!t.t)q(0);z[C]=t.t[C]}}var S=t.t=z,w=S[0],x=S[1],P=S[2],O=e[u-1];if(!O)q(0);var E=(u<<3)-8+ue(O)-P.b,F=E>>3,X=0,se=(e[F]|e[F+1]<<8)>>(E&7)&(1<<P.b)-1;F=(E-=x.b)>>3;var oe=(e[F]|e[F+1]<<8)>>(E&7)&(1<<x.b)-1;F=(E-=w.b)>>3;var ae=(e[F]|e[F+1]<<8)>>(E&7)&(1<<w.b)-1;for(++h;--h;){var le=P.s[se],R=P.n[se],U=w.s[ae],B=w.n[ae],G=x.s[oe],k=x.n[oe];F=(E-=G)>>3;var T=1<<G,d=T+((e[F]|e[F+1]<<8|e[F+2]<<16|e[F+3]<<24)>>>(E&7)&T-1);F=(E-=Oe[U])>>3;var j=Yt[U]+((e[F]|e[F+1]<<8|e[F+2]<<16)>>(E&7)&(1<<Oe[U])-1);F=(E-=Ue[le])>>3;var N=Zt[le]+((e[F]|e[F+1]<<8|e[F+2]<<16)>>(E&7)&(1<<Ue[le])-1);if(F=(E-=R)>>3,se=P.t[se]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<R)-1),F=(E-=B)>>3,ae=w.t[ae]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<B)-1),F=(E-=k)>>3,oe=x.t[oe]+((e[F]|e[F+1]<<8)>>(E&7)&(1<<k)-1),d>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=d-=3;else{var D=d-(N!=0);if(D){if(d=D==3?t.o[0]-1:t.o[D],D>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=d}else d=t.o[0]}for(var C=0;C<N;++C)y[X+C]=y[A+C];X+=N,A+=N;var V=X-d;if(V<0){var _=-V,Y=t.e+V;if(_>j)_=j;for(var C=0;C<_;++C)y[X+C]=t.w[Y+C];X+=_,j-=_,V=0}for(var C=0;C<j;++C)y[X+C]=y[V+C];X+=j}if(X!=A)while(A<y.length)y[X++]=y[A++];else X=y.length;if(n)t.y+=X;else y=De(y,0,X)}else if(n){if(t.y+=m,A)for(var C=0;C<m;++C)y[C]=y[A+C]}else if(A)y=De(y,A);return t.b=u,y}q(2)},qt=function(e,t){if(e.length==1)return e[0];var n=new Q(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function ve(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Gt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var c=Qt(e,i,t);if(!c)q(5);if(t)i.e=i.y;else n.push(c),o+=c.length,jt(i.w,0,c.length),i.w.set(c,i.w.length-c.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return qt(n,o)}async function en(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(ve(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function at(e){return new TextDecoder().decode(await en(e))}var lt=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function Ce(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var ee=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),ze=/^[A-Za-z][A-Za-z0-9_]*$/,Ne=new Map;function $e(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Ne.has(r))Ne.set(r,t);return r}function je(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&ze.test(e))return $e(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var ct=/^~?\\s*moved\\s+to\\s+(.+)$/i,tn=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),nn=new Set(["FILE","NOFILE","!DATA"]),bt=1000000000000000,yt=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),rn=new Set(["model","submodel","configuration"]),sn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function ut(e){let t=sn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return yt.has(n)||rn.has(n)?n:void 0}function on(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function an(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every((l)=>Number.isFinite(l)&&Math.abs(l)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let l=0;l<s;l++)c=c.replace(/^\\S+\\s*/,"");let u=on(c);if(!u.length)return null;let f={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)f.a=i[9];if(s===11)f.b=i[10];let a=u.findIndex((l,m)=>m>0&&l.toUpperCase()==="GLOSSMAP");if(a>0&&u[a+1])f.glossmap=u[a+1];if(t)f.next=!0;return f}var ln=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,"");if(t.length%4===1)t=t.slice(0,-1);let n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function cn(e){let t=e.length,n=1,r=(a)=>a===32||a===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let a=n;while(n<t&&!r(e.charCodeAt(n)))n++;return a<n?e.slice(a,n):null},o=s();if(o===null)return null;let i=Array(12);for(let a=0;a<12;a++){let l=s();if(l===null)return null;let m=+l;if(!Number.isFinite(m))return null;i[a]=m}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let c=e.slice(n),u=/[ \\t]{2,}|\\t/.test(c)?c.split(/\\s+/).join(" "):c,f=je(o);if(!Number.isFinite(f))return null;return{t:1,color:f,m:i,file:ee(u)}}var un=[0,12,6,9,12,12];function ft(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=je(e[1]),r=un[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=ee(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function xt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,u=null,f=[],a=null,l=()=>{if(!u)return;let p=ln(u.chunks.join("")),h=p[0]===137&&p[1]===80&&p[2]===78&&p[3]===71;(c??=new Map).set(ee(u.name),{name:u.name,bytes:p,...h?{mime:"image/png"}:{}}),u=null},m=!0,g=(p)=>{if(l(),o={name:ee(p),cmds:[]},s.set(o.name,o),!i)i=o.name;f=[],a=null,m=!0},b=!1,y=!1,A=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},v=(p,h)=>{if(a){p.tex=a,a=null;return}let M=f[f.length-1];if(!M)return;if(M.fallback){if(!h)p.fallback=!0}else p.tex=M.map};for(let p of e.split(`\n`)){let h=p.trim();if(!h)continue;if(r&&h.charCodeAt(0)>=50&&h.charCodeAt(0)<=53&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){if(u||b)continue;if(!o)g(t);let L=h.slice(2).trimStart(),I=L.search(/\\s/),S={t:h.charCodeAt(0)-48,color:je(I<0?L:L.slice(0,I)),p:[],src:h};v(S,!1),o.cmds.push(S),m=!1;continue}if(h.charCodeAt(0)===48&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)){let L=2;while(h.charCodeAt(L)===32||h.charCodeAt(L)===9)L++;let I=L;while(I<h.length&&h.charCodeAt(I)!==32&&h.charCodeAt(I)!==9)I++;let S=h.slice(L,I),w=/[^\\x21-\\x7e]/.test(S)?h.slice(L).trim().split(/\\s+/)[0]:S;if(!tn.has(w)&&!(w.length>=4&&w.length<=6&&nn.has(w.toUpperCase()))){if(b||u)continue;if(!o)g(t);let x=h.slice(L),P={t:0,text:x};if(S.charCodeAt(0)===33)P.meta=S;if(a=null,m&&!o.org){let E=ut(x);if(E)o.org=E}let O=x.match(ct);if(O&&!o.movedTo){let E=O[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(E))E+=".dat";o.movedTo=ee(E)}o.cmds.push(P);continue}}if(h.charCodeAt(0)===49&&(h.charCodeAt(1)===32||h.charCodeAt(1)===9)&&!u&&!b){let L=cn(h);if(L){if(!o)g(t);v(L,!1),o.cmds.push(L),m=!1;continue}}let M=h.split(/\\s+/);if(+M[0]===0){let L=h.slice(1).trim(),I=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(I==="FILE"){let x=L.slice(5).trimStart().split("\\r")[0].trim();if(x){A(),b=!1,g(x);continue}}if(I==="NOFILE"){l(),o=null,b=!0;continue}if(I==="!DATA"){A(),l(),o=null,b=!1,u={name:L.slice(5).trim(),chunks:[]};continue}if(b)continue;if(u){if(M[1]==="!:")u.chunks.push(M.slice(2).join(""));continue}if(!o)g(t);let S={t:0,text:L};if(M[1]==="STEP")S.step=!0,f=[],a=null;else if(M[1]==="BFC")S.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(S.meta="ROTSTEP",S.step=!0,f=[],a=null,(M[2]??"").toUpperCase()==="END")S.rotstep={x:0,y:0,z:0,mode:"END"};else{let x=(M[5]??"REL").toUpperCase(),P=(O)=>{let E=Number(O);return Number.isFinite(E)?E:0};S.rotstep={x:P(M[2]),y:P(M[3]),z:P(M[4]),mode:["REL","ABS","ADD"].includes(x)?x:"REL"}}else if(M[1]==="BUFEXCHG"){S.meta="BUFEXCHG";let x=(M[2]??"").toUpperCase();S.bufexchg={op:x==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))S.meta=M[1];if(m&&!o.org){let x=ut(L);if(x)o.org=x}if(M[1]==="!TEXMAP"){let x=(M[2]??"").toUpperCase();if(a=null,x==="START"||x==="NEXT"){let P=an(L.replace(/^!TEXMAP\\s+\\S+/i,""),x==="NEXT");if(S.texmap={op:x,...P?{map:P}:{}},P)if((o.texmaps??=[]).push(P),x==="START")f.push({map:P,fallback:!1});else a=P}else if(x==="FALLBACK"){S.texmap={op:x};let P=f[f.length-1];if(P)P.fallback=!0}else if(x==="END")S.texmap={op:x},f.pop()}else if(M[1]==="!:"){a=null;let x=ft(M.slice(2));if(x)v(x,!0),S.geom=x}else a=null;let w=L.match(ct);if(w&&!o.movedTo){let x=w[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(x))x+=".dat";o.movedTo=ee(x)}o.cmds.push(S);continue}if(u||b)continue;if(!o)g(t);let C=ft(M);if(!C){if(/^[2-5][ \\t]/.test(h))m=!1;continue}v(C,!1),o.cmds.push(C),m=!1}return l(),c?{main:i,files:s,data:c}:{main:i,files:s}}var On=Math.PI/180;function wt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function Mt(e,t){let[n,r,s,o,i,c,u,f,a,l,m,g]=e,[b,y,A,v,p,h,M,z,C,L,I,S]=t;return[o*b+i*y+c*A+n,u*b+f*y+a*A+r,l*b+m*y+g*A+s,o*v+i*M+c*L,o*p+i*z+c*I,o*h+i*C+c*S,u*v+f*M+a*L,u*p+f*z+a*I,u*h+f*C+a*S,l*v+m*M+g*L,l*p+m*z+g*I,l*h+m*C+g*S]}var Ve=[0,0,0,1,0,0,0,1,0,0,0,1];var pt=new WeakMap,fn=/^(s|8|48)\\//;function _e(e,t){let n=e.files.get(ee(t));if(!n)return"part";let r=pt.get(n);if(r)return r;if(n.org)r=yt.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&fn.test(s.file))?"part":"model";return pt.set(n,r),r}var mt=new WeakMap;function At(e){let t=mt.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return mt.set(e,t),t}var ht=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Ne.get(e)??String(e):String(e),pn=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${ht(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${ht(e.color)} ${e.p.join(" ")}`,Ge=(e,t)=>`${ee(e)}#${t}`;function mn(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ge(e.name,t),cmds:n}}function vt(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...mn(e,t).cmds.map(pn)].join(`\n`)+`\n`}function He(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Ct(e){let[t,n,r,s,o,i,c,u,f,a,l,m]=e,g=u*m-f*l,b=-(c*m-f*a),y=c*l-u*a,A=s*g+o*b+i*y;if(!Number.isFinite(A)||Math.abs(A)<0.000000000001)return null;let v=1/A,p=[g*v,-(o*m-i*l)*v,(o*f-i*u)*v,b*v,(s*m-i*a)*v,-(s*f-i*c)*v,y*v,-(s*l-o*a)*v,(s*u-o*c)*v];return[-(p[0]*t+p[1]*n+p[2]*r),-(p[3]*t+p[4]*n+p[5]*r),-(p[6]*t+p[7]*n+p[8]*r),...p]}var hn=(e)=>String(+e.toFixed(6)||0),gt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Tt(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(hn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${gt(t.texture)}${t.glossmap?" GLOSSMAP "+gt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${ee(e)}\n0 !TEXMAP END\n`;return{name:`${ee(e)}#tex-${He(r)}`,source:r}}var gn=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function dn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),u=Math.sin(n*r),f=Math.cos(n*r);return[c*f,-c*u,i,o*u+s*i*f,o*f-s*i*u,-s*c,s*u-o*i*f,s*f+o*i*u,o*c]}var dt=new WeakMap;function Lt(e){let t=dt.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=dn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:gn(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),dt.set(e,n),n}class We extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var bn=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=bt))return!1;return!0},St=999999,Pt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Ft=new WeakMap,Et=new WeakMap;function yn(e,t){let n=Et.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Ft.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},Et.set(t,n);let r=n.parts.get(e);if(!r){let s=ee(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${He(o)}`,source:o},n.parts.set(e,r)}return r}function xn(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,u=0,f=new Set,a=t.maxInstances??2000000,l=0,m=(b,y)=>{let A=b.name+"#"+y,v=c.get(A);if(!v){let p;v=Object.assign(()=>p??=vt(b,y),{file:b,step:y}),c.set(A,v)}return v},g=(b,y,A,v,p,h,M,z,C=null,L=[],I=[],S=void 0,w=null)=>{let x=b.files.get(y);if(!x||M>r||f.has(x))return;if(++l>a)throw new We("model",a);f.add(x);let P=w,O=0,E=M>0?++u:0,F=i&&E?[...L,E]:L,X=i&&E?[...I,A]:I,se=i&&!C?new Map:null,oe=-1,ae=0,le=(T,d,j,N,D,V,_)=>{if(oe!==O)oe=O,ae=0;let Y=se?.get(O+"|"+d);if(Y)return Y.n++,g(T,T===b?d:T.main,j,N,p+"/"+d,[...D,St],M+1,V,[...D,St],F,X,_,P);let J=[...D,ae++],H=n.length;g(T,T===b?d:T.main,j,N,p+"/"+d,J,M+1,V,C,F,X,_,P),se?.set(O+"|"+d,{n:1,from:H,to:n.length})},R=Lt(x),U=s?At(x):[],B=0,G=(T,d,j,N,D,V,_,Y,J)=>{if(C)N=C;if(++l>a)throw new We("model",a);let H={part:T,color:d,m:j,step:N[0],steps:N,localStep:D,path:p};if(Y)H.colour=Y;if(E){if(H.sub=E,i)H.subPath=F,H.subMats=X}if(V)H.embedded=!0;if(_){let ne=Tt(T,_);H.texPart=ne.name,H.texSource=ne.source}else if(J){let ne=yn(T,J);H.colPart=ne.name,H.colSource=ne.source}let W=R[D];if(W)H.view=W;return n.push(H),H},k=(T)=>{while(B<U.length&&U[B]<=T){let d=U[B++];G(Ge(x.name,d),v,A,[...h,d],d,!1,null,S,w).source=m(x,d)}};for(let T of x.cmds){if(T.t===0&&T.step){O++;continue}let d=T;if(d.t>=2||d.t===0&&d.geom&&d.geom.t>=2){k(O);continue}if(d.t===0){if(d.meta==="!COLOUR"){let W=Mn(d.text);if(W&&W.code!==16&&W.code!==24)Ft.set(W,d.text),(P=new Map(P??[])).set(W.code,W);continue}if(o&&d.geom?.t===1)d=d.geom;else continue}if(d.t!==1)continue;if(o&&d.fallback)continue;let j=Mt(A,d.m);if(!bn(j))continue;let N=d.color===16?v:d.color,D=d.color===16?S:P?.get(d.color),V=[...h,O],_=o?d.tex??z:null,Y=_?Ct(d.m):null,J=_&&Y?wt(_,Y):null;if(b.files.has(d.file)){if(_e(b,d.file)==="model"){le(b,d.file,j,N,V,J,D);continue}G(d.file,N,j,V,O,!0,J,D,P);continue}let H=t.resolveModel?.(d.file);if(H){le(H,d.file,j,N,V,J,D);continue}G(d.file,N,j,V,O,!1,J,D,P)}if(k(1/0),f.delete(x),se){for(let T of se.values())if(T.n>1)for(let d=T.from;d<T.to;d++)n[d].mult??=T.n}};if(_e(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ve],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,Ve,16,e.main,[],0,null),n}function Rt(e,t="main.ldr",n){return xn(xt(e,t,{geometryText:!0}),n)}var wn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function Ke(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function kt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=Ke(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function Mn(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",c=255,u=0,f={type:"default"},a=1;while(a<n.length){let l=n[a].toUpperCase(),m=n[a+1];if(l==="CODE")s=m!==void 0&&ze.test(m)?$e(m):m!==void 0&&/^\\d+$/.test(m)?+m:NaN,a+=2;else if(l==="VALUE"){let g=Ke(m);if(g)o=g;a+=2}else if(l==="EDGE")i=Ke(m)??m,a+=2;else if(l==="ALPHA")c=+m,a+=2;else if(l==="LUMINANCE")u=+m,a+=2;else if(l==="CHROME")f={type:"chrome"},a+=1;else if(l==="PEARLESCENT")f={type:"pearlescent"},a+=1;else if(l==="RUBBER")f={type:"rubber"},a+=1;else if(l==="MATTE_METALLIC")f={type:"matte_metallic"},a+=1;else if(l==="METAL")f={type:"metal"},a+=1;else if(l==="MATERIAL"){let g=(n[a+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:b,next:y}=kt(n,a+2);f={type:"glitter",material:b},a=y}else if(g==="SPECKLE"){let{grain:b,next:y}=kt(n,a+2);f={type:"speckle",material:b},a=y}else if(g==="FABRIC"){let b=(n[a+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(b)?b.toLowerCase():void 0;f={type:"fabric",kind:y},a+=y?3:2}else a=n.length}else if(wn.has(l))a+=1;else a+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(u)?u:0,finish:f}}function An(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function Xe(e){let t=An(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function vn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(ee(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(ee(t),r)}let u=i.trim().replace(/\\s+/g," ");if(u)r.push(u)}return n}var Cn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?ee(t.slice(14).join(" ")):null};function Tn(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function It(e,t,n="main.ldr"){let r=vn(e,n),s=new Map;for(let o of t){let i=ee(o);if(!r.has(i)||s.has(i))continue;let c=new Set([i]),u=[i];while(u.length)for(let a of r.get(u.pop())){let l=Cn(a);if(l&&r.has(l)&&!c.has(l))c.add(l),u.push(l)}let f=[i,...[...c].filter((a)=>a!==i).sort()].map((a)=>"0 FILE "+(a===i?"":a)+`\n`+r.get(a).join(`\n`)).join(`\n`);s.set(i,`emb/${Tn(f)}.dat`)}return s}var Bt=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,Dt=new WeakMap,Ze=null,Ye="",Je=null;function Qe(e,t){if(e===Ze&&t===Ye)return Je;let n=Dt.get(e);if(!n)Dt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return Ze=e,Ye=t,Je=r,r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],u=[];s.studs.forEach((m,g)=>{c.push(m[0]),u.push(m[1]);for(let b=0;b<12;b++)i[g*12+b]=m[2+b]});let f=null,a=0,l=0;if(s.mask){a=s.mask[0],l=s.mask[1];let m=s.mask[2];f=new Uint8Array(m.length);for(let g=0;g<m.length;g++)f[g]=m.charCodeAt(g)===49?1:0}return n.set(t,r={nStuds:o,studM:i,kind:c,color:u,mask:f,nx:a,nz:l}),Ze=e,Ye=t,Je=r,r}var fe=1073741824;class be{t;tag;mask;size=0;shift;constructor(e=1024,t=-1){let n=1024;while(n<e*2)n*=2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.shift=t}slot(e,t,n){let r=this.shift;if(r<0){let o=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return o^=o>>>15,o=Math.imul(o,739982445),o^=o>>>12,o&this.mask}let s=Math.imul(e>>r+2,2654435761)^Math.imul(t,2246822507)^Math.imul(n>>r+2,3266489909);return s^=s>>>15,s=Math.imul(s,739982445),s^=s>>>12,(s<<4|(e>>r&3)<<2|n>>r&3)&this.mask}static tagOf(e,t,n){return Math.imul(e^Math.imul(t,374761393)^Math.imul(n,668265261),2654435761)>>>24|1}get(e,t,n){let r=be.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let u=s[c];if(u===0)return-1;if(u===r){let f=c<<2;if(o[f]===e&&o[f+1]===t&&o[f+2]===n)return o[f+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=be.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,u=this.slot(e,t,n);for(;;){let f=o[u],a=u<<2;if(f===0)return o[u]=s,i[a]=e,i[a+1]=t,i[a+2]=n,i[a+3]=r,this.size++,-1;if(f===s&&i[a]===e&&i[a+1]===t&&i[a+2]===n){let l=i[a+3];return i[a+3]=r,l}u=u+1&c}}grow(){let e=this.t,t=this.tag,n=t.length*2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.size=0;for(let r=0;r<t.length;r++)if(t[r]){let s=r<<2;this.put(e[s],e[s+1],e[s+2],e[s+3])}}}var pe=(e,t,n)=>e>-fe&&e<fe&&t>-fe&&t<fe&&n>-fe&&n<fe,de=2147483647;function Ln(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function Sn(e,t,n){let s=new Map,o=(R)=>{let U=s.get(R);if(U===void 0)s.set(R,U=Ln(t,R));return U},i=[],c=[],u=[],f=[],a=[],l=[],m=[],g=[],b=[],y=[],A=[],v=new be(e.length*2),p=[],h=[];for(let R=0;R<e.length;R++){let U=e[R],B=U.m,G=t.parts[U.part];if(!G||!G.mask||!Bt(B)||o(U.color))continue;let k=G.bbox,T=1/0,d=-1/0,j=1/0,N=-1/0;for(let K=0;K<2;K++)for(let Z=0;Z<2;Z++){let te=K?k[3]:k[0],ce=Z?k[5]:k[2],ie=B[0]+B[3]*te+B[5]*ce,re=B[2]+B[9]*te+B[11]*ce;if(ie<T)T=ie;if(ie>d)d=ie;if(re<j)j=re;if(re>N)N=re}let D=Math.round((B[1]+k[4])*2),V=Qe(t,U.part),_=Math.floor(T/40),Y=Math.floor(d/40),J=Math.floor(j/40),H=Math.floor(N/40);if(!((Y-_+1)*(H-J+1)<=65536)||!pe(D,_,J)||!pe(D,Y,H))continue;let W=-1;for(let K=v.get(D,_,J),Z=0;K>=0&&Z<8;K=p[K],Z++){let te=h[K];if(i[te]!==T||c[te]!==d||u[te]!==j||f[te]!==N||m[te]!==V)continue;let ce=e[a[te]].m,ie=!0;for(let re=0;re<12;re++)if(ce[re]!==B[re]){ie=!1;break}if(ie){W=te;break}}if(W>=0){let K=n?n[R]:0;if(n&&K<n[a[W]])l[W]=a[W],a[W]=R;else if(l[W]<0||n&&K<n[l[W]])l[W]=R;continue}let ne=a.length;i.push(T),c.push(d),u.push(j),f.push(N),a.push(R),l.push(-1),m.push(V),g.push(k[0]),b.push(k[2]),y.push(D),A.push(B[0],B[1],B[2],B[3],B[6],B[9],B[5],B[8],B[11]);for(let K=_;K<=Y;K++)for(let Z=J;Z<=H;Z++){if(!pe(D,K,Z))continue;let te=h.length;h.push(ne),p.push(v.put(D,K,Z,te))}}let M=[0,5,-5,5,-5],z=[0,5,5,-5,-5],C=(R,U,B,G)=>{if(!(U-6>=i[R]-0.5&&U+6<=c[R]+0.5&&G-6>=u[R]-0.5&&G+6<=f[R]+0.5))return!1;let k=R*9,T=m[R],d=g[R],j=b[R],N=U-A[k],D=B-A[k+1],V=G-A[k+2],_=A[k+3]*N+A[k+4]*D+A[k+5]*V,Y=A[k+6]*N+A[k+7]*D+A[k+8]*V,{nx:J,nz:H,mask:W}=T;for(let ne=0;ne<5;ne++){let K=Math.floor((_+M[ne]-d)/20),Z=Math.floor((Y+z[ne]-j)/20);if(K<0||Z<0||K>=J||Z>=H||W[K*H+Z]!==1)return!1}return!0},L=NaN,I=NaN,S=NaN,w=-1,x=-1,P=(R,U,B,G)=>{let k=Math.round(U*2),T=Math.floor(R/40),d=Math.floor(B/40);if(!pe(k,T,d))return de;let j=de;if(!n&&x>=0&&y[x]===k&&(a[x]!==G||l[x]>=0)&&C(x,R,U,B))return 0;if(k!==L||T!==I||d!==S)L=k,I=T,S=d,w=v.get(k,T,d);for(let N=w;N>=0;N=p[N]){let D=h[N],V=a[D];if(V===G&&(V=l[D])<0)continue;if(!C(D,R,U,B))continue;if(!n)return x=D,0;let _=n[V];if(_<j)j=_}return j},O=0;for(let R of e){let U=Qe(t,R.part);if(U)O+=U.nStuds}let E=new Uint8Array(O),F=new Uint8Array(O),X=new be(O,4),se=0,oe=n?new Int32Array(O).fill(de):void 0;for(let R=0,U=0;R<e.length;R++){let B=e[R],G=Qe(t,B.part);if(!G)continue;let k=B.m,T=G.studM,d=k[0],j=k[1],N=k[2],D=k[3],V=k[4],_=k[5],Y=k[6],J=k[7],H=k[8],W=k[9],ne=k[10],K=k[11];for(let Z=0;Z<G.nStuds;Z++,U++){let te=Z*12,ce=T[te+4],ie=T[te+7],re=T[te+10];if(!(Math.abs(Y*ce+J*ie+H*re-1)<0.001&&Math.abs(D*ce+V*ie+_*re)<0.001&&Math.abs(W*ce+ne*ie+K*re)<0.001))continue;F[U]=1;let Re=T[te],Ie=T[te+1],Be=T[te+2],qe=d+D*Re+V*Ie+_*Be,et=j+Y*Re+J*Ie+H*Be,tt=N+W*Re+ne*Ie+K*Be,nt=P(qe,et,tt,R);if(nt!==de){if(E[U]=1,se++,oe)oe[U]=nt}let ye=Math.round(qe),xe=Math.round(et),we=Math.round(tt);if(!pe(ye,xe,we))continue;if(!n){X.put(ye,xe,we,1);continue}let rt=n[R],st=X.get(ye,xe,we);if(st<0||rt<st)X.put(ye,xe,we,rt)}}let ae=new Uint8Array(e.length),le=n?new Int32Array(e.length).fill(de):void 0;for(let R=0;R<e.length;R++){let U=e[R],B=t.parts[U.part];if(!B||!B.under||!Bt(U.m)||o(U.color))continue;let G=B.bbox,k=Math.round((G[3]-G[0])/20),T=Math.round((G[5]-G[2])/20);if(!k||!T||k*T>4096)continue;let d=U.m,j=Math.round(d[1]+G[4]),N=!0,D=0;for(let V=0;V<k&&N;V++)for(let _=0;_<T;_++){let Y=G[0]+10+20*V,J=G[2]+10+20*_,H=d[0]+d[3]*Y+d[5]*J,W=d[2]+d[9]*Y+d[11]*J,ne=Math.round(H),K=Math.round(W),Z=pe(ne,j,K)?X.get(ne,j,K):-1;if(Z<0){N=!1;break}if(Z>D)D=Z}if(N){if(ae[R]=1,le)le[R]=D}}return{nStuds:O,studHidden:E,studUp:F,underHidden:ae,studsHidden:se,studHideStep:oe,underHideStep:le}}function En(e,t,n){let r=(l)=>l.colPart&&t.parts[l.colPart]?l.colPart:n&&l.texPart&&t.parts[l.texPart]?l.texPart:l.part,s=new Map,o=new Map,i=(l)=>{let m=l.colour;if(!m)return String(l.color);let g=o.get(m);if(g!==void 0)return g;let b=t.colorTable?.[l.color],y=b?.hex??t.colors?.[l.color],A=b?Xe({alpha:b.alpha??255,luminance:b.luminance??0,finish:b.finish??{type:"default"}}):"default:op",v=Xe(m);if(g=y&&y.toUpperCase()===m.hex.toUpperCase()&&A===v?String(l.color):m.hex.toUpperCase()+"/"+v,g!==String(l.color))s.set(g,m);return o.set(m,g),g},c=e.map((l)=>({part:r(l),color:i(l),m:l.m,steps:l.steps})),u=c.map((l)=>Pt(l.steps)),f=[...new Set(u)].sort(),a=new Map(f.map((l,m)=>[l,m]));return{all:c,stepOf:u.map((l)=>a.get(l)),nSteps:f.length,localColours:s}}function Te(e,t,n=!0){let r=En(e,t,n);return Sn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Pe="https://ldr-demo.vercel.app/cdn/v1/",Se=new Map,Le=new Map;function Ee(e=Pe,t=fetch){let n=Se.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Se.delete(e)),Se.set(e,n);return n}var kn=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),ke=(e,t)=>kn(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>ke(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,ke(r,t)])):e;function Pn(e,t={}){let n=[],r=0,s={},o={};for(let m of e){let g=m.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let b=new DataView(g).getUint32(0,!0),y=new Uint8Array(g,4+b),A=r;n.push(y),r+=y.byteLength;let v=(4-r%4)%4;if(v)n.push(new Uint8Array(v)),r+=v;for(let[p,h]of Object.entries(m.header.parts??{}))if(!(p in s))s[p]=ke(h,A);for(let[p,h]of Object.entries(m.header.studKinds??{}))if(!(p in o))o[p]=ke(h,A)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+c.length)%4)%4,f=4+c.length+u,a=new Uint8Array(f+r);new DataView(a.buffer).setUint32(0,c.length+u,!0),a.set(c,4),a.fill(32,4+c.length,f);let l=f;for(let m of n)a.set(m,l),l+=m.byteLength;return Ce(a.buffer)}async function Fn(e,t={}){e=[...e];try{return await Ut(e,t)}catch(n){let r=t.cdn??Pe,s=t.fetch??fetch;Se.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await Ut(e,{...t,fetch:o})}catch{throw n}}}async function Ut(e,t){let n=t.cdn??Pe,r=t.fetch??fetch,s=t.gap??16384,o=await Ee(n,r),i=[...new Set([...e].map(ee))],c=[],u=[];for(let p of i){if(Le.has(n+p))continue;let h=o.parts[p];if(h)u.push({name:p,off:h[0],len:h[1],file:h[2]??0});else c.push(p)}u.sort((p,h)=>p.file-h.file||p.off-h.off);let f=[];for(let p of u){let h=f[f.length-1];if(h&&h.file===p.file&&p.off-h.end<=s)h.end=Math.max(h.end,p.off+p.len),h.items.push(p);else f.push({file:p.file,start:p.off,end:p.off+p.len,items:[p]})}let a=0,l=0,m=0,g=new Map,b=async()=>{while(m<f.length){let p=f[m++],h=g.get(p.file);if(h)h=h.subarray(p.start,p.end);else{let M=await r(new URL(o.archives[p.file],n).href,{headers:{Range:`bytes=${p.start}-${p.end-1}`,"Accept-Encoding":"identity"}});if(!M.ok)throw Error(`ldr: parts CDN ${M.status}`);if(l++,h=new Uint8Array(await M.arrayBuffer()),a+=h.byteLength,M.status===200)g.set(p.file,h),h=h.subarray(p.start,p.end)}for(let M of p.items){let z=ve(h.subarray(M.off-p.start,M.off-p.start+M.len)),C=z.buffer.slice(z.byteOffset,z.byteOffset+z.byteLength);Le.set(n+M.name,Ce(C))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,f.length)},b));let y=i.filter((p)=>Le.has(n+p)).map((p)=>Le.get(n+p)),A={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:y.length?Pn(y,A):Ce(Rn(A)),missing:c,requests:l,bytes:a}}function Rn(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function In(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function Ot(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let c of e){let u=c.embedded?t.get(c.part):ee(c.part),f=u?n.parts[u]:void 0;if(!f)continue;if(f[3]!=null)o=!0,r+=f[3];if(!i.has(u))i.add(u),s+=f[1]}return{bodyTris:r,packBytes:s,known:o}}class Fe extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Nt(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Ee(t.cdn??Pe,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(w)=>{if(!w.ok)throw Error(`ldr: ${w.status} fetching ${e}`);return at(await w.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":lt(e)),u=Rt(o,c,{looseGeometry:!1,callouts:t.callouts}),f=performance.now();t.onParsed?.(u),await s;let a=It(o,new Set(u.filter((w)=>w.embedded).map((w)=>w.part)),c),l=(w,x)=>t.maxBodyTris!=null&&w>t.maxBodyTris||t.maxPackBytes!=null&&x>t.maxPackBytes,m=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(w)=>new Fe({...w,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),b="full";if(m){let w=Ot(u,a,await s);if(l(w.known?w.bodyTris:0,w.packBytes)){if(!t.lowCdn)throw g(w);let x=await Ee(t.lowCdn,r).catch(()=>null);if(!x)throw g(w);let P=Ot(u,a,x);if(l(P.known?P.bodyTris:0,P.packBytes))throw g(P);b="low"}}let y=[...u.filter((w)=>!w.embedded).map((w)=>w.part),...a.values()],A=async()=>{let w=await Fn(y,b==="low"?{...t,cdn:t.lowCdn}:t);for(let[x,P]of a){let O=w.pack.header.parts[P];if(O)w.pack.header.parts[x]=O}return{...w,packBytes:w.pack.buffer?.byteLength??w.pack.bytes??0,bodyTris:In(u,w.pack)}},v=await A();if(m&&l(v.bodyTris,v.packBytes)&&b==="full"&&t.lowCdn&&await Ee(t.lowCdn,r).then(()=>!0,()=>!1)){b="low";let w=v;v=await A(),v.requests+=w.requests,v.bytes+=w.bytes}if(m&&l(v.bodyTris,v.packBytes))throw g(v);let{pack:p,missing:h,requests:M,bytes:z}=v,C=new Map([...a].map(([w,x])=>[x,w])),L=h.map((w)=>C.get(w)??w),I=performance.now(),S=t.cull?Te(u,p.header,t.textures!==!1):void 0;return{insts:u,pack:p,tier:b,missing:L,requests:M,bytes:z,cull:S,timings:{fetchModel:i-n,parse:f-i,parts:I-f,...S?{cull:performance.now()-I}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Nt(n,{...r,cull:!1,onParsed:(a)=>self.postMessage({id:t,insts:a})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),c=Te(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,f=[];for(let a of[c.studHidden,c.studUp,c.underHidden,c.studHideStep,c.underHideStep])if(a)f.push(a.buffer);self.postMessage({id:t,cull:c,ms:u},f)}catch(s){if(s instanceof Fe||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
5263
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/load-worker.gen.ts
5264
+ var load_worker_gen_default = 'var Wt=ArrayBuffer,K=Uint8Array,Se=Uint16Array,Xt=Int16Array;var ke=Int32Array,je=function(e,t,n){if(K.prototype.slice)return K.prototype.slice.call(e,t,n);if(t==null||t<0)t=0;if(n==null||n>e.length)n=e.length;var r=new K(n-t);return r.set(e.subarray(t,n)),r},Me=function(e,t,n,r){if(K.prototype.fill)return K.prototype.fill.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;for(;n<r;++n)e[n]=t;return e},Kt=function(e,t,n,r){if(K.prototype.copyWithin)return K.prototype.copyWithin.call(e,t,n,r);if(n==null||n<0)n=0;if(r==null||r>e.length)r=e.length;while(n<r)e[t++]=e[n++]};var Zt=["invalid zstd data","window size too large (>2046MB)","invalid block type","FSE accuracy too high","match distance too far back","unexpected EOF"],Z=function(e,t,n){var r=Error(t||Zt[e]);if(r.code=e,Error.captureStackTrace)Error.captureStackTrace(r,Z);if(!n)throw r;return r},ft=function(e,t,n){var r=0,s=0;for(;r<n;++r)s|=e[t++]<<(r<<3);return s},Yt=function(e,t){return(e[t]|e[t+1]<<8|e[t+2]<<16|e[t+3]<<24)>>>0},Jt=function(e,t){var n=e[0]|e[1]<<8|e[2]<<16;if(n==3126568&&e[3]==253){var r=e[4],s=r>>5&1,o=r>>2&1,i=r&3,c=r>>6;if(r&8)Z(0);var u=6-s,f=i==3?4:i,l=ft(e,u,f);u+=f;var a=c?1<<c:s,p=ft(e,u,a)+(c==1&&256),g=p;if(!s){var b=1<<10+(e[5]>>3);g=b+(b>>3)*(e[5]&7)}if(g>2145386496)Z(1);var y=new K((t==1?p||g:t?0:g)+12);return y[0]=1,y[4]=4,y[8]=8,{b:u+a,y:0,l:0,d:l,w:t&&t!=1?t:y.subarray(12),e:g,o:new ke(y.buffer,0,3),u:p,c:o,m:Math.min(131072,g)}}else if((n>>4|e[3]<<20)==25481893)return Yt(e,4)+8;Z(0)},be=function(e){var t=0;for(;1<<t<=e;++t);return t-1},Ae=function(e,t,n){var r=(t<<3)+4,s=(e[t]&15)+5;if(s>n)Z(3);var o=1<<s,i=o,c=-1,u=-1,f=-1,l=o,a=new Wt(512+(o<<2)),p=new Xt(a,0,256),g=new Se(a,0,256),b=new Se(a,512,o),y=512+(o<<1),w=new K(a,y,o),x=new K(a,y+o);while(c<255&&i>0){var m=be(i+1),d=r>>3,M=(1<<m+1)-1,U=(e[d]|e[d+1]<<8|e[d+2]<<16)>>(r&7)&M,T=(1<<m)-1,k=M-i-1,D=U&T;if(D<k)r+=m,U=D;else if(r+=m+1,U>T)U-=k;if(p[++c]=--U,U==-1)i+=U,w[--l]=c;else i-=U;if(!U)do{var P=r>>3;u=(e[P]|e[P+1]<<8)>>(r&7)&3,r+=2,c+=u}while(u==3)}if(c>255||i)Z(0);var A=0,v=(o>>1)+(o>>3)+3,E=o-1;for(var z=0;z<=c;++z){var S=p[z];if(S<1){g[z]=-S;continue}for(f=0;f<S;++f){w[A]=z;do A=A+v&E;while(A>=l)}}if(A)Z(0);for(f=0;f<o;++f){var I=g[w[f]]++,X=x[f]=s-be(I);b[f]=(I<<X)-o}return[r+7>>3,{b:s,s:w,n:x,t:b}]},Qt=function(e,t){var n=0,r=-1,s=new K(292),o=e[t],i=s.subarray(0,256),c=s.subarray(256,268),u=new Se(s.buffer,268);if(o<128){var f=Ae(e,t+1,6),l=f[0],a=f[1];t+=o;var p=l<<3,g=e[t];if(!g)Z(0);var b=0,y=0,w=a.b,x=w,m=(++t<<3)-8+be(g);for(;;){if(m-=w,m<p)break;var d=m>>3;if(b+=(e[d]|e[d+1]<<8)>>(m&7)&(1<<w)-1,i[++r]=a.s[b],m-=x,m<p)break;d=m>>3,y+=(e[d]|e[d+1]<<8)>>(m&7)&(1<<x)-1,i[++r]=a.s[y],w=a.n[b],b=a.t[b],x=a.n[y],y=a.t[y]}if(++r>255)Z(0)}else{r=o-127;for(;n<r;n+=2){var M=e[++t];i[n]=M>>4,i[n+1]=M&15}++t}var U=0;for(n=0;n<r;++n){var T=i[n];if(T>11)Z(0);U+=T&&1<<T-1}var k=be(U)+1,D=1<<k,P=D-U;if(P&P-1)Z(0);i[r++]=be(P)+1;for(n=0;n<r;++n){var T=i[n];++c[i[n]=T&&k+1-T]}var A=new K(D<<1),v=A.subarray(0,D),E=A.subarray(D);u[k]=0;for(n=k;n>0;--n){var z=u[n];Me(E,n,z,u[n-1]=z+c[n]*(1<<k-n))}if(u[0]!=D)Z(0);for(n=0;n<r;++n){var S=i[n];if(S){var I=u[S];Me(v,n,I,u[S]=I+(1<<k-S))}}return[t,{n:E,b:k,s:v}]},qt=Ae(new K([81,16,99,140,49,198,24,99,12,33,196,24,99,102,102,134,70,146,4]),0,6)[1],en=Ae(new K([33,20,196,24,99,140,33,132,16,66,8,33,132,16,66,8,33,68,68,68,68,68,68,68,68,36,9]),0,6)[1],tn=Ae(new K([32,132,16,66,102,70,68,68,68,68,36,73,2]),0,5)[1],pt=function(e,t){var n=e.length,r=new ke(n);for(var s=0;s<n;++s)r[s]=t,t+=1<<e[s];return r},Ve=new K(new ke([0,0,0,0,16843009,50528770,134678020,202050057,269422093]).buffer,0,36),nn=pt(Ve,0),_e=new K(new ke([0,0,0,0,0,0,0,0,16843009,50528770,117769220,185207048,252579084,16]).buffer,0,53),rn=pt(_e,3),we=function(e,t,n){var r=e.length,s=t.length,o=e[r-1],i=(1<<n.b)-1,c=-n.b;if(!o)Z(0);var u=0,f=n.b,l=(r<<3)-8+be(o)-f,a=-1;for(;l>c&&a<s;){var p=l>>3,g=(e[p]|e[p+1]<<8|e[p+2]<<16)>>(l&7);u=(u<<f|g)&i,t[++a]=n.s[u],l-=f=n.n[u]}if(l!=c||a+1!=s)Z(0)},sn=function(e,t,n){var r=6,s=t.length,o=s+3>>2,i=o<<1,c=o+i;we(e.subarray(r,r+=e[0]|e[1]<<8),t.subarray(0,o),n),we(e.subarray(r,r+=e[2]|e[3]<<8),t.subarray(o,i),n),we(e.subarray(r,r+=e[4]|e[5]<<8),t.subarray(i,c),n),we(e.subarray(r),t.subarray(c),n)},on=function(e,t,n){var r,s=t.b,o=e[s],i=o>>1&3;t.l=o&1;var c=o>>3|e[s+1]<<5|e[s+2]<<13,u=(s+=3)+c;if(i==1){if(s>=e.length)return;if(t.b=s+1,n)return Me(n,e[s],t.y,t.y+=c),n;return Me(new K(c),e[s])}if(u>e.length)return;if(i==0){if(t.b=u,n)return n.set(e.subarray(s,u),t.y),t.y+=c,n;return je(e,s,u)}if(i==2){var f=e[s],l=f&3,a=f>>2&3,p=f>>4,g=0,b=0;if(l<2)if(a&1)p|=e[++s]<<4|(a&2&&e[++s]<<12);else p=f>>3;else if(b=a,a<2)p|=(e[++s]&63)<<4,g=e[s]>>6|e[++s]<<2;else if(a==2)p|=e[++s]<<4|(e[++s]&3)<<12,g=e[s]>>2|e[++s]<<6;else p|=e[++s]<<4|(e[++s]&63)<<12,g=e[s]>>6|e[++s]<<2|e[++s]<<10;++s;var y=n?n.subarray(t.y,t.y+t.m):new K(t.m),w=y.length-p;if(l==0)y.set(e.subarray(s,s+=p),w);else if(l==1)Me(y,e[s++],w);else{var x=t.h;if(l==2){var m=Qt(e,s);g+=s-(s=m[0]),t.h=x=m[1]}else if(!x)Z(0);(b?sn:we)(e.subarray(s,s+=g),y.subarray(w),x)}var d=e[s++];if(d){if(d==255)d=(e[s++]|e[s++]<<8)+32512;else if(d>127)d=d-128<<8|e[s++];var M=e[s++];if(M&3)Z(0);var U=[en,tn,qt];for(var T=2;T>-1;--T){var k=M>>(T<<1)+2&3;if(k==1){var D=new K([0,0,e[s++]]);U[T]={s:D.subarray(2,3),n:D.subarray(0,1),t:new Se(D.buffer,0,1),b:0}}else if(k==2)r=Ae(e,s,9-(T&1)),s=r[0],U[T]=r[1];else if(k==3){if(!t.t)Z(0);U[T]=t.t[T]}}var P=t.t=U,A=P[0],v=P[1],E=P[2],z=e[u-1];if(!z)Z(0);var S=(u<<3)-8+be(z)-E.b,I=S>>3,X=0,re=(e[I]|e[I+1]<<8)>>(S&7)&(1<<E.b)-1;I=(S-=v.b)>>3;var ee=(e[I]|e[I+1]<<8)>>(S&7)&(1<<v.b)-1;I=(S-=A.b)>>3;var ce=(e[I]|e[I+1]<<8)>>(S&7)&(1<<A.b)-1;for(++d;--d;){var fe=E.s[re],ge=E.n[re],se=A.s[ce],ue=A.n[ce],pe=v.s[ee],me=v.n[ee];I=(S-=pe)>>3;var V=1<<pe,h=V+((e[I]|e[I+1]<<8|e[I+2]<<16|e[I+3]<<24)>>>(S&7)&V-1);I=(S-=_e[se])>>3;var F=rn[se]+((e[I]|e[I+1]<<8|e[I+2]<<16)>>(S&7)&(1<<_e[se])-1);I=(S-=Ve[fe])>>3;var L=nn[fe]+((e[I]|e[I+1]<<8|e[I+2]<<16)>>(S&7)&(1<<Ve[fe])-1);if(I=(S-=ge)>>3,re=E.t[re]+((e[I]|e[I+1]<<8)>>(S&7)&(1<<ge)-1),I=(S-=ue)>>3,ce=A.t[ce]+((e[I]|e[I+1]<<8)>>(S&7)&(1<<ue)-1),I=(S-=me)>>3,ee=v.t[ee]+((e[I]|e[I+1]<<8)>>(S&7)&(1<<me)-1),h>3)t.o[2]=t.o[1],t.o[1]=t.o[0],t.o[0]=h-=3;else{var B=h-(L!=0);if(B){if(h=B==3?t.o[0]-1:t.o[B],B>1)t.o[2]=t.o[1];t.o[1]=t.o[0],t.o[0]=h}else h=t.o[0]}for(var T=0;T<L;++T)y[X+T]=y[w+T];X+=L,w+=L;var C=X-h;if(C<0){var R=-C,O=t.e+C;if(R>F)R=F;for(var T=0;T<R;++T)y[X+T]=t.w[O+T];X+=R,F-=R,C=0}for(var T=0;T<F;++T)y[X+T]=y[C+T];X+=F}if(X!=w)while(w<y.length)y[X++]=y[w++];else X=y.length;if(n)t.y+=X;else y=je(y,0,X)}else if(n){if(t.y+=p,w)for(var T=0;T<p;++T)y[T]=y[w+T]}else if(w)y=je(y,w);return t.b=u,y}Z(2)},an=function(e,t){if(e.length==1)return e[0];var n=new K(t);for(var r=0,s=0;r<e.length;++r){var o=e[r];n.set(o,s),s+=o.length}return n};function Ee(e,t){var n=[],r=+!t,s=0,o=0;for(;e.length;){var i=Jt(e,r||t);if(typeof i=="object"){if(r){if(t=null,i.w.length==i.u)n.push(t=i.w),o+=i.u}else n.push(t),i.e=0;for(;!i.l;){var c=on(e,i,t);if(!c)Z(5);if(t)i.e=i.y;else n.push(c),o+=c.length,Kt(i.w,0,c.length),i.w.set(c,i.w.length-c.length)}s=i.b+i.c*4}else s=i;e=e.subarray(s)}return an(n,o)}async function ln(e){let t=e instanceof Uint8Array?e:new Uint8Array(e),n=(r)=>r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);if(t[0]===40&&t[1]===181&&t[2]===47&&t[3]===253)return n(Ee(t));if(t[0]===31&&t[1]===139)return new Response(new Blob([t]).stream().pipeThrough(new DecompressionStream("gzip"))).arrayBuffer();return n(t)}async function mt(e){return new TextDecoder().decode(await ln(e))}var ht=(e)=>decodeURIComponent(e.split(/[?#]/)[0].split("/").pop()||"main.ldr").replace(/\\.(zst|gz)$/i,"")||"main.ldr";function Pe(e){let t=new DataView(e).getUint32(0,!0),n=JSON.parse(new TextDecoder().decode(new Uint8Array(e,4,t))),r=4+t;return{header:n,arr:(o)=>o&&(o[2]==="f32"?new Float32Array(e,r+o[0],o[1]):o[2]==="u16"?new Uint16Array(e,r+o[0],o[1]):o[2]==="u8"?new Uint8Array(e,r+o[0],o[1]):new Uint32Array(e,r+o[0],o[1])),bytes:e.byteLength,buffer:e}}var Y=(e)=>e.trim().toLowerCase().replace(/\\\\/g,"/").replace(/\\/+/g,"/"),He=/^[A-Za-z][A-Za-z0-9_]*$/,Ge=new Map;function We(e){let t=e.toLowerCase(),n=2166136261;for(let s=0;s<t.length;s++)n^=t.charCodeAt(s),n=Math.imul(n,16777619);let r=-1-(n>>>0&1073741823);if(!Ge.has(r))Ge.set(r,t);return r}function Xe(e){let t=e.charCodeAt(0)|32;if(t>=97&&t<=122&&He.test(e))return We(e);if(/^0x/i.test(e))return parseInt(e,16);return+e}var gt=/^~?\\s*moved\\s+to\\s+(.+)$/i,cn=new Set(["FILE","NOFILE","!DATA","!:","STEP","BFC","ROTSTEP","BUFEXCHG","!TEXMAP"]),un=new Set(["FILE","NOFILE","!DATA"]),vt=1000000000000000,Ct=new Set(["part","subpart","primitive","8_primitive","48_primitive","shortcut","helper"]),fn=new Set(["model","submodel","configuration"]),pn=/^(?:!?LDRAW_ORG|Unofficial|Official\\s+LCAD)\\s+(\\S+)/i;function bt(e){let t=pn.exec(e);if(!t)return;let n=t[1].toLowerCase().replace(/^unofficial_/,"");return Ct.has(n)||fn.has(n)?n:void 0}function mn(e){let t=[],n=0;while(n<e.length){while(e[n]===" "||e[n]==="\\t")n++;if(n>=e.length)break;if(e[n]===\'"\'){let r="";n++;while(n<e.length&&e[n]!==\'"\'){if(e[n]==="\\\\"&&n+1<e.length)n++;r+=e[n++]}n++,t.push(r)}else{let r=n;while(r<e.length&&e[r]!==" "&&e[r]!=="\\t")r++;t.push(e.slice(n,r)),n=r}}return t}function hn(e,t=!1){let n=/^\\s*(\\S+)\\s+(.*)$/.exec(e);if(!n)return null;let r=n[1].toUpperCase(),s=r==="PLANAR"?9:r==="CYLINDRICAL"?10:r==="SPHERICAL"?11:0;if(!s)return null;let o=n[2].trim().split(/\\s+/);if(o.length<s+1)return null;let i=o.slice(0,s).map(Number);if(!i.every((a)=>Number.isFinite(a)&&Math.abs(a)<=1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000))return null;if(s>=10&&!(Math.abs(i[9])>=0.000001)||s===11&&!(Math.abs(i[10])>=0.000001))return null;let c=n[2].trim();for(let a=0;a<s;a++)c=c.replace(/^\\S+\\s*/,"");let u=mn(c);if(!u.length)return null;let f={method:r,p1:i.slice(0,3),p2:i.slice(3,6),p3:i.slice(6,9),texture:u[0]};if(s>=10)f.a=i[9];if(s===11)f.b=i[10];let l=u.findIndex((a,p)=>p>0&&a.toUpperCase()==="GLOSSMAP");if(l>0&&u[l+1])f.glossmap=u[l+1];if(t)f.next=!0;return f}var gn=(e)=>{let t=e.replace(/[^A-Za-z0-9+/]/g,"");if(t.length%4===1)t=t.slice(0,-1);let n=t+"=".repeat((4-t.length%4)%4),r=atob(n),s=new Uint8Array(r.length);for(let o=0;o<r.length;o++)s[o]=r.charCodeAt(o);return s};function bn(e){let t=e.length,n=1,r=(l)=>l===32||l===9,s=()=>{while(n<t&&r(e.charCodeAt(n)))n++;let l=n;while(n<t&&!r(e.charCodeAt(n)))n++;return l<n?e.slice(l,n):null},o=s();if(o===null)return null;let i=Array(12);for(let l=0;l<12;l++){let a=s();if(a===null)return null;let p=+a;if(!Number.isFinite(p))return null;i[l]=p}while(n<t&&r(e.charCodeAt(n)))n++;if(n>=t)return null;let c=e.slice(n),u=/[ \\t]{2,}|\\t/.test(c)?c.split(/\\s+/).join(" "):c,f=Xe(o);if(!Number.isFinite(f))return null;return{t:1,color:f,m:i,file:Y(u)}}var dn=[0,12,6,9,12,12];function dt(e){let t=+e[0];if(!(t>=1&&t<=5&&Number.isInteger(t))||e.length<2)return null;let n=Xe(e[1]),r=dn[t];if(!Number.isFinite(n)||e.length<2+r+(t===1?1:0))return null;let s=Array(r);for(let o=0;o<r;o++){let i=+e[2+o];if(!Number.isFinite(i))return null;s[o]=i}if(t===1){let o=Y(e.slice(14).join(" "));return o?{t:1,color:n,m:s,file:o}:null}if(t===2)return{t:2,color:n,p:s};if(t===3)return{t:3,color:n,p:s};if(t===4)return{t:4,color:n,p:s};return{t:5,color:n,p:s}}function Tt(e,t="main.ldr",n={}){let r=!!n.geometryText,s=new Map,o=null,i="",c,u=null,f=[],l=null,a=()=>{if(!u)return;let m=gn(u.chunks.join("")),d=m[0]===137&&m[1]===80&&m[2]===78&&m[3]===71;(c??=new Map).set(Y(u.name),{name:u.name,bytes:m,...d?{mime:"image/png"}:{}}),u=null},p=!0,g=(m)=>{if(a(),o={name:Y(m),cmds:[]},s.set(o.name,o),!i)i=o.name;f=[],l=null,p=!0},b=!1,y=!1,w=()=>{if(y)return;y=!0,s.clear(),o=null,i=""},x=(m,d)=>{if(l){m.tex=l,l=null;return}let M=f[f.length-1];if(!M)return;if(M.fallback){if(!d)m.fallback=!0}else m.tex=M.map};for(let m of e.split(`\n`)){let d=m.trim();if(!d)continue;if(r&&d.charCodeAt(0)>=50&&d.charCodeAt(0)<=53&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){if(u||b)continue;if(!o)g(t);let k=d.slice(2).trimStart(),D=k.search(/\\s/),P={t:d.charCodeAt(0)-48,color:Xe(D<0?k:k.slice(0,D)),p:[],src:d};x(P,!1),o.cmds.push(P),p=!1;continue}if(d.charCodeAt(0)===48&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)){let k=2;while(d.charCodeAt(k)===32||d.charCodeAt(k)===9)k++;let D=k;while(D<d.length&&d.charCodeAt(D)!==32&&d.charCodeAt(D)!==9)D++;let P=d.slice(k,D),A=/[^\\x21-\\x7e]/.test(P)?d.slice(k).trim().split(/\\s+/)[0]:P;if(!cn.has(A)&&!(A.length>=4&&A.length<=6&&un.has(A.toUpperCase()))){if(b||u)continue;if(!o)g(t);let v=d.slice(k),E={t:0,text:v};if(P.charCodeAt(0)===33)E.meta=P;if(l=null,p&&!o.org){let S=bt(v);if(S)o.org=S}let z=v.match(gt);if(z&&!o.movedTo){let S=z[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(S))S+=".dat";o.movedTo=Y(S)}o.cmds.push(E);continue}}if(d.charCodeAt(0)===49&&(d.charCodeAt(1)===32||d.charCodeAt(1)===9)&&!u&&!b){let k=bn(d);if(k){if(!o)g(t);x(k,!1),o.cmds.push(k),p=!1;continue}}let M=d.split(/\\s+/);if(+M[0]===0){let k=d.slice(1).trim(),D=M.length>1&&M[1].length>=4&&M[1].length<=6?M[1].toUpperCase():M[1];if(D==="FILE"){let v=k.slice(5).trimStart().split("\\r")[0].trim();if(v){w(),b=!1,g(v);continue}}if(D==="NOFILE"){a(),o=null,b=!0;continue}if(D==="!DATA"){w(),a(),o=null,b=!1,u={name:k.slice(5).trim(),chunks:[]};continue}if(b)continue;if(u){if(M[1]==="!:")u.chunks.push(M.slice(2).join(""));continue}if(!o)g(t);let P={t:0,text:k};if(M[1]==="STEP")P.step=!0,f=[],l=null;else if(M[1]==="BFC")P.bfc=M.slice(2).join(" ");else if(M[1]==="ROTSTEP")if(P.meta="ROTSTEP",P.step=!0,f=[],l=null,(M[2]??"").toUpperCase()==="END")P.rotstep={x:0,y:0,z:0,mode:"END"};else{let v=(M[5]??"REL").toUpperCase(),E=(z)=>{let S=Number(z);return Number.isFinite(S)?S:0};P.rotstep={x:E(M[2]),y:E(M[3]),z:E(M[4]),mode:["REL","ABS","ADD"].includes(v)?v:"REL"}}else if(M[1]==="BUFEXCHG"){P.meta="BUFEXCHG";let v=(M[2]??"").toUpperCase();P.bufexchg={op:v==="RETRIEVE"?"RETRIEVE":"STORE",buf:M[3]??"A"}}else if(M[1]?.startsWith("!"))P.meta=M[1];if(p&&!o.org){let v=bt(k);if(v)o.org=v}if(M[1]==="!TEXMAP"){let v=(M[2]??"").toUpperCase();if(l=null,v==="START"||v==="NEXT"){let E=hn(k.replace(/^!TEXMAP\\s+\\S+/i,""),v==="NEXT");if(P.texmap={op:v,...E?{map:E}:{}},E)if((o.texmaps??=[]).push(E),v==="START")f.push({map:E,fallback:!1});else l=E}else if(v==="FALLBACK"){P.texmap={op:v};let E=f[f.length-1];if(E)E.fallback=!0}else if(v==="END")P.texmap={op:v},f.pop()}else if(M[1]==="!:"){l=null;let v=dt(M.slice(2));if(v)x(v,!0),P.geom=v}else l=null;let A=k.match(gt);if(A&&!o.movedTo){let v=A[1].trim().replace(/\\\\/g,"/");if(!/\\.(dat|ldr|mpd)$/i.test(v))v+=".dat";o.movedTo=Y(v)}o.cmds.push(P);continue}if(u||b)continue;if(!o)g(t);let T=dt(M);if(!T){if(/^[2-5][ \\t]/.test(d))p=!1;continue}x(T,!1),o.cmds.push(T),p=!1}return a(),c?{main:i,files:s,data:c}:{main:i,files:s}}var Hn=Math.PI/180;function Lt(e,t){let n=(r)=>[t[3]*r[0]+t[4]*r[1]+t[5]*r[2]+t[0],t[6]*r[0]+t[7]*r[1]+t[8]*r[2]+t[1],t[9]*r[0]+t[10]*r[1]+t[11]*r[2]+t[2]];return{...e,p1:n(e.p1),p2:n(e.p2),p3:n(e.p3)}}function St(e,t){let[n,r,s,o,i,c,u,f,l,a,p,g]=e,[b,y,w,x,m,d,M,U,T,k,D,P]=t;return[o*b+i*y+c*w+n,u*b+f*y+l*w+r,a*b+p*y+g*w+s,o*x+i*M+c*k,o*m+i*U+c*D,o*d+i*T+c*P,u*x+f*M+l*k,u*m+f*U+l*D,u*d+f*T+l*P,a*x+p*M+g*k,a*m+p*U+g*D,a*d+p*T+g*P]}var Ke=[0,0,0,1,0,0,0,1,0,0,0,1];var yt=new WeakMap,yn=/^(s|8|48)\\//;function Ze(e,t){let n=e.files.get(Y(t));if(!n)return"part";let r=yt.get(n);if(r)return r;if(n.org)r=Ct.has(n.org)?"part":"model";else if(n.name===e.main)r="model";else r=n.cmds.some((s)=>s.t>=2||s.t===0&&!!s.geom||s.t===1&&yn.test(s.file))?"part":"model";return yt.set(n,r),r}var xt=new WeakMap;function kt(e){let t=xt.get(e);if(t)return t;t=[];let n=0;for(let r of e.cmds){if(r.t===0&&r.step){n++;continue}if((r.t>=2||r.t===0&&r.geom&&r.geom.t>=2)&&t[t.length-1]!==n)t.push(n)}return xt.set(e,t),t}var wt=(e)=>e>16777215?"0x"+e.toString(16).toUpperCase():e<0?Ge.get(e)??String(e):String(e),xn=(e)=>e.t===0?"0 "+e.text:e.t===1?`1 ${wt(e.color)} ${e.m.join(" ")} ${e.file}`:e.src?e.src:`${e.t} ${wt(e.color)} ${e.p.join(" ")}`,Ye=(e,t)=>`${Y(e)}#${t}`;function wn(e,t){let n=[],r=0,s=(o)=>!!o&&o.t===0&&o.texmap?.op==="NEXT";for(let o of e.cmds){if(o.t===0){if(o.step){r++;continue}if(o.bfc!==void 0||o.meta==="!COLOUR"){n.push(o);continue}if(r!==t)continue;if(o.texmap)n.push(o);else if(o.geom){if(o.geom.t>=2)n.push(o);else if(s(n[n.length-1]))n.pop()}continue}if(r!==t)continue;if(o.t===1){if(s(n[n.length-1]))n.pop();continue}n.push(o)}return{name:Ye(e.name,t),cmds:n}}function Et(e,t){return[`0 ldr: own geometry of ${e.name}, step ${t}`,...wn(e,t).cmds.map(xn)].join(`\n`)+`\n`}function Je(e){let t=2166136261;for(let n=0;n<e.length;n++)t^=e.charCodeAt(n),t=Math.imul(t,16777619);return(t>>>0).toString(16).padStart(8,"0")}function Pt(e){let[t,n,r,s,o,i,c,u,f,l,a,p]=e,g=u*p-f*a,b=-(c*p-f*l),y=c*a-u*l,w=s*g+o*b+i*y;if(!Number.isFinite(w)||Math.abs(w)<0.000000000001)return null;let x=1/w,m=[g*x,-(o*p-i*a)*x,(o*f-i*u)*x,b*x,(s*p-i*l)*x,-(s*f-i*c)*x,y*x,-(s*a-o*l)*x,(s*u-o*c)*x];return[-(m[0]*t+m[1]*n+m[2]*r),-(m[3]*t+m[4]*n+m[5]*r),-(m[6]*t+m[7]*n+m[8]*r),...m]}var Mn=(e)=>String(+e.toFixed(6)||0),Mt=(e)=>\'"\'+e.replace(/\\\\/g,"\\\\\\\\").replace(/"/g,"\\\\\\"")+\'"\';function Ft(e,t){let n=[...t.p1,...t.p2,...t.p3,...t.method!=="PLANAR"?[t.a??360]:[],...t.method==="SPHERICAL"?[t.b??180]:[]].map(Mn).join(" "),r=`0 ldr: ${e} with a model-level !TEXMAP\n0 BFC CERTIFY CCW\n0 !TEXMAP START ${t.method} ${n} ${Mt(t.texture)}${t.glossmap?" GLOSSMAP "+Mt(t.glossmap):""}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${Y(e)}\n0 !TEXMAP END\n`;return{name:`${Y(e)}#tex-${Je(r)}`,source:r}}var An=(e,t)=>{let n=[,,,,,,,,,];for(let r=0;r<3;r++)for(let s=0;s<3;s++)n[r*3+s]=e[r*3]*t[s]+e[r*3+1]*t[3+s]+e[r*3+2]*t[6+s];return n};function vn(e,t,n){let r=Math.PI/180,s=Math.sin(e*r),o=Math.cos(e*r),i=Math.sin(t*r),c=Math.cos(t*r),u=Math.sin(n*r),f=Math.cos(n*r);return[c*f,-c*u,i,o*u+s*i*f,o*f-s*i*u,-s*c,s*u-o*i*f,s*f+o*i*u,o*c]}var At=new WeakMap;function It(e){let t=At.get(e);if(t)return t;let n=[],r=null;for(let s of e.cmds){if(s.t!==0||!s.step)continue;let o=s.rotstep;if(o)if(o.mode==="END")r=null;else{let i=vn(o.x,o.y,o.z);r=o.mode==="ABS"?{abs:!0,m:i,rotstep:o}:o.mode==="ADD"&&r?{abs:r.abs,m:An(r.m,i),rotstep:o}:{abs:!1,m:i,rotstep:o}}n.push(r)}return n.push(r),At.set(e,n),n}class Qe extends Error{limit;code="ldr-model-limit";constructor(e,t){super(`ldr: ${e} expands past ${t.toLocaleString("en-US")} (see maxInstances)`);this.limit=t;this.name="ModelLimitError"}}var Cn=(e)=>{for(let t=0;t<12;t++)if(!(Math.abs(e[t])<=vt))return!1;return!0},Rt=999999,Nt=(e)=>e.map((t)=>String(t).padStart(6,"0")).join(".")+"~",Ut=new WeakMap,Bt=new WeakMap;function Tn(e,t){let n=Bt.get(t);if(!n)n={head:[...t.values()].map((o)=>{let i=Ut.get(o)??"",c=i.indexOf("!COLOUR");return c<0?"":"0 "+i.slice(c).trim().replace(/\\s+/g," ")}).filter(Boolean).join(`\n`),parts:new Map},Bt.set(t,n);let r=n.parts.get(e);if(!r){let s=Y(e),o=`0 ldr: ${s} placed in a model\'s !COLOUR scope\n0 BFC CERTIFY CCW\n${n.head}\n1 16 0 0 0 1 0 0 0 1 0 0 0 1 ${s}\n`;r={name:`${s}#col-${Je(o)}`,source:o},n.parts.set(e,r)}return r}function Ln(e,t={}){let n=[],r=t.maxDepth??64,s=t.looseGeometry!==!1,o=!!t.textures,i=!!t.callouts,c=new Map,u=0,f=new Set,l=t.maxInstances??2000000,a=0,p=(b,y)=>{let w=b.name+"#"+y,x=c.get(w);if(!x){let m;x=Object.assign(()=>m??=Et(b,y),{file:b,step:y}),c.set(w,x)}return x},g=(b,y,w,x,m,d,M,U,T=null,k=[],D=[],P=void 0,A=null)=>{let v=b.files.get(y);if(!v||M>r||f.has(v))return;if(++a>l)throw new Qe("model",l);f.add(v);let E=A,z=0,S=M>0?++u:0,I=i&&S?[...k,S]:k,X=i&&S?[...D,w]:D,re=i&&!T?new Map:null,ee=-1,ce=0,fe=(V,h,F,L,B,C,R)=>{if(ee!==z)ee=z,ce=0;let O=re?.get(z+"|"+h);if(O)return O.n++,g(V,V===b?h:V.main,F,L,m+"/"+h,[...B,Rt],M+1,C,[...B,Rt],I,X,R,E);let _=[...B,ce++],N=n.length;g(V,V===b?h:V.main,F,L,m+"/"+h,_,M+1,C,T,I,X,R,E),re?.set(z+"|"+h,{n:1,from:N,to:n.length})},ge=It(v),se=s?kt(v):[],ue=0,pe=(V,h,F,L,B,C,R,O,_)=>{if(T)L=T;if(++a>l)throw new Qe("model",l);let N={part:V,color:h,m:F,step:L[0],steps:L,localStep:B,path:m};if(O)N.colour=O;if(S){if(N.sub=S,i)N.subPath=I,N.subMats=X}if(C)N.embedded=!0;if(R){let H=Ft(V,R);N.texPart=H.name,N.texSource=H.source}else if(_){let H=Tn(V,_);N.colPart=H.name,N.colSource=H.source}let j=ge[B];if(j)N.view=j;return n.push(N),N},me=(V)=>{while(ue<se.length&&se[ue]<=V){let h=se[ue++];pe(Ye(v.name,h),x,w,[...d,h],h,!1,null,P,A).source=p(v,h)}};for(let V of v.cmds){if(V.t===0&&V.step){z++;continue}let h=V;if(h.t>=2||h.t===0&&h.geom&&h.geom.t>=2){me(z);continue}if(h.t===0){if(h.meta==="!COLOUR"){let j=kn(h.text);if(j&&j.code!==16&&j.code!==24)Ut.set(j,h.text),(E=new Map(E??[])).set(j.code,j);continue}if(o&&h.geom?.t===1)h=h.geom;else continue}if(h.t!==1)continue;if(o&&h.fallback)continue;let F=St(w,h.m);if(!Cn(F))continue;let L=h.color===16?x:h.color,B=h.color===16?P:E?.get(h.color),C=[...d,z],R=o?h.tex??U:null,O=R?Pt(h.m):null,_=R&&O?Lt(R,O):null;if(b.files.has(h.file)){if(Ze(b,h.file)==="model"){fe(b,h.file,F,L,C,_,B);continue}pe(h.file,L,F,C,z,!0,_,B,E);continue}let N=t.resolveModel?.(h.file);if(N){fe(N,h.file,F,L,C,_,B);continue}pe(h.file,L,F,C,z,!1,_,B,E)}if(me(1/0),f.delete(v),re){for(let V of re.values())if(V.n>1)for(let h=V.from;h<V.to;h++)n[h].mult??=V.n}};if(Ze(e,e.main)==="part"){if(e.files.get(e.main))n.push({part:e.main,color:16,m:[...Ke],step:0,steps:[0],localStep:0,path:e.main,embedded:!0});return n}return g(e,e.main,Ke,16,e.main,[],0,null),n}function Ot(e,t="main.ldr",n){return Ln(Tt(e,t,{geometryText:!0}),n)}var Sn=new Set(["CHROME","PEARLESCENT","RUBBER","MATTE_METALLIC","METAL","MATERIAL"]);function qe(e){if(!e)return null;if(e.startsWith("#")&&/^#[0-9A-Fa-f]{6}$/.test(e))return e.toUpperCase();if(/^0x[0-9A-Fa-f]{6}$/i.test(e))return("#"+e.slice(2)).toUpperCase();return null}function Dt(e,t){let n={value:"#FFFFFF",fraction:0.5};while(t<e.length){let r=e[t].toUpperCase(),s=e[t+1];if(r==="VALUE"){let o=qe(s);if(o)n.value=o;t+=2}else if(r==="ALPHA")n.alpha=+s,t+=2;else if(r==="LUMINANCE")n.luminance=+s,t+=2;else if(r==="FRACTION")n.fraction=+s,t+=2;else if(r==="VFRACTION")n.vfraction=+s,t+=2;else if(r==="SIZE")n.size=+s,t+=2;else if(r==="MINSIZE")n.minsize=+s,t+=2;else if(r==="MAXSIZE")n.maxsize=+s,t+=2;else break}return{grain:n,next:t}}function kn(e){let t=e.indexOf("!COLOUR");if(t<0)return null;let n=e.slice(t+7).trim().split(/\\s+/).filter(Boolean);if(n.length<2)return null;let r=n[0],s=NaN,o="#FF00FF",i="#333333",c=255,u=0,f={type:"default"},l=1;while(l<n.length){let a=n[l].toUpperCase(),p=n[l+1];if(a==="CODE")s=p!==void 0&&He.test(p)?We(p):p!==void 0&&/^\\d+$/.test(p)?+p:NaN,l+=2;else if(a==="VALUE"){let g=qe(p);if(g)o=g;l+=2}else if(a==="EDGE")i=qe(p)??p,l+=2;else if(a==="ALPHA")c=+p,l+=2;else if(a==="LUMINANCE")u=+p,l+=2;else if(a==="CHROME")f={type:"chrome"},l+=1;else if(a==="PEARLESCENT")f={type:"pearlescent"},l+=1;else if(a==="RUBBER")f={type:"rubber"},l+=1;else if(a==="MATTE_METALLIC")f={type:"matte_metallic"},l+=1;else if(a==="METAL")f={type:"metal"},l+=1;else if(a==="MATERIAL"){let g=(n[l+1]||"").toUpperCase();if(g==="GLITTER"){let{grain:b,next:y}=Dt(n,l+2);f={type:"glitter",material:b},l=y}else if(g==="SPECKLE"){let{grain:b,next:y}=Dt(n,l+2);f={type:"speckle",material:b},l=y}else if(g==="FABRIC"){let b=(n[l+2]||"").toUpperCase(),y=["VELVET","CANVAS","STRING","FUR"].includes(b)?b.toLowerCase():void 0;f={type:"fabric",kind:y},l+=y?3:2}else l=n.length}else if(Sn.has(a))l+=1;else l+=1}if(Number.isNaN(s)||!o)return null;return{code:s,name:r,hex:o,edge:i,alpha:Number.isFinite(c)?c:255,luminance:Number.isFinite(u)?u:0,finish:f}}function En(e){let t=Math.max(0,Math.min(1,(e.alpha??255)/255)),n=t<1,r=Math.max(0,Math.min(1,(e.luminance??0)/255)),s={opacity:t,transparent:n,depthWrite:!n,emissive:r,clearcoat:0,clearcoatRoughness:0,sheen:0,sheenRoughness:0};switch(e.finish?.type??"default"){case"chrome":return{...s,metalness:1,roughness:0,finish:"chrome"};case"pearlescent":return{...s,metalness:0.25,roughness:0.3,clearcoat:0.5,clearcoatRoughness:0.25,sheen:0.4,sheenRoughness:0.35,finish:"pearlescent"};case"rubber":return{...s,metalness:0,roughness:0.9,finish:"rubber"};case"matte_metallic":return{...s,metalness:0.4,roughness:0.8,finish:"matte_metallic"};case"metal":return{...s,metalness:0.85,roughness:0.2,finish:"metal"};case"glitter":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.35,roughness:0.25,clearcoat:1,clearcoatRoughness:0.08,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"glitter"}}case"speckle":{let i=e.finish.material,c=i.size??(i.minsize!=null&&i.maxsize!=null?(i.minsize+i.maxsize)/2:1);return{...s,metalness:0.2,roughness:0.55,particleHex:i.value,particleFraction:i.fraction,particleSize:c,finish:"speckle"}}case"fabric":return{...s,metalness:0,roughness:0.85,sheen:0.65,sheenRoughness:0.75,finish:"fabric"};default:return{...s,metalness:0,roughness:0.45,finish:"default"}}}function et(e){let t=En(e),n=!t.transparent?"op":t.opacity>=0.75?"a200":t.opacity>=0.4?"a128":`a${Math.round(t.opacity*255)}`,r=t.emissive>0?`L${Math.round(t.emissive*16)}`:"",s=`${t.finish}:${n}${r}`;if(t.particleHex)s+=`:${t.particleHex}:${(t.particleFraction??0).toFixed(2)}`;return s}function Pn(e,t){let n=new Map,r=null,s=!1,o=!1;for(let i of e.split(/\\r?\\n/)){let c=/^\\s*0\\s+FILE\\s+(\\S[^\\r]*)/i.exec(i);if(c){if(!s)n.clear();s=!0,o=!1,r=[],n.set(Y(c[1]),r);continue}if(/^\\s*0\\s+(NOFILE|!DATA)(\\s|$)/i.test(i)){if(!s&&/!DATA/i.test(i))n.clear(),s=!0;r=null,o=!0;continue}if(!r){if(s||o)continue;r=[],n.set(Y(t),r)}let u=i.trim().replace(/\\s+/g," ");if(u)r.push(u)}return n}var Fn=(e)=>{if(!e.startsWith("1 "))return null;let t=e.split(" ");return t.length>=15?Y(t.slice(14).join(" ")):null};function In(e){let t=2166136261,n=1523705862;for(let r=0;r<e.length;r++){let s=e.charCodeAt(r);t=Math.imul(t^s,16777619),n=Math.imul(n^s,16777629)^n>>>15}return(t>>>0).toString(16).padStart(8,"0")+(n>>>0).toString(16).padStart(8,"0")}function zt(e,t,n="main.ldr"){let r=Pn(e,n),s=new Map;for(let o of t){let i=Y(o);if(!r.has(i)||s.has(i))continue;let c=new Set([i]),u=[i];while(u.length)for(let l of r.get(u.pop())){let a=Fn(l);if(a&&r.has(a)&&!c.has(a))c.add(a),u.push(a)}let f=[i,...[...c].filter((l)=>l!==i).sort()].map((l)=>"0 FILE "+(l===i?"":l)+`\n`+r.get(l).join(`\n`)).join(`\n`);s.set(i,`emb/${In(f)}.dat`)}return s}var $t=(e,t=0)=>Math.abs(e[t+7]-1)<0.001&&Math.abs(e[t+4])<0.001&&Math.abs(e[t+10])<0.001,jt=new WeakMap,tt=null,nt="",rt=null;function st(e,t){if(e===tt&&t===nt)return rt;let n=jt.get(e);if(!n)jt.set(e,n=new Map);let r=n.get(t);if(r!==void 0)return tt=e,nt=t,rt=r,r;let s=e.parts[t];if(!s)return n.set(t,null),null;let o=s.studs.length,i=new Float64Array(o*12),c=[],u=[];s.studs.forEach((g,b)=>{c.push(g[0]),u.push(g[1]);for(let y=0;y<12;y++)i[b*12+y]=g[2+y]});let f=null,l=0,a=0;if(s.mask){l=s.mask[0],a=s.mask[1];let g=s.mask[2];f=new Uint8Array(g.length);for(let b=0;b<g.length;b++)f[b]=g.charCodeAt(b)===49?1:0}let p=!!f;if(f){for(let g=0;g<f.length;g++)if(f[g]!==1){p=!1;break}}return n.set(t,r={nStuds:o,studM:i,kind:c,color:u,mask:f,nx:l,nz:a,full:p}),tt=e,nt=t,rt=r,r}var ye=1073741824;class de{t;tag;mask;size=0;shift;constructor(e=1024,t=-1){let n=1024;while(n<e*2)n*=2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.shift=t}slot(e,t,n){let r=this.shift;if(r<0){let o=Math.imul(e,2654435761)^Math.imul(t,2246822507)^Math.imul(n,3266489909);return o^=o>>>15,o=Math.imul(o,739982445),o^=o>>>12,o&this.mask}let s=Math.imul(e>>r+2,2654435761)^Math.imul(t,2246822507)^Math.imul(n>>r+2,3266489909);return s^=s>>>15,s=Math.imul(s,739982445),s^=s>>>12,(s<<4|(e>>r&3)<<2|n>>r&3)&this.mask}static tagOf(e,t,n){return Math.imul(e^Math.imul(t,374761393)^Math.imul(n,668265261),2654435761)>>>24|1}get(e,t,n){let r=de.tagOf(e,t,n),s=this.tag,o=this.t,i=this.mask,c=this.slot(e,t,n);for(;;){let u=s[c];if(u===0)return-1;if(u===r){let f=c<<2;if(o[f]===e&&o[f+1]===t&&o[f+2]===n)return o[f+3]}c=c+1&i}}put(e,t,n,r){if((this.size+1)*2>this.tag.length)this.grow();let s=de.tagOf(e,t,n),o=this.tag,i=this.t,c=this.mask,u=this.slot(e,t,n);for(;;){let f=o[u],l=u<<2;if(f===0)return o[u]=s,i[l]=e,i[l+1]=t,i[l+2]=n,i[l+3]=r,this.size++,-1;if(f===s&&i[l]===e&&i[l+1]===t&&i[l+2]===n){let a=i[l+3];return i[l+3]=r,a}u=u+1&c}}grow(){let e=this.t,t=this.tag,n=t.length*2;this.t=new Int32Array(n*4),this.tag=new Uint8Array(n),this.mask=n-1,this.size=0;for(let r=0;r<t.length;r++)if(t[r]){let s=r<<2;this.put(e[s],e[s+1],e[s+2],e[s+3])}}}class Vt{grp=new de(64);gBits=[];gX0=[];gZ0=[];gNz=[];gNx=[];bits;rest;lk=NaN;lpx=NaN;lpz=NaN;lg=-1;group(e,t,n){if(e!==this.lk||t!==this.lpx||n!==this.lpz)this.lk=e,this.lpx=t,this.lpz=n,this.lg=this.grp.get(e,t,n);return this.lg}constructor(e,t,n,r){let s=[],o=[],i=[],c=[],u=[];for(let a=0;a<r;a++){let p=e[a],g=t[a],b=n[a],y=(p%20+20)%20,w=(b%20+20)%20,x=this.group(g,y,w);if(x<0)x=s.length,this.grp.put(g,y,w,x),this.lg=x,s.push(0),o.push(p),i.push(p),c.push(b),u.push(b);if(s[x]++,p<o[x])o[x]=p;else if(p>i[x])i[x]=p;if(b<c[x])c[x]=b;else if(b>u[x])u[x]=b}let f=0,l=0;for(let a=0;a<s.length;a++){let p=(i[a]-o[a])/20+1,g=(u[a]-c[a])/20+1,b=p*g;if(this.gX0.push(o[a]),this.gZ0.push(c[a]),this.gNx.push(p),this.gNz.push(g),b<=64*s[a]+1024&&f+b<2147483648)this.gBits.push(f),f+=b;else this.gBits.push(-1),l+=s[a]}this.bits=new Uint8Array(Math.ceil(f/8)),this.rest=new de(l);for(let a=0;a<r;a++){let p=e[a],g=t[a],b=n[a],y=this.group(g,(p%20+20)%20,(b%20+20)%20),w=this.gBits[y];if(w<0){this.rest.put(p,g,b,1);continue}let x=w+(p-this.gX0[y])/20*this.gNz[y]+(b-this.gZ0[y])/20;this.bits[x>>>3]|=1<<(x&7)}}has(e,t,n){let r=this.group(t,(e%20+20)%20,(n%20+20)%20);if(r<0)return!1;let s=this.gBits[r];if(s<0)return this.rest.get(e,t,n)>=0;let o=(e-this.gX0[r])/20,i=(n-this.gZ0[r])/20;if(o<0||i<0||o>=this.gNx[r]||i>=this.gNz[r])return!1;let c=s+o*this.gNz[r]+i;return(this.bits[c>>>3]&1<<(c&7))!==0}}var Rn=(e,t,n,r)=>e===0&&r===0&&(t===1||t===-1)&&(n===1||n===-1)||t===0&&n===0&&(e===1||e===-1)&&(r===1||r===-1),xe=(e,t,n)=>e>-ye&&e<ye&&t>-ye&&t<ye&&n>-ye&&n<ye,ve=2147483647;function Bn(e,t){let n=e.colorTable?.[t];if(n)return(n.alpha??255)<255;return t.charCodeAt(0)===35&&/\\/[^:/]*:a\\d/.test(t)}function Dn(e,t,n){let s=new Map,o=(h)=>{let F=s.get(h);if(F===void 0)s.set(h,F=Bn(t,h));return F},i=[],c=[],u=[],f=[],l=[],a=[],p=[],g=[],b=[],y=[],w=[],x=[],m=new de(e.length*2),d=[],M=[];for(let h=0;h<e.length;h++){let F=e[h],L=F.m,B=t.parts[F.part];if(!B||!B.mask||!$t(L)||o(F.color))continue;let C=B.bbox,R=1/0,O=-1/0,_=1/0,N=-1/0;for(let G=0;G<2;G++)for(let W=0;W<2;W++){let J=G?C[3]:C[0],he=W?C[5]:C[2],le=L[0]+L[3]*J+L[5]*he,ne=L[2]+L[9]*J+L[11]*he;if(le<R)R=le;if(le>O)O=le;if(ne<_)_=ne;if(ne>N)N=ne}let j=Math.round((L[1]+C[4])*2),H=st(t,F.part),Q=Math.floor(R/40),ie=Math.floor(O/40),oe=Math.floor(_/40),ae=Math.floor(N/40);if(!((ie-Q+1)*(ae-oe+1)<=65536)||!xe(j,Q,oe)||!xe(j,ie,ae))continue;let q=-1;for(let G=m.get(j,Q,oe),W=0;G>=0&&W<8;G=d[G],W++){let J=M[G];if(i[J]!==R||c[J]!==O||u[J]!==_||f[J]!==N||p[J]!==H)continue;let he=e[l[J]].m,le=!0;for(let ne=0;ne<12;ne++)if(he[ne]!==L[ne]){le=!1;break}if(le){q=J;break}}if(q>=0){let G=n?n[h]:0;if(n&&G<n[l[q]])a[q]=l[q],l[q]=h;else if(a[q]<0||n&&G<n[a[q]])a[q]=h;continue}let te=l.length;i.push(R),c.push(O),u.push(_),f.push(N),l.push(h),a.push(-1),p.push(H),g.push(C[0]),b.push(C[2]),y.push(j),w.push(L[0],L[1],L[2],L[3],L[6],L[9],L[5],L[8],L[11]),x.push(H.full&&C[3]-C[0]<=20*H.nx&&C[5]-C[2]<=20*H.nz&&L[4]===0&&L[6]===0&&L[8]===0&&L[10]===0&&Rn(L[3],L[5],L[9],L[11])?1:0);for(let G=Q;G<=ie;G++)for(let W=oe;W<=ae;W++){if(!xe(j,G,W))continue;let J=M.length;M.push(te),d.push(m.put(j,G,W,J))}}let U=[0,5,-5,5,-5],T=[0,5,5,-5,-5],k=(h,F,L,B)=>{if(!(F-6>=i[h]-0.5&&F+6<=c[h]+0.5&&B-6>=u[h]-0.5&&B+6<=f[h]+0.5))return!1;if(x[h]===1)return!0;let C=h*9,R=p[h],O=g[h],_=b[h],N=F-w[C],j=L-w[C+1],H=B-w[C+2],Q=w[C+3]*N+w[C+4]*j+w[C+5]*H,ie=w[C+6]*N+w[C+7]*j+w[C+8]*H,{nx:oe,nz:ae,mask:q}=R;for(let te=0;te<5;te++){let G=Math.floor((Q+U[te]-O)/20),W=Math.floor((ie+T[te]-_)/20);if(G<0||W<0||G>=oe||W>=ae||q[G*ae+W]!==1)return!1}return!0},D=NaN,P=NaN,A=NaN,v=-1,E=-1,z=(h,F,L,B)=>{let C=Math.round(F*2),R=Math.floor(h/40),O=Math.floor(L/40);if(!xe(C,R,O))return ve;let _=ve;if(!n&&E>=0&&y[E]===C&&(l[E]!==B||a[E]>=0)&&k(E,h,F,L))return 0;if(C!==D||R!==P||O!==A)D=C,P=R,A=O,v=m.get(C,R,O);for(let N=v;N>=0;N=d[N]){let j=M[N],H=l[j];if(H===B&&(H=a[j])<0)continue;if(!k(j,h,F,L))continue;if(!n)return E=j,0;let Q=n[H];if(Q<_)_=Q}return _},S=0;for(let h of e){let F=st(t,h.part);if(F)S+=F.nStuds}let I=new Uint8Array(S),X=new Uint8Array(S),re=0,ee=n?new de(S,4):null,ce=n?null:new Int32Array(S),fe=n?null:new Int32Array(S),ge=n?null:new Int32Array(S),se=0,ue=n?new Int32Array(S).fill(ve):void 0;for(let h=0,F=0;h<e.length;h++){let L=e[h],B=st(t,L.part);if(!B)continue;let C=L.m,R=B.studM,O=C[0],_=C[1],N=C[2],j=C[3],H=C[4],Q=C[5],ie=C[6],oe=C[7],ae=C[8],q=C[9],te=C[10],G=C[11];for(let W=0;W<B.nStuds;W++,F++){let J=W*12,he=R[J+4],le=R[J+7],ne=R[J+10];if(!(Math.abs(ie*he+oe*le+ae*ne-1)<0.001&&Math.abs(j*he+H*le+Q*ne)<0.001&&Math.abs(q*he+te*le+G*ne)<0.001))continue;X[F]=1;let Oe=R[J],ze=R[J+1],$e=R[J+2],ot=O+j*Oe+H*ze+Q*$e,it=_+ie*Oe+oe*ze+ae*$e,at=N+q*Oe+te*ze+G*$e,lt=z(ot,it,at,h);if(lt!==ve){if(I[F]=1,re++,ue)ue[F]=lt}let Ce=Math.round(ot),Te=Math.round(it),Le=Math.round(at);if(!xe(Ce,Te,Le))continue;if(!ee){ce[se]=Ce,fe[se]=Te,ge[se++]=Le;continue}let ct=n[h],ut=ee.get(Ce,Te,Le);if(ut<0||ct<ut)ee.put(Ce,Te,Le,ct)}}let pe=ee?null:new Vt(ce,fe,ge,se),me=new Uint8Array(e.length),V=n?new Int32Array(e.length).fill(ve):void 0;for(let h=0;h<e.length;h++){let F=e[h],L=t.parts[F.part];if(!L||!L.under||!$t(F.m)||o(F.color))continue;let B=L.bbox,C=Math.round((B[3]-B[0])/20),R=Math.round((B[5]-B[2])/20);if(!C||!R||C*R>4096)continue;let O=F.m,_=Math.round(O[1]+B[4]),N=!0,j=0;for(let H=0;H<C&&N;H++)for(let Q=0;Q<R;Q++){let ie=B[0]+10+20*H,oe=B[2]+10+20*Q,ae=O[0]+O[3]*ie+O[5]*oe,q=O[2]+O[9]*ie+O[11]*oe,te=Math.round(ae),G=Math.round(q),W=!xe(te,_,G)?-1:ee?ee.get(te,_,G):pe.has(te,_,G)?1:-1;if(W<0){N=!1;break}if(W>j)j=W}if(N){if(me[h]=1,V)V[h]=j}}return{nStuds:S,studHidden:I,studUp:X,underHidden:me,studsHidden:re,studHideStep:ue,underHideStep:V}}function Nn(e,t,n){let r=(a)=>a.colPart&&t.parts[a.colPart]?a.colPart:n&&a.texPart&&t.parts[a.texPart]?a.texPart:a.part,s=new Map,o=new Map,i=(a)=>{let p=a.colour;if(!p)return String(a.color);let g=o.get(p);if(g!==void 0)return g;let b=t.colorTable?.[a.color],y=b?.hex??t.colors?.[a.color],w=b?et({alpha:b.alpha??255,luminance:b.luminance??0,finish:b.finish??{type:"default"}}):"default:op",x=et(p);if(g=y&&y.toUpperCase()===p.hex.toUpperCase()&&w===x?String(a.color):p.hex.toUpperCase()+"/"+x,g!==String(a.color))s.set(g,p);return o.set(p,g),g},c=e.map((a)=>({part:r(a),color:i(a),m:a.m,steps:a.steps})),u=c.map((a)=>Nt(a.steps)),f=[...new Set(u)].sort(),l=new Map(f.map((a,p)=>[a,p]));return{all:c,stepOf:u.map((a)=>l.get(a)),nSteps:f.length,localColours:s}}function Fe(e,t,n=!0){let r=Nn(e,t,n);return Dn(r.all,t,r.nSteps>1?r.stepOf:void 0)}var Ne="https://ldr-demo.vercel.app/cdn/v1/",Re=new Map,Ie=new Map;function Be(e=Ne,t=fetch){let n=Re.get(e);if(!n)n=t(e+"parts.json").then((r)=>{if(!r.ok)throw Error(`ldr: parts CDN index ${r.status} (${e}parts.json)`);return r.json()}),n.catch(()=>Re.delete(e)),Re.set(e,n);return n}var Un=(e)=>Array.isArray(e)&&e.length===3&&typeof e[0]==="number"&&typeof e[1]==="number"&&(e[2]==="f32"||e[2]==="u16"||e[2]==="u8"||e[2]==="u32"),De=(e,t)=>Un(e)?[e[0]+t,e[1],e[2]]:Array.isArray(e)?e.map((n)=>De(n,t)):e&&typeof e==="object"?Object.fromEntries(Object.entries(e).map(([n,r])=>[n,De(r,t)])):e;function On(e,t={}){let n=[],r=0,s={},o={};for(let p of e){let g=p.buffer;if(!g)throw Error("ldr: mergePacks needs packs from decodePack/loadPack");let b=new DataView(g).getUint32(0,!0),y=new Uint8Array(g,4+b),w=r;n.push(y),r+=y.byteLength;let x=(4-r%4)%4;if(x)n.push(new Uint8Array(x)),r+=x;for(let[m,d]of Object.entries(p.header.parts??{}))if(!(m in s))s[m]=De(d,w);for(let[m,d]of Object.entries(p.header.studKinds??{}))if(!(m in o))o[m]=De(d,w)}let i=e[0]?.header??{version:1,weld:!0},c=new TextEncoder().encode(JSON.stringify({...i,parts:s,studKinds:o,...t})),u=(4-(4+c.length)%4)%4,f=4+c.length+u,l=new Uint8Array(f+r);new DataView(l.buffer).setUint32(0,c.length+u,!0),l.set(c,4),l.fill(32,4+c.length,f);let a=f;for(let p of n)l.set(p,a),a+=p.byteLength;return Pe(l.buffer)}async function zn(e,t={}){e=[...e];try{return await _t(e,t)}catch(n){let r=t.cdn??Ne,s=t.fetch??fetch;Re.delete(r);let o=(i,c)=>s(i,{...c,cache:"reload"});try{return await _t(e,{...t,fetch:o})}catch{throw n}}}async function _t(e,t){let n=t.cdn??Ne,r=t.fetch??fetch,s=t.gap??16384,o=await Be(n,r),i=[...new Set([...e].map(Y))],c=[],u=[];for(let m of i){if(Ie.has(n+m))continue;let d=o.parts[m];if(d)u.push({name:m,off:d[0],len:d[1],file:d[2]??0});else c.push(m)}u.sort((m,d)=>m.file-d.file||m.off-d.off);let f=[];for(let m of u){let d=f[f.length-1];if(d&&d.file===m.file&&m.off-d.end<=s)d.end=Math.max(d.end,m.off+m.len),d.items.push(m);else f.push({file:m.file,start:m.off,end:m.off+m.len,items:[m]})}let l=0,a=0,p=0,g=new Map,b=async()=>{while(p<f.length){let m=f[p++],d=g.get(m.file);if(d)d=d.subarray(m.start,m.end);else{let M=await r(new URL(o.archives[m.file],n).href,{headers:{Range:`bytes=${m.start}-${m.end-1}`,"Accept-Encoding":"identity"}});if(!M.ok)throw Error(`ldr: parts CDN ${M.status}`);if(a++,d=new Uint8Array(await M.arrayBuffer()),l+=d.byteLength,M.status===200)g.set(m.file,d),d=d.subarray(m.start,m.end)}for(let M of m.items){let U=Ee(d.subarray(M.off-m.start,M.off-m.start+M.len)),T=U.buffer.slice(U.byteOffset,U.byteOffset+U.byteLength);Ie.set(n+M.name,Pe(T))}}};await Promise.all(Array.from({length:Math.min(t.concurrency??24,f.length)},b));let y=i.filter((m)=>Ie.has(n+m)).map((m)=>Ie.get(n+m)),w={colors:o.colors,...o.colorTable?{colorTable:o.colorTable}:{}};return{pack:y.length?On(y,w):Pe($n(w)),missing:c,requests:a,bytes:l}}function $n(e){let t=new TextEncoder().encode(JSON.stringify({version:1,weld:!0,parts:{},studKinds:{},...e})),n=(4-(4+t.length)%4)%4,r=new Uint8Array(4+t.length+n).fill(32);return new DataView(r.buffer).setUint32(0,t.length+n,!0),r.set(t,4),r.buffer}function jn(e,t){let n=t.header.parts;if(!n)return 0;let r=0;for(let s of e){let o=n[s.part]?.body?.tris;if(o)r+=o}return r}function Gt(e,t,n){let r=0,s=0,o=!1,i=new Set;for(let c of e){let u=c.embedded?t.get(c.part):Y(c.part),f=u?n.parts[u]:void 0;if(!f)continue;if(f[3]!=null)o=!0,r+=f[3];if(!i.has(u))i.add(u),s+=f[1]}return{bodyTris:r,packBytes:s,known:o}}class Ue extends Error{code="ldr-budget";bodyTris;packBytes;maxBodyTris;maxPackBytes;constructor(e){let t=[e.maxBodyTris!=null&&e.bodyTris>e.maxBodyTris?`${e.bodyTris} triangles (limit ${e.maxBodyTris})`:"",e.maxPackBytes!=null&&e.packBytes>e.maxPackBytes?`${(e.packBytes/1e6).toFixed(1)} MB parts pack (limit ${(e.maxPackBytes/1e6).toFixed(0)} MB)`:""].filter(Boolean).join(", ");super(`ldr: model exceeds device budget: ${t}`);this.name="BudgetError",this.bodyTris=e.bodyTris,this.packBytes=e.packBytes,this.maxBodyTris=e.maxBodyTris,this.maxPackBytes=e.maxPackBytes}}async function Ht(e,t={}){let n=performance.now(),r=t.fetch??fetch,s=Be(t.cdn??Ne,r);s.catch(()=>{});let o=t.text?e:await r(e).then(async(A)=>{if(!A.ok)throw Error(`ldr: ${A.status} fetching ${e}`);return mt(await A.arrayBuffer())}),i=performance.now(),c=t.name??(t.text?"main.ldr":ht(e)),u=Ot(o,c,{looseGeometry:!1,callouts:t.callouts}),f=performance.now();t.onParsed?.(u),await s;let l=zt(o,new Set(u.filter((A)=>A.embedded).map((A)=>A.part)),c),a=(A,v)=>t.maxBodyTris!=null&&A>t.maxBodyTris||t.maxPackBytes!=null&&v>t.maxPackBytes,p=t.maxBodyTris!=null||t.maxPackBytes!=null,g=(A)=>new Ue({...A,maxBodyTris:t.maxBodyTris,maxPackBytes:t.maxPackBytes}),b="full";if(p){let A=Gt(u,l,await s);if(a(A.known?A.bodyTris:0,A.packBytes)){if(!t.lowCdn)throw g(A);let v=await Be(t.lowCdn,r).catch(()=>null);if(!v)throw g(A);let E=Gt(u,l,v);if(a(E.known?E.bodyTris:0,E.packBytes))throw g(E);b="low"}}let y=[...u.filter((A)=>!A.embedded).map((A)=>A.part),...l.values()],w=async()=>{let A=await zn(y,b==="low"?{...t,cdn:t.lowCdn}:t);for(let[v,E]of l){let z=A.pack.header.parts[E];if(z)A.pack.header.parts[v]=z}return{...A,packBytes:A.pack.buffer?.byteLength??A.pack.bytes??0,bodyTris:jn(u,A.pack)}},x=await w();if(p&&a(x.bodyTris,x.packBytes)&&b==="full"&&t.lowCdn&&await Be(t.lowCdn,r).then(()=>!0,()=>!1)){b="low";let A=x;x=await w(),x.requests+=A.requests,x.bytes+=A.bytes}if(p&&a(x.bodyTris,x.packBytes))throw g(x);let{pack:m,missing:d,requests:M,bytes:U}=x,T=new Map([...l].map(([A,v])=>[v,A])),k=d.map((A)=>T.get(A)??A),D=performance.now(),P=t.cull?Fe(u,m.header,t.textures!==!1):void 0;return{insts:u,pack:m,tier:b,missing:k,requests:M,bytes:U,cull:P,timings:{fetchModel:i-n,parse:f-i,parts:D-f,...P?{cull:performance.now()-D}:{}}}}self.onmessage=async(e)=>{let{id:t,source:n,opts:r}=e.data;try{let s=await Ht(n,{...r,cull:!1,onParsed:(l)=>self.postMessage({id:t,insts:l})}),o=s.pack.buffer;if(self.postMessage({id:t,buffer:o,tier:s.tier,missing:s.missing,requests:s.requests,bytes:s.bytes,timings:s.timings},[o]),!r.cull)return;let i=performance.now(),c=Fe(s.insts,s.pack.header,r.textures!==!1),u=performance.now()-i,f=[];for(let l of[c.studHidden,c.studUp,c.underHidden,c.studHideStep,c.underHideStep])if(l)f.push(l.buffer);self.postMessage({id:t,cull:c,ms:u},f)}catch(s){if(s instanceof Ue||s?.code==="ldr-budget")self.postMessage({id:t,phase:"error",error:String(s?.message??s),budget:{bodyTris:s.bodyTris,packBytes:s.packBytes,maxBodyTris:s.maxBodyTris,maxPackBytes:s.maxPackBytes}});else self.postMessage({id:t,phase:"error",error:String(s?.message??s)})}};\n';
5080
5265
 
5081
- // ../../../../../../../tmp/ldr-build-HYKc29/src/cdn.ts
5266
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/cdn.ts
5082
5267
  var worker;
5083
5268
  var seq = 0;
5084
5269
  var pending = new Map;
@@ -5192,7 +5377,7 @@ async function loadModel(source, o = {}) {
5192
5377
  timings: { ...prep.timings, parts: t3 - t0 - prep.timings.fetchModel - prep.timings.parse, build: t4 - t3, total: t4 - t0 }
5193
5378
  });
5194
5379
  }
5195
- // ../../../../../../../tmp/ldr-build-HYKc29/src/node/library.ts
5380
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/node/library.ts
5196
5381
  import { existsSync, readFileSync, statSync } from "fs";
5197
5382
  import { join } from "path";
5198
5383
  var xf = (m, x, y, z) => [m[3] * x + m[4] * y + m[5] * z + m[0], m[6] * x + m[7] * y + m[8] * z + m[1], m[9] * x + m[10] * y + m[11] * z + m[2]];
@@ -5542,11 +5727,11 @@ class Library {
5542
5727
  return insts;
5543
5728
  }
5544
5729
  }
5545
- // ../../../../../../../tmp/ldr-build-HYKc29/src/node/build-pack.ts
5730
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/node/build-pack.ts
5546
5731
  import fs3 from "node:fs";
5547
5732
  import path3 from "node:path";
5548
5733
 
5549
- // ../../../../../../../tmp/ldr-build-HYKc29/src/node/resolver.ts
5734
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/node/resolver.ts
5550
5735
  import fs from "node:fs";
5551
5736
  import path from "node:path";
5552
5737
  var TOP_STUD_RE = /^(stud|studa|stud2|stud2a|stud6|stud6a|stud10|stud15|stud2s|stud2s2|stud-logo\d*|stud2-logo\d*)\.dat$/i;
@@ -5875,11 +6060,11 @@ function collectDeps(lib, refs) {
5875
6060
  return out;
5876
6061
  }
5877
6062
 
5878
- // ../../../../../../../tmp/ldr-build-HYKc29/src/node/compile.ts
6063
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/node/compile.ts
5879
6064
  import fs2 from "node:fs";
5880
6065
  import path2 from "node:path";
5881
6066
 
5882
- // ../../../../../../../tmp/ldr-build-HYKc29/src/node/lod.ts
6067
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/node/lod.ts
5883
6068
  import { MeshoptSimplifier, MeshoptEncoder } from "meshoptimizer";
5884
6069
  await Promise.all([MeshoptSimplifier.ready, MeshoptEncoder.ready]);
5885
6070
  function reorderMesh(P, N, C, I) {
@@ -6185,7 +6370,7 @@ function levelLines(P, I, E, err, always, tol = 0.01) {
6185
6370
  return out;
6186
6371
  }
6187
6372
 
6188
- // ../../../../../../../tmp/ldr-build-HYKc29/src/node/compile.ts
6373
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/node/compile.ts
6189
6374
  class BfcState {
6190
6375
  accum;
6191
6376
  ccw = true;
@@ -7129,7 +7314,7 @@ function encodePack(parts, studKinds, weld, extra, options = {}) {
7129
7314
  return Buffer.concat([head, ...chunks.map((c) => new Uint8Array(c.buffer, c.byteOffset, c.byteLength))]);
7130
7315
  }
7131
7316
 
7132
- // ../../../../../../../tmp/ldr-build-HYKc29/src/node/build-pack.ts
7317
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/node/build-pack.ts
7133
7318
  function packCompilerOpts(o) {
7134
7319
  return { studs: o.studs ?? "low", prims: o.primitives ?? "full", weld: o.weld ?? true, separateStuds: true, cond: !!o.cond, tex: !!o.textures, ...o.partWorkLimit ? { workLimit: o.partWorkLimit } : {} };
7135
7320
  }
@@ -7201,7 +7386,7 @@ function buildPack(o) {
7201
7386
  const warnings = [...lib.conflicts].map((n) => `${n}: defined differently by two models; the first definition is used`);
7202
7387
  return { data: encodePack(parts, kinds, comp.opts.weld, extra, { texture, lod: o.lod !== false, reorder: !!o.reorder }), parts: parts.size, studKinds: kinds.size, missing: [...missing], ...warnings.length ? { warnings } : {} };
7203
7388
  }
7204
- // ../../../../../../../tmp/ldr-build-HYKc29/src/node/promote.ts
7389
+ // ../../../../../../../tmp/ldr-build-DCpOVo/src/node/promote.ts
7205
7390
  var GEOM = /^\s*[2-5]\s/;
7206
7391
  var REF = /^\s*1\s/;
7207
7392
  var FILE = /^\s*0\s+FILE\s+(\S.*?)\s*$/i;