@vincentt-xr/sdk 2.0.0-alpha.0 → 2.0.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/GROUNDING.md +232 -14
  2. package/dist/{DebuggerUI-CEfdddkZ.cjs → DebuggerUI-CatYc-RG.cjs} +1 -1
  3. package/dist/{DebuggerUI-Dgop6Q6o.js → DebuggerUI-gLMKiVwJ.js} +1 -1
  4. package/dist/MediaSourceSwitcher-C-xYg0nQ.js +317 -0
  5. package/dist/MediaSourceSwitcher-Cq3g4IKw.cjs +31 -0
  6. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +6 -1
  7. package/dist/components/FaceMesh/material/defaults.d.ts +4 -0
  8. package/dist/components/FaceMesh/material/types.d.ts +2 -0
  9. package/dist/components/FaceRetouch/Background.d.ts +6 -1
  10. package/dist/components/FaceRetouch/defaults.d.ts +13 -0
  11. package/dist/components/FaceRetouch/index.d.ts +3 -1
  12. package/dist/components/FaceRetouch/landmarkMask.d.ts +4 -1
  13. package/dist/components/FaceRetouch/useFaceRetouchMask.d.ts +2 -1
  14. package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +15 -0
  15. package/dist/components/FaceWarp3D/defaults.d.ts +37 -0
  16. package/dist/components/FaceWarp3D/index.d.ts +3 -0
  17. package/dist/components/FaceWarp3D/warp.d.ts +13 -0
  18. package/dist/components/HandJoints2D/index.d.ts +6 -0
  19. package/dist/components/HandTracker/index.d.ts +2 -2
  20. package/dist/components/HandTracking2D/HandVisual.d.ts +12 -0
  21. package/dist/components/HandTracking2D/index.d.ts +5 -0
  22. package/dist/components/HandTracking2DController/index.d.ts +5 -0
  23. package/dist/components/HandTracking3D/index.d.ts +6 -0
  24. package/dist/components/ScreenImage/index.d.ts +87 -0
  25. package/dist/components/ScreenText/index.d.ts +20 -0
  26. package/dist/components/TextLabel/index.d.ts +99 -0
  27. package/dist/components/XRScene/index.d.ts +14 -3
  28. package/dist/components/XRViewport/index.d.ts +17 -0
  29. package/dist/components/index.d.ts +7 -0
  30. package/dist/debug-ui/default-setting/index.d.ts +37 -0
  31. package/dist/debug-ui/default-setting.cjs +21 -0
  32. package/dist/debug-ui/default-setting.js +777 -0
  33. package/dist/debug-ui/face-warp-3d/index.d.ts +6 -0
  34. package/dist/debug-ui/hand-joints-2d/index.d.ts +6 -0
  35. package/dist/debug-ui/hand-tracking-2d/index.d.ts +6 -0
  36. package/dist/debug-ui/hand-tracking-2d-controller/index.d.ts +6 -0
  37. package/dist/debug-ui/hand-tracking-3d/index.d.ts +6 -0
  38. package/dist/debug-ui/index.d.ts +23 -0
  39. package/dist/debug-ui/layer-panel/index.d.ts +17 -0
  40. package/dist/debug-ui/media-source/MediaSourceSwitcher.d.ts +10 -0
  41. package/dist/debug-ui/media-source/index.d.ts +4 -0
  42. package/dist/debug-ui/media-source/media-preset.d.ts +9 -0
  43. package/dist/debug-ui/media-source.cjs +1 -0
  44. package/dist/debug-ui/media-source.js +7 -0
  45. package/dist/debug-ui/screen-image-settings/index.d.ts +7 -0
  46. package/dist/debug-ui/screen-text-settings/index.d.ts +122 -0
  47. package/dist/debug-ui/settings-panel/index.d.ts +38 -0
  48. package/dist/debug-ui/shared/MaterialSection.d.ts +13 -0
  49. package/dist/debug-ui/shared/ScreenTransformSection.d.ts +29 -0
  50. package/dist/debug-ui.cjs +20 -0
  51. package/dist/debug-ui.js +6063 -0
  52. package/dist/defaults-BLpcN3pG.cjs +1 -0
  53. package/dist/defaults-LtY4M7dg.js +55 -0
  54. package/dist/entries/core.d.ts +5 -1
  55. package/dist/entries/face-effects.d.ts +2 -0
  56. package/dist/entries/low-level.d.ts +3 -0
  57. package/dist/face-effects.cjs +113 -23
  58. package/dist/face-effects.js +1566 -1399
  59. package/dist/handJoints2d.d.ts +49 -0
  60. package/dist/handTracking2d.d.ts +33 -0
  61. package/dist/handTracking2dController.d.ts +65 -0
  62. package/dist/handTracking3d.d.ts +52 -0
  63. package/dist/{index-BD-JWMjE.js → index-BGNbrc4C.js} +113 -137
  64. package/dist/index-BXyObVHF.cjs +1 -0
  65. package/dist/index-CY3bUAcW.js +12 -0
  66. package/dist/index-C_Duh13c.cjs +1 -0
  67. package/dist/index-D8fpPQkC.cjs +1 -0
  68. package/dist/index-DxshgBu0.cjs +1 -0
  69. package/dist/index-O-2crZ3M.js +1102 -0
  70. package/dist/{index-CYMj26Ej.js → index-safCs_af.js} +426 -416
  71. package/dist/{internal-DH5d1Xnq.cjs → internal-BjyhBP8i.cjs} +1 -1
  72. package/dist/{internal-KOKJDxCG.js → internal-Cae1ps15.js} +3 -3
  73. package/dist/internal.cjs +1 -1
  74. package/dist/internal.js +2 -2
  75. package/dist/layerStack.d.ts +29 -0
  76. package/dist/low-level.cjs +1 -1
  77. package/dist/low-level.js +74 -890
  78. package/dist/main.cjs +73 -1
  79. package/dist/main.js +1656 -407
  80. package/dist/models/Hand/HandTracking.d.ts +2 -0
  81. package/dist/screen2d/index.d.ts +4 -0
  82. package/dist/screen2d/material-runtime.d.ts +32 -0
  83. package/dist/screen2d/texture.d.ts +10 -0
  84. package/dist/screen2d/transform.d.ts +25 -0
  85. package/dist/screen2d/types.d.ts +90 -0
  86. package/dist/screenImagePresets.d.ts +13 -0
  87. package/dist/screenImageSettings-6NRg4cx9.js +39 -0
  88. package/dist/screenImageSettings-y_B4_767.cjs +1 -0
  89. package/dist/screenImageSettings.d.ts +50 -0
  90. package/dist/screenTextPresets.d.ts +6 -0
  91. package/dist/screenTextSettings.d.ts +131 -0
  92. package/dist/{selectors-Bub0o3qy.cjs → selectors-BLl2JUWW.cjs} +1 -1
  93. package/dist/{selectors-BHO6TnoC.js → selectors-CXd_x-6t.js} +6 -6
  94. package/dist/tracking.cjs +1 -1
  95. package/dist/tracking.js +193 -168
  96. package/dist/types/hand-tracking.d.ts +8 -0
  97. package/dist/types/nodes.d.ts +2 -0
  98. package/dist/useXRModel-3DcUa28n.cjs +1 -0
  99. package/dist/useXRModel-BMJE1hrk.js +28 -0
  100. package/dist/x-Co8jPhP0.js +127 -0
  101. package/dist/x-KC8E4Gaj.cjs +41 -0
  102. package/package.json +19 -1
  103. package/dist/index-B5J4gzn2.cjs +0 -1
  104. package/dist/index-BVBVg96G.cjs +0 -1
  105. package/dist/index-DtwHElmG.js +0 -157
  106. package/dist/index-PtFmD6B8.cjs +0 -1
package/dist/main.js CHANGED
@@ -1,27 +1,28 @@
1
- var Q = Object.defineProperty;
2
- var ee = (r, e, t) => e in r ? Q(r, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : r[e] = t;
3
- var R = (r, e, t) => ee(r, typeof e != "symbol" ? e + "" : e, t);
4
- import { useState as W, useEffect as k, useRef as y, useMemo as I, Suspense as te, useCallback as F } from "react";
5
- import { X as re, R as ne } from "./index-CYMj26Ej.js";
6
- import { b as rt, a as nt } from "./index-CYMj26Ej.js";
7
- import { S as se, a as ie, u as oe } from "./index-DtwHElmG.js";
8
- import { X as it } from "./index-DtwHElmG.js";
9
- import { jsx as p, jsxs as P, Fragment as X } from "react/jsx-runtime";
10
- import { useThree as Y, useFrame as ae } from "@react-three/fiber";
11
- import * as K from "three";
12
- import { PerspectiveCamera as J, RepeatWrapping as q, LinearFilter as H } from "three";
13
- import { u as ce, a as le } from "./selectors-BHO6TnoC.js";
14
- import { useTexture as ue } from "@react-three/drei";
15
- const $ = 9, G = 16, Ae = ({ children: r }) => {
16
- const [e, t] = W({ width: 0, height: 0 });
17
- return k(() => {
18
- const n = () => {
19
- const i = document.documentElement.clientWidth, c = document.documentElement.clientHeight, o = i / c, a = $ / G;
20
- let s, u;
21
- o > a ? (u = c, s = u * $ / G) : (s = i, u = s * G / $), t({ width: s, height: u });
1
+ var nt = Object.defineProperty;
2
+ var rt = (t, e, n) => e in t ? nt(t, e, { enumerable: !0, configurable: !0, writable: !0, value: n }) : t[e] = n;
3
+ var U = (t, e, n) => rt(t, typeof e != "symbol" ? e + "" : e, n);
4
+ import { a as Vn, D as Zn } from "./screenImageSettings-6NRg4cx9.js";
5
+ import { useState as _, useEffect as $, useMemo as x, useRef as X, Suspense as st, useCallback as te } from "react";
6
+ import { X as it, R as at } from "./index-safCs_af.js";
7
+ import { d as qn, c as _n } from "./index-safCs_af.js";
8
+ import { h as ot, u as lt, c as At, S as ct, f as dt, i as De, j as Ne } from "./index-O-2crZ3M.js";
9
+ import { k as er } from "./index-O-2crZ3M.js";
10
+ import { jsx as v, jsxs as W, Fragment as Te } from "react/jsx-runtime";
11
+ import { useThree as Ye, useFrame as ut } from "@react-three/fiber";
12
+ import * as T from "three";
13
+ import { RepeatWrapping as Re, LinearFilter as Oe } from "three";
14
+ import { b as ht, d as ft } from "./selectors-CXd_x-6t.js";
15
+ import { useTexture as Ve } from "@react-three/drei";
16
+ const Qe = 9, we = 16, Qn = ({ children: t }) => {
17
+ const [e, n] = _({ width: 0, height: 0 });
18
+ return $(() => {
19
+ const r = () => {
20
+ const i = document.documentElement.clientWidth, a = document.documentElement.clientHeight, o = i / a, A = Qe / we;
21
+ let s, l;
22
+ o > A ? (l = a, s = l * Qe / we) : (s = i, l = s * we / Qe), n({ width: s, height: l });
22
23
  };
23
- return n(), window.addEventListener("resize", n), () => window.removeEventListener("resize", n);
24
- }, []), /* @__PURE__ */ p(
24
+ return r(), window.addEventListener("resize", r), () => window.removeEventListener("resize", r);
25
+ }, []), /* @__PURE__ */ v(
25
26
  "div",
26
27
  {
27
28
  style: {
@@ -32,297 +33,1541 @@ const $ = 9, G = 16, Ae = ({ children: r }) => {
32
33
  justifyContent: "center",
33
34
  backgroundColor: "#0d0d0d"
34
35
  },
35
- children: /* @__PURE__ */ p("div", { style: { width: e.width, height: e.height, position: "relative" }, children: r })
36
+ children: /* @__PURE__ */ v("div", { style: { width: e.width, height: e.height, position: "relative" }, children: t })
36
37
  }
37
38
  );
38
- }, de = "rgba(20,40,110,0.88)", he = 24, fe = 512;
39
- function _e({
40
- color: r = de,
41
- borderColor: e,
42
- borderWidth: t = 0,
43
- borderRadius: n = he,
44
- resolution: i = fe,
45
- aspect: c = 1,
46
- opacity: o = 1,
47
- name: a,
48
- overlay: s = !0,
49
- position: u,
50
- rotation: g,
51
- scale: m,
52
- visible: l
53
- }) {
54
- const M = y(null), v = y(null), w = I(() => me({
55
- width: Math.round(i * Math.max(c, 0.05)),
56
- height: Math.round(i),
57
- color: r,
58
- borderColor: e,
59
- borderWidth: t,
60
- borderRadius: n
61
- }), [r, e, t, n, i, c]);
62
- k(() => () => {
63
- w.dispose();
64
- }, [w]);
65
- const b = y(null), S = y(o);
66
- return S.current !== o && (S.current = o, b.current = null, v.current && (v.current.opacity = o)), k(() => {
67
- const d = M.current;
68
- if (d)
69
- return d.userData.setOpacity = (L) => {
70
- b.current = L, v.current && (v.current.opacity = L);
71
- }, () => {
72
- delete d.userData.setOpacity;
39
+ }, wn = ({ children: t, depth: e = 0 }) => {
40
+ const { camera: n, size: r } = Ye(), i = x(() => {
41
+ if (!n.isPerspectiveCamera)
42
+ return { width: 10, height: 10 };
43
+ const a = n, o = Math.abs(a.position.z - e), A = a.fov * Math.PI / 180, s = 2 * Math.tan(A / 2) * o;
44
+ return { width: s * (r.width / r.height), height: s };
45
+ }, [n, r, e]);
46
+ return /* @__PURE__ */ v(ot.Provider, { value: i, children: /* @__PURE__ */ v("group", { position: [0, 0, e], children: t }) });
47
+ };
48
+ function Xe(t, e) {
49
+ return !Number.isFinite(t) || !Number.isFinite(e) || t <= 0 || e <= 0 ? [1, 1, 1] : Math.abs(t - e) < 1e-6 ? [1, 1, 1] : t > e ? [e / t, 1, 1] : [1, t / e, 1];
50
+ }
51
+ const ne = {
52
+ width: 720,
53
+ height: 1280
54
+ }, gt = (t = [0.5, 0.5]) => [
55
+ t[0] * 2 - 1,
56
+ t[1] * 2 - 1
57
+ ], ke = ({
58
+ position: t = [0, 0],
59
+ size: e = [1, 1]
60
+ }) => {
61
+ const n = e[0] / 2, r = e[1] / 2;
62
+ return {
63
+ left: t[0] - n,
64
+ right: t[0] + n,
65
+ top: t[1] + r,
66
+ bottom: t[1] - r
67
+ };
68
+ }, pt = ({
69
+ position: t = [0, 0],
70
+ size: e = [ne.width, ne.width],
71
+ canvasSize: n = ne
72
+ }) => {
73
+ const r = n.width / 2 || ne.width / 2, i = n.height / 2 || ne.height / 2;
74
+ return ke({
75
+ position: [t[0] / r, t[1] / i],
76
+ size: [e[0] / r, e[1] / i]
77
+ });
78
+ }, Ze = ({
79
+ coordinateSpace: t = "normalized",
80
+ canvasSize: e = ne,
81
+ position: n,
82
+ size: r,
83
+ fallbackAnchors: i
84
+ }) => i || (!n && !r ? ke({}) : t === "canvas" ? pt({ position: n, size: r, canvasSize: e }) : ke({ position: n, size: r })), vt = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAyAAAAMgCAMAAADsrvZaAAAAAXNSR0IB2cksfwAAAAlwSFlzAAALEwAACxMBAJqcGAAAAUpQTFRFqampbGxsb29vcHBwSUlJcXFxkJCQenp6dHR0cnJyo6Ojg4ODfHx8nZ2dn5+fqqqqtLS0q6urc3NzrKysra2trq6udXV1r6+veHh4eXl5d3d3i4uLqKioe3t7fX19p6enpaWldnZ2sLCwpqamfn5+hISEpKSkkZGRgYGBnp6ef39/hoaGoKCgjo6OsbGxoaGhl5eXgICAgoKCnJycjIyMoqKilZWVmpqaiIiImZmZh4eHlJSUlpaWm5ubioqKiYmJhYWFj4+PkpKSs7OzmJiYsrKyk5OTjY2NTk5OtbW1UVFRZGRkZmZmS0tLYWFhXFxcW1tbVFRUTExMVlZWbm5uWVlZU1NTY2NjV1dXaWlpUFBQa2trX19fZ2dnWFhYYmJiVVVVt7e3Xl5eampqWlpaurq6ZWVltra2UlJSYGBgXV1dTU1NaGhoubm5Zbx22AAAQndJREFUeJztnfd74kqatlnUZSQbW1YgmmiCbYJtnHN2+/SZM/FM2p3Z2Yk7G779/3/9UAJJlMpgC0rAc18z3adNcCHqVqW33orFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAjX8BYHmBIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMPiIIO+/BoC5BIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAAIIAwACCAMAAggDAYJkFKdRqutL52ijlJUGIg9DoX0yBSOn6w8p6TSvXCry/6M+wtIIUyuWDm7uL9m4pm1YJ/AgRwbjdCJKaziZ3G+2Lnb1Krcz76/4wSyqIonQOzx7X+k2H8XUSAS1IiFiCEGJc2Lig1reezm5rCu+v/IMspyDNvcurYlqUjC/RgXe1WhQGF9P6u2+JpFZ7O+fHzbnsai2jIJXTw0bS6FcJjh9x+BEaw7uNo0n//2q23n7pVOZQkeUTRCm8laoqsW9vjh+upgR8ioEldl/LvLjxOFHzxe7p/BmyZIIUtNXHRp74vsg4WpCwcV9QRx2S273fm7dWZLkEKVTWV5ISv2qztNhtiZTdOludr+H6Ugli6CFiSpcDtiCEiLmTvdV5akSWSZDy7VZOJRCEA4OerECyVzenBZl3XRibJRJEviyKxqQjxhscGAz6CJGqD81t3pVhbJZGkPLBSUkSzOkqznVlORm0IaTfiOyeNcsxZS6akWURpNx5zPV7VwSL5pwQnDnfviIqaZ0dQJAIUaidb6WHy+a8K8tS4sz1CsZdipS2biu8a8VYLIUgcmX9PicMBMEwnQuDpUTDETF7cTkXQ/VlEETWLh/U/tciSfb6Oe+qsnS4r7hghy2Iyc6+HP1u1jIIUjs+SjudK1//yvEltEALMLjC1n+b//PdkqzhunS0rkd/0XAJBCl37qvuL25EEBAuw0gsQWBMiwjp+70YWhD+bLylze+J+iUJcdeXCkLA1x4HCmLuObys8K4d77H4gtSeSv3vSFIDBHG+1lnXo4XFntHtm/HOZpu+POn2ZY13/XiHhRdEO89JZnA7tQkhiDwJHWOxnLw/F2KsGKrp1jnvCvIOCy/I9a4kSCToNmb+nGAzSOiYk1VEiI+O0F2Xvm+S+HAc7f3qCy5I4aAhDvcNQpAZ4dR/Z6hOFcSa8M2uRDu4d8EFqdzlrc5wQF/KsoOo1WIChEWxfzFzeZUMXQnqZBlr6q2dcpSnshZaELm8VzQSMxDGLBZR88nWw90KCInHx5WdnZXuXWO3VDQsCfJDMCOr40TsdaI82bvQgmjra8Sanwociwvp3ZfUt0z0V3TnCU2XY3Jmc7/ZTZDAtps4XTDxalXnXeJgFlmQwulWljh7z/23L/MOlm48rcb293kXdEFJvabKBytHeYkMxnnur8D+UgSSOznlXdRgFlmQ2HFLZQ3N1dzJXjkV/WiHOUbbbq6/JVVCrI4uvZurJs+j24AvsiAHj2kS1P0VBCl7dbip8S7j4qNv7p0kTEWC19TvDyI7k7XAgijXvYDtg6YguauOnOFdxmUgoxW69aoqGMuHAV9H4muFdymDWFxB5P0rEqevn5s94msdesyKb+UjwdhtQF9d749GortcuLiClM8SgWtUgpQ838bYfHZk5KekROiTicbgJH8Vi+hYcGEF0WJrojFXRRekuKKh/Zgl24WbnESf8TVnTJKdiI5CFlaQ2Gk2MMpBKr6keBdv2VD0w54oBXWxSPruNJprUQsryMFOWggyJNFNof2YNbJ+mKQKYk65S611DYLMEOUyKTlb20boNnkXbyn59pKmG2KM3rNv0VwtXFRBak+5ETcEK12A2IvNT2K/hSJzWJesRVrPncv8kZo95F08KgsqSOHgrupvPazlc0JylxiA8EGOPeXtyLjR4xHINe/iUVlMQWT5uCQNUpYMvwdjC2H27ltEZxQXH025zwsjZ0Lam0juInm8zoIKop1XBf9eHfNfhKxtoAHhhZzaaEgjcye2IKWXKI7SF1OQWPmrFPcP0a1bl/gSxfvU0vB8nLCDeEcMIV+3I9i0L6Yg5ZcH40YVH7lRkfSVHuHNB4uPknpU7dj34RdjfzknUcxwspiCVLpJYiWg8c9i5b6+IoKXJ9udpD+u19nD3jiPYEDWYgoiX6ijGTXMdry9EcFmfKn451PWGArG/YLEhcR9BNenFlOQ1AURBP86oSnIGUYgnMms7kreqEWrKywQ8agWvWH6YgrSfCD2YpR/PaqJGBPeZHay/q1T9uphaz963d/FFOS85cTxelsQtYcGhDtKpeSP6rU7WcUD3mUbZTEF2UnGR+kLkn7DFBZ/Kg2RHiOXe4neKH0xBbnPUQWJZzvPvIsGYrGzJF2QfLfCu2gjLKYgvSrl8vcpprCKzh/t4IguSLodvYjexRQkp1L9EOp/4V0y0B+EaHf0rZ5SqcO7bCMspiDUdD+CIB0hzj0KbK9I1BsYyW/wLtoIiylIwM41sR29acRl5PVaDEght8e7aCMspiAB+RTzW9FbiFpGnl+yAbn2IchsCBAk0YUgUeD5NhGQbB+CzIYAQYorvAsGDJ7XkxCEK0EZLiFIJNjcSAYcGgJBZgP14kOQqNAXJOCIz3XeRRsBgoCZA0F4A0EiDQThDQSJNBCENxAk0kAQ3kCQSANBeANBIg0E4Q0EiTQQhDcQJNJAEN5AkPeRUyld1zVN0/VUarYxahCENxDkPeRM5nlfl2OFQiymZF4zmVkqAkF4A0FYfNMq65eX14/37cZRn7X2fffp5fC4qX2bUQEgCG8gSBDKdqpQvt1p13P5qiiqBmI6na5mS43uZa2sPc8i7QsE4Q0ECWIz1q2Lkh1sbuVrI8Z/WJkoc1cHszAEgvAGglBQtMLqzloyrfZlMBQRfBg/FhO9t46iTXlnMgThDQQZRcsUzi6KKjHyg1l5Wa1TCOz/ilv/JFL2Yac55UOAIQhvIMgIevNrQ3Q1G3a3yqdJ/2dxkm69nWrTVASC8AaC+NCUg5NE2j4Swt+zck54Io4rarq9Lk8xkTQE4Q0E8aLrJzmjX+W+GE4L4j0y0D41Il5tTDEPPgThDQRxo+zfrKW9p57ZilhHO3mvkvknkcR6V5vW4iEE4Q0EcaEpN720r6F4j35vSyw+FqY05QtBeANBhijNblYaPW+LiTEekQTx4jgzlYEIBOENBBkg106KzmFbYzcgxnRv/0XVtdX9aZQJgvAGgjjotQaxTzOdQBDjaqmSQMTe7T+mUCgIwhsIYiOfttJO92oSQayXEKIWj7fDPxYYgvAGgljotQtVGi4HTuCHvWJCpKPT/dANgSC8gSAmSuVEHCyUTzRIt1bVzdiTRvgny0MQ3kAQAy3VHY7PrYXBMQWJDwURqleFsA2BILyBIAa1Q+MYDkEi8UEvi6GE/2JZvSzj2KHHsBcMIQhvIEif7fUWccbm9pK5a6w+nNhyDeL9gSfGCwWpuLMZbskgCG8gSH8AknqojlR3jyDC4A9/DKPnBUQtNcNdL4QgvIEg/RHImURGBh6OEWZcr7ULxB7BE1rooh3TSO7KoRYNgvAGgsT2m2vSyNDc6UxZNkiSNRIfbpeidLHMB4q3oSYGgiC8gSCZVFdK2zuivIIQidj1Pm4M4M3mY9jh8gsS7z+j/4qrSirEwkEQ3iy9IIp+XRLMtoH4GgRLA7Pa53OJYrJUKubyKvFsDnG/wNxlSPL3SohzvRCEN0sviJ5qiJTmwI7HMtoPKd86ub7d6xx01s/ednNi4BjEWi6sF0Icp0MQ3iy9IPJ6zq7ZfkPMfbVEbO10Ypnn/VQmlUrtp5Tm2VGWUFsQwXpFeiXEQQgE4c3SC6J1RStindIgEEEsndymDKxuk66n9Oe9lcGuqhFBjKneRi28LbgQhDfLLsj2aX0wfys4C4VxJ1Nc+mpvtDmQM5WtKs0owZrjyp39JbTiQRDeLLsg306ylhzDaj4YoEvFm+1t2ou2t49baWtpxHvdzJeqpfBG6RCEN8suiN4S/QvoZtRIv9elJp9iVD+Ml52vqSPjehtSXQ1thzoE4c2SC7J/oPoHElZLQCS1tK4ED7dTzZ4YsHNEIF9DWwqBILxZckEyZ/6BhN2MCFLyMcboKinaYUsKaEKEi1pY5YMgvFlyQVYbhPgroDX6Tnd19mTU/kuWevH6FI/DKh8E4c2SC3KeVSXq/g7SLgSNP2z0TFcN2DYiXoaV4gSC8Ga5BdEPpZEWxBqm52/eHWhvd0oqtfL2ByFh5W+AILxZakGU/bOR/eeWH+rFGBNR31bSdEHi94WQhukQhDdLLUhKfxT8KXfNVRGSv3kd4+V7JUK9fvFGJ6SJXgjCm6UWRG9ejExEmSN0tVcZ5/WpR5EuSP0wpIBFCMKbpRZEO+/5E5hYa+j5s7HCqTKrOXrtzXZDCliEILxZbkFuSpQRSP//2c5YYwg9lgyYxroPqYQQhDdLLYj8mPNVP2sLulBcHasFkMtrKvUCkrVCOCWEILxZbkG20nFvniv7zM766XhvULtIUy+fsBtS7gYIwpulFiTWlnyTWFbMunTUHO/1hUfaanr/HVshnQ8NQXiz3II0Rs86MNqQ9EVlzDc4K9KvX2s7nE1TEIQ3yy3I2sgyiPnv6t240YY3Sfr16+1DEAgy/zSI/4Ob0bzp+3EFobcgcaGXCWcpHYLwZrkFMcYgo4YI4sO4Y5CdHPXyCT0FYxAIMvfI9+roOoiRhLq1Ot4blLfyVD/imMWCIAuA/Jb3BSva6X+KzfGicZu0dRDjPbAOAkEWAOWpOJowzhAkV35nM4j9+lqduqNQUK9CKiEE4c1SC6Kd7xJPRt64fbxB9WYsQVKrtCFIHLFYEGQx0A/axLcn3fxDUC/GquCpsyq9BUleY8MUBJl/MsrJyBDEzJEl5MbaVV45om0p7L/H0TrC3SHI/KO8nvmSvzkZRdWLMdYx/rmTp1deATsKIchCsP9CqIIQUtx7d0+gXFij70mPk5UUBIEgi8BtzncqiJVjt6/Nfeqdcbqi74j0vFhx8fwZg3QIsggc7PoH6c75OMnbbfY4InPQC/BDyN2GlXsUgvBmyQWRu3H/wWvOQWutdeZMlF5r+0/9HGS93j0Iq3wQhDdLLsj+nhSQPlRQSwdasCKpypromSK2By/mGSFPyM0LQRYDpZCgp0fsV3WxsZEJ6CrJeu0uKwm+Yz+JdRSupK6Ptcw4DhCEN0suSGxzK0sfRwj9il46pJ8PEsus9+yDcb0n6JiCiHWcDwJBFoV/ngckJjGnsnqXldRIbVcyhb01yepMeZWyGpHs27fQigdBeLPsgsS0NjU7op3COn+0kfo/z2yW/I/91buEeRihRG1ASGs1tB4WBOHO0gtSPqeeYmDHvQtSevd6tVmLaXofJVZuls/X8ubBIFYb4n6J8U9CxMcxN5OMAwThzdILosVatCbEVMAchovFtbuzvbKma0p576XbLlVVZzjunQAzu1yEFDshlg6C8GbpBZG1nQT1EhBiHnsuGS1FNVHv9XZ79WJWtY9UtyetXF0se9Cev5NxTjoEWSBStXvqNbBbCecMddL/D7vRsP4g3i6W88DRcUiBvCYQhDcQJLZ/nLcX0H2B78RqK+xMDoL9lxMUbww47NOpBtoIgngW1tk5JhCENxAkFlNWjG6U0aei18V3GcQAE9JuhtjBgiD8gSCx2HalJBrTth8TxGlXjEG6lA8tTNECgvAGgvTJHJfsscZH/LBeZfbQsjvhrRGaQBDeQJA+cuwxPTJrO4kh9iBEvSqHk3F0AAThDQQx0PV2+mNjEGGgSFwQW+MdKzIBEIQ3EMREW70TjTH25III1hJI/z+ltdswJ7BMIAhvIIiJkukcGQvnk/shOJYIiRczOh6zWBBkEZEPSumPdLHslwhq9iVlLhFCEAiykHw77EkfG4MYf0nFbibMJXQbCMIbCDKgcNwSByvi3vofZIe1+t7/n1g/C22brRsIwhsIMkQ7uKs6gVfO7NTIAVQDcVzTu4L4cDu6sSoMIAhvIMgQPbN6VzX3ehCJuAwIaDqI8wQp3Q7cvf5JIAhvIIgbJXVWMjcL2pXf3DVIvUSD1Q9JEqp3ijKV9gOC8AeCeEhlztfy/TbBCT+U6BNbg9De/lOqpafxThP5CBCENxDEh174WlcHI5GgHtZgA7paPOnsT2H6ygaC8AaCjJCp3NdFiQy2DVIvkPGQKqaLD+vTGXzYQBDeQJAR5NfCXruYHozBKddHMvfiisXGYSUTcniiFwjCGwhCQVaaq09Jqe9APKCPZQiSezstx6bXuzKBILyBIHQyqb2nB2MfFX0WS00cPd4q+1OauxoCQXgDQQJJaRs7F2tJI5FJfLBq3u9e5Yu7V4+3hc2pDj5sIAhvIAiTZ61z83ax1mvVS8lkslTvHTXuzvaU17D3fQQBQXgDQZgo+/sZLVYoVw721o/XN1bL5ZiS2n+eReNhAkF4A0HGQEmldE1RFE2fTsRVMBCENxAk0kAQ3kCQSANBeANBIg0E4Q0EiTQQhDcQJNJAEN5AkEgDQXgDQSINBOENBIk0EIQ3ECTSQBDeQJBIA0F4A0EiDQThDQSJNBCENxAk0kAQ3kCQSANBeANBIg0E4Q0EiTQQhDcQJNJAEN5AkEgDQXizEILIqSmnp+IGBOHNQgjyrO/PLI3CbIEgvFkAQfTM+sphjXcppgME4c38C/KsnxXV/N1idrIgCG/mXRAttX6XFgQhfafNOCPPTIAgvJlvQRS9fL6bNQ4pILlDeVbpDmcIBOHNXAuiZLSdXZGYxxGQo3N98doQCMKbeRZEV9bbaSOztHnoplo/nspJzFyBILyZY0Fe5cMH0T4r0DgPSmzvPfMuU9hAEN7MryB/6dyLgqvI/f/VD155lypkIAhv5lQQRSk8JUXX+YHmqeXqbvl1scYhEIQ38ymIsl15Kqru05/Ms81J9aS2WOMQCMKbuRQkVXvp5X0n0JozWaR6tViGQBDezKMg+6c7LVMHjyDmseVS/qmwSJ0sCMKb+RNEfz0uGb0rc+ZqWGRijEL6/6uePC9Q1AkE4c28CaLrzbesJAmCpBLPGMS0w2hV8luzPgZqikAQ3syZIKnU3lXO6FtZDYini2W2Kn1xcjeLE5YFQXgzX4KkalslyXZD8J5hLjiKEJJ7yizK9hAIwpt5EkTXT7eyKrHGGoJzcPlI2Yla39jmXdaQgCC8mSNBUq9f62YLQaiFHhS+P1yvv/yFd2nDAYLwZm4E0VLH7aqoxgVVoteYYeH745DSobYQvSwIwps5EUTW9cvdar/5iAvvNCBGE0IEdbeyvwjbQyAIb+ZDEH1/482evPIOzQP8EAS1cQxBZgsE4ca20nnIEjIYnr8jiLUcclGZ9Uhd2w7dSQjCm3kQ5FW7M7bVStZMLtOOgSACUe8rMy7nN2Uz7IEPBOFN5AVRdP22pZqRV9Lo6ge19JLVGRMbFW123SxFS3WTVwexcBWBILyJvCDbykpPNFcAJcryILXwxDYkf6LPLLRX3laeilJ+rfMaqiEQhDdRFyRzeSU6kYn24uB7nSxnHVEQqish39CDkQ+2zAD80qESZqwkBOFNtAXJxG5bVVMLY4LXaTxsRRxdBHtfuvWX/bj5Tyl5NqOgk+2D+4SRXUWQds/CTD8EQXgTZUGU7cqJSi2eGWVibAcxtkkNGgxLItfzJJK/nEkeh3/c9iQzu4oQl7JbsfB2xkMQ3kRRECtcXdZWb5IidVVQGELEXJYIgwbGEMb1NCLldgrT3h4iK6mdrGT8YqtE1fqGHFa7BUF4E0VBTLRU7KTlTsvgLp9kT+USIia7b3kr/H1kCG8KUzrfnrIhmnyWlNzOqmudsJbxIQhvoiqIrpzvimqAH6YbZmUUTzZi2kteGg5CXJEo1haq5PF0hyF6sz/8GAx7jF5WXKqvyOFsSYEgvImoIJnC9ZFqLHywBOl3oLbKr4r2ep8zt9+ahrgFMVHbe9PM2rvf6WZVMpwksGakE2e1zTDeHYLwJpKCyH/Za6vWuiC9fJIRtChVd8+sqHalW1WHnRzPBzFGKfUpBp1826sP12cEexLNmGFux8IwBILwJoKCyLHaY1VkBSaaKX7U0knZ7jxp2knOXB/0xaLYCyhqY12ZUhsiX5p+SJKVg2gwD90vTOu8/PlfCkF4Ez1BFH3jLWElvQoQxOjoE7H3UnaqvaytvomESMSX6cQZuVcvClNJ5KDHrnfTZrYhYi9iWr/eLIXYePn8miEE4U3kBNmsXJfSZNijp5dPyN2XFdfgW67dpQfDEE8DYv5fvCpkwi/qt9WTrKt/JQwLbRZESjwpn12FgSC8iZogWvmtJNlDbrcg1n85vXyxtFPRPR2YzOpaerjW7rxmsNKe/RoLfbI3E7vLkkGfarhF3rGESMkn+ZNeQhDeREuQzPNeT4iT0XbDGQOb92uSbR+PxuluNCTB18dyvTz7+BpyG/Jaa1B/l+fX3svfPvVLIAhvoiRIRm62c8SXc9flhxWTJaV3zzOUaSm52R8PSMYEF+0DkepjLExDlMJNSwqaZRv8WqIe3RhF+/BoHYLwJkKCaJuXF3kztMqz7XzQtSeqIYiUf9jQ9ykv17cPjwbJ5PxVt/+WxafN8KayMspLK03eFaTvZeu88ImYewjCm+gIkimf5FQnrt0viFXJjfYjeSMHjCbk2HHSDsUamSDuiyXlnrbDakO0wn1SJfTunFdLoibvtI8vw0AQ3kRFEE3f6Gbt0Fx/YVyrC/mHQyWwlsv6dcKKTqGsGBKJJDfCmeyVt2PdvLMyyRTE8F2q9ofqH227IAhvIiLIduYmSyTqnsHh7Kmk5k4U5qD3/3aSg6ja0cS9QvI4DEH0zcpWWqCUlK5Iv2t4t/pRQyAIb6IgiKylNo7yVoSumfhqNPWVWdGqjdv3+kipw4QzdPYIYsat9Ls76583JFXYq5v5Tz2h9cGC9J8qlY5rH+vdQRDeREAQJSWf76Yle/tT3FfxBmsLUuKio793I1ZiJ0UyWI9wC2KEoRBxbf2zob368+GROmb7Ya6pGy6pR18/lvAEgvAmAoKkTq+M7apEsHO++Y5Ws0tEenvjdFPkwleJjDQhgy3tUmv9c4GL28pKzgpu7xfSmFdjMpidlvInMm3q7T0gCG+4C5LRLi+qVqBf3IkUcXeSrCVqkm0c7491D1YqbVWw94K4BHEW1cV2+TOZTpTydZIIA0EkZ3gUd6+oe+22D3LP7tT2J1/MhyC84S3Ipr4jDuZmXRXaUobYi+di6WnswYOiH6WtAQK1ZqkXnzAkE7vK++Ihh6cxCE7CIeoVFdJHq5mJDYEgvOEriB57WVPtGif4xgyGIeZcKpGydwcTDK6V2kk6OEMpybbLH1wO0QvnPVWVvApYa5NmMe2JX7ohhEi9m4mzEEEQ3vAURNGVs3p62K3ytCDWfJY591RcKaQmufemVo/SQUNoQ7eVjwWd6K/HdSuo3jM/Zv4iYp57RZiC9NvBR23CNgSC8IanINq6Obnr/M7RdQuz0ontvfJkN15lu3MVvJckTvJ3H4ns1ZSzonEEonejo2BPLRCiDlQJ8EMwNqacTvZRIAhvuAkip2rnZveKWoK4PfjoNx93qxOPGZTtvWTAEMTULnGtTzyXJcvXdWIlQPVtyrL3dkkkd2QeYUINJ7ZGKn03NyY6YRSC8IabIP+sXeSEgCGtXe2MfYOtF/0jt/v946IYsJ/duOfnXvQJVwy/ld+qxNqO4mkjhCG561ilmyPULpZgbzs0zk98neADQRDe8BFEllP9+zExd3PH46NVoH87Nrd6l7ZqH1y2eL48ovd1rFnjxGQbqHT5oCVaOlu7UjzvZ1oiFm/12Pb+ZTJgbcSa4jLmex8z4zciEIQ3PASRNb3WTaaHpzmPFsCsSmL9sPLhPavyWUKiC2IGf9T3xg+PkrX903baGmlYy42eMYg5hSU2zs1GSXvp0Zsu8/wfY6JLSjwqY5+0A0F4w0MQTb8+Ep0JH2E4SPf2XOL57upnzveQn5LUj2ZlWCDJw+dx7+N65roleRY7RgTJXzmrK3KnnQ4QxD6VQUhfbECQj79mtnAQ5Hn1rKQK/mVn5x9Ol6V/o43tfya0UC4/Va08cv7Ad2vZYvd0zN7bt8J5XbVmb519KfFBZgaruPmT1YxTVs04CGGwh955nh22aJFvjxsSBkF4M3NBUq8dc5WC/nvjdh4SKf9w+bnd3AYnaXP1LmAioFcYKwv7pryVoCTcIs4qvxFo1S24XqBrKwmnwSFOXhXPpxTU+tl4fUcIwpsZCyLLq18TQcvc9v3YSPXWWgnhHBp5/86cKKOHpQvSbifzbhMlK50rK6GQa/pWcDIMmRnj1NZX38Lj9uGuKMSJkyzLt8ne8F9NnyjKGO0jBOHNbAXJKKcXxjRPQMCSvddJSh8dj1N73mXz4E4klBwQ9m/LX8Xe62XJ+t59flDRPSrbXSaSbp37NwHrWsdey5ec8GRP+JYRd5J4LGy//xkhCG9mKsi21jXO44zTU4/E7W4LSbzFlHAyssu1hhqnd+eMXyQ2Vt95A+WmJFqjes9ktF3pzXnqi9XUyJBb0U+30gOPvGMt64WEVI867wfAQxDezFIQrfaYU+3qEXBT7z8qfiCmLwg5tdegTyRba3fVrQrr5Sn5rGVMPRHiexNneEFIur1Kmw2TXwt3VafLaKe7c15qx/8S8Wrv3ZgwCMKb2QmS2rx9IPY0aVAcSL/rkb/rhJlGd7NizNDSc2UZbcj9fvBIfTOzkjZzEFnZ5P0b5Y2V/sRdYFps/a04CO/1vHRwnLWUfHl+Z54AgvBmVoLosdOTPHEiLoK6WGK1fpYJ9+jm7XI9KOjEKEr6pBbwQjnVvB/urfVtczQ7V0QtHTIWNFLHR+nBZJdPTHvCN9+tsFfVIQhvZiOIrO931nKq+6Ay2q8Vs1e3kwaEv8t+QNCJFc8iJZ8K1CqqaM121uoL2Qe++cbohKi9a1Zpte3jdpr4P615dINjiFTcYqcEgiC8mYkgSqaykyDCMGc7feBMkmeVKZxSoHWSjIhIKfGV+jv37dwMxBVi4jOksVFgrogrSvmkGvd/WGE4/dtHXLtl9bIgCG9mIoh+sOXs5LYFcVc0J29ievc2lMldP4r+VLcWs0enBsxFu8PRTp1cvrUnau0+0nDd3xxxG0cqHG28uxSvFawE8M5dwQ7cGn72uJBe22BM2UEQ3sxAkG/bX3vS6IFqzgKB3QkhpcDRwGfRMuc5szLS96kLyctXX0uQypwlJH/krtP8Cea2qOrWWAe76WdJZyAzSB3hekNjUqv0kgmczYIgvJm2ILKmHLTTxFk2cP8Oe7bT3Kwq5XePwx2ce9Bv8lbEB30+K3nsXcpQVh+yUtwfLea0d1as42NqvLlo+dYIzHTOy/LnjDSvQ+4+cMs9BOHNtAXJ6IcPVWe3EGWjkRUrJeVOOpOn/Bif/dRWYmQxY1gWsbHnCjpRlNW7vOQME7xFto95k4pn44bC6KlOwx6qj8xu2/t1pexWMyBuGYLwZsqCbO7dZ1Xqxo9BXKLxR/KyMsWTmmPGAVQr1eDZM0HtNYer2vpxKS0Mbvqe51mLH5Ja79CnvmgoinIhmacCWfkdfYKY/a506ZzefkIQ3kxVkH194yFL7E3c/nmggSAkf3X52bP83kUrNIL2ixuFEe9W7eBhXVlvOAmw41RDiNg+nyjSONV8y1HbkOHghBztabQuGwThzRQFUfYLX3OS03rYcz++umEcoNFbSU1x+OGQqmypQsCCiDlna7UJqe2nukSGJyT6O1n9AmcvChP2BjXtuqcO5sNGBDF/f/06QzEEgvBmeoKkascl4oSzSmTkbmxVF5K/OJ3i4MONkZOUvv5itmRXRkyucnyXdqZ0RztkRpOnJp4+sJapH6yJTmIg12WOW6kpzN9fvVsd7WZCEN5MSxBdy+zsqoIrLad/DGIMd0Wx+Bab5ujcTarSSwecYGi0DHkjPV35KjHcCOUXxPiBmrsOPsEnGD2zsVaVvBN5g9UVazVSyl01R0b+EIQ3UxJETm300mTYh4gLvjkka4W62l4N9WhNNvppm55yxDo9pHoV29tNu8pJmceSjm7Zq+eBKIWVPGU93s6TYv6nWj/2x51AEN5MRxBFPmw7GdvtmmYdjebUC7NlkXJvB+EcijZusY6Tkr1X3Pt5rXt5dauh0gLbhwP29O7Hz6jaVrpF+3CfYbIKYbjRxGie1vxZwDY7pYDtLBBkNkxFkH+sdrPBGeFsPfq17WV/6rNXHpTUy5FkzZ+9fziUyx6no5jfmiSJth9NP2/YyVykoLiX/LW86X7NMwThzDQEUV6Mc9CC9mBIVhVRi93m59MyTEpqo2T1+aWAekcTxFrkJFL+UfvIIThDtmsXaWkYXUO5OoL6UHNv4H3eSwbknIAgsyF0QRRt9SmpEsr3b70zMSsnEXvX8mybDxNZuzEWyUnQ6SFUP8xzDYiY6H5keO4hFbvPDWctaIKQ6sWqa696fwwScCUhyGwIXRDtslVldGHsVfX8XU2e7tp5ALp2lnSF5o5niNF8SMnjj54r4iLVPMtL0iC013XFB4qovbPhYQ+bG0UIwpWQBclUvu5KVic/0I/+H8m3wmeSJn4GpfyYFoIaOCpWi7d7E4rReuprT3IG6q4L7lpBFVuXstOGPO+VAm41EGQ2hCqIljm9EIkzsU+LLDfvxtnG+uf68p9C1+8SkwhiNofiQzOsIu8fHKlWFLNHEGHw2wQhe6LZofTPe3UIwpUwBdEKj0lrCB6UuMRcii6dTZRZPXR0eSc9QRfLWMNLXIT5+2PtxOiKiPO3FXNw1bT2jpljEAjCkfAE0eXVk5zopFMLSuwjpXsv2uzWBqlsly/ECWaxBJLbaW6+/7Zj8231LSuNbJ2y/7ao3ltnwm/uYQzCl9AE2U/tlOxZfjsCi+pHYqXGafDhQlEa1fEXQkj9JhZymQtnPeIVxOOHkR2sdGg0Id86aEH4EpIg+n7zujiYwIwPw8WHYe7GX9Luk/bBE3FCJbW+ppoBxt4t8t5r4NTY+mVg7quPIivnPVdIveuXDjYGSL2ngtwXpIRQE66EJEhmfa3qm7y0t9S6Yrql3P3k5w1OB/m0N2juggSxii7u7o2VBH5C9jtr+cFGMurvl6pdffMbVtI5E4Ygekq5sLII+jrWVlZbwU7TKfauec3tjqIdP6h21Ae9AlrL3SR/15zOeuZ25TGnOgmF6IaI7YPXW3rKIggyKz4viKJnmldZaXSPqtOhtuoAyT10Jj05c4rI2nHLnnELqJ5G7VUTd5VpzUinyt2SlewlINd9386j85UEBOHK5wXJyMYXLQx3WLsEsS0xsvHmXsoTHYA8dTLHOZWxom7uPi+9THG9X9Zu6852qYDfr+aSaXSxuPJpQV73uglpGLxNSVxiLIukdyc+eHnaaK87xZGk1J4aKhXPPnQG9dglyFzWRUkKON/Hmi1XJUzzcuWTgmxuv9RF6xzAkbvxYAxK1ORO5Z/T/RwfQb7JSfHADo4gNibLzfAB/rFxlw+MLHbGbmhBePIpQTR540QdZGL2KzI4YyZ9dRv6RGkY6PuPxaBOlnH+1JRTERloyluR0Bsxa/QWcH4cBJkVnxBE1pX1tZzqSh/qrW1290rKXjVpCTsigKY8VYMG6fmt01nMuWnaWSIo6EAaPbkHgsyaTwiSiV0kJGFoh/VK97uY3aujw2Yk2w8DTVtx9W9cZSf5HX02pdZjxyXaASb2QVzoYnHmw4LIsU6//ywMdm17vRCcSazsw0ZU7TDQYg+DswSHWbMEUhw39W4IbB42xEHuBs9FFKg7cyHILPmoIK/a027Q6HaI2grvvMHpoNW2ROdmbSaMM3dk7J7PcrdjqnKRG56e4lxFuhcQZMZ8TBCtdtwImp4cZuKVchen0dYjZpwE0s4Ta8nfXukk+fsZt3pK4WvRSXc6bpQxBJkNHxFEVvTDVj5octK+FwuSWFypcNh2PiGytnGlWlmIbEvEi4o+427hduo6oU6UawWCzIgPCKI/d7byJOjbtMM3JDV9tR7SaefTRVEOGq6JapLtzjRXl4UeO++J42eSgCAz4wOCaHuNbPD0it1TkRJble2IrZ0HkTk2T4Eysz2S7LXMJeJYXjeyOg6uIgSJCBML8iw/Ju3ToeivNbedi42b7SjPXnn5y+WuFTRo5GbgFTGmrZ4Msu2NMRSBILNhMkGUlLJXV4dHC1IF6VM6qUxjE8XU0PeS5klX6gPHWQUl9pRwIq8gSFSYTJCM/mQedGHN+lBP2+j/OF08K8x6mPs59MxK0gyp3OC5oWs7tVNSibOVEYJEgkkEUZ7Xr9KDY8NHO8rWvU/KXtT4pi35AHL5Oqtm32p8R00Z+bQlkpGQBAjCkQkE2daP16q+dfPBnW6w6KuWdprzpodBoVt/lHnvl1f0vStxGIbAWhaBILNhbEGU7eZK1nfYuRMO4cyQ9gfo4t3xZkT2nU/I/sEr53REBt+Uk6w0OE5lJEIagsyacQVJ1W5bqn0SwOB59pkflh1mYHv9UZuj2SsvESm3vtNzn8wVFI0FQWbDeIJomtatq8SJxxg+b5D9w3hITe9eRyKrz1yTil320oM2ObCTBUFmw1iCKJlT82wy//LgsBNgDt2Tb7FobTufT2Tt9C7tWtunfkUQZEaMI4im3LTVwb5Bb1oGxw8iSMnDGocgjQVE2a9diFZkcfB8LwSZDWMIYhyoJlnZqH0r6PZhBkaoNklcdPYj0ouffzTlxFwzHDlHBILMmncFkbWXkuq0976TmcykUmbvKt06LPP8GAuH8tJKk+FhnxCEF+8Iomi1w5xkb5Swkw36Ml8Zobv59m1Et53PK3rm5ijtXXOCIDx4R5DMwYN1qN4gT6IVXzLIRm7mxyl1YzJGH+Eiy522yIg4gSCzIeDyW4Io2o11TsAgI4N9eK3d9ls9L+noJjOPa+cRR9ZO22mspPMmUJDtWGw/9pilfEN2P8vucpHkW3n2xzkvBfvydc4XuwBBZg1VD4EUV/5PkS8b1OOcncl504/02m2B92dYWOTYWUvCSjpX6IJIycd/lC9LaeqmD1eQkJRvnM4uP87yoaee8pjm5QpdECFx12ln1aEf1KTUQrp+WIYe0+R5vYhZLK5QLz4hYnEt74oqEbyrH+YZz/2/2reYvJour+s4o5AvdEEk4xxOryDu9XOJxCUiFVfkudpXO49AEN7Q229BkiT36WCCv4sVFxMXtwjcnTqbexCEL3Q/BDLMSm3/xPWoEZdV3KpN62wyMOR5A4d48iVAECdrydCQ+GAPupEUrr6uRO3EqIXk2TjlFtO8HAkQZDQ1k+CcHN5vQbLtzjbWzmfBZgddLL5QL35gq2KuG4qtl8ge+LFobG4kA7IsQpDZMLYgcXu7Lcl1N7AvalZAEN5M4Ic5KpGK3VgK7cesgCC8GV8QI9BdSj+cFzD6mB0QhDeTCCLFc/dNtB6zBILwZnxBBCF9dJyKQG61ZQKC8GaCFqS4tTqfORPnGAjCm7EFEZNPBUTuzhoIwhtWm2H+Yf1J0lsdDe3HzIEgvGH4Ya6nWwlNSO6tEsPix+yBILyhXnxChhnbjaxXYvv8GbNXPIAgvAkQZJCWwfiv1mMFow8+QBDe0HtXw0S8hKjFQxl+cAKC8CawBRGsXbVS4qIsY+2cFxCEN/QWRBAk1UwYpyaeEFrCEQjCm8AulpmnWr1b/4a1c45AEN4ECCIZWdvF0lMMow+uQBDeBAoiEPHoOoW8DHyBILyhC2KMzotbBR2LH5yBILwJakFI+qaMtAzcgSC8oV78uJBuHWNwHgEgCG8CuljZk03eJQMxCMIf6sUnQq6L4UcUgCC8CWhBEo/oYUUBCMIb6sWPxxM7WACJAhCEN0EtyAq6WFEAgvAmUBDeBQMGEIQ3ECTSQBDeUC9+HF2siABBeIMWJNJAEN5AkEgDQXgDQSINBOENBIk0EIQ3ECTSQBDeQJBIA0F4A0EiDQThDQSJNBCENxAk0kAQ3gQIknvkXTBgsLlXxDHQXKFefCJk33gXDBhsHifofkCQGUG9PwlC9Z53wYDB822AIMIe76KNsJiCSIR6+dUjZMSKAs+3OaogAoEgsyEvUS+/VP8L75KBPs/nWXoDIkGQ2VASqddfKOr7vIsG+oLcpKmCkPQG76KNsJiCrOXpgmTXX3kXDcRir19V6iiRZCHIbDgp0ptwcQ07piLA9iOhCqLWD3gXbYTFFOSyRW/CJbGDvCbckbUtgSqI2DjlXbYRFlOQyhq1hyUQ4brAu2xAUy7o64Tp+1XeZRthMQVR2oJ13rP7izAPYGtdauhlcUavrI0IYhyNF8+vVHiXbYTFFKTcloh9oK3gFoQI6XucTcgb5bZFBK8dFrmXMu+yjbCYglRWSsQ8rtPfhBCS34EgnCmf5D0tiGAfrioUozdGX1BBChsnUtwSxDVEJ+Y50Im3TQzUeSLXesTT+R38d0mL3tktiylIrHytmj0s943KOMKz/2+SuN2HIRzRagkjrEHw+WEMEFPRa90XVJDCS06yW27vGMQ4Czp3qWCkzg9lp+q7dZnfDhHEtQrvso2yqIKsr4mCNQrxdHWNkTshpW4sem350rC6K/kFEUxBcndN3mUbZUEFicXOcsTfhDizJUSqtg830YbwYX8rLcT9gpg/OTqs8S7cKIsqiLLeUH3fg31OumCM1NXc/YaO425nj75/kye+pt3+moST6E3yLq4gsYOdtH8MIvWVkYhgtyy7182KjNH6bJEzB7txSt/X6GWRnSjesRZWkNhqSRKI9T0MpkkEZ869/7ckli4uy4XUKySZFd9Sha8tyZDBP3ti/L/6FMUwoMUVpHJfFYyFj7i9HOK6Y9l/EDFxdH/YTGHWdzZs64f3CcpWNsH6knqXEGSWFA56xO5NEf9ofQBJ19srN4cv5+ud09PT1T72XyBETjudzvr5zc1bPU1PFmB8ReQkepGKsUUWRN5fKRLLjrh/zdDz3fQHJ+lccvdoDUyL3d1eMqsS+pdg/JRIRDqL5NT74goSi228iU4bMjKx6BJEGHTABs8E4WJHjtJuUc7XIJYuedcXKossSOWlJRLnCxJIcOs+HKEEf4fgEwxVoT/c/wryJ9HbLGWwyILElMukdfMiAa173Pu1sW5y4BM4V5l6l7IeTN5GcI43ttiCyHplZdjJYgniYdq1ZQkxL2vg1TV+LF50IAgHKldVYjciAa07BJkB73WxBCl5G8EwE4MFF6TQucqaUe4BgjjfGMSYKvblDW5BclvlaDYgiy5IrHzTb0NYcyhW31ig56EB4UD3Q3AeE0jjPIpxWAaLLkiscvuQJ8JwOE6/i0GP6SK4/hz8zPw2jLadJL5WeNeTIBZekELl5koaTshjlBEZXMskJxHcCGKz8ILEYrW9+zyx3SAwJCoMvw2xd5rhXUkCWQJB+gORt5JK1GFgFu+6ASw/JLNpVxu3UYxStFkKQWKrZ/WqtR8dLUhUcPpXavIsklGKNsshSKx8eZGVrExyJGBFBMwWc4wuEenouhnhBmRZBJErt48JiQRNYoHZY/V3Sev6IMp+LIsgMWNF5K4oxQPjesGMMRvz6tFhxfmClEguFS6PILFU4etVQg2OOgGzpT/8SJzsDZsPBftB+CLHyqvdVl6yt6mbf/KuJEsCLZd734+6Z/0jkg3IMgnS/wrk5urLkbW1bbCTChukZoYth4WavzhfjagVLpZKkD5K5fbmPqcS95eGqa0p477Wdk4TQXy47kQ0gNfDsgkSi2n66tfuVd3ITGqPRgRrTyiYJoLZrbIvuNi66O5pc5FMZvkEMVAqL/dXa8n8QBBMbE0Zqwkxk1omWldb52U5+r0rk+UUJFaonNYOVh5yiUS2KqqqJKEFmSpGWImkitV8InnUPa/VjM6VPBeGLKkgMWPSpHK6V2ken201eolsWgRTpZotHW19vawUKs3yfKhhsbyCmOhaYXXv8vDr0wqYLjtPZy97pzU9E70zcpgsuSCAN1FvTSAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIAgADCAIAAwgCAAMIMhkPOSGnAc85+Dy60mjlGxsXR83Z1o4BvNabu4sryD/+mUsvC9Kuh/aorzr6cMPv3I/55f/0tjjX+wIlHteWV5BfvaBmkY8D41UtObuf9De4sdShW+xo1DueWV5BfnNxDWt+RPvQ/6K1v6voDf5frfMr9jRKPe8sryCfD9hTbvJ/dL3kLeinf83621+fsqp2FEp97yyvIKMV9GsmraT/8m/jT7kqWhff8p+nx9D6tJPUuwolXteWVpBDiapaT9QH3JXtKdfUZ/i4vvDmRc7QuWeW5ZWkOtJapr4XkW7freeffnym8Ksix2hcs8tSyvI1SQ17eidinb43ThvtTvrYkeo3HPL0gpSnKSmrbxT0X431lv9YtbFjlC555alFeTXk9S0PXZFO/Q9EG+fNU8vu//pf0EI69MTFXum5T7v7pbuLj//CSPG0griWRrr7XhY2bpotIp56dd/++F31rPZFe0Pnh//+avz867vBY+eEtx45o9OnB//0f3Tn32u2FMpdyz288Ejv7R+UL77wf4wP5U6n/l40WNpBfnR/UUdvPdsu6/+nUD70r336e9dKwcNb0Ured901/3Yj/ZQ+N79w9+OrEJMVuzplNtdyTeMf195hjLiJz5e9FhaQTxfVOz2ivz3L378/ldfvv/77/6g7o6E8/3ZeuJD1v0y50689oX2UwPfpGzD966euKqE+aOmeyHwpzefLPaUyu0Kd7nq/zPrffaXn5Q//PGix7IK8uL+8r4bWZ7+5a8vau6n/8L8Qq9i1IqW87zS/bKm911XfIWo/MldXcz+u+R+fv2zxZ5SuV2hKyRWG11s+Y/aBz9eBFlWQdoj3+pIZWu45v+Nrv/Pr2P0iuYZOP/g/i1171se+0tx+7+uR43Johv30//fp4s9pXK7lPh7LE0pRPyDHy+CLKsg1Xdr2pcvvxmMLPu9hZ9dGH97KprzsGeyNO36JUnv+1GmSy/cjyfsO77Nj5TJowmLPaVy/z/Xg8fUpcazj328CLKsgtCDMPwQ5+krdkQS9U58fdXLCX/73S9+aYxVxcGvOPQF0X7pUsrhGT1f5l3/+BVtynTCYk+p3H9zPfjzLzR+/rGPF0GWVZA/j1XTXNXGglrRXHQunYHy4Uhdpl8ldwX7vfvpVyEWO+Ry/8v7JXj70MeLIEsqyOp4FW1kAue9iuYwWs2+/KZGfeZGQLRHPMxih1xu/2rld7//qz8m+Ncf+XhRZEkFeRy3pv2Xd8fQeBXtzN9J6fPzoEUL/6qcxd+pOn202CGX27tB8U/mgOPG+9p/+8jHiyJLKohvGPrlN9WV89V+R+M6598/0fO8bpyKdk2LcPr34K15ecrTv6PvwvhosUMut2ey9r+dn3rDxAar7xN8vCiypIL8u+f7+r17or/k/S7/6nnd+xWtS9s0/tMkqzCUV9DG858odsjl9ggyXJ10z1F9Gb5y/I8XRZZUEM8u1H/3PuaNs/hfz2PvVbTbv1Kq2ZffjSyAeDgdWfBLBzzzo8UOudzubSau9ZMz+kcY/+NFkeUUpOP+uv7kn5D3ZtbxVJJ3KlqLVs3+dP9eca59Q9y/Bjzvw8UOudxuQVTXz90m/Hr443E/XiRZTkHYPHi+zjv3Q8yK1qElz/k5Y85ogG/e9GObXBnFDrnc7sVz924qdySlu30L5eNxYukFuS22/D/yzhW13Q+xKtrF6Izmd4I/jInKme8W+8ewix1yud3r+W5B3G/0h099vOiw3ILsVI00U/6gUu9Obs9mCEZFS/hr2S+yY0arrv7W/9JcyMUOudzuiSlXF2vD/S7DccbEHy9SLK0glZ3kD/Yd73tvheh6p0w9IRHBFc23F/Y/G+9v1nCgrD58DXrux4odcrndgnw/XNHwhC0OQ3Un+XjRYzkFWRE9U5JfHoYP3fiXiT2begIrmmeF4n/qvlpWu1xpl6p/GOkVmdBGyN9TtxJ9uNghl9sTJz8YjXsmsb4MRvjjf7xIspyCjGT7+O5fk42t7lUv/yf/Iz8az38q7ba3VnZ2djzDzcTJfXutldzyvWHcXgU7uD3rXuwWhR9+7tzb27SyHFIzt1E3o05a7GmV2yOIMxl85W3BnKXACT5eJFlOQQo/0r41Knnj+cxcIv1Pf+uqBT8R/vaTP/7ml7QYJFrvpelPDGqTCKHY0yq3f9jyk92T7B+9P3Kmcif5eJFkOQXxblRgYvbl36to9JhvP7+nlSQwgJ3WT5+w2NMq9xi5h5whyEQfL4osqSC+oI1g/tN89jsVbWu89/oDpRyezAY5d0D4b1c/XexplXtk4muUvQ99vAiyrILUfvFlHL6zehfvVLQxqy1lD7YnM9XfY0/uf/7k08WeVrndgoyMfkyqH/t4EWRZBYmdjtW9eLCe/E5FGyPBrcHo4lvFfU/91bEvkNyfbWfiYk+r3O5B+gntFf9V+eDHix5LK0isRpmf9/GrNfu57Io2bkLp0dA/T+a2h/4Pmp5FtetPFnta5XZPGh/StslfffjjRY7lFSQWawfMsDj8YhDJza5oD6xHXYxkSfckprK6HF/dP6L308cv9rTK7V4ovK6MHumT/8zHixjLLEgs1hqJghjijtZjVzT/NqYA/s3/2y/dXRxn2OBJc/CD/yWTFXtK5fYI8hQ7/73vBWuf/HiRYrkF6Q8jc9RO/Xe/9nS82RWNfgrHCH/2/WpPD32wwciTezAwt9p4xZ5Oub3Bio/9Xp9naPFj9/MfL0IsuyB9Orvebv13f5T8od7siqaOV9F+43tTz/6N3w62tno6Pj8NDg0fo9jTKbc3LNJMX3K6+z9OKUrOB/nkx4sKEMTk4Pz65KGeqDfuV9i7/6IFp2K7BXGkbB5utUpvo9mB5x0IAibG3fRc8C7MlIEgYGLcY44H3oWZMhAETEzcJciiH2AIQcDEuPeezMFE1KeAIGBi3CvkRd6FmTIQBEyMewZ3nvaXfwQIAibGvcmjyrswUwaCgIlxr1COnLSwYEAQMDHubLvk/afPNRAETIx7/7nAuzBTBoKAifkflyBzcxLOB4EgYGLiPxsyH/sCPw4EAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYABBAGAAQQBgAEEAYBBOIIAsDRAEAAYQBAAGEAQABhAEAAYQBAAGEAQABhAEAAYQBAAGEAQABhAEAAYQBAAGEAQABhAEAAYQBAAGEAQABhAEAAYQBAAGLwvCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAApsT/B5IXXl4PVzuXAAAAAElFTkSuQmCC", je = {
85
+ left: -0.35,
86
+ right: 0.35,
87
+ top: 0.35,
88
+ bottom: -0.35
89
+ }, mt = {}, Et = {
90
+ left: 0,
91
+ right: 0,
92
+ top: 0,
93
+ bottom: 0
94
+ }, Ct = [0.5, 0.5], It = 999, Le = Math.PI / 180, bt = () => {
95
+ const t = document.createElement("canvas");
96
+ t.width = 256, t.height = 256;
97
+ const e = t.getContext("2d");
98
+ if (!e)
99
+ return new T.CanvasTexture(t);
100
+ const n = e.createRadialGradient(96, 80, 10, 128, 128, 128);
101
+ n.addColorStop(0, "#ffffff"), n.addColorStop(0.18, "#f8fafc"), n.addColorStop(0.44, "#cbd5e1"), n.addColorStop(0.72, "#475569"), n.addColorStop(1, "#0f172a"), e.fillStyle = n, e.fillRect(0, 0, t.width, t.height);
102
+ const r = new T.CanvasTexture(t);
103
+ return r.needsUpdate = !0, r;
104
+ }, St = /* @__PURE__ */ new Set([
105
+ "overlay",
106
+ "softLight",
107
+ "hardLight",
108
+ "difference",
109
+ "exclusion"
110
+ ]), Mt = (t) => {
111
+ switch (t) {
112
+ case "add":
113
+ return { blending: T.AdditiveBlending };
114
+ case "subtract":
115
+ return { blending: T.SubtractiveBlending };
116
+ case "multiply":
117
+ return { blending: T.MultiplyBlending };
118
+ case "screen":
119
+ return {
120
+ blending: T.CustomBlending,
121
+ blendSrc: T.OneFactor,
122
+ blendDst: T.OneMinusSrcColorFactor,
123
+ blendEquation: T.AddEquation
73
124
  };
74
- }, []), /* @__PURE__ */ P(
75
- "mesh",
76
- {
77
- ref: M,
78
- name: a,
79
- position: u,
80
- rotation: g,
81
- scale: m,
82
- visible: l,
83
- children: [
84
- /* @__PURE__ */ p("planeGeometry", { args: [1, 1] }),
85
- /* @__PURE__ */ p(
125
+ case "lighten":
126
+ return {
127
+ blending: T.CustomBlending,
128
+ blendSrc: T.OneFactor,
129
+ blendDst: T.OneFactor,
130
+ blendEquation: T.MaxEquation
131
+ };
132
+ case "darken":
133
+ return {
134
+ blending: T.CustomBlending,
135
+ blendSrc: T.OneFactor,
136
+ blendDst: T.OneFactor,
137
+ blendEquation: T.MinEquation
138
+ };
139
+ case "normal":
140
+ default:
141
+ return { blending: T.NormalBlending };
142
+ }
143
+ }, Bt = {
144
+ overlay: 0,
145
+ softLight: 1,
146
+ hardLight: 2,
147
+ difference: 3,
148
+ exclusion: 4
149
+ }, yt = `
150
+ varying vec2 vUv;
151
+
152
+ void main() {
153
+ vUv = uv;
154
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
155
+ }
156
+ `, Qt = `
157
+ uniform sampler2D imageMap;
158
+ uniform sampler2D backdropMap;
159
+ uniform vec2 resolution;
160
+ uniform vec3 tint;
161
+ uniform float opacity;
162
+ uniform float alphaTest;
163
+ uniform int blendMode;
164
+ varying vec2 vUv;
165
+
166
+ float overlayChannel(float base, float blend) {
167
+ return base < 0.5 ? 2.0 * base * blend : 1.0 - 2.0 * (1.0 - base) * (1.0 - blend);
168
+ }
169
+
170
+ float hardLightChannel(float base, float blend) {
171
+ return blend < 0.5 ? 2.0 * base * blend : 1.0 - 2.0 * (1.0 - base) * (1.0 - blend);
172
+ }
173
+
174
+ float softLightChannel(float base, float blend) {
175
+ return blend < 0.5
176
+ ? base - (1.0 - 2.0 * blend) * base * (1.0 - base)
177
+ : base + (2.0 * blend - 1.0) * (sqrt(max(base, 0.0)) - base);
178
+ }
179
+
180
+ vec3 applyAdvancedBlend(vec3 base, vec3 blend) {
181
+ if (blendMode == 0) {
182
+ return vec3(
183
+ overlayChannel(base.r, blend.r),
184
+ overlayChannel(base.g, blend.g),
185
+ overlayChannel(base.b, blend.b)
186
+ );
187
+ }
188
+ if (blendMode == 1) {
189
+ return vec3(
190
+ softLightChannel(base.r, blend.r),
191
+ softLightChannel(base.g, blend.g),
192
+ softLightChannel(base.b, blend.b)
193
+ );
194
+ }
195
+ if (blendMode == 2) {
196
+ return vec3(
197
+ hardLightChannel(base.r, blend.r),
198
+ hardLightChannel(base.g, blend.g),
199
+ hardLightChannel(base.b, blend.b)
200
+ );
201
+ }
202
+ if (blendMode == 3) {
203
+ return abs(base - blend);
204
+ }
205
+ return base + blend - 2.0 * base * blend;
206
+ }
207
+
208
+ void main() {
209
+ vec4 image = texture2D(imageMap, vUv) * vec4(tint, opacity);
210
+ if (image.a <= alphaTest) {
211
+ discard;
212
+ }
213
+
214
+ vec2 backdropUv = gl_FragCoord.xy / max(resolution, vec2(1.0));
215
+ vec3 backdrop = texture2D(backdropMap, backdropUv).rgb;
216
+ vec3 blended = applyAdvancedBlend(backdrop, image.rgb);
217
+ vec3 composited = mix(backdrop, blended, image.a);
218
+ gl_FragColor = vec4(composited, 1.0);
219
+ }
220
+ `, wt = (t, e) => t || (e ? { kind: "image", src: e } : { kind: "default" }), Tt = (t) => {
221
+ const e = t.image, n = (e == null ? void 0 : e.videoWidth) ?? (e == null ? void 0 : e.width) ?? 1, r = (e == null ? void 0 : e.videoHeight) ?? (e == null ? void 0 : e.height) ?? 1;
222
+ return n > 0 && r > 0 ? n / r : 1;
223
+ }, Pe = (t, e) => {
224
+ const [n, r] = Xe(t, e);
225
+ return n === 1 && r === 1 ? [1, 1, 1] : n < 1 ? [1, 1 / n, 1] : [1 / r, 1, 1];
226
+ }, kt = (t, e) => t <= 0 || e <= 0 ? [1, 1, 1] : [1, t / e, 1], Lt = (t, e) => t <= 0 || e <= 0 ? [1, 1, 1] : [e / t, 1, 1], Ft = (t) => [
227
+ t[0] * 2 - 1,
228
+ t[1] * 2 - 1
229
+ ], Wt = (t, e) => t || (e === "cover" ? "fill" : e === "stretch" ? "stretch" : "fit"), xt = (t, e, n, r, i) => t || (!r && !i ? je : Ze({
230
+ coordinateSpace: e,
231
+ canvasSize: n ?? ne,
232
+ position: r,
233
+ size: i
234
+ })), Dt = (t, e, n, r, i) => {
235
+ let a = [1, 1, 1], o = [1, 1, 1], A = [1, 1], s = [0, 0];
236
+ switch (t) {
237
+ case "fit":
238
+ a = Xe(e, n), o = a;
239
+ break;
240
+ case "fitWidth":
241
+ a = kt(e, n), o = a;
242
+ break;
243
+ case "fitHeight":
244
+ a = Lt(e, n), o = a;
245
+ break;
246
+ case "stretch":
247
+ break;
248
+ case "fill":
249
+ a = Pe(e, n), o = a;
250
+ break;
251
+ case "fillAndCut": {
252
+ if (o = Pe(e, n), n > e) {
253
+ const c = e / n;
254
+ A = [c, 1], s = [(1 - c) / 2, 0];
255
+ } else if (n < e) {
256
+ const c = n / e;
257
+ A = [1, c], s = [0, (1 - c) / 2];
258
+ }
259
+ break;
260
+ }
261
+ }
262
+ return {
263
+ meshScale: [a[0] * (r ? -1 : 1), a[1] * (i ? -1 : 1), 1],
264
+ guideScale: o,
265
+ repeat: A,
266
+ offset: s
267
+ };
268
+ };
269
+ function Yt({
270
+ name: t,
271
+ source: e,
272
+ src: n,
273
+ fit: r,
274
+ stretchMode: i,
275
+ materialType: a = "unlit",
276
+ blendMode: o = "normal",
277
+ backdropTexture: A = null,
278
+ rotation: s = 0,
279
+ opacity: l = 1,
280
+ color: c = "#ffffff",
281
+ flipX: h = !1,
282
+ flipY: u = !1,
283
+ renderOrder: f = It,
284
+ transparent: p = !0,
285
+ alphaTest: d = 0,
286
+ overlay: g = !0,
287
+ visible: C,
288
+ showFitGuides: m = !1
289
+ }) {
290
+ const { size: I } = Ye(), y = dt(), S = wt(e, n), M = S.kind === "image" ? S.src : vt, H = Ve(M), G = S.kind === "texture" ? S.texture : H, B = De(), w = Wt(i, r), b = Tt(G), Y = x(() => bt(), []), k = x(
291
+ () => Dt(w, B, b, h, u),
292
+ [w, B, b, h, u]
293
+ ), L = x(() => {
294
+ const K = G.clone();
295
+ return K.needsUpdate = !0, K.repeat.set(k.repeat[0], k.repeat[1]), K.offset.set(k.offset[0], k.offset[1]), K;
296
+ }, [G, k.repeat, k.offset]), D = x(() => Mt(o), [o]), R = St.has(o) ? o : null, Z = A ?? (y == null ? void 0 : y.finalColorTexture) ?? (y == null ? void 0 : y.sceneColorTexture) ?? null, re = R !== null && Z !== null, se = x(
297
+ () => ({
298
+ imageMap: { value: L },
299
+ backdropMap: { value: Z },
300
+ resolution: { value: new T.Vector2(I.width, I.height) },
301
+ tint: { value: new T.Color(c) },
302
+ opacity: { value: l },
303
+ alphaTest: { value: d },
304
+ blendMode: {
305
+ value: R === null ? 0 : Bt[R]
306
+ }
307
+ }),
308
+ [
309
+ R,
310
+ d,
311
+ Z,
312
+ I.height,
313
+ I.width,
314
+ c,
315
+ L,
316
+ l
317
+ ]
318
+ );
319
+ return /* @__PURE__ */ W("group", { visible: C, children: [
320
+ /* @__PURE__ */ W(
321
+ "mesh",
322
+ {
323
+ name: t,
324
+ scale: k.meshScale,
325
+ rotation: [0, 0, s * Le],
326
+ renderOrder: f,
327
+ children: [
328
+ /* @__PURE__ */ v("planeGeometry", { args: [1, 1] }),
329
+ re ? /* @__PURE__ */ v(
330
+ "shaderMaterial",
331
+ {
332
+ uniforms: se,
333
+ vertexShader: yt,
334
+ fragmentShader: Qt,
335
+ transparent: !1,
336
+ depthTest: !g,
337
+ depthWrite: !g,
338
+ toneMapped: !1
339
+ }
340
+ ) : a === "standardPBR" ? /* @__PURE__ */ v(
341
+ "meshStandardMaterial",
342
+ {
343
+ map: L,
344
+ transparent: p || l < 1,
345
+ opacity: l,
346
+ color: c,
347
+ alphaTest: d,
348
+ depthTest: !g,
349
+ depthWrite: !g,
350
+ toneMapped: !1,
351
+ roughness: 0.72,
352
+ metalness: 0.08,
353
+ emissive: c,
354
+ emissiveIntensity: 0.18,
355
+ ...D
356
+ }
357
+ ) : a === "matcap" ? /* @__PURE__ */ v(
358
+ "meshMatcapMaterial",
359
+ {
360
+ map: L,
361
+ matcap: Y,
362
+ transparent: p || l < 1,
363
+ opacity: l,
364
+ color: c,
365
+ alphaTest: d,
366
+ depthTest: !g,
367
+ depthWrite: !g,
368
+ toneMapped: !1,
369
+ ...D
370
+ }
371
+ ) : /* @__PURE__ */ v(
372
+ "meshBasicMaterial",
373
+ {
374
+ map: L,
375
+ transparent: p || l < 1,
376
+ opacity: l,
377
+ color: c,
378
+ alphaTest: d,
379
+ depthTest: !g,
380
+ depthWrite: !g,
381
+ toneMapped: !1,
382
+ ...D
383
+ }
384
+ )
385
+ ]
386
+ }
387
+ ),
388
+ m ? /* @__PURE__ */ W("group", { renderOrder: f + 1, children: [
389
+ /* @__PURE__ */ W("mesh", { position: [0, 0, 2e-3], children: [
390
+ /* @__PURE__ */ v("planeGeometry", { args: [1, 1] }),
391
+ /* @__PURE__ */ v(
86
392
  "meshBasicMaterial",
87
393
  {
88
- ref: v,
89
- map: w,
394
+ color: "#22d3ee",
395
+ wireframe: !0,
90
396
  transparent: !0,
91
- opacity: o,
92
- depthTest: !s,
93
- depthWrite: !s
397
+ opacity: 0.9,
398
+ depthTest: !1,
399
+ depthWrite: !1,
400
+ toneMapped: !1
94
401
  }
95
402
  )
96
- ]
403
+ ] }),
404
+ /* @__PURE__ */ W(
405
+ "mesh",
406
+ {
407
+ position: [0, 0, 4e-3],
408
+ scale: k.guideScale,
409
+ rotation: [0, 0, s * Le],
410
+ children: [
411
+ /* @__PURE__ */ v("planeGeometry", { args: [1, 1] }),
412
+ /* @__PURE__ */ v(
413
+ "meshBasicMaterial",
414
+ {
415
+ color: "#f59e0b",
416
+ wireframe: !0,
417
+ transparent: !0,
418
+ opacity: 0.9,
419
+ depthTest: !1,
420
+ depthWrite: !1,
421
+ toneMapped: !1
422
+ }
423
+ )
424
+ ]
425
+ }
426
+ )
427
+ ] }) : null
428
+ ] });
429
+ }
430
+ function Xt({
431
+ anchors: t,
432
+ offsets: e,
433
+ pivot: n,
434
+ rotation: r,
435
+ children: i
436
+ }) {
437
+ const { width: a, height: o } = lt(), A = x(() => ({ ...je, ...t }), [t]), s = x(() => ({ ...Et, ...e }), [e]), l = x(
438
+ () => At(a, o, A, s, n),
439
+ [o, a, A, s, n]
440
+ ), c = l.width > 0 && l.height > 0 ? l.width / l.height : null;
441
+ return /* @__PURE__ */ v(
442
+ "group",
443
+ {
444
+ position: [l.centerX - l.pivotX, l.centerY - l.pivotY, 0],
445
+ rotation: [0, 0, r * Le],
446
+ scale: [l.width, l.height, 1],
447
+ children: /* @__PURE__ */ v(ct.Provider, { value: c, children: i })
97
448
  }
98
449
  );
99
450
  }
100
- function me(r) {
101
- const { width: e, height: t, color: n, borderColor: i, borderWidth: c, borderRadius: o } = r, a = typeof OffscreenCanvas < "u" ? new OffscreenCanvas(e, t) : (() => {
102
- const m = document.createElement("canvas");
103
- return m.width = e, m.height = t, m;
104
- })(), s = a.getContext("2d");
105
- s.clearRect(0, 0, e, t);
106
- const u = Math.min(o, Math.min(e, t) / 2);
107
- s.beginPath(), s.moveTo(u, 0), s.lineTo(e - u, 0), s.quadraticCurveTo(e, 0, e, u), s.lineTo(e, t - u), s.quadraticCurveTo(e, t, e - u, t), s.lineTo(u, t), s.quadraticCurveTo(0, t, 0, t - u), s.lineTo(0, u), s.quadraticCurveTo(0, 0, u, 0), s.closePath(), s.fillStyle = n, s.fill(), i && c > 0 && (s.lineWidth = c, s.strokeStyle = i, s.stroke());
108
- const g = new K.CanvasTexture(a);
109
- return g.needsUpdate = !0, g;
110
- }
111
- const ze = ({ children: r, depth: e = 0 }) => {
112
- const { camera: t, size: n } = Y(), i = I(() => {
113
- if (!(t instanceof J))
114
- return { width: 10, height: 10 };
115
- const c = Math.abs(t.position.z - e), o = t.fov * Math.PI / 180, a = 2 * Math.tan(o / 2) * c;
116
- return { width: a * (n.width / n.height), height: a };
117
- }, [t, n, e]);
118
- return /* @__PURE__ */ p(se.Provider, { value: i, children: /* @__PURE__ */ p("group", { position: [0, 0, e], children: r }) });
119
- };
120
- function pe(r, e) {
121
- return !Number.isFinite(r) || !Number.isFinite(e) || r <= 0 || e <= 0 ? [1, 1, 1] : Math.abs(r - e) < 1e-6 ? [1, 1, 1] : r > e ? [e / r, 1, 1] : [1, r / e, 1];
122
- }
123
- const ge = { left: -1, right: 1, top: 1, bottom: -1 }, Me = (r, e, t) => {
124
- const n = r % e, i = Math.floor(r / e);
125
- return { x: n / e, y: (t - 1 - i) / t };
126
- }, ve = ({
127
- sheet: r,
128
- contentAspect: e,
129
- renderOrder: t,
130
- name: n
131
- }) => {
132
- const i = ue(r.url), c = y(0), o = y(-1), a = oe(), [s, u] = e != null ? pe(a, e) : [1, 1];
133
- return ae((g, m) => {
134
- i.wrapS = q, i.wrapT = q, i.magFilter = H, i.minFilter = H, i.generateMipmaps = !1, i.repeat.set(1 / r.cols, 1 / r.rows), c.current += m;
135
- const l = Math.floor(c.current * r.fps) % r.frames;
136
- if (l === o.current) return;
137
- o.current = l;
138
- const { x: M, y: v } = Me(l, r.cols, r.rows);
139
- i.offset.set(M, v);
140
- }), /* @__PURE__ */ P("mesh", { name: n, renderOrder: t, scale: [s, u, 1], children: [
141
- /* @__PURE__ */ p("planeGeometry", { args: [1, 1] }),
142
- /* @__PURE__ */ p("meshBasicMaterial", { map: i, transparent: !0, toneMapped: !1, depthWrite: !1 })
143
- ] });
144
- }, Be = ({
145
- sheet: r,
146
- anchors: e = ge,
147
- contentAspect: t,
148
- renderOrder: n = 10,
149
- name: i = "spriteAnimation"
150
- }) => /* @__PURE__ */ p(te, { fallback: null, children: /* @__PURE__ */ p(ie, { anchors: e, children: /* @__PURE__ */ p(ve, { sheet: r, contentAspect: t, renderOrder: n, name: i }) }) }), Te = {
451
+ function Tn({
452
+ anchors: t,
453
+ coordinateSpace: e,
454
+ canvasSize: n,
455
+ position: r,
456
+ size: i,
457
+ offsets: a = mt,
458
+ pivot: o = Ct,
459
+ rotation: A = 0,
460
+ ...s
461
+ }) {
462
+ const l = x(
463
+ () => xt(t, e, n, r, i),
464
+ [t, n, e, r, i]
465
+ ), c = x(() => Ft(o), [o]);
466
+ return /* @__PURE__ */ v(
467
+ Xt,
468
+ {
469
+ anchors: l,
470
+ offsets: a,
471
+ pivot: c,
472
+ rotation: A,
473
+ children: /* @__PURE__ */ v(Yt, { ...s, rotation: 0 })
474
+ }
475
+ );
476
+ }
477
+ const Gt = {
151
478
  color: "#ffffff",
479
+ strokeWidth: 0,
480
+ strokeOpacity: 1,
481
+ shadowBlur: 0,
482
+ shadowOffsetX: 0,
483
+ shadowOffsetY: 0,
484
+ shadowOpacity: 1,
152
485
  fontWeight: "bold",
486
+ fontStyle: "normal",
153
487
  fontFamily: "Arial, sans-serif",
154
488
  fontSize: 48,
489
+ textAlign: "center",
490
+ minFontSize: 12,
491
+ letterSpacing: 0,
492
+ lineSpacing: 0.3,
155
493
  bgColor: "rgba(20,40,110,0.88)",
494
+ bgFillMode: "solid",
495
+ bgOpacity: 1,
496
+ bgFit: "full",
497
+ bgTextureFit: "cover",
498
+ bgTextureFlipX: !1,
499
+ bgTextureFlipY: !1,
156
500
  borderWidth: 0,
157
501
  borderRadius: 24,
158
502
  padding: 32,
159
503
  aspect: 2.5,
160
504
  resolution: 512,
161
- opacity: 1
505
+ opacity: 1,
506
+ underline: !1,
507
+ bendPreset: "arc",
508
+ bendStrength: 0
162
509
  };
163
- function Ie(r) {
164
- const e = { ...Te, ...r }, {
165
- text: t,
166
- color: n,
167
- fontWeight: i,
168
- fontFamily: c,
169
- fontSize: o,
170
- bgColor: a,
171
- borderColor: s,
172
- borderWidth: u,
173
- borderRadius: g,
174
- padding: m,
175
- aspect: l,
176
- resolution: M,
177
- opacity: v,
178
- name: w,
179
- overlay: b = !0,
180
- position: S,
181
- rotation: d,
182
- scale: L,
183
- visible: N
184
- } = e, [_, z] = W(null), [B, A] = W(null), h = y(t);
185
- h.current !== t && (h.current = t, _ !== null && z(null));
186
- const T = y(a);
187
- T.current !== a && (T.current = a, B !== null && A(null));
188
- const f = y(null), E = _ ?? t, D = B ?? a, O = I(
189
- () => ye({
190
- text: E,
191
- color: n,
192
- fontWeight: i,
193
- fontFamily: c,
194
- fontSize: o,
195
- bgColor: D,
196
- borderColor: s,
197
- borderWidth: u,
198
- borderRadius: g,
199
- padding: m,
200
- height: M,
201
- width: Math.round(M * Math.max(l, 0.1))
510
+ function Rt(t) {
511
+ const e = { ...Gt, ...t }, {
512
+ text: n,
513
+ lines: r,
514
+ color: i,
515
+ strokeLayers: a,
516
+ strokeColor: o,
517
+ strokeWidth: A,
518
+ strokeOpacity: s,
519
+ shadowLayers: l,
520
+ innerShadow: c,
521
+ glow: h,
522
+ shadowColor: u,
523
+ shadowBlur: f,
524
+ shadowOffsetX: p,
525
+ shadowOffsetY: d,
526
+ shadowOpacity: g,
527
+ fontWeight: C,
528
+ fontStyle: m,
529
+ fontFamily: I,
530
+ fontSize: y,
531
+ textAlign: S,
532
+ overflow: M,
533
+ resizeToFit: H,
534
+ minFontSize: G,
535
+ letterSpacing: B,
536
+ lineSpacing: w,
537
+ bgColor: b,
538
+ bgFillMode: Y,
539
+ bgOpacity: k,
540
+ bgFit: L,
541
+ bgAutoSize: D,
542
+ bgWidth: R,
543
+ bgHeight: Z,
544
+ bgGradientStops: re,
545
+ bgTextureFit: se,
546
+ bgTextureFlipX: K,
547
+ bgTextureFlipY: ve,
548
+ borderColor: me,
549
+ borderWidth: Ee,
550
+ borderRadius: j,
551
+ padding: q,
552
+ aspect: O,
553
+ resolution: ie,
554
+ opacity: Be,
555
+ underline: Ce,
556
+ bendPreset: ae,
557
+ bendStrength: ce,
558
+ name: E,
559
+ overlay: de = !0,
560
+ position: Ge,
561
+ rotation: Ie,
562
+ scale: P,
563
+ visible: N,
564
+ renderOrder: ee
565
+ } = e, [oe, be] = _(null), [Se, Me] = _(null), V = X(n);
566
+ V.current !== n && (V.current = n, oe !== null && be(null));
567
+ const Q = X(b);
568
+ Q.current !== b && (Q.current = b, Se !== null && Me(null));
569
+ const J = X(null), F = oe ?? n, ue = Se ?? b, he = void 0, fe = x(
570
+ () => Ot({
571
+ text: F,
572
+ lines: r,
573
+ color: i,
574
+ strokeLayers: a,
575
+ strokeColor: o,
576
+ strokeWidth: A,
577
+ strokeOpacity: s,
578
+ shadowLayers: l,
579
+ innerShadow: c,
580
+ glow: h,
581
+ shadowColor: u,
582
+ shadowBlur: f,
583
+ shadowOffsetX: p,
584
+ shadowOffsetY: d,
585
+ shadowOpacity: g,
586
+ fontWeight: C,
587
+ fontStyle: m,
588
+ fontFamily: I,
589
+ fontSize: y,
590
+ textAlign: S,
591
+ overflow: M,
592
+ resizeToFit: H,
593
+ minFontSize: G,
594
+ letterSpacing: B,
595
+ lineSpacing: w,
596
+ bgColor: ue,
597
+ bgFillMode: Y,
598
+ bgOpacity: k,
599
+ bgFit: L,
600
+ bgAutoSize: D,
601
+ bgWidth: R,
602
+ bgHeight: Z,
603
+ bgGradientStops: re,
604
+ bgTextureImage: he,
605
+ bgTextureFit: se,
606
+ bgTextureFlipX: K,
607
+ bgTextureFlipY: ve,
608
+ borderColor: me,
609
+ borderWidth: Ee,
610
+ borderRadius: j,
611
+ padding: q,
612
+ height: ie,
613
+ width: Math.round(ie * Math.max(O, 0.1)),
614
+ underline: Ce,
615
+ bendPreset: ae,
616
+ bendStrength: ce
202
617
  }),
203
618
  [
204
- E,
205
- n,
619
+ F,
620
+ r,
206
621
  i,
207
- c,
622
+ a,
208
623
  o,
209
- D,
624
+ A,
210
625
  s,
626
+ l,
627
+ c,
628
+ h,
211
629
  u,
630
+ f,
631
+ p,
632
+ d,
212
633
  g,
634
+ C,
213
635
  m,
214
- l,
215
- M
636
+ I,
637
+ y,
638
+ S,
639
+ M,
640
+ H,
641
+ G,
642
+ B,
643
+ w,
644
+ ue,
645
+ Y,
646
+ k,
647
+ L,
648
+ D,
649
+ R,
650
+ Z,
651
+ re,
652
+ he,
653
+ se,
654
+ K,
655
+ ve,
656
+ me,
657
+ Ee,
658
+ j,
659
+ q,
660
+ O,
661
+ ie,
662
+ Ce,
663
+ ae,
664
+ ce
216
665
  ]
217
666
  );
218
- return k(() => {
219
- const x = f.current;
220
- if (x)
221
- return x.userData.setText = (U) => z(U), x.userData.setBgColor = (U) => A(U), () => {
222
- delete x.userData.setText, delete x.userData.setBgColor;
667
+ return $(() => {
668
+ const ge = J.current;
669
+ if (ge)
670
+ return ge.userData.setText = (ye) => be(ye), ge.userData.setBgColor = (ye) => Me(ye), () => {
671
+ delete ge.userData.setText, delete ge.userData.setBgColor;
223
672
  };
224
- }, []), k(() => () => {
225
- O.dispose();
226
- }, [O]), /* @__PURE__ */ P(
673
+ }, []), $(() => () => {
674
+ fe.dispose();
675
+ }, [fe]), /* @__PURE__ */ W(
227
676
  "mesh",
228
677
  {
229
- ref: f,
230
- name: w,
231
- position: S,
232
- rotation: d,
233
- scale: L,
678
+ ref: J,
679
+ name: E,
680
+ position: Ge,
681
+ rotation: Ie,
682
+ scale: P,
234
683
  visible: N,
684
+ renderOrder: ee,
235
685
  children: [
236
- /* @__PURE__ */ p("planeGeometry", { args: [1, 1] }),
237
- /* @__PURE__ */ p(
686
+ /* @__PURE__ */ v("planeGeometry", { args: [1, 1] }),
687
+ /* @__PURE__ */ v(
238
688
  "meshBasicMaterial",
239
689
  {
240
- map: O,
690
+ map: fe,
241
691
  transparent: !0,
242
- opacity: v,
243
- depthTest: !b,
244
- depthWrite: !b
692
+ opacity: Be,
693
+ depthTest: !de,
694
+ depthWrite: !de
245
695
  }
246
696
  )
247
697
  ]
248
698
  }
249
699
  );
250
700
  }
251
- function ye(r) {
252
- const { width: e, height: t, text: n, color: i, fontFamily: c, fontWeight: o, padding: a } = r;
253
- let { fontSize: s, bgColor: u } = r, g;
254
- const m = typeof OffscreenCanvas < "u" ? new OffscreenCanvas(e, t) : (() => {
255
- const d = document.createElement("canvas");
256
- return d.width = e, d.height = t, d;
257
- })(), l = m.getContext("2d");
258
- if (l.clearRect(0, 0, e, t), u !== "transparent") {
259
- const d = Math.min(r.borderRadius, Math.min(e, t) / 2);
260
- l.beginPath(), l.moveTo(d, 0), l.lineTo(e - d, 0), l.quadraticCurveTo(e, 0, e, d), l.lineTo(e, t - d), l.quadraticCurveTo(e, t, e - d, t), l.lineTo(d, t), l.quadraticCurveTo(0, t, 0, t - d), l.lineTo(0, d), l.quadraticCurveTo(0, 0, d, 0), l.closePath(), l.fillStyle = u, l.fill(), r.borderColor && r.borderWidth > 0 && (l.lineWidth = r.borderWidth, l.strokeStyle = r.borderColor, l.stroke());
701
+ function Ot(t) {
702
+ const {
703
+ width: e,
704
+ height: n,
705
+ text: r,
706
+ lines: i,
707
+ color: a,
708
+ strokeLayers: o,
709
+ strokeColor: A,
710
+ strokeWidth: s,
711
+ strokeOpacity: l,
712
+ shadowLayers: c,
713
+ innerShadow: h,
714
+ glow: u,
715
+ shadowColor: f,
716
+ shadowBlur: p,
717
+ shadowOffsetX: d,
718
+ shadowOffsetY: g,
719
+ shadowOpacity: C,
720
+ fontStyle: m,
721
+ fontFamily: I,
722
+ fontWeight: y,
723
+ textAlign: S,
724
+ padding: M,
725
+ overflow: H,
726
+ resizeToFit: G,
727
+ minFontSize: B,
728
+ letterSpacing: w,
729
+ lineSpacing: b,
730
+ bgFillMode: Y,
731
+ bgOpacity: k,
732
+ bgFit: L,
733
+ bgAutoSize: D,
734
+ bgWidth: R,
735
+ bgHeight: Z,
736
+ bgGradientStops: re,
737
+ bgTextureImage: se,
738
+ bgTextureFit: K,
739
+ bgTextureFlipX: ve,
740
+ bgTextureFlipY: me,
741
+ underline: Ee,
742
+ bendPreset: j,
743
+ bendStrength: q
744
+ } = t;
745
+ let { fontSize: O, bgColor: ie } = t;
746
+ const Be = [
747
+ ...o ?? [],
748
+ ...A && s > 0 ? [{ color: A, width: s, opacity: l }] : []
749
+ ].filter((Q) => Q.width > 0), Ce = [
750
+ ...c ?? [],
751
+ ...f && (p > 0 || d !== 0 || g !== 0) ? [
752
+ {
753
+ color: f,
754
+ blur: p,
755
+ offsetX: d,
756
+ offsetY: g,
757
+ opacity: C
758
+ }
759
+ ] : []
760
+ ].filter((Q) => Q.blur > 0 || (Q.offsetX ?? 0) !== 0 || (Q.offsetY ?? 0) !== 0);
761
+ let ae;
762
+ const ce = typeof OffscreenCanvas < "u" ? new OffscreenCanvas(e, n) : (() => {
763
+ const Q = document.createElement("canvas");
764
+ return Q.width = e, Q.height = n, Q;
765
+ })(), E = ce.getContext("2d");
766
+ E.clearRect(0, 0, e, n), E.fillStyle = a, E.textAlign = S, E.textBaseline = "middle";
767
+ const de = e - M * 2, Ie = Array.isArray(i) || r.includes(`
768
+ `) || H !== void 0 || G !== void 0 ? _t({
769
+ ctx: E,
770
+ text: r,
771
+ explicitLines: i,
772
+ maxWidth: de,
773
+ maxHeight: n,
774
+ padding: M,
775
+ fontStyle: m,
776
+ fontWeight: y,
777
+ fontSize: O,
778
+ fontFamily: I,
779
+ overflow: H,
780
+ resizeToFit: G,
781
+ minFontSize: B,
782
+ letterSpacing: w,
783
+ lineSpacing: b
784
+ }) : $t({
785
+ ctx: E,
786
+ text: r,
787
+ maxWidth: de,
788
+ maxHeight: n,
789
+ padding: M,
790
+ fontStyle: m,
791
+ fontWeight: y,
792
+ fontSize: O,
793
+ fontFamily: I,
794
+ letterSpacing: w,
795
+ lineSpacing: b
796
+ });
797
+ O = Ie.fontSize;
798
+ const P = Ie.lines;
799
+ E.font = qe(m, y, O, I);
800
+ const N = pe(O, w), ee = _e(O, b), oe = n / 2 - (P.length - 1) * ee / 2, be = P.map(
801
+ (Q) => Ae(E, Q, N)
802
+ ), Se = Math.min(
803
+ e,
804
+ Math.max(0, Math.max(...be, 0)) + M * 2
805
+ ), Me = Math.min(
806
+ n,
807
+ Math.max(O, O + (P.length - 1) * ee) + M * 2
808
+ ), V = Pt(e, M, S);
809
+ if (ie !== "transparent") {
810
+ const Q = D === !0, J = Je(
811
+ Q ? void 0 : R,
812
+ L === "text" || Q ? Se : e,
813
+ e
814
+ ), F = Je(
815
+ Q ? void 0 : Z,
816
+ L === "text" || Q ? Me : n,
817
+ n
818
+ ), ue = Jt(e, J, S, L), he = (n - F) / 2, fe = Math.min(t.borderRadius, Math.min(J, F) / 2);
819
+ Ht(E, ue, he, J, F, fe), Kt(E, {
820
+ panelX: ue,
821
+ panelY: he,
822
+ panelWidth: J,
823
+ panelHeight: F,
824
+ bgColor: ie,
825
+ bgFillMode: Y,
826
+ bgOpacity: k,
827
+ bgGradientStops: re,
828
+ bgTextureImage: se,
829
+ bgTextureFit: K,
830
+ bgTextureFlipX: ve,
831
+ bgTextureFlipY: me
832
+ }), t.borderColor && t.borderWidth > 0 && (E.lineWidth = t.borderWidth, E.strokeStyle = t.borderColor, E.stroke());
833
+ }
834
+ u && Vt(E, {
835
+ lines: P,
836
+ textX: V,
837
+ startY: oe,
838
+ lineHeight: ee,
839
+ letterSpacingPx: N,
840
+ bendPreset: j,
841
+ bendStrength: q,
842
+ color: u.color,
843
+ style: u.style,
844
+ intensity: u.intensity ?? 0.5,
845
+ range: u.range ?? 0.5,
846
+ horizontalAngle: u.horizontalAngle ?? 0,
847
+ verticalAngle: u.verticalAngle ?? 0
848
+ });
849
+ for (let Q = 0; Q < P.length; Q++) {
850
+ const J = oe + Q * ee;
851
+ for (const F of Ce)
852
+ E.save(), E.shadowColor = F.color, E.shadowBlur = F.blur, E.shadowOffsetX = F.offsetX ?? 0, E.shadowOffsetY = F.offsetY ?? 0, E.globalAlpha = F.opacity ?? 1, E.fillStyle = a, le(
853
+ E,
854
+ P[Q],
855
+ V,
856
+ J,
857
+ N,
858
+ "fill",
859
+ j,
860
+ q
861
+ ), E.restore();
862
+ for (const F of Be)
863
+ E.save(), E.lineJoin = "round", E.miterLimit = 2, E.lineWidth = F.width, E.strokeStyle = F.color, E.globalAlpha = F.opacity ?? 1, le(
864
+ E,
865
+ P[Q],
866
+ V,
867
+ J,
868
+ N,
869
+ "stroke",
870
+ j,
871
+ q
872
+ ), E.restore();
873
+ E.save(), E.fillStyle = a, E.globalAlpha = 1, le(
874
+ E,
875
+ P[Q],
876
+ V,
877
+ J,
878
+ N,
879
+ "fill",
880
+ j,
881
+ q
882
+ ), E.restore(), Ee && jt(
883
+ E,
884
+ P[Q],
885
+ V,
886
+ J,
887
+ S,
888
+ a,
889
+ O,
890
+ N
891
+ );
892
+ }
893
+ return h && Zt(E, {
894
+ width: e,
895
+ height: n,
896
+ font: E.font,
897
+ lines: P,
898
+ textX: V,
899
+ startY: oe,
900
+ lineHeight: ee,
901
+ letterSpacingPx: N,
902
+ bendPreset: j,
903
+ bendStrength: q,
904
+ textAlign: S,
905
+ color: h.color,
906
+ opacity: h.opacity ?? 1,
907
+ blur: h.blur,
908
+ offsetX: h.offsetX ?? 0,
909
+ offsetY: h.offsetY ?? 0
910
+ }), ae = new T.CanvasTexture(ce), ae.needsUpdate = !0, ae;
911
+ }
912
+ function Pt(t, e, n) {
913
+ return n === "left" ? e : n === "right" ? t - e : t / 2;
914
+ }
915
+ function Jt(t, e, n, r) {
916
+ return r === "full" || n === "left" ? 0 : n === "right" ? t - e : (t - e) / 2;
917
+ }
918
+ function qe(t, e, n, r) {
919
+ return `${t} ${e} ${n}px ${r}`;
920
+ }
921
+ function pe(t, e) {
922
+ const n = Math.max(0, Math.min(e, 1));
923
+ return t * n * 0.08;
924
+ }
925
+ function _e(t, e) {
926
+ const n = Math.max(0, Math.min(e, 1));
927
+ return t * (1.2 + n * 0.6);
928
+ }
929
+ function Ae(t, e, n) {
930
+ $e(t, n);
931
+ const r = t.measureText(e).width;
932
+ return et(t), r;
933
+ }
934
+ function le(t, e, n, r, i, a, o = "arc", A = 0) {
935
+ if (A !== 0) {
936
+ zt(t, e, n, r, i, a, o, A);
937
+ return;
938
+ }
939
+ $e(t, i), a === "fill" ? t.fillText(e, n, r) : t.strokeText(e, n, r), et(t);
940
+ }
941
+ function zt(t, e, n, r, i, a, o, A) {
942
+ const s = Array.from(e);
943
+ if (s.length === 0) return;
944
+ const l = s.map((C) => t.measureText(C).width), c = l.reduce((C, m) => C + m, 0) + i * Math.max(0, s.length - 1), h = t.textAlign, u = h === "right" ? n - c : h === "center" ? n - c / 2 : n, p = Math.max(-100, Math.min(A, 100)) / 100 * 72, d = Math.max(c / 2, 1);
945
+ let g = u;
946
+ for (let C = 0; C < s.length; C++) {
947
+ const m = s[C], I = l[C], y = g + I / 2, S = (y - u - c / 2) / d, M = Ut(
948
+ o,
949
+ S,
950
+ C,
951
+ s.length,
952
+ p,
953
+ d
954
+ );
955
+ t.save(), t.translate(y + M.xOffset, r + M.yOffset), t.rotate(M.rotation), t.scale(M.scaleX, M.scaleY), t.textAlign = "center", a === "fill" ? t.fillText(m, 0, 0) : t.strokeText(m, 0, 0), t.restore(), g += I + i;
956
+ }
957
+ }
958
+ function Ut(t, e, n, r, i, a) {
959
+ const o = i / 72, A = Math.abs(o), s = 1 - Math.min(1, Math.abs(e)), l = Math.min(1, Math.abs(e)), c = r <= 1 ? 0.5 : n / (r - 1), h = Math.sin(c * Math.PI * 2 - Math.PI / 2), u = Math.sin(c * Math.PI * 2.7 - Math.PI / 2) * (0.65 + c * 0.35), f = i * e * e, p = 2 * i * e / a, d = {
960
+ xOffset: 0,
961
+ yOffset: 0,
962
+ rotation: 0,
963
+ scaleX: 1,
964
+ scaleY: 1
965
+ };
966
+ switch (t) {
967
+ case "arc":
968
+ return {
969
+ ...d,
970
+ yOffset: f,
971
+ rotation: Math.atan(p)
972
+ };
973
+ case "arc-lower":
974
+ return {
975
+ ...d,
976
+ yOffset: f * 0.55,
977
+ scaleY: Math.max(0.2, 1 + o * e * e * 0.45)
978
+ };
979
+ case "arc-upper":
980
+ return {
981
+ ...d,
982
+ yOffset: -f * 0.55,
983
+ scaleY: Math.max(0.2, 1 - o * e * e * 0.45)
984
+ };
985
+ case "arch":
986
+ return {
987
+ ...d,
988
+ yOffset: f
989
+ };
990
+ case "bulge":
991
+ return {
992
+ ...d,
993
+ scaleY: Math.max(0.2, 1 + o * s * 0.75)
994
+ };
995
+ case "shell-lower":
996
+ return {
997
+ ...d,
998
+ yOffset: i * 0.45 * c * s,
999
+ scaleY: Math.max(0.2, 1 + o * c * s)
1000
+ };
1001
+ case "shell-upper":
1002
+ return {
1003
+ ...d,
1004
+ yOffset: -i * 0.45 * (1 - c) * s,
1005
+ scaleY: Math.max(0.2, 1 + o * (1 - c) * s)
1006
+ };
1007
+ case "flag":
1008
+ return {
1009
+ ...d,
1010
+ yOffset: i * 0.65 * u,
1011
+ rotation: Math.atan(
1012
+ i / Math.max(a, 1) * Math.cos(c * Math.PI * 2.7) * 1.6
1013
+ )
1014
+ };
1015
+ case "wave":
1016
+ return {
1017
+ ...d,
1018
+ yOffset: i * 0.6 * h,
1019
+ rotation: Math.atan(i / Math.max(a, 1) * Math.cos(c * Math.PI * 2) * 1.4)
1020
+ };
1021
+ case "fish":
1022
+ return {
1023
+ ...d,
1024
+ scaleX: Math.max(0.25, 1 - A * l * 0.55),
1025
+ scaleY: Math.max(0.2, 1 + o * s)
1026
+ };
1027
+ case "rise":
1028
+ return {
1029
+ ...d,
1030
+ yOffset: i * e
1031
+ };
1032
+ case "fisheye":
1033
+ return {
1034
+ ...d,
1035
+ yOffset: i * 0.18 * e * s,
1036
+ scaleX: Math.max(0.25, 1 + o * s * 0.7),
1037
+ scaleY: Math.max(0.2, 1 + o * s * 0.7)
1038
+ };
1039
+ case "inflate":
1040
+ return {
1041
+ ...d,
1042
+ scaleX: Math.max(0.25, 1 + o * s * 0.6),
1043
+ scaleY: Math.max(0.2, 1 + o * s * 0.6)
1044
+ };
1045
+ case "squeeze":
1046
+ return {
1047
+ ...d,
1048
+ scaleY: Math.max(0.2, 1 - o * s * 0.8)
1049
+ };
1050
+ case "twist":
1051
+ return {
1052
+ ...d,
1053
+ yOffset: i * e,
1054
+ rotation: o * e * 0.45,
1055
+ scaleY: Math.max(0.2, 1 + o * e * 0.25)
1056
+ };
1057
+ default:
1058
+ return d;
1059
+ }
1060
+ }
1061
+ function $e(t, e) {
1062
+ "letterSpacing" in t && (t.letterSpacing = `${e}px`);
1063
+ }
1064
+ function et(t) {
1065
+ "letterSpacing" in t && (t.letterSpacing = "0px");
1066
+ }
1067
+ function Je(t, e, n) {
1068
+ return typeof t != "number" || Number.isNaN(t) || t <= 0 ? e : Math.min(t, n);
1069
+ }
1070
+ function Ht(t, e, n, r, i, a) {
1071
+ t.beginPath(), t.moveTo(e + a, n), t.lineTo(e + r - a, n), t.quadraticCurveTo(e + r, n, e + r, n + a), t.lineTo(e + r, n + i - a), t.quadraticCurveTo(e + r, n + i, e + r - a, n + i), t.lineTo(e + a, n + i), t.quadraticCurveTo(e, n + i, e, n + i - a), t.lineTo(e, n + a), t.quadraticCurveTo(e, n, e + a, n), t.closePath();
1072
+ }
1073
+ function Kt(t, e) {
1074
+ const {
1075
+ panelX: n,
1076
+ panelY: r,
1077
+ panelWidth: i,
1078
+ panelHeight: a,
1079
+ bgColor: o,
1080
+ bgFillMode: A,
1081
+ bgOpacity: s,
1082
+ bgGradientStops: l,
1083
+ bgTextureImage: c,
1084
+ bgTextureFit: h,
1085
+ bgTextureFlipX: u,
1086
+ bgTextureFlipY: f
1087
+ } = e;
1088
+ if (t.save(), t.globalAlpha = Math.max(0, Math.min(s, 1)), A === "gradient" && l && l.length > 1) {
1089
+ const p = t.createLinearGradient(
1090
+ n,
1091
+ r,
1092
+ n + i,
1093
+ r + a
1094
+ );
1095
+ [...l].sort((d, g) => d.position - g.position).forEach(
1096
+ (d) => p.addColorStop(Math.max(0, Math.min(d.position, 1)), d.color)
1097
+ ), t.fillStyle = p, t.fill(), t.restore();
1098
+ return;
1099
+ }
1100
+ if (c) {
1101
+ t.clip(), Nt(t, {
1102
+ image: c,
1103
+ x: n,
1104
+ y: r,
1105
+ width: i,
1106
+ height: a,
1107
+ fit: h,
1108
+ flipX: u,
1109
+ flipY: f
1110
+ }), t.restore();
1111
+ return;
1112
+ }
1113
+ t.fillStyle = o, t.fill(), t.restore();
1114
+ }
1115
+ function Nt(t, e) {
1116
+ const { image: n, x: r, y: i, width: a, height: o, fit: A, flipX: s, flipY: l } = e, c = "naturalWidth" in n ? n.naturalWidth : "videoWidth" in n ? n.videoWidth : n.width, h = "naturalHeight" in n ? n.naturalHeight : "videoHeight" in n ? n.videoHeight : n.height;
1117
+ let u = a, f = o, p = r, d = i;
1118
+ if (A !== "stretch" && c > 0 && h > 0) {
1119
+ const g = A === "cover" ? Math.max(a / c, o / h) : Math.min(a / c, o / h);
1120
+ u = c * g, f = h * g, p = r + (a - u) / 2, d = i + (o - f) / 2;
261
1121
  }
262
- l.fillStyle = i, l.textAlign = "center", l.textBaseline = "middle";
263
- const M = e - a * 2;
264
- let v = Z(l, n, M, o, s, c);
265
- const w = Math.max(1, Math.floor((t - a * 2) / (s * 1.3)));
266
- v.length > w && (s = Math.max(12, Math.round(s * 0.75)), v = Z(l, n, M, o, s, c)), l.font = `${o} ${s}px ${c}`;
267
- const b = s * 1.3, S = t / 2 - (v.length - 1) * b / 2;
268
- for (let d = 0; d < v.length; d++)
269
- l.fillText(v[d], e / 2, S + d * b);
270
- return g = new K.CanvasTexture(m), g.needsUpdate = !0, g;
271
- }
272
- function Z(r, e, t, n, i, c) {
273
- r.font = `${n} ${i}px ${c}`;
274
- const o = e.split(" "), a = [];
275
- let s = "";
276
- for (const u of o) {
277
- const g = s ? `${s} ${u}` : u;
278
- r.measureText(g).width > t && s ? (a.push(s), s = u) : s = g;
1122
+ t.save(), (s || l) && (t.translate(s ? r + a : 0, l ? i + o : 0), t.scale(s ? -1 : 1, l ? -1 : 1), p = s ? -(p - r) - u + r : p, d = l ? -(d - i) - f + i : d), t.drawImage(n, p, d, u, f), t.restore();
1123
+ }
1124
+ function Vt(t, e) {
1125
+ const {
1126
+ lines: n,
1127
+ textX: r,
1128
+ startY: i,
1129
+ lineHeight: a,
1130
+ letterSpacingPx: o,
1131
+ bendPreset: A,
1132
+ bendStrength: s,
1133
+ color: l,
1134
+ style: c,
1135
+ intensity: h,
1136
+ range: u,
1137
+ horizontalAngle: f,
1138
+ verticalAngle: p
1139
+ } = e, d = Math.max(0, Math.min(h, 1));
1140
+ if (d <= 0) return;
1141
+ const g = Math.max(0, Math.min(u, 1)), C = g * 72, m = Math.max(-0.5, Math.min(f, 0.5)) * 80, I = Math.max(-0.5, Math.min(p, 0.5)) * 80;
1142
+ for (let y = 0; y < n.length; y++) {
1143
+ const S = i + y * a;
1144
+ t.save(), t.globalAlpha = d, t.shadowColor = l, t.shadowBlur = C, t.shadowOffsetX = m, t.shadowOffsetY = I, c === "contoured" ? (t.lineJoin = "round", t.miterLimit = 2, t.lineWidth = Math.max(2, g * 42), t.strokeStyle = l, le(
1145
+ t,
1146
+ n[y],
1147
+ r,
1148
+ S,
1149
+ o,
1150
+ "stroke",
1151
+ A,
1152
+ s
1153
+ )) : (t.fillStyle = l, le(t, n[y], r, S, o, "fill", A, s)), t.restore();
1154
+ }
1155
+ }
1156
+ function Zt(t, e) {
1157
+ const {
1158
+ width: n,
1159
+ height: r,
1160
+ font: i,
1161
+ lines: a,
1162
+ textX: o,
1163
+ startY: A,
1164
+ lineHeight: s,
1165
+ letterSpacingPx: l,
1166
+ bendPreset: c,
1167
+ bendStrength: h,
1168
+ textAlign: u,
1169
+ color: f,
1170
+ opacity: p,
1171
+ blur: d,
1172
+ offsetX: g,
1173
+ offsetY: C
1174
+ } = e, m = typeof OffscreenCanvas < "u" ? new OffscreenCanvas(n, r) : (() => {
1175
+ const M = document.createElement("canvas");
1176
+ return M.width = n, M.height = r, M;
1177
+ })(), I = m.getContext("2d");
1178
+ I.clearRect(0, 0, n, r), I.font = i, I.fillStyle = "#ffffff", I.textAlign = u, I.textBaseline = "middle";
1179
+ for (let M = 0; M < a.length; M++)
1180
+ le(
1181
+ I,
1182
+ a[M],
1183
+ o,
1184
+ A + M * s,
1185
+ l,
1186
+ "fill",
1187
+ c,
1188
+ h
1189
+ );
1190
+ const y = typeof OffscreenCanvas < "u" ? new OffscreenCanvas(n, r) : (() => {
1191
+ const M = document.createElement("canvas");
1192
+ return M.width = n, M.height = r, M;
1193
+ })(), S = y.getContext("2d");
1194
+ S.clearRect(0, 0, n, r), S.save(), S.globalAlpha = p, S.filter = d > 0 ? `blur(${d}px)` : "none", S.drawImage(m, g, C), S.restore(), S.globalCompositeOperation = "destination-in", S.drawImage(m, 0, 0), S.globalCompositeOperation = "source-in", S.globalAlpha = p, S.fillStyle = f, S.fillRect(0, 0, n, r), t.drawImage(y, 0, 0);
1195
+ }
1196
+ function jt(t, e, n, r, i, a, o, A) {
1197
+ const s = Ae(t, e, A), l = i === "center" ? n - s / 2 : i === "right" ? n - s : n, c = r + o * 0.42;
1198
+ t.save(), t.strokeStyle = a, t.lineWidth = Math.max(2, o * 0.06), t.lineCap = "round", t.beginPath(), t.moveTo(l, c), t.lineTo(l + s, c), t.stroke(), t.restore();
1199
+ }
1200
+ function Fe(t, e, n, r, i, a, o, A) {
1201
+ t.font = qe(r, i, a, o);
1202
+ const s = e.split(" "), l = [];
1203
+ let c = "";
1204
+ for (const h of s) {
1205
+ const u = c ? `${c} ${h}` : h;
1206
+ Ae(t, u, A) > n && c ? (l.push(c), c = h) : c = u;
279
1207
  }
280
- return s && a.push(s), a;
1208
+ return c && l.push(c), l;
1209
+ }
1210
+ function ze(t, e, n, r, i, a, o, A) {
1211
+ const l = e.split(/\r?\n/).flatMap((c) => c.trim().length === 0 ? [""] : Fe(
1212
+ t,
1213
+ c,
1214
+ n,
1215
+ r,
1216
+ i,
1217
+ a,
1218
+ o,
1219
+ A
1220
+ ));
1221
+ return l.length > 0 ? l : [e];
1222
+ }
1223
+ function We(t, e, n, r) {
1224
+ return Math.max(1, Math.floor((t - e * 2) / _e(n, r)));
1225
+ }
1226
+ function tt(t, e, n, r, i) {
1227
+ const a = r ? "..." : "";
1228
+ let o = e.trimEnd();
1229
+ for (; o.length > 0 && Ae(t, `${o}${a}`, i) > n; )
1230
+ o = o.slice(0, -1).trimEnd();
1231
+ return `${o}${a}`;
1232
+ }
1233
+ function xe(t, e, n, r, i) {
1234
+ return e.map((a, o) => {
1235
+ if (Ae(t, a, i) <= n)
1236
+ return a;
1237
+ const A = o === e.length - 1;
1238
+ return tt(
1239
+ t,
1240
+ a,
1241
+ n,
1242
+ r === "ellipsis" && A,
1243
+ i
1244
+ );
1245
+ });
1246
+ }
1247
+ function Ue(t, e, n, r, i, a) {
1248
+ if (e.length <= n)
1249
+ return xe(
1250
+ t,
1251
+ e,
1252
+ r,
1253
+ i ? "ellipsis" : "clip",
1254
+ a
1255
+ );
1256
+ const o = e.slice(0, n), A = o[n - 1];
1257
+ return o[n - 1] = tt(
1258
+ t,
1259
+ A,
1260
+ r,
1261
+ i,
1262
+ a
1263
+ ), xe(
1264
+ t,
1265
+ o,
1266
+ r,
1267
+ i ? "ellipsis" : "clip",
1268
+ a
1269
+ );
1270
+ }
1271
+ function qt(t, e, n, r, i) {
1272
+ return e.length <= r && e.every((a) => Ae(t, a, i) <= n);
281
1273
  }
282
- const Ne = ({
283
- segmentationMask: r,
1274
+ function _t(t) {
1275
+ const {
1276
+ ctx: e,
1277
+ text: n,
1278
+ explicitLines: r,
1279
+ maxWidth: i,
1280
+ maxHeight: a,
1281
+ padding: o,
1282
+ fontStyle: A,
1283
+ fontWeight: s,
1284
+ fontSize: l,
1285
+ fontFamily: c,
1286
+ letterSpacing: h,
1287
+ lineSpacing: u,
1288
+ overflow: f,
1289
+ resizeToFit: p,
1290
+ minFontSize: d
1291
+ } = t;
1292
+ let g = l, C = pe(g, h), m = r ?? ze(
1293
+ e,
1294
+ n,
1295
+ i,
1296
+ A,
1297
+ s,
1298
+ g,
1299
+ c,
1300
+ C
1301
+ ), I = We(a, o, g, u);
1302
+ const y = p === !0 || f === "shrink";
1303
+ for (; y && !qt(e, m, i, I, C) && g > d && (g = Math.max(d, g - 4), C = pe(g, h), m = r ?? ze(
1304
+ e,
1305
+ n,
1306
+ i,
1307
+ A,
1308
+ s,
1309
+ g,
1310
+ c,
1311
+ C
1312
+ ), I = We(a, o, g, u), g !== d); )
1313
+ ;
1314
+ return f === "ellipsis" ? m = Ue(
1315
+ e,
1316
+ m,
1317
+ I,
1318
+ i,
1319
+ !0,
1320
+ C
1321
+ ) : f === "clamp" || f === "shrink" ? m = Ue(
1322
+ e,
1323
+ m,
1324
+ I,
1325
+ i,
1326
+ !1,
1327
+ C
1328
+ ) : f === "clip" ? m = m : m = xe(e, m, i, void 0, C), { fontSize: g, lines: m };
1329
+ }
1330
+ function $t(t) {
1331
+ const {
1332
+ ctx: e,
1333
+ text: n,
1334
+ maxWidth: r,
1335
+ maxHeight: i,
1336
+ padding: a,
1337
+ fontStyle: o,
1338
+ fontWeight: A,
1339
+ fontSize: s,
1340
+ fontFamily: l,
1341
+ letterSpacing: c,
1342
+ lineSpacing: h
1343
+ } = t;
1344
+ let u = s, f = Fe(
1345
+ e,
1346
+ n,
1347
+ r,
1348
+ o,
1349
+ A,
1350
+ u,
1351
+ l,
1352
+ pe(u, c)
1353
+ );
1354
+ const p = We(i, a, u, h);
1355
+ return f.length > p && (u = Math.max(12, Math.round(u * 0.75)), f = Fe(
1356
+ e,
1357
+ n,
1358
+ r,
1359
+ o,
1360
+ A,
1361
+ u,
1362
+ l,
1363
+ pe(u, c)
1364
+ )), { fontSize: u, lines: f };
1365
+ }
1366
+ const en = "rgba(20,40,110,0.88)", tn = 24, nn = 512;
1367
+ function kn({
1368
+ color: t = en,
1369
+ borderColor: e,
1370
+ borderWidth: n = 0,
1371
+ borderRadius: r = tn,
1372
+ resolution: i = nn,
1373
+ aspect: a = 1,
1374
+ opacity: o = 1,
1375
+ name: A,
1376
+ overlay: s = !0,
1377
+ position: l,
1378
+ rotation: c,
1379
+ scale: h,
1380
+ visible: u
1381
+ }) {
1382
+ const f = X(null), p = X(null), d = x(() => rn({
1383
+ width: Math.round(i * Math.max(a, 0.05)),
1384
+ height: Math.round(i),
1385
+ color: t,
1386
+ borderColor: e,
1387
+ borderWidth: n,
1388
+ borderRadius: r
1389
+ }), [t, e, n, r, i, a]);
1390
+ $(() => () => {
1391
+ d.dispose();
1392
+ }, [d]);
1393
+ const g = X(null), C = X(o);
1394
+ return C.current !== o && (C.current = o, g.current = null, p.current && (p.current.opacity = o)), $(() => {
1395
+ const m = f.current;
1396
+ if (m)
1397
+ return m.userData.setOpacity = (I) => {
1398
+ g.current = I, p.current && (p.current.opacity = I);
1399
+ }, () => {
1400
+ delete m.userData.setOpacity;
1401
+ };
1402
+ }, []), /* @__PURE__ */ W(
1403
+ "mesh",
1404
+ {
1405
+ ref: f,
1406
+ name: A,
1407
+ position: l,
1408
+ rotation: c,
1409
+ scale: h,
1410
+ visible: u,
1411
+ children: [
1412
+ /* @__PURE__ */ v("planeGeometry", { args: [1, 1] }),
1413
+ /* @__PURE__ */ v(
1414
+ "meshBasicMaterial",
1415
+ {
1416
+ ref: p,
1417
+ map: d,
1418
+ transparent: !0,
1419
+ opacity: o,
1420
+ depthTest: !s,
1421
+ depthWrite: !s
1422
+ }
1423
+ )
1424
+ ]
1425
+ }
1426
+ );
1427
+ }
1428
+ function rn(t) {
1429
+ const { width: e, height: n, color: r, borderColor: i, borderWidth: a, borderRadius: o } = t, A = typeof OffscreenCanvas < "u" ? new OffscreenCanvas(e, n) : (() => {
1430
+ const h = document.createElement("canvas");
1431
+ return h.width = e, h.height = n, h;
1432
+ })(), s = A.getContext("2d");
1433
+ s.clearRect(0, 0, e, n);
1434
+ const l = Math.min(o, Math.min(e, n) / 2);
1435
+ s.beginPath(), s.moveTo(l, 0), s.lineTo(e - l, 0), s.quadraticCurveTo(e, 0, e, l), s.lineTo(e, n - l), s.quadraticCurveTo(e, n, e - l, n), s.lineTo(l, n), s.quadraticCurveTo(0, n, 0, n - l), s.lineTo(0, l), s.quadraticCurveTo(0, 0, l, 0), s.closePath(), s.fillStyle = r, s.fill(), i && a > 0 && (s.lineWidth = a, s.strokeStyle = i, s.stroke());
1436
+ const c = new T.CanvasTexture(A);
1437
+ return c.needsUpdate = !0, c;
1438
+ }
1439
+ const sn = 2.5, an = {
1440
+ top: { left: -0.92, right: 0.92, top: 0.92, bottom: 0.56 },
1441
+ center: { left: -0.92, right: 0.92, top: 0.18, bottom: -0.18 },
1442
+ bottom: { left: -0.92, right: 0.92, top: -0.56, bottom: -0.92 }
1443
+ };
1444
+ function on(t = "center") {
1445
+ return an[t];
1446
+ }
1447
+ function ln(t) {
1448
+ const e = De(), n = Math.max(e || sn, 0.1), { showTransformGuides: r = !1, renderOrder: i, overlay: a = !0, ...o } = t;
1449
+ return /* @__PURE__ */ W(Te, { children: [
1450
+ /* @__PURE__ */ v(
1451
+ Rt,
1452
+ {
1453
+ ...o,
1454
+ aspect: n,
1455
+ overlay: a,
1456
+ renderOrder: i
1457
+ }
1458
+ ),
1459
+ r ? /* @__PURE__ */ v("group", { renderOrder: (i ?? 0) + 1, children: /* @__PURE__ */ W("mesh", { position: [0, 0, 4e-3], children: [
1460
+ /* @__PURE__ */ v("planeGeometry", { args: [1, 1] }),
1461
+ /* @__PURE__ */ v(
1462
+ "meshBasicMaterial",
1463
+ {
1464
+ color: "#38bdf8",
1465
+ wireframe: !0,
1466
+ transparent: !0,
1467
+ opacity: 0.9,
1468
+ depthTest: !1,
1469
+ depthWrite: !1,
1470
+ toneMapped: !1
1471
+ }
1472
+ )
1473
+ ] }) }) : null
1474
+ ] });
1475
+ }
1476
+ function Ln({
1477
+ anchors: t,
1478
+ coordinateSpace: e,
1479
+ canvasSize: n,
1480
+ offsets: r,
1481
+ pivot: i,
1482
+ position: a,
1483
+ rotation: o = 0,
1484
+ size: A,
1485
+ transform: s,
1486
+ verticalAlign: l = "center",
1487
+ ...c
1488
+ }) {
1489
+ const h = x(() => s != null && s.anchors ? s.anchors : t || (s != null && s.position || s != null && s.size || a || A ? Ze({
1490
+ coordinateSpace: (s == null ? void 0 : s.coordinateSpace) ?? e,
1491
+ canvasSize: (s == null ? void 0 : s.canvasSize) ?? n,
1492
+ position: (s == null ? void 0 : s.position) ?? a,
1493
+ size: (s == null ? void 0 : s.size) ?? A
1494
+ }) : on(l)), [t, n, e, a, A, s, l]), u = (s == null ? void 0 : s.offsets) ?? r, f = x(
1495
+ () => gt((s == null ? void 0 : s.pivot) ?? i ?? [0.5, 0.5]),
1496
+ [i, s == null ? void 0 : s.pivot]
1497
+ ), p = (s == null ? void 0 : s.rotation) ?? o;
1498
+ return /* @__PURE__ */ v(Ne, { anchors: h, offsets: u, pivot: f, children: /* @__PURE__ */ v("group", { rotation: [0, 0, p * Math.PI / 180], children: /* @__PURE__ */ v(ln, { ...c }) }) });
1499
+ }
1500
+ const An = { left: -1, right: 1, top: 1, bottom: -1 }, cn = (t, e, n) => {
1501
+ const r = t % e, i = Math.floor(t / e);
1502
+ return { x: r / e, y: (n - 1 - i) / n };
1503
+ }, dn = ({
1504
+ sheet: t,
1505
+ contentAspect: e,
1506
+ renderOrder: n,
1507
+ name: r
1508
+ }) => {
1509
+ const i = Ve(t.url), a = X(0), o = X(-1), A = De(), [s, l] = e != null ? Xe(A, e) : [1, 1];
1510
+ return ut((c, h) => {
1511
+ i.wrapS = Re, i.wrapT = Re, i.magFilter = Oe, i.minFilter = Oe, i.generateMipmaps = !1, i.repeat.set(1 / t.cols, 1 / t.rows), a.current += h;
1512
+ const u = Math.floor(a.current * t.fps) % t.frames;
1513
+ if (u === o.current) return;
1514
+ o.current = u;
1515
+ const { x: f, y: p } = cn(u, t.cols, t.rows);
1516
+ i.offset.set(f, p);
1517
+ }), /* @__PURE__ */ W("mesh", { name: r, renderOrder: n, scale: [s, l, 1], children: [
1518
+ /* @__PURE__ */ v("planeGeometry", { args: [1, 1] }),
1519
+ /* @__PURE__ */ v("meshBasicMaterial", { map: i, transparent: !0, toneMapped: !1, depthWrite: !1 })
1520
+ ] });
1521
+ }, Fn = ({
1522
+ sheet: t,
1523
+ anchors: e = An,
1524
+ contentAspect: n,
1525
+ renderOrder: r = 10,
1526
+ name: i = "spriteAnimation"
1527
+ }) => /* @__PURE__ */ v(st, { fallback: null, children: /* @__PURE__ */ v(Ne, { anchors: e, children: /* @__PURE__ */ v(dn, { sheet: t, contentAspect: n, renderOrder: r, name: i }) }) }), Wn = ({
1528
+ segmentationMask: t,
284
1529
  segmentation: e,
285
- invert: t = !1,
286
- customBackground: n,
287
- renderOrder: i = ne.BACKGROUND
1530
+ invert: n = !1,
1531
+ customBackground: r,
1532
+ renderOrder: i = at.BACKGROUND
288
1533
  }) => {
289
- const { camera: c, size: o } = Y(), a = ce(), s = le(re.BACKGROUND_SEGMENTATION), u = e ? s == null ? void 0 : s.backgroundSegmentationMask : void 0, g = y(!1);
290
- k(() => {
1534
+ const { camera: a, size: o } = Ye(), A = ht(), s = ft(it.BACKGROUND_SEGMENTATION), l = e ? s == null ? void 0 : s.backgroundSegmentationMask : void 0, c = X(!1);
1535
+ $(() => {
291
1536
  if (!e) {
292
- g.current = !1;
1537
+ c.current = !1;
293
1538
  return;
294
1539
  }
295
- s === null && !g.current && (console.warn(
1540
+ s === null && !c.current && (console.warn(
296
1541
  `[VideoBackground] segmentation="${e}" set but no matching <Segmentation> component is mounted; rendering unmasked.`
297
- ), g.current = !0);
1542
+ ), c.current = !0);
298
1543
  }, [e, s]);
299
- const m = e ? u : r, l = I(() => {
300
- if (!(c instanceof J))
1544
+ const h = e ? l : t, u = x(() => {
1545
+ if (!a.isPerspectiveCamera)
301
1546
  return [10, 10];
302
- const w = (c.position.z || 5) - -1, b = c.fov * Math.PI / 180, S = 2 * Math.tan(b / 2) * w;
303
- return [S * (o.width / o.height), S];
304
- }, [c, o]);
305
- return a ? /* @__PURE__ */ p("group", { position: [0, 0, -1], children: t ? /* @__PURE__ */ P(X, { children: [
306
- /* @__PURE__ */ P("mesh", { position: [0, 0, -0.01], renderOrder: i - 1, children: [
307
- /* @__PURE__ */ p("planeGeometry", { args: l }),
308
- /* @__PURE__ */ p(
1547
+ const f = a, g = (f.position.z || 5) - -1, C = f.fov * Math.PI / 180, m = 2 * Math.tan(C / 2) * g;
1548
+ return [m * (o.width / o.height), m];
1549
+ }, [a, o]);
1550
+ return A ? /* @__PURE__ */ v("group", { position: [0, 0, -1], children: n ? /* @__PURE__ */ W(Te, { children: [
1551
+ /* @__PURE__ */ W("mesh", { position: [0, 0, -0.01], renderOrder: i - 1, children: [
1552
+ /* @__PURE__ */ v("planeGeometry", { args: u }),
1553
+ /* @__PURE__ */ v(
309
1554
  "meshBasicMaterial",
310
1555
  {
311
- map: a,
1556
+ map: A,
312
1557
  depthTest: !1,
313
1558
  depthWrite: !1,
314
1559
  toneMapped: !1
315
1560
  }
316
1561
  )
317
1562
  ] }),
318
- n && m && /* @__PURE__ */ P("mesh", { position: [0, 0, 0], renderOrder: i, children: [
319
- /* @__PURE__ */ p("planeGeometry", { args: l }),
320
- /* @__PURE__ */ p(
1563
+ r && h && /* @__PURE__ */ W("mesh", { position: [0, 0, 0], renderOrder: i, children: [
1564
+ /* @__PURE__ */ v("planeGeometry", { args: u }),
1565
+ /* @__PURE__ */ v(
321
1566
  "meshBasicMaterial",
322
1567
  {
323
- map: typeof n == "string" ? void 0 : n,
324
- color: typeof n == "string" ? n : void 0,
325
- alphaMap: m,
1568
+ map: typeof r == "string" ? void 0 : r,
1569
+ color: typeof r == "string" ? r : void 0,
1570
+ alphaMap: h,
326
1571
  transparent: !1,
327
1572
  alphaTest: 0.5,
328
1573
  depthTest: !1,
@@ -332,192 +1577,192 @@ const Ne = ({
332
1577
  "inverted-mask"
333
1578
  )
334
1579
  ] })
335
- ] }) : /* @__PURE__ */ P(X, { children: [
336
- n && m && /* @__PURE__ */ P("mesh", { position: [0, 0, -0.01], renderOrder: i - 1, children: [
337
- /* @__PURE__ */ p("planeGeometry", { args: l }),
338
- /* @__PURE__ */ p(
1580
+ ] }) : /* @__PURE__ */ W(Te, { children: [
1581
+ r && h && /* @__PURE__ */ W("mesh", { position: [0, 0, -0.01], renderOrder: i - 1, children: [
1582
+ /* @__PURE__ */ v("planeGeometry", { args: u }),
1583
+ /* @__PURE__ */ v(
339
1584
  "meshBasicMaterial",
340
1585
  {
341
- map: typeof n == "string" ? void 0 : n,
342
- color: typeof n == "string" ? n : void 0,
1586
+ map: typeof r == "string" ? void 0 : r,
1587
+ color: typeof r == "string" ? r : void 0,
343
1588
  depthTest: !1,
344
1589
  depthWrite: !1,
345
1590
  toneMapped: !1
346
1591
  }
347
1592
  )
348
1593
  ] }),
349
- /* @__PURE__ */ P("mesh", { position: [0, 0, 0], renderOrder: i, children: [
350
- /* @__PURE__ */ p("planeGeometry", { args: l }),
351
- /* @__PURE__ */ p(
1594
+ /* @__PURE__ */ W("mesh", { position: [0, 0, 0], renderOrder: i, children: [
1595
+ /* @__PURE__ */ v("planeGeometry", { args: u }),
1596
+ /* @__PURE__ */ v(
352
1597
  "meshBasicMaterial",
353
1598
  {
354
- map: a,
355
- alphaMap: m,
1599
+ map: A,
1600
+ alphaMap: h,
356
1601
  transparent: !1,
357
- alphaTest: m ? 0.5 : void 0,
1602
+ alphaTest: h ? 0.5 : void 0,
358
1603
  depthTest: !1,
359
1604
  depthWrite: !1,
360
1605
  toneMapped: !1
361
1606
  },
362
- m ? "with-mask" : "no-mask"
1607
+ h ? "with-mask" : "no-mask"
363
1608
  )
364
1609
  ] })
365
1610
  ] }) }) : null;
366
- }, we = [
1611
+ }, un = [
367
1612
  "video/mp4",
368
1613
  "video/webm;codecs=vp9",
369
1614
  "video/webm;codecs=vp8",
370
1615
  "video/webm"
371
1616
  ];
372
- function $e(r = {}) {
373
- const { audio: e = !1, mimeType: t, bitsPerSecond: n, onData: i, onStop: c, passThroughStream: o } = r, a = y(null), s = y(null), u = y([]), [g, m] = W(!1), [l, M] = W(!1), [v, w] = W(null), [b, S] = W(null), d = F(() => {
374
- var T;
375
- const h = [t, ...we].filter(Boolean);
376
- for (const f of h)
377
- if ((T = MediaRecorder.isTypeSupported) != null && T.call(MediaRecorder, f)) return f;
378
- }, [t]), L = F(
379
- async (h) => {
380
- const T = new MediaStream();
381
- if (h.getTracks().forEach((f) => T.addTrack(f)), e) {
382
- let f;
1617
+ function xn(t = {}) {
1618
+ const { audio: e = !1, mimeType: n, bitsPerSecond: r, onData: i, onStop: a, passThroughStream: o } = t, A = X(null), s = X(null), l = X([]), [c, h] = _(!1), [u, f] = _(!1), [p, d] = _(null), [g, C] = _(null), m = te(() => {
1619
+ var w;
1620
+ const B = [n, ...un].filter(Boolean);
1621
+ for (const b of B)
1622
+ if ((w = MediaRecorder.isTypeSupported) != null && w.call(MediaRecorder, b)) return b;
1623
+ }, [n]), I = te(
1624
+ async (B) => {
1625
+ const w = new MediaStream();
1626
+ if (B.getTracks().forEach((b) => w.addTrack(b)), e) {
1627
+ let b;
383
1628
  if (e instanceof MediaStream)
384
- f = e;
1629
+ b = e;
385
1630
  else {
386
- const E = typeof e == "object" ? { audio: e } : { audio: !0, video: !1 };
387
- f = await navigator.mediaDevices.getUserMedia(E);
1631
+ const Y = typeof e == "object" ? { audio: e } : { audio: !0, video: !1 };
1632
+ b = await navigator.mediaDevices.getUserMedia(Y);
388
1633
  }
389
- f.getAudioTracks().forEach((E) => T.addTrack(E));
1634
+ b.getAudioTracks().forEach((Y) => w.addTrack(Y));
390
1635
  }
391
- if (!T.getTracks().length)
1636
+ if (!w.getTracks().length)
392
1637
  throw new Error("No tracks available in combined stream.");
393
- return s.current = T, T;
1638
+ return s.current = w, w;
394
1639
  },
395
1640
  [e]
396
- ), N = F(
397
- async (h, T) => {
1641
+ ), y = te(
1642
+ async (B, w) => {
398
1643
  try {
399
- let f;
400
- o ? (f = h, s.current = f) : f = await L(h);
401
- const E = d(), D = {};
402
- E && (D.mimeType = E), n && (D.bitsPerSecond = n);
403
- const O = new MediaRecorder(f, D);
404
- O.ondataavailable = (x) => {
405
- var U;
406
- ((U = x.data) == null ? void 0 : U.size) > 0 && (u.current.push(x.data), i == null || i(x.data));
407
- }, O.onstop = () => {
408
- const x = new Blob(u.current, {
409
- type: E ?? "video/webm"
1644
+ let b;
1645
+ o ? (b = B, s.current = b) : b = await I(B);
1646
+ const Y = m(), k = {};
1647
+ Y && (k.mimeType = Y), r && (k.bitsPerSecond = r);
1648
+ const L = new MediaRecorder(b, k);
1649
+ L.ondataavailable = (D) => {
1650
+ var R;
1651
+ ((R = D.data) == null ? void 0 : R.size) > 0 && (l.current.push(D.data), i == null || i(D.data));
1652
+ }, L.onstop = () => {
1653
+ const D = new Blob(l.current, {
1654
+ type: Y ?? "video/webm"
410
1655
  });
411
- w(x), c == null || c(x), u.current = [];
412
- }, a.current = O, O.start(T), m(!0), M(!1);
413
- } catch (f) {
414
- console.error("start(stream) failed", f), S(f instanceof Error ? f : new Error(String(f)));
1656
+ d(D), a == null || a(D), l.current = [];
1657
+ }, A.current = L, L.start(w), h(!0), f(!1);
1658
+ } catch (b) {
1659
+ console.error("start(stream) failed", b), C(b instanceof Error ? b : new Error(String(b)));
415
1660
  }
416
1661
  },
417
- [L, d, n, i, c, o]
418
- ), _ = F(() => {
419
- const h = a.current;
420
- h && h.state !== "inactive" && h.stop(), m(!1), M(!1);
421
- }, []), z = F(() => {
422
- const h = a.current;
423
- (h == null ? void 0 : h.state) === "recording" && (h.pause(), M(!0));
424
- }, []), B = F(() => {
425
- const h = a.current;
426
- (h == null ? void 0 : h.state) === "paused" && (h.resume(), M(!1));
427
- }, []), A = F(() => {
428
- var h, T;
1662
+ [I, m, r, i, a, o]
1663
+ ), S = te(() => {
1664
+ const B = A.current;
1665
+ B && B.state !== "inactive" && B.stop(), h(!1), f(!1);
1666
+ }, []), M = te(() => {
1667
+ const B = A.current;
1668
+ (B == null ? void 0 : B.state) === "recording" && (B.pause(), f(!0));
1669
+ }, []), H = te(() => {
1670
+ const B = A.current;
1671
+ (B == null ? void 0 : B.state) === "paused" && (B.resume(), f(!1));
1672
+ }, []), G = te(() => {
1673
+ var B, w;
429
1674
  try {
430
- (h = a.current) == null || h.stop(), a.current = null, (T = s.current) == null || T.getTracks().forEach((f) => f.stop()), s.current = null, w(null), m(!1), M(!1), u.current = [], S(null);
431
- } catch (f) {
432
- console.error("clear failed", f);
1675
+ (B = A.current) == null || B.stop(), A.current = null, (w = s.current) == null || w.getTracks().forEach((b) => b.stop()), s.current = null, d(null), h(!1), f(!1), l.current = [], C(null);
1676
+ } catch (b) {
1677
+ console.error("clear failed", b);
433
1678
  }
434
1679
  }, []);
435
- return k(() => () => A(), []), {
436
- start: N,
437
- stop: _,
438
- pause: z,
439
- resume: B,
440
- clear: A,
441
- isRecording: g,
442
- isPaused: l,
443
- recordedBlob: v,
444
- error: b,
1680
+ return $(() => () => G(), []), {
1681
+ start: y,
1682
+ stop: S,
1683
+ pause: M,
1684
+ resume: H,
1685
+ clear: G,
1686
+ isRecording: c,
1687
+ isPaused: u,
1688
+ recordedBlob: p,
1689
+ error: g,
445
1690
  getActiveStream: () => s.current
446
1691
  };
447
1692
  }
448
- const Ge = (r, e) => {
449
- const t = r.split(","), n = t[0].match(/:(.*?);/), i = n ? n[1] : "application/octet-stream", c = atob(t[t.length - 1]);
450
- let o = c.length;
451
- const a = new Uint8Array(o);
1693
+ const Dn = (t, e) => {
1694
+ const n = t.split(","), r = n[0].match(/:(.*?);/), i = r ? r[1] : "application/octet-stream", a = atob(n[n.length - 1]);
1695
+ let o = a.length;
1696
+ const A = new Uint8Array(o);
452
1697
  for (; o--; )
453
- a[o] = c.charCodeAt(o);
454
- return new File([a], e, { type: i });
455
- }, be = 4, Se = 50, xe = 5e3, j = (r) => new Promise((e) => {
456
- if (r.readyState >= 4) {
1698
+ A[o] = a.charCodeAt(o);
1699
+ return new File([A], e, { type: i });
1700
+ }, hn = 4, fn = 50, gn = 5e3, He = (t) => new Promise((e) => {
1701
+ if (t.readyState >= 4) {
457
1702
  e();
458
1703
  return;
459
1704
  }
460
- let t = !1;
461
- const n = () => {
462
- t || (t = !0, e());
1705
+ let n = !1;
1706
+ const r = () => {
1707
+ n || (n = !0, e());
463
1708
  };
464
- r.addEventListener("canplaythrough", n, { once: !0 }), r.addEventListener("error", n, { once: !0 }), setTimeout(n, xe);
465
- }), V = (r, e) => {
466
- const t = document.createElement("audio");
467
- return t.src = r, t.loop = e, t.preload = "auto", t.setAttribute("playsinline", ""), t.setAttribute("webkit-playsinline", ""), t.load(), t;
468
- }, Ce = (r) => {
469
- r.muted = !0, r.play().then(() => {
470
- r.pause(), r.currentTime = 0, r.muted = !1;
1709
+ t.addEventListener("canplaythrough", r, { once: !0 }), t.addEventListener("error", r, { once: !0 }), setTimeout(r, gn);
1710
+ }), Ke = (t, e) => {
1711
+ const n = document.createElement("audio");
1712
+ return n.src = t, n.loop = e, n.preload = "auto", n.setAttribute("playsinline", ""), n.setAttribute("webkit-playsinline", ""), n.load(), n;
1713
+ }, pn = (t) => {
1714
+ t.muted = !0, t.play().then(() => {
1715
+ t.pause(), t.currentTime = 0, t.muted = !1;
471
1716
  }).catch(() => {
472
- r.muted = !1;
1717
+ t.muted = !1;
473
1718
  });
474
1719
  };
475
- class Ee {
1720
+ class vn {
476
1721
  constructor(e = {}) {
477
- R(this, "sfxPoolSize");
478
- R(this, "coalesceMs");
479
- R(this, "muted", !0);
480
- R(this, "listeners", /* @__PURE__ */ new Set());
481
- R(this, "music", null);
482
- R(this, "musicWanted", null);
483
- R(this, "pools", /* @__PURE__ */ new Map());
1722
+ U(this, "sfxPoolSize");
1723
+ U(this, "coalesceMs");
1724
+ U(this, "muted", !0);
1725
+ U(this, "listeners", /* @__PURE__ */ new Set());
1726
+ U(this, "music", null);
1727
+ U(this, "musicWanted", null);
1728
+ U(this, "pools", /* @__PURE__ */ new Map());
484
1729
  /** Last play time per SFX URL, for the coalesce window. */
485
- R(this, "lastPlayed", /* @__PURE__ */ new Map());
1730
+ U(this, "lastPlayed", /* @__PURE__ */ new Map());
486
1731
  /** Readiness promises so a loading gate can await decode/buffer. */
487
- R(this, "ready", /* @__PURE__ */ new Map());
488
- this.sfxPoolSize = e.sfxPoolSize ?? be, this.coalesceMs = e.coalesceMs ?? Se;
1732
+ U(this, "ready", /* @__PURE__ */ new Map());
1733
+ this.sfxPoolSize = e.sfxPoolSize ?? hn, this.coalesceMs = e.coalesceMs ?? fn;
489
1734
  }
490
1735
  /**
491
1736
  * Create + buffer the looping music element. Await in the loading gate so the
492
1737
  * unmute tap is instant. Idempotent per URL (re-requesting the same track is
493
1738
  * a no-op that returns the in-flight promise).
494
1739
  */
495
- prefetchMusic(e, t = 0.4) {
496
- this.musicWanted = { url: e, volume: t };
497
- const n = `music:${e}`, i = this.ready.get(n);
1740
+ prefetchMusic(e, n = 0.4) {
1741
+ this.musicWanted = { url: e, volume: n };
1742
+ const r = `music:${e}`, i = this.ready.get(r);
498
1743
  if (i) return i;
499
- this.music = V(e, !0), this.music.volume = t;
500
- const c = j(this.music);
501
- return this.ready.set(n, c), c;
1744
+ this.music = Ke(e, !0), this.music.volume = n;
1745
+ const a = He(this.music);
1746
+ return this.ready.set(r, a), a;
502
1747
  }
503
1748
  /**
504
1749
  * Create + buffer an SFX voice pool (round-robin so overlapping plays don't
505
1750
  * cut each other off). Returns a promise that resolves when the first element
506
1751
  * buffers. Idempotent per URL.
507
1752
  */
508
- registerSound(e, t = 1) {
509
- const n = this.ready.get(e);
510
- if (n) return n;
1753
+ registerSound(e, n = 1) {
1754
+ const r = this.ready.get(e);
1755
+ if (r) return r;
511
1756
  const i = [];
512
1757
  for (let o = 0; o < this.sfxPoolSize; o += 1) {
513
- const a = V(e, !1);
514
- a.volume = t, a.addEventListener("ended", () => {
515
- a.currentTime = 0;
516
- }), i.push(a);
1758
+ const A = Ke(e, !1);
1759
+ A.volume = n, A.addEventListener("ended", () => {
1760
+ A.currentTime = 0;
1761
+ }), i.push(A);
517
1762
  }
518
- this.pools.set(e, { els: i, next: 0, volume: t });
519
- const c = j(i[0]);
520
- return this.ready.set(e, c), c;
1763
+ this.pools.set(e, { els: i, next: 0, volume: n });
1764
+ const a = He(i[0]);
1765
+ return this.ready.set(e, a), a;
521
1766
  }
522
1767
  /** Subscribe to mute-state changes (for a toggle UI). Fires immediately with
523
1768
  * the current state. Returns an unsubscribe. */
@@ -534,7 +1779,7 @@ class Ee {
534
1779
  * then start the music. All elements are already buffered, so this is instant.
535
1780
  */
536
1781
  setMuted(e) {
537
- e !== this.muted && (this.muted = e, this.muted || this.pools.forEach((t) => t.els.forEach(Ce)), this.applyMusic(), this.listeners.forEach((t) => t(this.muted)));
1782
+ e !== this.muted && (this.muted = e, this.muted || this.pools.forEach((n) => n.els.forEach(pn)), this.applyMusic(), this.listeners.forEach((n) => n(this.muted)));
538
1783
  }
539
1784
  toggleMuted() {
540
1785
  this.setMuted(!this.muted);
@@ -545,29 +1790,29 @@ class Ee {
545
1790
  * same sound into one play, and does NO synchronous `currentTime` seek on a
546
1791
  * ready element (the pool rewinds on `ended`, off the hot path).
547
1792
  */
548
- playOneShot(e, t) {
1793
+ playOneShot(e, n) {
549
1794
  if (this.muted) return;
550
- const n = this.pools.get(e);
551
- if (!n) return;
1795
+ const r = this.pools.get(e);
1796
+ if (!r) return;
552
1797
  const i = performance.now();
553
1798
  if (i - (this.lastPlayed.get(e) ?? -1 / 0) < this.coalesceMs) return;
554
1799
  this.lastPlayed.set(e, i);
555
- const c = n.els.length;
1800
+ const a = r.els.length;
556
1801
  let o;
557
- for (let a = 0; a < c; a += 1) {
558
- const s = n.els[(n.next + a) % c];
1802
+ for (let A = 0; A < a; A += 1) {
1803
+ const s = r.els[(r.next + A) % a];
559
1804
  if (s.paused) {
560
- o = s, n.next = (n.next + a + 1) % c;
1805
+ o = s, r.next = (r.next + A + 1) % a;
561
1806
  break;
562
1807
  }
563
1808
  }
564
- o || (o = n.els[n.next], n.next = (n.next + 1) % c), o.muted = !1, o.volume = t ?? n.volume, o.currentTime !== 0 && (o.currentTime = 0), o.play().catch(() => {
1809
+ o || (o = r.els[r.next], r.next = (r.next + 1) % a), o.muted = !1, o.volume = n ?? r.volume, o.currentTime !== 0 && (o.currentTime = 0), o.play().catch(() => {
565
1810
  });
566
1811
  }
567
1812
  /** Request the looping background track (buffer it with prefetchMusic, which
568
1813
  * a loading gate awaits). Remembered while muted; starts on unmute. */
569
- startMusic(e, t = 0.4) {
570
- this.musicWanted = { url: e, volume: t }, this.applyMusic();
1814
+ startMusic(e, n = 0.4) {
1815
+ this.musicWanted = { url: e, volume: n }, this.applyMusic();
571
1816
  }
572
1817
  stopMusic() {
573
1818
  this.musicWanted = null, this.music && (this.music.pause(), this.music.currentTime = 0);
@@ -577,36 +1822,40 @@ class Ee {
577
1822
  }), this.muted && !this.music.paused && this.music.pause());
578
1823
  }
579
1824
  }
580
- const C = new Ee(), Xe = (r, e) => C.prefetchMusic(r, e), qe = (r, e) => C.registerSound(r, e), He = (r, e) => C.startMusic(r, e), Ze = () => C.stopMusic(), je = (r, e) => C.playOneShot(r, e), Ve = (r) => C.setMuted(r), Ye = () => C.toggleMuted(), Ke = () => C.isMuted(), Je = (r) => C.onMuteChange(r), Qe = () => {
581
- const [r, e] = W(C.isMuted());
582
- return k(() => C.onMuteChange(e), []), r;
1825
+ const z = new vn(), Yn = (t, e) => z.prefetchMusic(t, e), Xn = (t, e) => z.registerSound(t, e), Gn = (t, e) => z.startMusic(t, e), Rn = () => z.stopMusic(), On = (t, e) => z.playOneShot(t, e), Pn = (t) => z.setMuted(t), Jn = () => z.toggleMuted(), zn = () => z.isMuted(), Un = (t) => z.onMuteChange(t), Hn = () => {
1826
+ const [t, e] = _(z.isMuted());
1827
+ return $(() => z.onMuteChange(e), []), t;
583
1828
  };
584
1829
  export {
585
- Ae as AspectRatioContainer,
586
- Ee as AudioEngine,
587
- _e as Panel,
588
- ze as ScreenSpaceUI,
589
- ie as ScreenTransform,
590
- Be as SpriteAnimation,
591
- Ie as TextLabel,
592
- Ne as VideoBackground,
593
- rt as XRMediaSource,
594
- re as XRModel,
595
- nt as XRProvider,
596
- it as XRScene,
597
- C as audio,
598
- pe as computeContainScale,
599
- Ge as dataURLtoFile,
600
- Ke as isMuted,
601
- Je as onMuteChange,
602
- je as playOneShot,
603
- Xe as prefetchMusic,
604
- qe as registerSound,
605
- Ve as setMuted,
606
- He as startMusic,
607
- Ze as stopMusic,
608
- Ye as toggleMuted,
609
- $e as useMediaRecorder,
610
- Qe as useMuted,
611
- oe as useScreenRectAspect
1830
+ Qn as AspectRatioContainer,
1831
+ vn as AudioEngine,
1832
+ Vn as DEFAULT_SCREEN_IMAGE_SCENE_SETTINGS,
1833
+ Zn as DEFAULT_SCREEN_IMAGE_SETTINGS,
1834
+ kn as Panel,
1835
+ Tn as ScreenImage,
1836
+ wn as ScreenSpaceUI,
1837
+ Ln as ScreenText,
1838
+ Ne as ScreenTransform,
1839
+ Fn as SpriteAnimation,
1840
+ Rt as TextLabel,
1841
+ Wn as VideoBackground,
1842
+ qn as XRMediaSource,
1843
+ it as XRModel,
1844
+ _n as XRProvider,
1845
+ er as XRScene,
1846
+ z as audio,
1847
+ Xe as computeContainScale,
1848
+ Dn as dataURLtoFile,
1849
+ zn as isMuted,
1850
+ Un as onMuteChange,
1851
+ On as playOneShot,
1852
+ Yn as prefetchMusic,
1853
+ Xn as registerSound,
1854
+ Pn as setMuted,
1855
+ Gn as startMusic,
1856
+ Rn as stopMusic,
1857
+ Jn as toggleMuted,
1858
+ xn as useMediaRecorder,
1859
+ Hn as useMuted,
1860
+ De as useScreenRectAspect
612
1861
  };