mesh-avatar 0.2.1 → 0.3.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.
package/dist/index.js CHANGED
@@ -21,157 +21,157 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
21
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
22
  SOFTWARE.
23
23
  */
24
- const te = (n, e, t) => {
24
+ const ee = (n, e, t) => {
25
25
  (typeof n != "number" || !Number.isFinite(n)) && t.push(`${e}: expected a finite number`);
26
- }, Oe = (n, e, t) => {
27
- te(n, e, t), typeof n == "number" && n <= 0 && t.push(`${e}: must be positive`);
28
- }, xe = (n, e, t) => {
29
- Oe(n, e, t), typeof n == "number" && !Number.isInteger(n) && t.push(`${e}: expected an integer`);
30
26
  }, _e = (n, e, t) => {
31
- te(n, e, t), typeof n == "number" && !Number.isInteger(n) && t.push(`${e}: expected an integer`);
32
- }, kt = (n, e, t) => {
27
+ ee(n, e, t), typeof n == "number" && n <= 0 && t.push(`${e}: must be positive`);
28
+ }, Ae = (n, e, t) => {
29
+ _e(n, e, t), typeof n == "number" && !Number.isInteger(n) && t.push(`${e}: expected an integer`);
30
+ }, Ue = (n, e, t) => {
31
+ ee(n, e, t), typeof n == "number" && !Number.isInteger(n) && t.push(`${e}: expected an integer`);
32
+ }, Bt = (n, e, t) => {
33
33
  (typeof n != "string" || !n.trim()) && t.push(`${e}: expected a non-empty string`);
34
- }, de = (n, e = 0, t = 1 / 0) => (r, a, s) => {
34
+ }, ge = (n, e = 0, t = 1 / 0) => (r, a, o) => {
35
35
  if (!Array.isArray(r)) {
36
- s.push(`${a}: expected an array`);
36
+ o.push(`${a}: expected an array`);
37
37
  return;
38
38
  }
39
- (r.length < e || r.length > t) && s.push(`${a}: expected ${e}..${t} items`), r.forEach((l, m) => n(l, `${a}[${m}]`, s));
40
- }, ge = de(te, 2, 2), ce = (n, e, t) => {
41
- ge(n, e, t), Array.isArray(n) && n.length === 2 && n[0] >= n[1] && t.push(`${e}: start must be less than end`);
42
- }, se = (n, e = []) => (t, r, a) => {
39
+ (r.length < e || r.length > t) && o.push(`${a}: expected ${e}..${t} items`), r.forEach((i, f) => n(i, `${a}[${f}]`, o));
40
+ }, ye = ge(ee, 2, 2), he = (n, e, t) => {
41
+ ye(n, e, t), Array.isArray(n) && n.length === 2 && n[0] >= n[1] && t.push(`${e}: start must be less than end`);
42
+ }, oe = (n, e = []) => (t, r, a) => {
43
43
  if (!t || typeof t != "object" || Array.isArray(t)) {
44
44
  a.push(`${r}: expected an object`);
45
45
  return;
46
46
  }
47
- const s = t;
48
- for (const [l, m] of Object.entries(n))
49
- s[l] === void 0 && e.includes(l) || m(s[l], `${r}.${l}`, a);
50
- }, Ne = { cx: te, cy: te, rx: Oe, ry: Oe }, ye = se(Ne), $e = de(ge, 3), _t = de(ge, 2), Ke = (n, e, t) => {
51
- te(n, e, t), typeof n == "number" && (n < 0 || n > 1) && t.push(`${e}: must be between 0 and 1`);
52
- }, pn = (n) => se({
47
+ const o = t;
48
+ for (const [i, f] of Object.entries(n))
49
+ o[i] === void 0 && e.includes(i) || f(o[i], `${r}.${i}`, a);
50
+ }, $e = { cx: ee, cy: ee, rx: _e, ry: _e }, ve = oe($e), Ze = ge(ye, 3), Ut = ge(ye, 2), et = (n, e, t) => {
51
+ ee(n, e, t), typeof n == "number" && (n < 0 || n > 1) && t.push(`${e}: must be between 0 and 1`);
52
+ }, vn = (n) => oe({
53
53
  version: (e, t, r) => {
54
54
  e !== 1 && r.push(`${t}: only version 1 is supported`);
55
55
  },
56
- image: se({ width: xe, height: xe }),
57
- head: se({
58
- ...Ne,
59
- shiftX: te,
60
- shiftY: te,
61
- pivotX: te,
62
- pivotY: te,
63
- maxRoll: te,
64
- weightBand: ce,
65
- turnBand: ce
56
+ image: oe({ width: Ae, height: Ae }),
57
+ head: oe({
58
+ ...$e,
59
+ shiftX: ee,
60
+ shiftY: ee,
61
+ pivotX: ee,
62
+ pivotY: ee,
63
+ maxRoll: ee,
64
+ weightBand: he,
65
+ turnBand: he
66
66
  }),
67
- body: se({
68
- pivotX: te,
69
- pivotY: te,
70
- maxRoll: te,
71
- breathBand: ce,
72
- rollBand: ce,
73
- chest: ye,
74
- shoulders: de(ye)
67
+ body: oe({
68
+ pivotX: ee,
69
+ pivotY: ee,
70
+ maxRoll: ee,
71
+ breathBand: he,
72
+ rollBand: he,
73
+ chest: ve,
74
+ shoulders: ge(ve)
75
75
  }),
76
- face: se({
77
- nose: ye,
78
- mouth: ye,
79
- eyeA: ye,
80
- eyeB: ye,
81
- earL: ye,
82
- earR: ye,
83
- brow: se({ ...Ne, band: ce }),
84
- jaw: se({ ...Ne, band: ce })
76
+ face: oe({
77
+ nose: ve,
78
+ mouth: ve,
79
+ eyeA: ve,
80
+ eyeB: ve,
81
+ earL: ve,
82
+ earR: ve,
83
+ brow: oe({ ...$e, band: he }),
84
+ jaw: oe({ ...$e, band: he })
85
85
  }),
86
- buns: se({ bunL: ye, bunR: ye }, ["bunL", "bunR"]),
87
- eyes: de(se({
88
- opening: $e,
89
- roi: $e,
90
- x0: te,
91
- x1: te,
92
- top: de(te, 24, 24),
93
- bot: de(te, 24, 24)
86
+ buns: oe({ bunL: ve, bunR: ve }, ["bunL", "bunR"]),
87
+ eyes: ge(oe({
88
+ opening: Ze,
89
+ roi: Ze,
90
+ x0: ee,
91
+ x1: ee,
92
+ top: ge(ee, 24, 24),
93
+ bot: ge(ee, 24, 24)
94
94
  }, n ? ["x0", "x1", "top", "bot"] : []), 2, 2),
95
- mouth: se({
96
- cx: te,
97
- cy: te,
98
- angle: te,
99
- halfLen: Oe,
100
- bow: te,
101
- area: se({ ...Ne, angle: te })
95
+ mouth: oe({
96
+ cx: ee,
97
+ cy: ee,
98
+ angle: ee,
99
+ halfLen: _e,
100
+ bow: ee,
101
+ area: oe({ ...$e, angle: ee })
102
102
  }),
103
- cheeks: de(ge, 2, 2),
104
- strands: de(se({ name: kt, nodes: _t, sigma: Oe, k: Oe, max: Oe })),
105
- accessories: de(se({
106
- name: kt,
107
- pivot: ge,
108
- tip: ge,
109
- split: Ke,
110
- box: de(_e, 4, 4),
111
- color: se({ redness: Ke, minRed: te })
103
+ cheeks: ge(ye, 2, 2),
104
+ strands: ge(oe({ name: Bt, nodes: Ut, sigma: _e, k: _e, max: _e })),
105
+ accessories: ge(oe({
106
+ name: Bt,
107
+ pivot: ye,
108
+ tip: ye,
109
+ split: et,
110
+ box: ge(Ue, 4, 4),
111
+ color: oe({ redness: et, minRed: ee })
112
112
  })),
113
- hand: se({
114
- outline: $e,
115
- jaw: _t,
116
- jawRange: ce,
117
- background: $e,
118
- elbow: ge,
119
- wrist: ge,
120
- knuckle: ge,
121
- contact: ge,
122
- forearmShare: Ke,
123
- armBand: ce,
124
- wristBand: ce,
125
- handBand: ce,
126
- fingerXBand: ce,
127
- fingerYBand: ce,
128
- pinBand: ce
113
+ hand: oe({
114
+ outline: Ze,
115
+ jaw: Ut,
116
+ jawRange: he,
117
+ background: Ze,
118
+ elbow: ye,
119
+ wrist: ye,
120
+ knuckle: ye,
121
+ contact: ye,
122
+ forearmShare: et,
123
+ armBand: he,
124
+ wristBand: he,
125
+ handBand: he,
126
+ fingerXBand: he,
127
+ fingerYBand: he,
128
+ pinBand: he
129
129
  }),
130
- mesh: se({
131
- baseCell: xe,
132
- fine: se({
133
- x0: _e,
134
- x1: _e,
135
- y0: _e,
136
- y1: _e,
137
- cell: xe
130
+ mesh: oe({
131
+ baseCell: Ae,
132
+ fine: oe({
133
+ x0: Ue,
134
+ x1: Ue,
135
+ y0: Ue,
136
+ y1: Ue,
137
+ cell: Ae
138
138
  }),
139
- handCell: xe,
140
- tasselCell: xe,
141
- eyeBallCell: xe,
142
- eyeCell: xe,
143
- spriteCell: xe
139
+ handCell: Ae,
140
+ tasselCell: Ae,
141
+ eyeBallCell: Ae,
142
+ eyeCell: Ae,
143
+ spriteCell: Ae
144
144
  }),
145
- view: se({ padTop: te, padSide: te, gazeCenter: ge }, ["gazeCenter"])
145
+ view: oe({ padTop: ee, padSide: ee, gazeCenter: ye }, ["gazeCenter"])
146
146
  }, ["buns", "strands", "accessories", "hand"]);
147
- function Gt(n, e = {}) {
147
+ function Qt(n, e = {}) {
148
148
  const t = [];
149
- if (pn(e.draft ?? !1)(n, "rig", t), t.length) return t;
149
+ if (vn(e.draft ?? !1)(n, "rig", t), t.length) return t;
150
150
  const r = n;
151
- r.eyes.forEach((a, s) => {
152
- const l = ["x0", "x1", "top", "bot"];
153
- if (!(e.draft && l.every((m) => a[m] === void 0))) {
154
- if (l.some((m) => a[m] === void 0)) {
155
- t.push(`rig.eyes[${s}]: supply all x0/x1/top/bot fields or omit all in a draft`);
151
+ r.eyes.forEach((a, o) => {
152
+ const i = ["x0", "x1", "top", "bot"];
153
+ if (!(e.draft && i.every((f) => a[f] === void 0))) {
154
+ if (i.some((f) => a[f] === void 0)) {
155
+ t.push(`rig.eyes[${o}]: supply all x0/x1/top/bot fields or omit all in a draft`);
156
156
  return;
157
157
  }
158
- a.x0 >= a.x1 && t.push(`rig.eyes[${s}].x1: must exceed x0`), a.top.some((m, b) => m > a.bot[b]) && t.push(`rig.eyes[${s}].top: must not exceed bottom curve`);
158
+ a.x0 >= a.x1 && t.push(`rig.eyes[${o}].x1: must exceed x0`), a.top.some((f, m) => f > a.bot[m]) && t.push(`rig.eyes[${o}].top: must not exceed bottom curve`);
159
159
  }
160
160
  }), (r.mesh.fine.x0 >= r.mesh.fine.x1 || r.mesh.fine.y0 >= r.mesh.fine.y1) && t.push("rig.mesh.fine: rectangle must have positive area"), (r.view.padTop <= -1 || r.view.padTop >= 1 || r.view.padSide <= -0.5) && t.push("rig.view: margins must leave a positive viewport");
161
- for (const [a, s] of (r.strands ?? []).entries())
162
- s.nodes.some((l, m) => m > 0 && l[0] === s.nodes[m - 1][0] && l[1] === s.nodes[m - 1][1]) && t.push(`rig.strands[${a}].nodes: consecutive nodes must differ`);
163
- for (const [a, s] of (r.accessories ?? []).entries())
164
- (s.box[0] < 0 || s.box[1] < 0 || s.box[2] > r.image.width || s.box[3] > r.image.height) && t.push(`rig.accessories[${a}].box: rectangle must stay inside the image`), (s.split <= 0 || s.split >= 1) && t.push(`rig.accessories[${a}].split: must be strictly between 0 and 1`), s.pivot.every((l, m) => l === s.tip[m]) && t.push(`rig.accessories[${a}].tip: must differ from pivot`), (s.box[0] >= s.box[2] || s.box[1] >= s.box[3]) && t.push(`rig.accessories[${a}].box: rectangle must have positive area`);
161
+ for (const [a, o] of (r.strands ?? []).entries())
162
+ o.nodes.some((i, f) => f > 0 && i[0] === o.nodes[f - 1][0] && i[1] === o.nodes[f - 1][1]) && t.push(`rig.strands[${a}].nodes: consecutive nodes must differ`);
163
+ for (const [a, o] of (r.accessories ?? []).entries())
164
+ (o.box[0] < 0 || o.box[1] < 0 || o.box[2] > r.image.width || o.box[3] > r.image.height) && t.push(`rig.accessories[${a}].box: rectangle must stay inside the image`), (o.split <= 0 || o.split >= 1) && t.push(`rig.accessories[${a}].split: must be strictly between 0 and 1`), o.pivot.every((i, f) => i === o.tip[f]) && t.push(`rig.accessories[${a}].tip: must differ from pivot`), (o.box[0] >= o.box[2] || o.box[1] >= o.box[3]) && t.push(`rig.accessories[${a}].box: rectangle must have positive area`);
165
165
  return t;
166
166
  }
167
- function bt(n) {
168
- const e = Gt(n);
167
+ function wt(n) {
168
+ const e = Qt(n);
169
169
  if (e.length) throw new Error(`Invalid rig:
170
170
  ${e.join(`
171
171
  `)}`);
172
172
  return structuredClone(n);
173
173
  }
174
- const De = [
174
+ const We = [
175
175
  { id: "angleX", label: "Face angle X", min: -30, max: 30, def: 0, group: "Head and body" },
176
176
  { id: "angleY", label: "Face angle Y", min: -30, max: 30, def: 0, group: "Head and body" },
177
177
  { id: "angleZ", label: "Face roll", min: -30, max: 30, def: 0, group: "Head and body" },
@@ -192,253 +192,253 @@ const De = [
192
192
  { id: "handAngle", label: "Wrist angle", min: -10, max: 10, def: 0, group: "Hand" },
193
193
  { id: "fingerTap", label: "Finger tap", min: 0, max: 1, def: 0, group: "Hand" }
194
194
  ];
195
- function dn(n) {
196
- const e = { w: n.image.width, h: n.image.height }, t = (g, A, E) => E ? Math.exp(-(((g - E.cx) / E.rx) ** 2 + ((A - E.cy) / E.ry) ** 2)) : 0, r = 24, a = n.eyes;
197
- function s(g, A) {
198
- const E = Math.min(1, Math.max(0, A)) * (r - 1), k = Math.min(Math.floor(E), r - 2), N = E - k;
199
- return g[k] + (g[k + 1] - g[k]) * N;
200
- }
201
- function l(g, A, E, k) {
202
- A = Math.min(1, Math.max(0, A));
203
- const N = s(g.top, A), z = s(g.bot, A), F = 1 - E, j = 4 * A * (1 - A), M = s(g.bot, 0.5) - s(g.top, 0.5), R = g.top[0] + (g.top[r - 1] - g.top[0]) * A - 0.3 * M * j, W = Math.max(N, z + 1 + (R - z - 1) * k);
204
- return [(W - N) * Math.max(F, -0.07), F > 0 ? (W - z) * F * k : 0];
205
- }
206
- const m = [[-2, 1], [-1, 2], [0, 3], [1, 2], [2, 1]], b = 5;
207
- function d(g, A, E, k) {
208
- let N = 0, z = 0;
209
- for (const [R, W] of m) {
210
- const [Q, ne] = l(g, (A + R * b - g.x0) / (g.x1 - g.x0), E, k);
211
- N += Q * W / 9, z += ne * W / 9;
212
- }
213
- const F = Math.min(1, Math.max(0, (A - g.x0) / (g.x1 - g.x0))), j = s(g.top, F), M = s(g.bot, F);
214
- return { top: j, bot: M, b: 1 - E, lid: j + N, bc: M + z };
215
- }
216
- function p(g, A, E, k, N, z) {
217
- const F = d(g, E, N, z);
218
- return A === "lash" ? F.lid - (F.top - k) * (1 - 0.3 * Math.min(1, Math.max(0, F.b))) : A === "low" ? k + (F.bc - F.bot) : A === "crease" ? k + (F.lid - F.top) * 0.22 : k;
219
- }
220
- function i(g, A, E) {
221
- const k = Math.min(1, Math.max(0, 1 - A));
222
- return g === "low" ? 1 - Math.min(1, k * E * 1.2) : g === "crease" ? 1 - 0.45 * k : 1;
223
- }
224
- const u = n.mouth, S = n.cheeks, y = n.head, c = n.body, v = (g, A, E) => {
225
- const k = Math.min(1, Math.max(0, (E - g) / (A - g)));
226
- return k * k * (3 - 2 * k);
195
+ function bn(n) {
196
+ const e = { w: n.image.width, h: n.image.height }, t = (b, M, S) => S ? Math.exp(-(((b - S.cx) / S.rx) ** 2 + ((M - S.cy) / S.ry) ** 2)) : 0, r = 24, a = n.eyes;
197
+ function o(b, M) {
198
+ const S = Math.min(1, Math.max(0, M)) * (r - 1), L = Math.min(Math.floor(S), r - 2), U = S - L;
199
+ return b[L] + (b[L + 1] - b[L]) * U;
200
+ }
201
+ function i(b, M, S, L) {
202
+ M = Math.min(1, Math.max(0, M));
203
+ const U = o(b.top, M), X = o(b.bot, M), k = 1 - S, P = 4 * M * (1 - M), A = o(b.bot, 0.5) - o(b.top, 0.5), R = b.top[0] + (b.top[r - 1] - b.top[0]) * M - 0.3 * A * P, C = Math.max(U, X + 1 + (R - X - 1) * L);
204
+ return [(C - U) * Math.max(k, -0.07), k > 0 ? (C - X) * k * L : 0];
205
+ }
206
+ const f = [[-2, 1], [-1, 2], [0, 3], [1, 2], [2, 1]], m = 5;
207
+ function g(b, M, S, L) {
208
+ let U = 0, X = 0;
209
+ for (const [R, C] of f) {
210
+ const [Q, te] = i(b, (M + R * m - b.x0) / (b.x1 - b.x0), S, L);
211
+ U += Q * C / 9, X += te * C / 9;
212
+ }
213
+ const k = Math.min(1, Math.max(0, (M - b.x0) / (b.x1 - b.x0))), P = o(b.top, k), A = o(b.bot, k);
214
+ return { top: P, bot: A, b: 1 - S, lid: P + U, bc: A + X };
215
+ }
216
+ function p(b, M, S, L, U, X) {
217
+ const k = g(b, S, U, X);
218
+ return M === "lash" ? k.lid - (k.top - L) * (1 - 0.3 * Math.min(1, Math.max(0, k.b))) : M === "low" ? L + (k.bc - k.bot) : M === "crease" ? L + (k.lid - k.top) * 0.22 : L;
219
+ }
220
+ function l(b, M, S) {
221
+ const L = Math.min(1, Math.max(0, 1 - M));
222
+ return b === "low" ? 1 - Math.min(1, L * S * 1.2) : b === "crease" ? 1 - 0.45 * L : 1;
223
+ }
224
+ const h = n.mouth, E = n.cheeks, y = n.head, u = n.body, v = (b, M, S) => {
225
+ const L = Math.min(1, Math.max(0, (S - b) / (M - b)));
226
+ return L * L * (3 - 2 * L);
227
227
  };
228
- function x(g, A) {
229
- return 1 - v(...y.weightBand, A);
230
- }
231
- function o(g, A) {
232
- return 1 - v(...y.turnBand, A);
233
- }
234
- const h = n.strands ?? [];
235
- function T(g, A, E) {
236
- let k = 1 / 0, N = 0;
237
- const z = E.length - 1;
238
- for (let F = 0; F < z; F++) {
239
- const [j, M] = E[F], [R, W] = E[F + 1], Q = R - j, ne = W - M, ee = Math.min(1, Math.max(0, ((g - j) * Q + (A - M) * ne) / (Q * Q + ne * ne))), he = Math.hypot(g - j - Q * ee, A - M - ne * ee);
240
- he < k && (k = he, N = (F + ee) / z);
241
- }
242
- return [k, N];
243
- }
244
- function f(g, A, E) {
245
- if (E < 0.02) return [];
246
- const k = [];
247
- let N = 0;
248
- h.forEach((F, j) => {
249
- const [M, R] = T(g, A, F.nodes), W = Math.exp(-((M / F.sigma) ** 2));
250
- W < 0.02 || (k.push([j, W, R]), N += W);
228
+ function x(b, M) {
229
+ return 1 - v(...y.weightBand, M);
230
+ }
231
+ function s(b, M) {
232
+ return 1 - v(...y.turnBand, M);
233
+ }
234
+ const c = n.strands ?? [];
235
+ function T(b, M, S) {
236
+ let L = 1 / 0, U = 0;
237
+ const X = S.length - 1;
238
+ for (let k = 0; k < X; k++) {
239
+ const [P, A] = S[k], [R, C] = S[k + 1], Q = R - P, te = C - A, ne = Math.min(1, Math.max(0, ((b - P) * Q + (M - A) * te) / (Q * Q + te * te))), ie = Math.hypot(b - P - Q * ne, M - A - te * ne);
240
+ ie < L && (L = ie, U = (k + ne) / X);
241
+ }
242
+ return [L, U];
243
+ }
244
+ function d(b, M, S) {
245
+ if (S < 0.02) return [];
246
+ const L = [];
247
+ let U = 0;
248
+ c.forEach((k, P) => {
249
+ const [A, R] = T(b, M, k.nodes), C = Math.exp(-((A / k.sigma) ** 2));
250
+ C < 0.02 || (L.push([P, C, R]), U += C);
251
251
  });
252
- const z = Math.max(1, N);
253
- return k.map(([F, j, M]) => [F, E * j / z * v(0.04, 0.55, M), M]);
252
+ const X = Math.max(1, U);
253
+ return L.map(([k, P, A]) => [k, S * P / X * v(0.04, 0.55, A), A]);
254
254
  }
255
- function w(g, A, E = 1) {
255
+ function w(b, M, S = 1) {
256
256
  return {
257
- head: x(g, A),
258
- turn: o(g, A),
259
- strands: f(g, A, E),
260
- bunL: t(g, A, n.buns?.bunL),
261
- bunR: t(g, A, n.buns?.bunR),
262
- brow: t(g, A, n.face.brow) * (1 - v(...n.face.brow.band, A)),
257
+ head: x(b, M),
258
+ turn: s(b, M),
259
+ strands: d(b, M, S),
260
+ bunL: t(b, M, n.buns?.bunL),
261
+ bunR: t(b, M, n.buns?.bunR),
262
+ brow: t(b, M, n.face.brow) * (1 - v(...n.face.brow.band, M)),
263
263
  // chin below the mouth line drops a little when the mouth opens
264
- jaw: t(g, A, n.face.jaw) * v(...n.face.jaw.band, A),
264
+ jaw: t(b, M, n.face.jaw) * v(...n.face.jaw.band, M),
265
265
  // per-feature depth for head turns (nose sticks out most, ears sit at the back)
266
- nose: t(g, A, n.face.nose),
267
- mouth: t(g, A, n.face.mouth),
268
- eyeA: t(g, A, n.face.eyeA),
269
- eyeB: t(g, A, n.face.eyeB),
270
- earR: t(g, A, n.face.earR),
271
- earL: t(g, A, n.face.earL),
272
- chest: t(g, A, c.chest),
273
- breath: 1 - v(...c.breathBand, A),
274
- shoulder: c.shoulders.reduce((k, N) => k + t(g, A, N), 0)
266
+ nose: t(b, M, n.face.nose),
267
+ mouth: t(b, M, n.face.mouth),
268
+ eyeA: t(b, M, n.face.eyeA),
269
+ eyeB: t(b, M, n.face.eyeB),
270
+ earR: t(b, M, n.face.earR),
271
+ earL: t(b, M, n.face.earL),
272
+ chest: t(b, M, u.chest),
273
+ breath: 1 - v(...u.breathBand, M),
274
+ shoulder: u.shoulders.reduce((L, U) => L + t(b, M, U), 0)
275
275
  };
276
276
  }
277
- function B(g, A, E, k) {
278
- const N = (g - y.cx) / y.rx, z = (A - y.cy) / y.ry, F = 1 - N * N - z * z;
279
- if (F <= 0) return [0, 0];
280
- const j = v(0, 0.84, F);
281
- return [E * y.shiftX * j, -k * y.shiftY * j];
282
- }
283
- function Y(g, A, E, k) {
284
- const N = Math.cos(k), z = Math.sin(k), F = g[0] - A, j = g[1] - E;
285
- g[0] = A + F * N - j * z, g[1] = E + F * z + j * N;
286
- }
287
- function I(g, A, E, k = A) {
288
- const N = B(g[0], g[1], E.angleX / 30, E.angleY / 30);
289
- g[0] += N[0] * k, g[1] += N[1] * k, !(A <= 0) && Y(g, y.pivotX, y.pivotY, -E.angleZ / 30 * y.maxRoll * A);
290
- }
291
- function _(g, A, E, k = 0, N = 1, z = 0) {
292
- const F = E.breath;
293
- g[1] -= F * (5 * N + 4 * z), g[0] += (g[0] - c.chest.cx) * 0.012 * F * k, g[0] += E.bodyAngleX / 10 * (7 + 9 * k), Y(g, c.pivotX, c.pivotY, -E.bodyAngleZ / 10 * c.maxRoll * (1 - v(...c.rollBand, A)));
294
- }
295
- function U(g, A, E, k, N, z) {
296
- const F = z;
297
- F[0] = g, F[1] = A;
298
- const j = N.gain;
299
- for (const [W, Q, ne] of E.strands) {
300
- const ee = N.strands?.[W];
301
- if (!ee) continue;
302
- const he = ne * 3, oe = Math.min(2, Math.floor(he)), ke = he - oe;
303
- F[0] += (ee[oe][0] + (ee[oe + 1][0] - ee[oe][0]) * ke) * Q * j, F[1] += (ee[oe][1] + (ee[oe + 1][1] - ee[oe][1]) * ke) * Q * j;
304
- }
305
- if (F[0] += (N.bunL[0] * E.bunL + N.bunR[0] * E.bunR) * j, F[1] += (N.bunL[1] * E.bunL + N.bunR[1] * E.bunR) * j, F[1] -= k.browY * 7 * E.brow, E.brow > 0.01) {
306
- const W = k.browAngle * 0.12 * E.brow;
307
- F[1] += (g - n.face.brow.cx) * Math.sin(W);
308
- }
309
- F[1] += k.mouthOpen * 3.5 * E.jaw;
310
- const M = k.angleX / 30, R = k.angleY / 30;
311
- return F[0] += M * (8 * E.nose + 5 * E.mouth) + (g - n.face.eyeA.cx) * 0.12 * M * E.eyeA - (g - n.face.eyeB.cx) * 0.12 * M * E.eyeB - M * 9 * E.earR + M * 4 * E.earL - M * 10 * (E.bunL + E.bunR), F[1] -= R * (6 * E.nose + 3 * E.mouth), F[1] += (A - n.face.eyeA.cy) * -0.06 * Math.abs(R) * E.eyeA + (A - n.face.eyeB.cy) * -0.06 * Math.abs(R) * E.eyeB, I(F, E.head, k, E.turn), _(F, A, k, E.chest, E.breath, E.shoulder), F;
312
- }
313
- const O = n.hand, C = O?.elbow ?? [0, 0], $ = O?.wrist ?? [0, 0], V = O?.knuckle ?? [0, 0], X = O?.contact ?? [0, 0], D = O?.forearmShare ?? 0;
314
- function H(g, A) {
277
+ function F(b, M, S, L) {
278
+ const U = (b - y.cx) / y.rx, X = (M - y.cy) / y.ry, k = 1 - U * U - X * X;
279
+ if (k <= 0) return [0, 0];
280
+ const P = v(0, 0.84, k);
281
+ return [S * y.shiftX * P, -L * y.shiftY * P];
282
+ }
283
+ function Y(b, M, S, L) {
284
+ const U = Math.cos(L), X = Math.sin(L), k = b[0] - M, P = b[1] - S;
285
+ b[0] = M + k * U - P * X, b[1] = S + k * X + P * U;
286
+ }
287
+ function I(b, M, S, L = M) {
288
+ const U = F(b[0], b[1], S.angleX / 30, S.angleY / 30);
289
+ b[0] += U[0] * L, b[1] += U[1] * L, !(M <= 0) && Y(b, y.pivotX, y.pivotY, -S.angleZ / 30 * y.maxRoll * M);
290
+ }
291
+ function _(b, M, S, L = 0, U = 1, X = 0) {
292
+ const k = S.breath;
293
+ b[1] -= k * (5 * U + 4 * X), b[0] += (b[0] - u.chest.cx) * 0.012 * k * L, b[0] += S.bodyAngleX / 10 * (7 + 9 * L), Y(b, u.pivotX, u.pivotY, -S.bodyAngleZ / 10 * u.maxRoll * (1 - v(...u.rollBand, M)));
294
+ }
295
+ function B(b, M, S, L, U, X) {
296
+ const k = X;
297
+ k[0] = b, k[1] = M;
298
+ const P = U.gain;
299
+ for (const [C, Q, te] of S.strands) {
300
+ const ne = U.strands?.[C];
301
+ if (!ne) continue;
302
+ const ie = te * 3, se = Math.min(2, Math.floor(ie)), me = ie - se;
303
+ k[0] += (ne[se][0] + (ne[se + 1][0] - ne[se][0]) * me) * Q * P, k[1] += (ne[se][1] + (ne[se + 1][1] - ne[se][1]) * me) * Q * P;
304
+ }
305
+ if (k[0] += (U.bunL[0] * S.bunL + U.bunR[0] * S.bunR) * P, k[1] += (U.bunL[1] * S.bunL + U.bunR[1] * S.bunR) * P, k[1] -= L.browY * 7 * S.brow, S.brow > 0.01) {
306
+ const C = L.browAngle * 0.12 * S.brow;
307
+ k[1] += (b - n.face.brow.cx) * Math.sin(C);
308
+ }
309
+ k[1] += L.mouthOpen * 3.5 * S.jaw;
310
+ const A = L.angleX / 30, R = L.angleY / 30;
311
+ return k[0] += A * (8 * S.nose + 5 * S.mouth) + (b - n.face.eyeA.cx) * 0.12 * A * S.eyeA - (b - n.face.eyeB.cx) * 0.12 * A * S.eyeB - A * 9 * S.earR + A * 4 * S.earL - A * 10 * (S.bunL + S.bunR), k[1] -= R * (6 * S.nose + 3 * S.mouth), k[1] += (M - n.face.eyeA.cy) * -0.06 * Math.abs(R) * S.eyeA + (M - n.face.eyeB.cy) * -0.06 * Math.abs(R) * S.eyeB, I(k, S.head, L, S.turn), _(k, M, L, S.chest, S.breath, S.shoulder), k;
312
+ }
313
+ const O = n.hand, z = O?.elbow ?? [0, 0], D = O?.wrist ?? [0, 0], J = O?.knuckle ?? [0, 0], j = O?.contact ?? [0, 0], H = O?.forearmShare ?? 0;
314
+ function Z(b, M) {
315
315
  return O ? {
316
- arm: 1 - v(...O.armBand, A),
317
- wrist: 1 - v(...O.wristBand, A),
318
- hand: 1 - v(...O.handBand, A),
319
- finger: v(...O.fingerXBand, g) * (1 - v(...O.fingerYBand, A)),
320
- pinBottom: v(...O.pinBand, A)
316
+ arm: 1 - v(...O.armBand, M),
317
+ wrist: 1 - v(...O.wristBand, M),
318
+ hand: 1 - v(...O.handBand, M),
319
+ finger: v(...O.fingerXBand, b) * (1 - v(...O.fingerYBand, M)),
320
+ pinBottom: v(...O.pinBand, M)
321
321
  } : { arm: 0, wrist: 0, hand: 0, finger: 0, pinBottom: 0 };
322
322
  }
323
- const L = (g, A, E, k) => {
324
- const N = g[0] - A[0], z = g[1] - A[1];
325
- return [A[0] + N * E - z * k, A[1] + N * k + z * E];
326
- }, Z = (g) => Math.atan2(g[1], g[0]);
327
- function P(g) {
328
- const A = [...X];
329
- I(A, x(...X), g, o(...X)), _(A, X[1], g, 0, 1, 0);
330
- const E = [...C];
331
- _(E, C[1], g, 0, 0, 0);
332
- const N = (Z([A[0] - E[0], A[1] - E[1]]) - Z([X[0] - C[0], X[1] - C[1]])) * D, z = Math.cos(N), F = Math.sin(N), j = (ne) => {
333
- const ee = L(ne, C, z, F);
334
- return [ee[0] + E[0] - C[0], ee[1] + E[1] - C[1]];
335
- }, M = j($), R = j(X), W = Z([A[0] - M[0], A[1] - M[1]]) - Z([R[0] - M[0], R[1] - M[1]]), Q = Math.min(1.03, Math.max(0.97, Math.hypot(A[0] - M[0], A[1] - M[1]) / Math.hypot(R[0] - M[0], R[1] - M[1])));
336
- return { tr: j, w: M, b: W, k: Q };
337
- }
338
- function G(g, A, E, k, N, z) {
339
- let F = [g, A];
340
- F = L(F, V, Math.cos(k.fingerTap * 0.07 * E.finger), Math.sin(k.fingerTap * 0.07 * E.finger));
341
- const j = -k.handAngle / 10 * 0.045 * E.wrist, M = -k.armAngle / 10 * 0.015 * E.arm;
342
- F = L(F, $, Math.cos(j), Math.sin(j)), F = L(F, C, Math.cos(M), Math.sin(M)), F = N.tr(F);
343
- const R = N.b * E.hand, W = 1 + (N.k - 1) * E.hand;
344
- return F = L(F, N.w, Math.cos(R) * W, Math.sin(R) * W), F[1] += (A - F[1]) * E.pinBottom, z[0] = F[0], z[1] = F[1], z;
345
- }
346
- const J = n.accessories ?? [];
347
- function q(g, A, E, k) {
348
- const N = w(g.pivot[0], g.pivot[1]);
349
- return U(g.pivot[0], g.pivot[1], N, A, E, k);
350
- }
351
- return { IMG: e, EYES: a, MOUTH: u, CHEEKS: S, STRANDS: h, TASSELS: J, headWeight: x, turnWeight: o, baseWeights: w, deformBase: U, applyHead: I, applyBody: _, handWeights: H, handFrame: P, deformHand: G, eyePartY: p, eyePartAlpha: i, tasselAnchor: q };
323
+ const $ = (b, M, S, L) => {
324
+ const U = b[0] - M[0], X = b[1] - M[1];
325
+ return [M[0] + U * S - X * L, M[1] + U * L + X * S];
326
+ }, q = (b) => Math.atan2(b[1], b[0]);
327
+ function W(b) {
328
+ const M = [...j];
329
+ I(M, x(...j), b, s(...j)), _(M, j[1], b, 0, 1, 0);
330
+ const S = [...z];
331
+ _(S, z[1], b, 0, 0, 0);
332
+ const U = (q([M[0] - S[0], M[1] - S[1]]) - q([j[0] - z[0], j[1] - z[1]])) * H, X = Math.cos(U), k = Math.sin(U), P = (te) => {
333
+ const ne = $(te, z, X, k);
334
+ return [ne[0] + S[0] - z[0], ne[1] + S[1] - z[1]];
335
+ }, A = P(D), R = P(j), C = q([M[0] - A[0], M[1] - A[1]]) - q([R[0] - A[0], R[1] - A[1]]), Q = Math.min(1.03, Math.max(0.97, Math.hypot(M[0] - A[0], M[1] - A[1]) / Math.hypot(R[0] - A[0], R[1] - A[1])));
336
+ return { tr: P, w: A, b: C, k: Q };
337
+ }
338
+ function N(b, M, S, L, U, X) {
339
+ let k = [b, M];
340
+ k = $(k, J, Math.cos(L.fingerTap * 0.07 * S.finger), Math.sin(L.fingerTap * 0.07 * S.finger));
341
+ const P = -L.handAngle / 10 * 0.045 * S.wrist, A = -L.armAngle / 10 * 0.015 * S.arm;
342
+ k = $(k, D, Math.cos(P), Math.sin(P)), k = $(k, z, Math.cos(A), Math.sin(A)), k = U.tr(k);
343
+ const R = U.b * S.hand, C = 1 + (U.k - 1) * S.hand;
344
+ return k = $(k, U.w, Math.cos(R) * C, Math.sin(R) * C), k[1] += (M - k[1]) * S.pinBottom, X[0] = k[0], X[1] = k[1], X;
345
+ }
346
+ const G = n.accessories ?? [];
347
+ function V(b, M, S, L) {
348
+ const U = w(b.pivot[0], b.pivot[1]);
349
+ return B(b.pivot[0], b.pivot[1], U, M, S, L);
350
+ }
351
+ return { IMG: e, EYES: a, MOUTH: h, CHEEKS: E, STRANDS: c, TASSELS: G, headWeight: x, turnWeight: s, baseWeights: w, deformBase: B, applyHead: I, applyBody: _, handWeights: Z, handFrame: W, deformHand: N, eyePartY: p, eyePartAlpha: l, tasselAnchor: V };
352
352
  }
353
- function gn(n, e, t, r = !1) {
354
- const a = r ? Math.max(e, t) * 2 : 1, s = new Float32Array(n.length), l = Math.SQRT2;
355
- for (let m = 0; m < t; m++) for (let b = 0; b < e; b++) {
356
- const d = m * e + b;
357
- n[d] <= 3 || (s[d] = Math.min(
358
- b ? s[d - 1] + 1 : a,
359
- m ? s[d - e] + 1 : a,
360
- b && m ? s[d - e - 1] + l : a,
361
- m && b + 1 < e ? s[d - e + 1] + l : a
353
+ function xn(n, e, t, r = !1) {
354
+ const a = r ? Math.max(e, t) * 2 : 1, o = new Float32Array(n.length), i = Math.SQRT2;
355
+ for (let f = 0; f < t; f++) for (let m = 0; m < e; m++) {
356
+ const g = f * e + m;
357
+ n[g] <= 3 || (o[g] = Math.min(
358
+ m ? o[g - 1] + 1 : a,
359
+ f ? o[g - e] + 1 : a,
360
+ m && f ? o[g - e - 1] + i : a,
361
+ f && m + 1 < e ? o[g - e + 1] + i : a
362
362
  ));
363
363
  }
364
- for (let m = t - 1; m >= 0; m--) for (let b = e - 1; b >= 0; b--) {
365
- const d = m * e + b;
366
- !n[d] || n[d] <= 3 || (s[d] = Math.min(
367
- s[d],
368
- b + 1 < e ? s[d + 1] + 1 : a,
369
- m + 1 < t ? s[d + e] + 1 : a,
370
- b && m + 1 < t ? s[d + e - 1] + l : a,
371
- b + 1 < e && m + 1 < t ? s[d + e + 1] + l : a
364
+ for (let f = t - 1; f >= 0; f--) for (let m = e - 1; m >= 0; m--) {
365
+ const g = f * e + m;
366
+ !n[g] || n[g] <= 3 || (o[g] = Math.min(
367
+ o[g],
368
+ m + 1 < e ? o[g + 1] + 1 : a,
369
+ f + 1 < t ? o[g + e] + 1 : a,
370
+ m && f + 1 < t ? o[g + e - 1] + i : a,
371
+ m + 1 < e && f + 1 < t ? o[g + e + 1] + i : a
372
372
  ));
373
373
  }
374
- return s;
374
+ return o;
375
375
  }
376
- function Qe(n, e, t) {
376
+ function tt(n, e, t) {
377
377
  return Math.exp(-(((n - t.cx) / t.rx) ** 2 + ((e - t.cy) / t.ry) ** 2));
378
378
  }
379
- function yn(n, e, t) {
379
+ function wn(n, e, t) {
380
380
  const r = ((n - t.head.cx) / t.head.rx) ** 2 + ((e - t.head.cy) / t.head.ry) ** 2;
381
- let a = t.head.rx * 0.8 * Math.sqrt(Math.max(0, 1 - r)) + t.body.chest.rx * 0.23 * Qe(n, e, t.body.chest);
382
- a += t.face.nose.rx * 0.2 * Qe(n, e, t.face.nose);
383
- for (const [s, l] of t.cheeks) a += t.head.rx * 0.012 * Qe(n, e, { cx: s, cy: l, rx: t.head.rx * 0.3, ry: t.head.ry * 0.16 });
381
+ let a = t.head.rx * 0.8 * Math.sqrt(Math.max(0, 1 - r)) + t.body.chest.rx * 0.23 * tt(n, e, t.body.chest);
382
+ a += t.face.nose.rx * 0.2 * tt(n, e, t.face.nose);
383
+ for (const [o, i] of t.cheeks) a += t.head.rx * 0.012 * tt(n, e, { cx: o, cy: i, rx: t.head.rx * 0.3, ry: t.head.ry * 0.16 });
384
384
  return a;
385
385
  }
386
- function Ge(n, e, t, r) {
387
- const a = new Float32Array(n.length), s = new Float32Array(n.length), l = (m, b, d, p, i, u) => {
388
- for (let S = 0; S < p; S++) {
389
- const y = S * u;
390
- let c = 0, v = 0;
391
- for (let x = 0; x < Math.min(r, d - 1) + 1; x++)
392
- c += m[y + x * i], v++;
393
- for (let x = 0; x < d; x++) {
394
- b[y + x * i] = c / v;
395
- const o = x + r + 1, h = x - r;
396
- o < d && (c += m[y + o * i], v++), h >= 0 && (c -= m[y + h * i], v--);
386
+ function qe(n, e, t, r) {
387
+ const a = new Float32Array(n.length), o = new Float32Array(n.length), i = (f, m, g, p, l, h) => {
388
+ for (let E = 0; E < p; E++) {
389
+ const y = E * h;
390
+ let u = 0, v = 0;
391
+ for (let x = 0; x < Math.min(r, g - 1) + 1; x++)
392
+ u += f[y + x * l], v++;
393
+ for (let x = 0; x < g; x++) {
394
+ m[y + x * l] = u / v;
395
+ const s = x + r + 1, c = x - r;
396
+ s < g && (u += f[y + s * l], v++), c >= 0 && (u -= f[y + c * l], v--);
397
397
  }
398
398
  }
399
399
  };
400
- return l(n, a, e, t, 1, e), l(a, s, t, e, e, 1), s;
400
+ return i(n, a, e, t, 1, e), i(a, o, t, e, e, 1), o;
401
401
  }
402
- function vn(n, e, t, r) {
403
- const a = Ge(n, t, r, 1), s = Ge(n, t, r, 6), l = new Float32Array(n.length);
404
- for (let d = 0; d < l.length; d++) l[d] = e[d] > 128 ? a[d] - s[d] : 0;
405
- const m = new Float32Array(n.length * 2), b = (d, p) => l[Math.max(0, Math.min(r - 1, p)) * t + Math.max(0, Math.min(t - 1, d))];
406
- for (let d = 0; d < r; d++) for (let p = 0; p < t; p++) {
407
- const i = d * t + p;
408
- e[i] <= 128 || (m[2 * i] = Math.max(-1, Math.min(1, -(b(p + 1, d) - b(p - 1, d)) * 4)), m[2 * i + 1] = Math.max(-1, Math.min(1, -(b(p, d + 1) - b(p, d - 1)) * 4)));
409
- }
410
- return m;
402
+ function An(n, e, t, r) {
403
+ const a = qe(n, t, r, 1), o = qe(n, t, r, 6), i = new Float32Array(n.length);
404
+ for (let g = 0; g < i.length; g++) i[g] = e[g] > 128 ? a[g] - o[g] : 0;
405
+ const f = new Float32Array(n.length * 2), m = (g, p) => i[Math.max(0, Math.min(r - 1, p)) * t + Math.max(0, Math.min(t - 1, g))];
406
+ for (let g = 0; g < r; g++) for (let p = 0; p < t; p++) {
407
+ const l = g * t + p;
408
+ e[l] <= 128 || (f[2 * l] = Math.max(-1, Math.min(1, -(m(p + 1, g) - m(p - 1, g)) * 4)), f[2 * l + 1] = Math.max(-1, Math.min(1, -(m(p, g + 1) - m(p, g - 1)) * 4)));
409
+ }
410
+ return f;
411
411
  }
412
- function bn(n, e, t, r, a, s = !0, l) {
413
- const m = !!a && r[0] === 0 && r[1] === 0 && r[2] === a.image.width && r[3] === a.image.height, b = gn(n, e, t, m), d = new Float32Array(n.length), p = r[2] / e, i = r[3] / t, u = Math.min(p, i), S = Math.min(r[2], r[3]) * 0.08;
414
- for (let o = 0; o < t; o++) for (let h = 0; h < e; h++) {
415
- const T = o * e + h;
416
- d[T] = (s ? Math.sqrt(b[T] * u * S) * 0.55 : 0) + (a ? yn(r[0] + (h + 0.5) * p, r[1] + (o + 0.5) * i, a) : 0);
412
+ function Mn(n, e, t, r, a, o = !0, i) {
413
+ const f = !!a && r[0] === 0 && r[1] === 0 && r[2] === a.image.width && r[3] === a.image.height, m = xn(n, e, t, f), g = new Float32Array(n.length), p = r[2] / e, l = r[3] / t, h = Math.min(p, l), E = Math.min(r[2], r[3]) * 0.08;
414
+ for (let s = 0; s < t; s++) for (let c = 0; c < e; c++) {
415
+ const T = s * e + c;
416
+ g[T] = (o ? Math.sqrt(m[T] * h * E) * 0.55 : 0) + (a ? wn(r[0] + (c + 0.5) * p, r[1] + (s + 0.5) * l, a) : 0);
417
417
  }
418
418
  const y = Math.max(1, Math.round(Math.min(e, t) * 0.02));
419
- d.set(Ge(Ge(d, e, t, y), e, t, y));
420
- const c = l ? vn(l, n, e, t) : null, v = new Uint8Array(e * t * 4), x = (o, h) => d[Math.max(0, Math.min(t - 1, h)) * e + Math.max(0, Math.min(e - 1, o))];
421
- for (let o = 0; o < t; o++) for (let h = 0; h < e; h++) {
422
- const T = -(x(h + 2, o) - x(h - 2, o)) / (4 * p), f = -(x(h, o + 2) - x(h, o - 2)) / (4 * i), w = Math.hypot(T, f, 1), B = (o * e + h) * 4, Y = o * e + h;
423
- v[B] = Math.round((T / w * 0.5 + 0.5) * 255), v[B + 1] = Math.round((f / w * 0.5 + 0.5) * 255), v[B + 2] = Math.round(((c?.[2 * Y] ?? 0) * 0.5 + 0.5) * 255), v[B + 3] = Math.round(((c?.[2 * Y + 1] ?? 0) * 0.5 + 0.5) * 255);
419
+ g.set(qe(qe(g, e, t, y), e, t, y));
420
+ const u = i ? An(i, n, e, t) : null, v = new Uint8Array(e * t * 4), x = (s, c) => g[Math.max(0, Math.min(t - 1, c)) * e + Math.max(0, Math.min(e - 1, s))];
421
+ for (let s = 0; s < t; s++) for (let c = 0; c < e; c++) {
422
+ const T = -(x(c + 2, s) - x(c - 2, s)) / (4 * p), d = -(x(c, s + 2) - x(c, s - 2)) / (4 * l), w = Math.hypot(T, d, 1), F = (s * e + c) * 4, Y = s * e + c;
423
+ v[F] = Math.round((T / w * 0.5 + 0.5) * 255), v[F + 1] = Math.round((d / w * 0.5 + 0.5) * 255), v[F + 2] = Math.round(((u?.[2 * Y] ?? 0) * 0.5 + 0.5) * 255), v[F + 3] = Math.round(((u?.[2 * Y + 1] ?? 0) * 0.5 + 0.5) * 255);
424
424
  }
425
425
  return v;
426
426
  }
427
- const Ft = /* @__PURE__ */ new WeakMap();
428
- function xn(n, e, t, r) {
429
- const a = JSON.stringify([e, t.head, t.body.chest, t.face.nose, t.cheeks, r]), s = Ft.get(n);
430
- if (s?.key === a) return { ...s, computed: !1, ms: 0 };
431
- const l = performance.now(), m = Math.min(1, 512 / Math.max(n.width, n.height)), b = Math.max(1, Math.round(n.width * m)), d = Math.max(1, Math.round(n.height * m)), p = document.createElement("canvas");
432
- p.width = b, p.height = d;
433
- const i = p.getContext("2d", { willReadFrequently: !0 });
434
- i.drawImage(n, 0, 0, b, d);
435
- const u = i.getImageData(0, 0, b, d).data, S = new Uint8Array(b * d), y = new Float32Array(b * d);
436
- for (let v = 0; v < S.length; v++)
437
- S[v] = u[4 * v + 3], y[v] = (0.2126 * u[4 * v] + 0.7152 * u[4 * v + 1] + 0.0722 * u[4 * v + 2]) / 255;
438
- const c = { key: a, data: bn(S, b, d, e, t, r, r ? y : void 0), width: b, height: d };
439
- return Ft.set(n, c), { ...c, computed: !0, ms: performance.now() - l };
427
+ const Yt = /* @__PURE__ */ new WeakMap();
428
+ function En(n, e, t, r) {
429
+ const a = JSON.stringify([e, t.head, t.body.chest, t.face.nose, t.cheeks, r]), o = Yt.get(n);
430
+ if (o?.key === a) return { ...o, computed: !1, ms: 0 };
431
+ const i = performance.now(), f = Math.min(1, 512 / Math.max(n.width, n.height)), m = Math.max(1, Math.round(n.width * f)), g = Math.max(1, Math.round(n.height * f)), p = document.createElement("canvas");
432
+ p.width = m, p.height = g;
433
+ const l = p.getContext("2d", { willReadFrequently: !0 });
434
+ l.drawImage(n, 0, 0, m, g);
435
+ const h = l.getImageData(0, 0, m, g).data, E = new Uint8Array(m * g), y = new Float32Array(m * g);
436
+ for (let v = 0; v < E.length; v++)
437
+ E[v] = h[4 * v + 3], y[v] = (0.2126 * h[4 * v] + 0.7152 * h[4 * v + 1] + 0.0722 * h[4 * v + 2]) / 255;
438
+ const u = { key: a, data: Mn(E, m, g, e, t, r, r ? y : void 0), width: m, height: g };
439
+ return Yt.set(n, u), { ...u, computed: !0, ms: performance.now() - i };
440
440
  }
441
- const Re = Object.freeze({
441
+ const Fe = Object.freeze({
442
442
  enabled: !1,
443
443
  x: 0.2,
444
444
  y: 0.2,
@@ -455,7 +455,7 @@ const Re = Object.freeze({
455
455
  specular: 0.12,
456
456
  rim: 0.3,
457
457
  detail: 0.4
458
- }), Bt = {
458
+ }), It = {
459
459
  x: [0, 1],
460
460
  y: [0, 1],
461
461
  z: [0.1, 2],
@@ -469,41 +469,41 @@ const Re = Object.freeze({
469
469
  specular: [0, 1],
470
470
  rim: [0, 1],
471
471
  detail: [0, 1]
472
- }, wn = /* @__PURE__ */ new Set(["color", "ambientColor"]);
473
- function An(n) {
472
+ }, Sn = /* @__PURE__ */ new Set(["color", "ambientColor"]);
473
+ function Tn(n) {
474
474
  if (!n || typeof n != "object" || Array.isArray(n)) return null;
475
475
  const e = n;
476
- if (Object.keys(e).length !== Object.keys(Re).length || Object.keys(e).some((r) => !(r in Re)) || ![!0, !1].includes(e.enabled) || ![!0, !1].includes(e.shadow) || !["soft", "cel"].includes(e.mode)) return null;
477
- const t = { ...Re, enabled: e.enabled, shadow: e.shadow, mode: e.mode };
478
- for (const r of Object.keys(Bt)) {
479
- const a = e[r], [s, l] = Bt[r];
480
- if (typeof a != "number" || !Number.isFinite(a) || wn.has(r) && !Number.isInteger(a)) return null;
481
- t[r] = Math.max(s, Math.min(l, a));
476
+ if (Object.keys(e).length !== Object.keys(Fe).length || Object.keys(e).some((r) => !(r in Fe)) || ![!0, !1].includes(e.enabled) || ![!0, !1].includes(e.shadow) || !["soft", "cel"].includes(e.mode)) return null;
477
+ const t = { ...Fe, enabled: e.enabled, shadow: e.shadow, mode: e.mode };
478
+ for (const r of Object.keys(It)) {
479
+ const a = e[r], [o, i] = It[r];
480
+ if (typeof a != "number" || !Number.isFinite(a) || Sn.has(r) && !Number.isInteger(a)) return null;
481
+ t[r] = Math.max(o, Math.min(i, a));
482
482
  }
483
483
  return t;
484
484
  }
485
- function Sr(n) {
485
+ function _r(n) {
486
486
  return `#${n.toString(16).padStart(6, "0")}`;
487
487
  }
488
- const He = -0.1, Mn = 0.9, En = 1, Sn = 1.06;
489
- function Tn(n, e) {
488
+ const Ge = -0.1, On = 0.9, Rn = 1, Ln = 1.06;
489
+ function _n(n, e) {
490
490
  return [(0.5 - n) * 0.12, (0.5 - e) * 0.12];
491
491
  }
492
- function On(n, e, t, r) {
493
- const a = n * Math.PI / 180, s = e * Math.PI / 180, l = -t / 30 * r, m = Math.cos(a), b = Math.sin(a), d = Math.cos(s), p = Math.sin(s), i = Math.cos(l), u = Math.sin(l);
492
+ function kn(n, e, t, r) {
493
+ const a = n * Math.PI / 180, o = e * Math.PI / 180, i = -t / 30 * r, f = Math.cos(a), m = Math.sin(a), g = Math.cos(o), p = Math.sin(o), l = Math.cos(i), h = Math.sin(i);
494
494
  return [
495
- i * m,
496
- u * m,
497
- -b,
498
- i * b * p - u * d,
499
- u * b * p + i * d,
500
- m * p,
501
- i * b * d + u * p,
502
- u * b * d - i * p,
503
- m * d
495
+ l * f,
496
+ h * f,
497
+ -m,
498
+ l * m * p - h * g,
499
+ h * m * p + l * g,
500
+ f * p,
501
+ l * m * g + h * p,
502
+ h * m * g - l * p,
503
+ f * g
504
504
  ];
505
505
  }
506
- class Rn {
506
+ class Fn {
507
507
  constructor(e, t) {
508
508
  this.gl = e, this.program = t(e, `#version 300 es
509
509
  out vec2 vUv;
@@ -521,19 +521,19 @@ class Rn {
521
521
  }`), this.vao = e.createVertexArray(), this.targets = [];
522
522
  }
523
523
  target(e, t) {
524
- const r = this.gl, a = r.createTexture(), s = r.createFramebuffer();
525
- if (r.bindTexture(r.TEXTURE_2D, a), r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e, t, 0, r.RGBA, r.UNSIGNED_BYTE, null), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_MIN_FILTER, r.LINEAR), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_MAG_FILTER, r.LINEAR), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_WRAP_S, r.CLAMP_TO_EDGE), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_WRAP_T, r.CLAMP_TO_EDGE), r.bindFramebuffer(r.FRAMEBUFFER, s), r.framebufferTexture2D(r.FRAMEBUFFER, r.COLOR_ATTACHMENT0, r.TEXTURE_2D, a, 0), r.checkFramebufferStatus(r.FRAMEBUFFER) !== r.FRAMEBUFFER_COMPLETE) throw new Error("Shadow framebuffer unavailable");
526
- return { texture: a, framebuffer: s };
524
+ const r = this.gl, a = r.createTexture(), o = r.createFramebuffer();
525
+ if (r.bindTexture(r.TEXTURE_2D, a), r.texImage2D(r.TEXTURE_2D, 0, r.RGBA, e, t, 0, r.RGBA, r.UNSIGNED_BYTE, null), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_MIN_FILTER, r.LINEAR), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_MAG_FILTER, r.LINEAR), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_WRAP_S, r.CLAMP_TO_EDGE), r.texParameteri(r.TEXTURE_2D, r.TEXTURE_WRAP_T, r.CLAMP_TO_EDGE), r.bindFramebuffer(r.FRAMEBUFFER, o), r.framebufferTexture2D(r.FRAMEBUFFER, r.COLOR_ATTACHMENT0, r.TEXTURE_2D, a, 0), r.checkFramebufferStatus(r.FRAMEBUFFER) !== r.FRAMEBUFFER_COMPLETE) throw new Error("Shadow framebuffer unavailable");
526
+ return { texture: a, framebuffer: o };
527
527
  }
528
528
  begin(e, t) {
529
529
  const r = this.gl;
530
530
  (this.width !== e || this.height !== t) && (this.clearTargets(), this.width = e, this.height = t, this.targets = [this.target(e, t), this.target(Math.ceil(e / 2), Math.ceil(t / 2))]), r.bindFramebuffer(r.FRAMEBUFFER, this.targets[0].framebuffer), r.viewport(0, 0, e, t), r.clearColor(0, 0, 0, 0), r.clear(r.COLOR_BUFFER_BIT);
531
531
  }
532
532
  composite(e) {
533
- const t = this.gl, { prog: r, u: a } = this.program, s = this.width, l = this.height;
534
- t.useProgram(r), t.bindVertexArray(this.vao), t.activeTexture(t.TEXTURE0), t.uniform1i(a.uTex, 0), t.disable(t.BLEND), t.bindFramebuffer(t.FRAMEBUFFER, this.targets[1].framebuffer), t.viewport(0, 0, Math.ceil(s / 2), Math.ceil(l / 2)), t.bindTexture(t.TEXTURE_2D, this.targets[0].texture), t.uniform1i(a.uPass, 0), t.uniform2f(a.uShift, 0, 0), t.uniform2f(a.uStep, 3 / s, 0), t.drawArrays(t.TRIANGLES, 0, 3), t.bindFramebuffer(t.FRAMEBUFFER, null), t.viewport(0, 0, s, l), t.clearColor(0, 0, 0, 0), t.clear(t.COLOR_BUFFER_BIT), t.enable(t.BLEND), t.bindTexture(t.TEXTURE_2D, this.targets[1].texture);
535
- const m = Tn(e.x, e.y);
536
- t.uniform1i(a.uPass, 1), t.uniform2f(a.uShift, m[0], -m[1]), t.uniform2f(a.uStep, 0, 3 / l), t.drawArrays(t.TRIANGLES, 0, 3), t.bindTexture(t.TEXTURE_2D, this.targets[0].texture), t.uniform1i(a.uPass, 2), t.drawArrays(t.TRIANGLES, 0, 3), t.bindVertexArray(null);
533
+ const t = this.gl, { prog: r, u: a } = this.program, o = this.width, i = this.height;
534
+ t.useProgram(r), t.bindVertexArray(this.vao), t.activeTexture(t.TEXTURE0), t.uniform1i(a.uTex, 0), t.disable(t.BLEND), t.bindFramebuffer(t.FRAMEBUFFER, this.targets[1].framebuffer), t.viewport(0, 0, Math.ceil(o / 2), Math.ceil(i / 2)), t.bindTexture(t.TEXTURE_2D, this.targets[0].texture), t.uniform1i(a.uPass, 0), t.uniform2f(a.uShift, 0, 0), t.uniform2f(a.uStep, 3 / o, 0), t.drawArrays(t.TRIANGLES, 0, 3), t.bindFramebuffer(t.FRAMEBUFFER, null), t.viewport(0, 0, o, i), t.clearColor(0, 0, 0, 0), t.clear(t.COLOR_BUFFER_BIT), t.enable(t.BLEND), t.bindTexture(t.TEXTURE_2D, this.targets[1].texture);
535
+ const f = _n(e.x, e.y);
536
+ t.uniform1i(a.uPass, 1), t.uniform2f(a.uShift, f[0], -f[1]), t.uniform2f(a.uStep, 0, 3 / i), t.drawArrays(t.TRIANGLES, 0, 3), t.bindTexture(t.TEXTURE_2D, this.targets[0].texture), t.uniform1i(a.uPass, 2), t.drawArrays(t.TRIANGLES, 0, 3), t.bindVertexArray(null);
537
537
  }
538
538
  clearTargets() {
539
539
  for (const e of this.targets)
@@ -544,12 +544,12 @@ class Rn {
544
544
  this.clearTargets(), this.gl.deleteProgram(this.program.prog), this.gl.deleteVertexArray(this.vao);
545
545
  }
546
546
  }
547
- function Ln(n, e) {
548
- const { IMG: t, EYES: r, MOUTH: a, CHEEKS: s } = n, l = `#version 300 es
547
+ function Bn(n, e) {
548
+ const { IMG: t, EYES: r, MOUTH: a, CHEEKS: o } = n, i = `#version 300 es
549
549
  in vec2 aPos; in vec2 aUv;
550
550
  uniform vec2 uScale; uniform vec2 uOffset;
551
551
  out vec2 vUv;
552
- void main() { vUv = aUv; gl_Position = vec4(aPos * uScale + uOffset, 0.0, 1.0); }`, m = `#version 300 es
552
+ void main() { vUv = aUv; gl_Position = vec4(aPos * uScale + uOffset, 0.0, 1.0); }`, f = `#version 300 es
553
553
  precision highp float;
554
554
  in vec2 vUv; out vec4 outColor;
555
555
  uniform sampler2D uTex;
@@ -657,7 +657,7 @@ function Ln(n, e) {
657
657
  c = texAt(p);
658
658
  }
659
659
  outColor = c * uAlpha;
660
- }`, b = l.replace("out vec2 vUv;", "in float aHeadWeight; out float vHeadWeight; out vec2 vScreen; out vec2 vUv;").replace("vUv = aUv;", "vHeadWeight = aHeadWeight; vScreen = vec2((aPos.x * uScale.x + uOffset.x + 1.0) * 0.5, (1.0 - aPos.y * uScale.y - uOffset.y) * 0.5); vUv = aUv;"), d = m.replace("uniform sampler2D uTex;", `uniform sampler2D uTex;
660
+ }`, m = i.replace("out vec2 vUv;", "in float aHeadWeight; out float vHeadWeight; out vec2 vScreen; out vec2 vUv;").replace("vUv = aUv;", "vHeadWeight = aHeadWeight; vScreen = vec2((aPos.x * uScale.x + uOffset.x + 1.0) * 0.5, (1.0 - aPos.y * uScale.y - uOffset.y) * 0.5); vUv = aUv;"), g = f.replace("uniform sampler2D uTex;", `uniform sampler2D uTex;
661
661
  uniform sampler2D uNormal; in float vHeadWeight; in vec2 vScreen;
662
662
  uniform mat3 uHeadRotation; uniform vec3 uLight; uniform vec3 uLightColor; uniform vec3 uAmbientColor;
663
663
  uniform vec4 uLighting; uniform vec4 uSurface; uniform float uAspect; uniform int uCel;`).replace("outColor = c * uAlpha;", `
@@ -665,7 +665,7 @@ function Ln(n, e) {
665
665
  vec4 encoded = texture(uNormal, vUv);
666
666
  vec2 base = encoded.rg * 2.0 - 1.0;
667
667
  vec3 n = vec3(base, sqrt(max(0.0, 1.0 - dot(base, base))));
668
- n = normalize(n + vec3((encoded.ba * 2.0 - 1.0) * uSurface.w * ${Mn.toFixed(3)}, 0.0));
668
+ n = normalize(n + vec3((encoded.ba * 2.0 - 1.0) * uSurface.w * ${On.toFixed(3)}, 0.0));
669
669
  n = normalize(mix(n, uHeadRotation * n, vHeadWeight));
670
670
  vec2 toLight = (uLight.xy - vScreen) * vec2(uAspect, 1.0);
671
671
  vec3 light = normalize(vec3(toLight, uLight.z));
@@ -673,21 +673,21 @@ function Ln(n, e) {
673
673
  float diffuse;
674
674
  if (uCel == 1) {
675
675
  float w = 0.01 + uSurface.x * 0.08;
676
- diffuse = 0.2 + 0.45 * smoothstep(${He.toFixed(3)} - w, ${He.toFixed(3)} + w, ndl) + 0.35 * smoothstep(0.55 - w, 0.55 + w, ndl);
676
+ diffuse = 0.2 + 0.45 * smoothstep(${Ge.toFixed(3)} - w, ${Ge.toFixed(3)} + w, ndl) + 0.35 * smoothstep(0.55 - w, 0.55 + w, ndl);
677
677
  } else {
678
678
  float s = 0.05 + uSurface.x * 0.5;
679
- diffuse = smoothstep(${He.toFixed(3)} - s, ${He.toFixed(3)} + s, ndl) * (0.35 + 0.65 * max(0.0, ndl));
679
+ diffuse = smoothstep(${Ge.toFixed(3)} - s, ${Ge.toFixed(3)} + s, ndl) * (0.35 + 0.65 * max(0.0, ndl));
680
680
  }
681
681
  float reach = dot(toLight, toLight) / (uLighting.w * uLighting.w);
682
682
  float attenuation = 1.0 / (1.0 + reach);
683
683
  vec3 radiance = uLightColor * uLighting.y * attenuation;
684
684
  // A light close to the surface may brighten a little, but must not bleach painted colours.
685
- vec3 irradiance = min(uAmbientColor * uLighting.z + radiance * diffuse, vec3(${Sn.toFixed(3)}));
685
+ vec3 irradiance = min(uAmbientColor * uLighting.z + radiance * diffuse, vec3(${Ln.toFixed(3)}));
686
686
  // Painted shadows are deeper versions of the base colour, not grey: multiply by the colour
687
687
  // itself as the surface turns away from the light.
688
688
  vec3 albedo = c.rgb / max(c.a, 1e-4);
689
689
  float dark = 1.0 - clamp(dot(irradiance, vec3(0.3333)), 0.0, 1.0);
690
- vec3 shaded = c.rgb * mix(vec3(1.0), albedo, dark * ${En.toFixed(3)}) * irradiance;
690
+ vec3 shaded = c.rgb * mix(vec3(1.0), albedo, dark * ${Rn.toFixed(3)}) * irradiance;
691
691
  float specular = pow(max(dot(n, normalize(light + vec3(0.0, 0.0, 1.0))), 0.0), 60.0) * uSurface.y;
692
692
  if (uCel == 1) specular = smoothstep(0.3, 0.35, specular) * uSurface.y;
693
693
  vec2 side = length(n.xy) > 0.001 ? normalize(n.xy) : vec2(0.0);
@@ -697,350 +697,396 @@ function Ln(n, e) {
697
697
  c.rgb = clamp(mix(c.rgb, shaded, uLighting.x), vec3(0.0), vec3(c.a));
698
698
  outColor = c * uAlpha;`), p = `#version 300 es
699
699
  in vec2 aPos; uniform vec2 uScale; uniform vec2 uOffset;
700
- void main() { gl_Position = vec4(aPos * uScale + uOffset, 0.0, 1.0); gl_PointSize = 7.0; }`, i = `#version 300 es
700
+ void main() { gl_Position = vec4(aPos * uScale + uOffset, 0.0, 1.0); gl_PointSize = 7.0; }`, l = `#version 300 es
701
701
  precision mediump float; uniform vec4 uColor; out vec4 o; void main() { o = uColor; }`;
702
- function u(v, x, o) {
703
- const h = v.createProgram();
704
- for (const [w, B] of [[v.VERTEX_SHADER, x], [v.FRAGMENT_SHADER, o]]) {
702
+ function h(v, x, s) {
703
+ const c = v.createProgram();
704
+ for (const [w, F] of [[v.VERTEX_SHADER, x], [v.FRAGMENT_SHADER, s]]) {
705
705
  const Y = v.createShader(w);
706
- if (v.shaderSource(Y, B), v.compileShader(Y), !v.getShaderParameter(Y, v.COMPILE_STATUS)) throw new Error(v.getShaderInfoLog(Y));
707
- v.attachShader(h, Y), v.deleteShader(Y);
706
+ if (v.shaderSource(Y, F), v.compileShader(Y), !v.getShaderParameter(Y, v.COMPILE_STATUS)) throw new Error(v.getShaderInfoLog(Y));
707
+ v.attachShader(c, Y), v.deleteShader(Y);
708
708
  }
709
- if (v.bindAttribLocation(h, 0, "aPos"), v.bindAttribLocation(h, 1, "aUv"), v.bindAttribLocation(h, 2, "aHeadWeight"), v.linkProgram(h), !v.getProgramParameter(h, v.LINK_STATUS)) throw new Error(v.getProgramInfoLog(h));
710
- const T = {}, f = v.getProgramParameter(h, v.ACTIVE_UNIFORMS);
711
- for (let w = 0; w < f; w++) {
712
- const B = v.getActiveUniform(h, w).name.replace("[0]", "");
713
- T[B] = v.getUniformLocation(h, B);
709
+ if (v.bindAttribLocation(c, 0, "aPos"), v.bindAttribLocation(c, 1, "aUv"), v.bindAttribLocation(c, 2, "aHeadWeight"), v.linkProgram(c), !v.getProgramParameter(c, v.LINK_STATUS)) throw new Error(v.getProgramInfoLog(c));
710
+ const T = {}, d = v.getProgramParameter(c, v.ACTIVE_UNIFORMS);
711
+ for (let w = 0; w < d; w++) {
712
+ const F = v.getActiveUniform(c, w).name.replace("[0]", "");
713
+ T[F] = v.getUniformLocation(c, F);
714
714
  }
715
- return { prog: h, u: T };
715
+ return { prog: c, u: T };
716
716
  }
717
- function S(v, x, o, h) {
717
+ function E(v, x, s, c) {
718
718
  const T = [v];
719
- let f = v;
720
- for (; f < v + x - 0.5; ) {
721
- const w = h && f >= h.from && f < h.to ? h.cell : o;
722
- f = Math.min(v + x, f + w), T.push(f);
719
+ let d = v;
720
+ for (; d < v + x - 0.5; ) {
721
+ const w = c && d >= c.from && d < c.to ? c.cell : s;
722
+ d = Math.min(v + x, d + w), T.push(d);
723
723
  }
724
724
  return T;
725
725
  }
726
- function y(v, x, o, h, T = null) {
727
- const [f, w, B, Y] = v, I = S(f, B, x, T && { from: T.x0, to: T.x1, cell: T.cell }), _ = S(w, Y, x, T && { from: T.y0, to: T.y1, cell: T.cell }), U = I.length - 1, O = _.length - 1, C = (U + 1) * (O + 1), $ = new Float32Array(C * 2), V = new Float32Array(C * 2);
728
- for (let Z = 0; Z <= O; Z++) for (let P = 0; P <= U; P++) {
729
- const G = Z * (U + 1) + P;
730
- $[G * 2] = I[P], $[G * 2 + 1] = _[Z], V[G * 2] = (I[P] - f) / B, V[G * 2 + 1] = (_[Z] - w) / Y;
731
- }
732
- const X = [], D = [], H = o.length / h, L = h === 1 ? 0 : 1;
733
- for (let Z = 0; Z < O; Z++) for (let P = 0; P < U; P++) {
734
- const G = Math.floor(I[P] - f) * L - 2, J = Math.ceil(I[P + 1] - f) * L + 2, q = Math.floor(_[Z] - w) * L - 2, g = Math.ceil(_[Z + 1] - w) * L + 2;
735
- let A = !1;
736
- for (let F = Math.max(0, q); F < Math.min(H, g) && !A; F += 1)
737
- for (let j = Math.max(0, G); j < Math.min(h, J); j += 1)
738
- if (o[F * h + j] > 3) {
739
- A = !0;
726
+ function y(v, x, s, c, T = null) {
727
+ const [d, w, F, Y] = v, I = E(d, F, x, T && { from: T.x0, to: T.x1, cell: T.cell }), _ = E(w, Y, x, T && { from: T.y0, to: T.y1, cell: T.cell }), B = I.length - 1, O = _.length - 1, z = (B + 1) * (O + 1), D = new Float32Array(z * 2), J = new Float32Array(z * 2);
728
+ for (let q = 0; q <= O; q++) for (let W = 0; W <= B; W++) {
729
+ const N = q * (B + 1) + W;
730
+ D[N * 2] = I[W], D[N * 2 + 1] = _[q], J[N * 2] = (I[W] - d) / F, J[N * 2 + 1] = (_[q] - w) / Y;
731
+ }
732
+ const j = [], H = [], Z = s.length / c, $ = c === 1 ? 0 : 1;
733
+ for (let q = 0; q < O; q++) for (let W = 0; W < B; W++) {
734
+ const N = Math.floor(I[W] - d) * $ - 2, G = Math.ceil(I[W + 1] - d) * $ + 2, V = Math.floor(_[q] - w) * $ - 2, b = Math.ceil(_[q + 1] - w) * $ + 2;
735
+ let M = !1;
736
+ for (let k = Math.max(0, V); k < Math.min(Z, b) && !M; k += 1)
737
+ for (let P = Math.max(0, N); P < Math.min(c, G); P += 1)
738
+ if (s[k * c + P] > 3) {
739
+ M = !0;
740
740
  break;
741
741
  }
742
- if (!A) continue;
743
- const E = Z * (U + 1) + P, k = E + 1, N = E + U + 1, z = N + 1;
744
- X.push(E, k, N, k, z, N), D.push(E, k, E, N, k, N), P === U - 1 && D.push(k, z), Z === O - 1 && D.push(N, z);
742
+ if (!M) continue;
743
+ const S = q * (B + 1) + W, L = S + 1, U = S + B + 1, X = U + 1;
744
+ j.push(S, L, U, L, X, U), H.push(S, L, S, U, L, U), W === B - 1 && H.push(L, X), q === O - 1 && H.push(U, X);
745
745
  }
746
- return { rect: v, cols: U, rows: O, rest: $, uv: V, pos: new Float32Array($), tris: new Uint32Array(X), lines: new Uint32Array(D) };
746
+ return { rect: v, cols: B, rows: O, rest: D, uv: J, pos: new Float32Array(D), tris: new Uint32Array(j), lines: new Uint32Array(H) };
747
747
  }
748
- class c {
748
+ class u {
749
749
  // padTop / padSide: margin around the image, as a share of its height / width. A negative
750
750
  // padTop pushes the top of the image above the canvas (hides a cut-off top edge).
751
- constructor(x, { padTop: o = 0, padSide: h = 0, fit: T = "contain" } = {}) {
752
- this.pad = { top: o, side: h }, this.fit = T;
753
- const f = x.getContext("webgl2", { premultipliedAlpha: !0, antialias: !0, alpha: !0, preserveDrawingBuffer: !0 });
754
- if (!f) throw new Error("WebGL2 is not available");
755
- this.gl = f, this.canvas = x, this.main = u(f, l, m), this.line = u(f, p, i), this.layers = [], this.lighting = Re, this.lightingStats = { normalMs: 0, computedLayers: 0, cachedLayers: 0 }, f.enable(f.BLEND), f.blendFunc(f.ONE, f.ONE_MINUS_SRC_ALPHA);
751
+ constructor(x, { padTop: s = 0, padSide: c = 0, fit: T = "contain" } = {}) {
752
+ this.pad = { top: s, side: c }, this.fit = T;
753
+ const d = x.getContext("webgl2", { premultipliedAlpha: !0, antialias: !0, alpha: !0, preserveDrawingBuffer: !0 });
754
+ if (!d) throw new Error("WebGL2 is not available");
755
+ this.gl = d, this.canvas = x, this.main = h(d, i, f), this.line = h(d, p, l), this.layers = [], this.lighting = Fe, this.lightingStats = { normalMs: 0, computedLayers: 0, cachedLayers: 0 }, d.enable(d.BLEND), d.blendFunc(d.ONE, d.ONE_MINUS_SRC_ALPHA);
756
756
  }
757
757
  texture(x) {
758
- const o = this.gl, h = o.createTexture();
759
- return o.bindTexture(o.TEXTURE_2D, h), o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !0), o.texImage2D(o.TEXTURE_2D, 0, o.RGBA, o.RGBA, o.UNSIGNED_BYTE, x), o.generateMipmap(o.TEXTURE_2D), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MIN_FILTER, o.LINEAR_MIPMAP_LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MAG_FILTER, o.LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_S, o.CLAMP_TO_EDGE), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_T, o.CLAMP_TO_EDGE), h;
760
- }
761
- addLayer(x, o, h, T = {}) {
762
- const f = this.gl, w = f.createVertexArray();
763
- f.bindVertexArray(w);
764
- const B = f.createBuffer();
765
- f.bindBuffer(f.ARRAY_BUFFER, B), f.bufferData(f.ARRAY_BUFFER, h.pos, f.DYNAMIC_DRAW);
766
- for (const C of [this.main, this.line]) {
767
- const $ = f.getAttribLocation(C.prog, "aPos");
768
- f.enableVertexAttribArray($), f.vertexAttribPointer($, 2, f.FLOAT, !1, 0, 0);
758
+ const s = this.gl, c = s.createTexture();
759
+ return s.bindTexture(s.TEXTURE_2D, c), s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !0), s.texImage2D(s.TEXTURE_2D, 0, s.RGBA, s.RGBA, s.UNSIGNED_BYTE, x), s.generateMipmap(s.TEXTURE_2D), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, s.LINEAR_MIPMAP_LINEAR), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, s.LINEAR), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_S, s.CLAMP_TO_EDGE), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_T, s.CLAMP_TO_EDGE), c;
760
+ }
761
+ addLayer(x, s, c, T = {}) {
762
+ const d = this.gl, w = d.createVertexArray();
763
+ d.bindVertexArray(w);
764
+ const F = d.createBuffer();
765
+ d.bindBuffer(d.ARRAY_BUFFER, F), d.bufferData(d.ARRAY_BUFFER, c.pos, d.DYNAMIC_DRAW);
766
+ for (const z of [this.main, this.line]) {
767
+ const D = d.getAttribLocation(z.prog, "aPos");
768
+ d.enableVertexAttribArray(D), d.vertexAttribPointer(D, 2, d.FLOAT, !1, 0, 0);
769
769
  }
770
- const Y = f.createBuffer();
771
- f.bindBuffer(f.ARRAY_BUFFER, Y), f.bufferData(f.ARRAY_BUFFER, h.uv, f.STATIC_DRAW);
772
- const I = f.getAttribLocation(this.main.prog, "aUv");
773
- f.enableVertexAttribArray(I), f.vertexAttribPointer(I, 2, f.FLOAT, !1, 0, 0);
774
- const _ = f.createBuffer();
775
- f.bindBuffer(f.ELEMENT_ARRAY_BUFFER, _), f.bufferData(f.ELEMENT_ARRAY_BUFFER, h.tris, f.STATIC_DRAW), f.bindVertexArray(null);
776
- const U = f.createBuffer();
777
- f.bindBuffer(f.ELEMENT_ARRAY_BUFFER, U), f.bufferData(f.ELEMENT_ARRAY_BUFFER, h.lines, f.STATIC_DRAW);
778
- const O = { name: x, image: o, mesh: h, tex: this.texture(o), vao: w, posBuf: B, uvBuf: Y, triBuf: _, lineBuf: U, visible: !0, face: !!T.face, eyeBall: T.eyeBall, color: T.color || [1, 1, 1, 1] };
770
+ const Y = d.createBuffer();
771
+ d.bindBuffer(d.ARRAY_BUFFER, Y), d.bufferData(d.ARRAY_BUFFER, c.uv, d.STATIC_DRAW);
772
+ const I = d.getAttribLocation(this.main.prog, "aUv");
773
+ d.enableVertexAttribArray(I), d.vertexAttribPointer(I, 2, d.FLOAT, !1, 0, 0);
774
+ const _ = d.createBuffer();
775
+ d.bindBuffer(d.ELEMENT_ARRAY_BUFFER, _), d.bufferData(d.ELEMENT_ARRAY_BUFFER, c.tris, d.STATIC_DRAW), d.bindVertexArray(null);
776
+ const B = d.createBuffer();
777
+ d.bindBuffer(d.ELEMENT_ARRAY_BUFFER, B), d.bufferData(d.ELEMENT_ARRAY_BUFFER, c.lines, d.STATIC_DRAW);
778
+ const O = { name: x, image: s, mesh: c, tex: this.texture(s), vao: w, posBuf: F, uvBuf: Y, triBuf: _, lineBuf: B, visible: !0, face: !!T.face, eyeBall: T.eyeBall, color: T.color || [1, 1, 1, 1] };
779
779
  return this.layers.push(O), O;
780
780
  }
781
781
  destroy() {
782
782
  const x = this.gl;
783
- for (const o of this.layers) {
784
- x.deleteTexture(o.tex), o.normal && x.deleteTexture(o.normal), o.headBuf && x.deleteBuffer(o.headBuf), x.deleteVertexArray(o.vao);
785
- for (const h of [o.posBuf, o.uvBuf, o.triBuf, o.lineBuf]) x.deleteBuffer(h);
783
+ for (const s of this.layers) {
784
+ x.deleteTexture(s.tex), s.normal && x.deleteTexture(s.normal), s.headBuf && x.deleteBuffer(s.headBuf), x.deleteVertexArray(s.vao);
785
+ for (const c of [s.posBuf, s.uvBuf, s.triBuf, s.lineBuf]) x.deleteBuffer(c);
786
786
  }
787
787
  x.deleteProgram(this.main.prog), x.deleteProgram(this.line.prog), this.lit && x.deleteProgram(this.lit.prog), this.shadow?.destroy(), this.layers.length = 0;
788
788
  }
789
789
  setLighting(x) {
790
- if (this.lighting = An({ ...Re, ...x }) ?? Re, !this.lighting.enabled) return;
791
- const o = this.gl;
792
- this.lit || (this.lit = u(o, b, d));
793
- for (const h of this.layers) {
794
- if (h.normal || h.overlay) continue;
795
- const T = xn(h.image, h.mesh.rect, e, !/^(eye|mouth)/.test(h.name));
796
- this.lightingStats.normalMs += T.ms, this.lightingStats[T.computed ? "computedLayers" : "cachedLayers"]++, h.normal = o.createTexture(), o.activeTexture(o.TEXTURE0), o.bindTexture(o.TEXTURE_2D, h.normal), o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), o.texImage2D(o.TEXTURE_2D, 0, o.RGBA, T.width, T.height, 0, o.RGBA, o.UNSIGNED_BYTE, T.data), o.generateMipmap(o.TEXTURE_2D), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MIN_FILTER, o.LINEAR_MIPMAP_LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_MAG_FILTER, o.LINEAR), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_S, o.CLAMP_TO_EDGE), o.texParameteri(o.TEXTURE_2D, o.TEXTURE_WRAP_T, o.CLAMP_TO_EDGE);
797
- const f = new Float32Array(h.mesh.rest.length / 2);
798
- for (let w = 0; w < f.length; w++) f[w] = n.headWeight(h.mesh.rest[w * 2], h.mesh.rest[w * 2 + 1]);
799
- h.headBuf = o.createBuffer(), o.bindVertexArray(h.vao), o.bindBuffer(o.ARRAY_BUFFER, h.headBuf), o.bufferData(o.ARRAY_BUFFER, f, o.STATIC_DRAW), o.enableVertexAttribArray(2), o.vertexAttribPointer(2, 1, o.FLOAT, !1, 0, 0);
790
+ if (this.lighting = Tn({ ...Fe, ...x }) ?? Fe, !this.lighting.enabled) return;
791
+ const s = this.gl;
792
+ this.lit || (this.lit = h(s, m, g));
793
+ for (const c of this.layers) {
794
+ if (c.normal || c.overlay) continue;
795
+ const T = En(c.image, c.mesh.rect, e, !/^(eye|mouth)/.test(c.name));
796
+ this.lightingStats.normalMs += T.ms, this.lightingStats[T.computed ? "computedLayers" : "cachedLayers"]++, c.normal = s.createTexture(), s.activeTexture(s.TEXTURE0), s.bindTexture(s.TEXTURE_2D, c.normal), s.pixelStorei(s.UNPACK_PREMULTIPLY_ALPHA_WEBGL, !1), s.texImage2D(s.TEXTURE_2D, 0, s.RGBA, T.width, T.height, 0, s.RGBA, s.UNSIGNED_BYTE, T.data), s.generateMipmap(s.TEXTURE_2D), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MIN_FILTER, s.LINEAR_MIPMAP_LINEAR), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_MAG_FILTER, s.LINEAR), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_S, s.CLAMP_TO_EDGE), s.texParameteri(s.TEXTURE_2D, s.TEXTURE_WRAP_T, s.CLAMP_TO_EDGE);
797
+ const d = new Float32Array(c.mesh.rest.length / 2);
798
+ for (let w = 0; w < d.length; w++) d[w] = n.headWeight(c.mesh.rest[w * 2], c.mesh.rest[w * 2 + 1]);
799
+ c.headBuf = s.createBuffer(), s.bindVertexArray(c.vao), s.bindBuffer(s.ARRAY_BUFFER, c.headBuf), s.bufferData(s.ARRAY_BUFFER, d, s.STATIC_DRAW), s.enableVertexAttribArray(2), s.vertexAttribPointer(2, 1, s.FLOAT, !1, 0, 0);
800
800
  }
801
- o.bindVertexArray(null), this.lighting.shadow && !this.shadow && (this.shadow = new Rn(o, u));
801
+ s.bindVertexArray(null), this.lighting.shadow && !this.shadow && (this.shadow = new Fn(s, h));
802
802
  }
803
803
  resize() {
804
- const x = this.canvas, o = Math.min(window.devicePixelRatio || 1, 2), h = Math.round(x.clientWidth * o), T = Math.round(x.clientHeight * o);
805
- (x.width !== h || x.height !== T) && (x.width = h, x.height = T);
806
- const f = (this.fit === "cover" ? Math.max : Math.min)(h / (t.w * (1 + 2 * this.pad.side)), T / (t.h * (1 + this.pad.top))), w = (h - t.w * f) / 2, B = (T - t.h * f) / (this.fit === "cover" ? 2 : 1);
807
- this.scale = [2 * f / h, -2 * f / T], this.offset = [-1 + 2 * w / h, 1 - 2 * B / T], this.pxScale = f, this.pxOff = [w, B];
804
+ const x = this.canvas, s = Math.min(window.devicePixelRatio || 1, 2), c = Math.round(x.clientWidth * s), T = Math.round(x.clientHeight * s);
805
+ (x.width !== c || x.height !== T) && (x.width = c, x.height = T);
806
+ const d = (this.fit === "cover" ? Math.max : Math.min)(c / (t.w * (1 + 2 * this.pad.side)), T / (t.h * (1 + this.pad.top))), w = (c - t.w * d) / 2, F = (T - t.h * d) / (this.fit === "cover" ? 2 : 1);
807
+ this.scale = [2 * d / c, -2 * d / T], this.offset = [-1 + 2 * w / c, 1 - 2 * F / T], this.pxScale = d, this.pxOff = [w, F];
808
808
  }
809
809
  draw(x) {
810
- const o = this.gl;
811
- this.resize(), o.viewport(0, 0, this.canvas.width, this.canvas.height), o.clearColor(0, 0, 0, 0), o.clear(o.COLOR_BUFFER_BIT);
812
- const h = this.lighting.enabled, T = h && this.lighting.shadow;
810
+ const s = this.gl;
811
+ this.resize(), s.viewport(0, 0, this.canvas.width, this.canvas.height), s.clearColor(0, 0, 0, 0), s.clear(s.COLOR_BUFFER_BIT);
812
+ const c = this.lighting.enabled, T = c && this.lighting.shadow;
813
813
  T && this.shadow.begin(this.canvas.width, this.canvas.height);
814
- const f = h ? this.lit : this.main;
815
- if (this.current = f, o.useProgram(f.prog), h) {
814
+ const d = c ? this.lit : this.main;
815
+ if (this.current = d, s.useProgram(d.prog), c) {
816
816
  const w = this.lighting;
817
- o.uniform1i(f.u.uNormal, 1), o.uniform3f(f.u.uLight, w.x, w.y, w.z), o.uniform3f(f.u.uLightColor, (w.color >> 16 & 255) / 255, (w.color >> 8 & 255) / 255, (w.color & 255) / 255), o.uniform3f(f.u.uAmbientColor, (w.ambientColor >> 16 & 255) / 255, (w.ambientColor >> 8 & 255) / 255, (w.ambientColor & 255) / 255), o.uniform4f(f.u.uLighting, w.strength, w.intensity, w.ambient, w.reach), o.uniform4f(f.u.uSurface, w.softness, w.specular, w.rim, w.detail), o.uniform1f(f.u.uAspect, this.canvas.width / this.canvas.height), o.uniform1i(f.u.uCel, w.mode === "cel" ? 1 : 0), o.uniformMatrix3fv(f.u.uHeadRotation, !1, On(x.angleX ?? 0, x.angleY ?? 0, x.angleZ ?? 0, e.head.maxRoll));
817
+ s.uniform1i(d.u.uNormal, 1), s.uniform3f(d.u.uLight, w.x, w.y, w.z), s.uniform3f(d.u.uLightColor, (w.color >> 16 & 255) / 255, (w.color >> 8 & 255) / 255, (w.color & 255) / 255), s.uniform3f(d.u.uAmbientColor, (w.ambientColor >> 16 & 255) / 255, (w.ambientColor >> 8 & 255) / 255, (w.ambientColor & 255) / 255), s.uniform4f(d.u.uLighting, w.strength, w.intensity, w.ambient, w.reach), s.uniform4f(d.u.uSurface, w.softness, w.specular, w.rim, w.detail), s.uniform1f(d.u.uAspect, this.canvas.width / this.canvas.height), s.uniform1i(d.u.uCel, w.mode === "cel" ? 1 : 0), s.uniformMatrix3fv(d.u.uHeadRotation, !1, kn(x.angleX ?? 0, x.angleY ?? 0, x.angleZ ?? 0, e.head.maxRoll));
818
818
  }
819
- o.uniform2fv(f.u.uScale, this.scale), o.uniform2fv(f.u.uOffset, this.offset), o.uniform1i(f.u.uTex, 0), o.uniform4fv(f.u.uEyeBox, r.flatMap((w) => [w.x0, w.x1, 0, 0])), o.uniform1fv(f.u.uEyeTop, r.flatMap((w) => w.top)), o.uniform1fv(f.u.uEyeBot, r.flatMap((w) => w.bot)), o.uniform4fv(f.u.uEyeState, x.eyes), o.uniform4f(f.u.uMouth, a.cx, a.cy, a.angle, a.halfLen), o.uniform4f(f.u.uMouthState, x.mouthOpen, x.mouthForm, a.bow, 0), o.uniform4f(f.u.uCheeks, s[0][0], s[0][1], s[1][0], s[1][1]), o.uniform1f(f.u.uCheek, x.cheek), o.activeTexture(o.TEXTURE0);
819
+ s.uniform2fv(d.u.uScale, this.scale), s.uniform2fv(d.u.uOffset, this.offset), s.uniform1i(d.u.uTex, 0), s.uniform4fv(d.u.uEyeBox, r.flatMap((w) => [w.x0, w.x1, 0, 0])), s.uniform1fv(d.u.uEyeTop, r.flatMap((w) => w.top)), s.uniform1fv(d.u.uEyeBot, r.flatMap((w) => w.bot)), s.uniform4fv(d.u.uEyeState, x.eyes), s.uniform4f(d.u.uMouth, a.cx, a.cy, a.angle, a.halfLen), s.uniform4f(d.u.uMouthState, x.mouthOpen, x.mouthForm, a.bow, 0), s.uniform4f(d.u.uCheeks, o[0][0], o[0][1], o[1][0], o[1][1]), s.uniform1f(d.u.uCheek, x.cheek), s.activeTexture(s.TEXTURE0);
820
820
  for (const w of this.layers)
821
821
  !w.visible || w.overlay || this.drawLayer(w, w.alpha ?? 1);
822
822
  if (this.original && x.originalAlpha > 0 && this.drawLayer(this.original, x.originalAlpha), T && this.shadow.composite(this.lighting), x.showMesh) {
823
823
  const w = this.line;
824
- o.useProgram(w.prog), o.uniform2fv(w.u.uScale, this.scale), o.uniform2fv(w.u.uOffset, this.offset);
825
- for (const B of this.layers)
826
- !B.visible || B.overlay || (o.bindVertexArray(B.vao), o.bindBuffer(o.ELEMENT_ARRAY_BUFFER, B.lineBuf), o.uniform4fv(w.u.uColor, B.color), o.drawElements(o.LINES, B.mesh.lines.length, o.UNSIGNED_INT, 0), o.bindBuffer(o.ELEMENT_ARRAY_BUFFER, B.triBuf));
827
- x.joints?.length && this.drawPoints(x.joints), o.bindVertexArray(null);
824
+ s.useProgram(w.prog), s.uniform2fv(w.u.uScale, this.scale), s.uniform2fv(w.u.uOffset, this.offset);
825
+ for (const F of this.layers)
826
+ !F.visible || F.overlay || (s.bindVertexArray(F.vao), s.bindBuffer(s.ELEMENT_ARRAY_BUFFER, F.lineBuf), s.uniform4fv(w.u.uColor, F.color), s.drawElements(s.LINES, F.mesh.lines.length, s.UNSIGNED_INT, 0), s.bindBuffer(s.ELEMENT_ARRAY_BUFFER, F.triBuf));
827
+ x.joints?.length && this.drawPoints(x.joints), s.bindVertexArray(null);
828
828
  }
829
829
  }
830
- drawLayer(x, o) {
831
- const h = this.gl, T = this.current;
832
- h.useProgram(T.prog), h.bindVertexArray(x.vao), h.bindBuffer(h.ARRAY_BUFFER, x.posBuf), h.bufferSubData(h.ARRAY_BUFFER, 0, x.mesh.pos), this.lighting.enabled && (h.activeTexture(h.TEXTURE1), h.bindTexture(h.TEXTURE_2D, x.normal), h.activeTexture(h.TEXTURE0)), h.bindTexture(h.TEXTURE_2D, x.tex), h.uniform4fv(T.u.uRect, x.mesh.rect), h.uniform1i(T.u.uFace, x.eyeBall !== void 0 ? 2 + x.eyeBall : x.face ? 1 : 0), h.uniform1f(T.u.uAlpha, o), h.drawElements(h.TRIANGLES, x.mesh.tris.length, h.UNSIGNED_INT, 0);
830
+ drawLayer(x, s) {
831
+ const c = this.gl, T = this.current;
832
+ c.useProgram(T.prog), c.bindVertexArray(x.vao), c.bindBuffer(c.ARRAY_BUFFER, x.posBuf), c.bufferSubData(c.ARRAY_BUFFER, 0, x.mesh.pos), this.lighting.enabled && (c.activeTexture(c.TEXTURE1), c.bindTexture(c.TEXTURE_2D, x.normal), c.activeTexture(c.TEXTURE0)), c.bindTexture(c.TEXTURE_2D, x.tex), c.uniform4fv(T.u.uRect, x.mesh.rect), c.uniform1i(T.u.uFace, x.eyeBall !== void 0 ? 2 + x.eyeBall : x.face ? 1 : 0), c.uniform1f(T.u.uAlpha, s), c.drawElements(c.TRIANGLES, x.mesh.tris.length, c.UNSIGNED_INT, 0);
833
833
  }
834
834
  drawPoints(x) {
835
- const o = this.gl, h = this.line;
835
+ const s = this.gl, c = this.line;
836
836
  if (!this.pointBuf) {
837
- this.pointBuf = o.createBuffer(), this.pointVao = o.createVertexArray(), o.bindVertexArray(this.pointVao), o.bindBuffer(o.ARRAY_BUFFER, this.pointBuf);
838
- const T = o.getAttribLocation(h.prog, "aPos");
839
- o.enableVertexAttribArray(T), o.vertexAttribPointer(T, 2, o.FLOAT, !1, 0, 0);
837
+ this.pointBuf = s.createBuffer(), this.pointVao = s.createVertexArray(), s.bindVertexArray(this.pointVao), s.bindBuffer(s.ARRAY_BUFFER, this.pointBuf);
838
+ const T = s.getAttribLocation(c.prog, "aPos");
839
+ s.enableVertexAttribArray(T), s.vertexAttribPointer(T, 2, s.FLOAT, !1, 0, 0);
840
840
  }
841
- o.bindVertexArray(this.pointVao), o.bindBuffer(o.ARRAY_BUFFER, this.pointBuf), o.bufferData(o.ARRAY_BUFFER, new Float32Array(x.flat()), o.DYNAMIC_DRAW), o.uniform4f(h.u.uColor, 1, 0.85, 0.2, 1), o.drawArrays(o.POINTS, 0, x.length);
841
+ s.bindVertexArray(this.pointVao), s.bindBuffer(s.ARRAY_BUFFER, this.pointBuf), s.bufferData(s.ARRAY_BUFFER, new Float32Array(x.flat()), s.DYNAMIC_DRAW), s.uniform4f(c.u.uColor, 1, 0.85, 0.2, 1), s.drawArrays(s.POINTS, 0, x.length);
842
842
  }
843
843
  // canvas CSS px -> source image px
844
- toImage(x, o) {
844
+ toImage(x, s) {
845
845
  if (!this.pxOff) return null;
846
- const h = this.canvas.width / this.canvas.clientWidth;
847
- return [(x * h - this.pxOff[0]) / this.pxScale, (o * h - this.pxOff[1]) / this.pxScale];
846
+ const c = this.canvas.width / this.canvas.clientWidth;
847
+ return [(x * c - this.pxOff[0]) / this.pxScale, (s * c - this.pxOff[1]) / this.pxScale];
848
848
  }
849
849
  }
850
- return { Renderer: c, buildGrid: y };
850
+ return { Renderer: u, buildGrid: y };
851
851
  }
852
- function kn(n, e) {
853
- const { applyHead: t, applyBody: r, TASSELS: a, tasselAnchor: s } = n, l = (e.strands ?? []).map((o) => {
854
- if (o.nodes.length === 4) return o;
855
- const h = Array.from({ length: 4 }, (T, f) => {
856
- const w = f / 3 * (o.nodes.length - 1), B = Math.min(o.nodes.length - 2, Math.floor(w)), Y = w - B;
857
- return [0, 1].map((I) => o.nodes[B][I] + (o.nodes[B + 1][I] - o.nodes[B][I]) * Y);
852
+ function Un(n, e) {
853
+ const { applyHead: t, applyBody: r, TASSELS: a, tasselAnchor: o } = n, i = (e.strands ?? []).map((s) => {
854
+ if (s.nodes.length === 4) return s;
855
+ const c = Array.from({ length: 4 }, (T, d) => {
856
+ const w = d / 3 * (s.nodes.length - 1), F = Math.min(s.nodes.length - 2, Math.floor(w)), Y = w - F;
857
+ return [0, 1].map((I) => s.nodes[F][I] + (s.nodes[F + 1][I] - s.nodes[F][I]) * Y);
858
858
  });
859
- return { ...o, nodes: h };
860
- }), m = [0, 300, 200, 140], b = 0.9, d = 7, p = { stiff: 1.7, damp: 1.6, couple: 0.85, reach: 0.9, bind: 4 }, i = Math.min(6, l.filter((o) => o.name.startsWith("bang")).length), u = { freq: 0.7, zeta: 0.22, hang: 0.85, inertia: 0.32, wind: 0.03, max: 0.55, smooth: 6 }, S = (o, h) => [o[0] * Math.cos(h) - o[1] * Math.sin(h), o[0] * Math.sin(h) + o[1] * Math.cos(h)], y = (o, h) => {
861
- const T = Math.hypot(o[0], o[1]);
862
- if (T < 1e-6) return o;
863
- const f = h * Math.tanh(T / h) / T;
864
- return [o[0] * f, o[1] * f];
865
- }, c = Object.fromEntries(Object.entries(e.buns ?? {}).map(([o, h]) => [o, { at: [h.cx, h.cy], k: 260, c: 11, hang: 3, max: 4 }])), v = (o, h) => {
866
- const T = Math.hypot(o[0], o[1]);
867
- T > h && (o[0] *= h / T, o[1] *= h / T);
859
+ return { ...s, nodes: c };
860
+ }), f = [0, 300, 200, 140], m = 0.9, g = 7, p = { stiff: 1.7, damp: 1.6, couple: 0.85, reach: 0.9, bind: 4 }, l = Math.min(6, i.filter((s) => s.name.startsWith("bang")).length), h = { freq: 0.7, zeta: 0.22, hang: 0.85, inertia: 0.32, wind: 0.03, max: 0.55, smooth: 6 }, E = (s, c) => [s[0] * Math.cos(c) - s[1] * Math.sin(c), s[0] * Math.sin(c) + s[1] * Math.cos(c)], y = (s, c) => {
861
+ const T = Math.hypot(s[0], s[1]);
862
+ if (T < 1e-6) return s;
863
+ const d = c * Math.tanh(T / c) / T;
864
+ return [s[0] * d, s[1] * d];
865
+ }, u = Object.fromEntries(Object.entries(e.buns ?? {}).map(([s, c]) => [s, { at: [c.cx, c.cy], k: 260, c: 11, hang: 3, max: 4 }])), v = (s, c) => {
866
+ const T = Math.hypot(s[0], s[1]);
867
+ T > c && (s[0] *= c / T, s[1] *= c / T);
868
868
  };
869
869
  class x {
870
870
  constructor() {
871
871
  this.gain = 1, this.out = { gain: 1, bunL: [0, 0], bunR: [0, 0] }, this.hair = {};
872
- for (const h of Object.keys(c))
873
- this.hair[h] = { p: null, v: [0, 0] }, this.out[h] = [0, 0];
874
- this.strands = l.map(() => ({ p: null, v: [[0, 0], [0, 0], [0, 0], [0, 0]] })), this.out.strands = l.map(() => [[0, 0], [0, 0], [0, 0], [0, 0]]), this.chains = a.map((h) => {
875
- const T = h.tip[0] - h.pivot[0], f = h.tip[1] - h.pivot[1], w = Math.hypot(T, f), B = [T / w, f / w];
876
- return { t: h, dir: B, L1: w * h.split, L2: w * (1 - h.split), pts: null, prev: null, phi: [0, 0], anchor: [0, 0] };
872
+ for (const c of Object.keys(u))
873
+ this.hair[c] = { p: null, v: [0, 0] }, this.out[c] = [0, 0];
874
+ this.strands = i.map(() => ({ p: null, v: [[0, 0], [0, 0], [0, 0], [0, 0]] })), this.out.strands = i.map(() => [[0, 0], [0, 0], [0, 0], [0, 0]]), this.chains = a.map((c) => {
875
+ const T = c.tip[0] - c.pivot[0], d = c.tip[1] - c.pivot[1], w = Math.hypot(T, d), F = [T / w, d / w];
876
+ return { t: c, dir: F, L1: w * c.split, L2: w * (1 - c.split), pts: null, prev: null, phi: [0, 0], anchor: [0, 0] };
877
877
  }), this.time = 0;
878
878
  }
879
- hairAnchor(h, T) {
880
- const f = [h[0], h[1]];
881
- return t(f, 1, T), r(f, h[1], T), f;
882
- }
883
- step(h, T) {
884
- const f = Math.max(1, Math.ceil(T / 0.004166666666666667)), w = Math.min(T, 0.05) / f, B = -h.angleZ / 30 * e.head.maxRoll - h.bodyAngleZ / 10 * e.body.maxRoll, Y = this.gain;
885
- l.forEach((_, U) => {
886
- const O = this.strands[U], C = this.out.strands[U], $ = _.nodes.map((X) => this.hairAnchor(X, h));
887
- O.p || (O.p = $.map((X) => [...X]));
888
- const V = U * 1.7;
889
- for (let X = 0; X < f; X++) {
890
- const D = this.time + X * w;
891
- for (let H = 1; H < 4; H++) {
892
- const L = Math.hypot(_.nodes[H][0] - _.nodes[0][0], _.nodes[H][1] - _.nodes[0][1]), Z = (Math.sin(D * 1.3) * 0.5 + Math.sin(D * 3.1) * 0.3 + Math.sin(D * 4.7 + V) * 0.2) * _.max * 0.1 * H / 3, P = [O.p[H - 1][0] - $[H - 1][0], O.p[H - 1][1] - $[H - 1][1]], G = $[H][0] + P[0] * b * p.couple - Math.sin(B) * L * 0.12 + Z, J = $[H][1] + P[1] * b * p.couple, q = m[H] * _.k * p.stiff / Math.max(0.35, Y), g = d * p.damp * Math.sqrt(p.stiff) / Math.max(0.5, Math.sqrt(Y)), A = O.v[H], E = O.p[H];
893
- A[0] += (q * (G - E[0]) - g * A[0]) * w, A[1] += (q * (J - E[1]) - g * A[1]) * w, E[0] += A[0] * w, E[1] += A[1] * w;
879
+ hairAnchor(c, T) {
880
+ const d = [c[0], c[1]];
881
+ return t(d, 1, T), r(d, c[1], T), d;
882
+ }
883
+ step(c, T) {
884
+ const d = Math.max(1, Math.ceil(T / 0.004166666666666667)), w = Math.min(T, 0.05) / d, F = -c.angleZ / 30 * e.head.maxRoll - c.bodyAngleZ / 10 * e.body.maxRoll, Y = this.gain;
885
+ i.forEach((_, B) => {
886
+ const O = this.strands[B], z = this.out.strands[B], D = _.nodes.map((j) => this.hairAnchor(j, c));
887
+ O.p || (O.p = D.map((j) => [...j]));
888
+ const J = B * 1.7;
889
+ for (let j = 0; j < d; j++) {
890
+ const H = this.time + j * w;
891
+ for (let Z = 1; Z < 4; Z++) {
892
+ const $ = Math.hypot(_.nodes[Z][0] - _.nodes[0][0], _.nodes[Z][1] - _.nodes[0][1]), q = (Math.sin(H * 1.3) * 0.5 + Math.sin(H * 3.1) * 0.3 + Math.sin(H * 4.7 + J) * 0.2) * _.max * 0.1 * Z / 3, W = [O.p[Z - 1][0] - D[Z - 1][0], O.p[Z - 1][1] - D[Z - 1][1]], N = D[Z][0] + W[0] * m * p.couple - Math.sin(F) * $ * 0.12 + q, G = D[Z][1] + W[1] * m * p.couple, V = f[Z] * _.k * p.stiff / Math.max(0.35, Y), b = g * p.damp * Math.sqrt(p.stiff) / Math.max(0.5, Math.sqrt(Y)), M = O.v[Z], S = O.p[Z];
893
+ M[0] += (V * (N - S[0]) - b * M[0]) * w, M[1] += (V * (G - S[1]) - b * M[1]) * w, S[0] += M[0] * w, S[1] += M[1] * w;
894
894
  }
895
- O.p[0] = [...$[0]];
895
+ O.p[0] = [...D[0]];
896
896
  }
897
- for (let X = 0; X < 4; X++) {
898
- const D = [O.p[X][0] - $[X][0], O.p[X][1] - $[X][1]];
899
- C[X] = y(D, Math.max(0.5, _.max * p.reach * Math.max(1, Y) * X / 3));
897
+ for (let j = 0; j < 4; j++) {
898
+ const H = [O.p[j][0] - D[j][0], O.p[j][1] - D[j][1]];
899
+ z[j] = y(H, Math.max(0.5, _.max * p.reach * Math.max(1, Y) * j / 3));
900
900
  }
901
901
  });
902
- for (const [_, U] of Object.entries(c)) {
903
- const O = this.hair[_], C = this.hairAnchor(U.at, h), $ = Math.sin(this.time * 1.3 + U.at[0] * 0.01) * 0.6 + Math.sin(this.time * 2.9 + U.at[1] * 0.02) * 0.4, V = C[0] - Math.sin(B) * U.hang + $ * U.max * 0.12, X = C[1];
904
- O.p || (O.p = [V, X]);
905
- const D = U.k / Math.max(0.35, Y), H = U.c / Math.max(0.5, Math.sqrt(Y));
906
- for (let Z = 0; Z < f; Z++)
907
- O.v[0] += (D * (V - O.p[0]) - H * O.v[0]) * w, O.v[1] += (D * (X - O.p[1]) - H * O.v[1]) * w, O.p[0] += O.v[0] * w, O.p[1] += O.v[1] * w;
908
- const L = [O.p[0] - C[0], O.p[1] - C[1]];
909
- v(L, U.max * Math.max(1, Y)), this.out[_] = L;
902
+ for (const [_, B] of Object.entries(u)) {
903
+ const O = this.hair[_], z = this.hairAnchor(B.at, c), D = Math.sin(this.time * 1.3 + B.at[0] * 0.01) * 0.6 + Math.sin(this.time * 2.9 + B.at[1] * 0.02) * 0.4, J = z[0] - Math.sin(F) * B.hang + D * B.max * 0.12, j = z[1];
904
+ O.p || (O.p = [J, j]);
905
+ const H = B.k / Math.max(0.35, Y), Z = B.c / Math.max(0.5, Math.sqrt(Y));
906
+ for (let q = 0; q < d; q++)
907
+ O.v[0] += (H * (J - O.p[0]) - Z * O.v[0]) * w, O.v[1] += (H * (j - O.p[1]) - Z * O.v[1]) * w, O.p[0] += O.v[0] * w, O.p[1] += O.v[1] * w;
908
+ const $ = [O.p[0] - z[0], O.p[1] - z[1]];
909
+ v($, B.max * Math.max(1, Y)), this.out[_] = $;
910
910
  }
911
911
  this.out.gain = 1;
912
912
  const I = this.out.strands;
913
- for (let _ = 0; _ < p.bind; _++) for (let U = 1; U < 4; U++) {
914
- const O = I.slice(0, i).map((C) => [...C[U]]);
915
- for (let C = 0; C < i; C++) {
916
- const $ = O[Math.max(0, C - 1)], V = O[Math.min(i - 1, C + 1)];
917
- for (const X of [0, 1]) I[C][U][X] = O[C][X] * 0.5 + ($[X] + V[X]) * 0.25;
913
+ for (let _ = 0; _ < p.bind; _++) for (let B = 1; B < 4; B++) {
914
+ const O = I.slice(0, l).map((z) => [...z[B]]);
915
+ for (let z = 0; z < l; z++) {
916
+ const D = O[Math.max(0, z - 1)], J = O[Math.min(l - 1, z + 1)];
917
+ for (const j of [0, 1]) I[z][B][j] = O[z][j] * 0.5 + (D[j] + J[j]) * 0.25;
918
918
  }
919
919
  }
920
920
  for (const _ of this.chains) {
921
- const U = s(_.t, h, this.out, [0, 0]);
922
- _.st || (_.st = { th: [0, 0], w: [0, 0], pos: [...U], vel: [0, 0], acc: [0, 0] });
923
- const O = _.st, C = u, $ = [(U[0] - O.pos[0]) / Math.max(T, 1e-3), (U[1] - O.pos[1]) / Math.max(T, 1e-3)], V = 1 - Math.exp(-T * C.smooth), X = [($[0] - O.vel[0]) / Math.max(T, 1e-3), ($[1] - O.vel[1]) / Math.max(T, 1e-3)];
924
- O.acc = [O.acc[0] + (X[0] - O.acc[0]) * V, O.acc[1] + (X[1] - O.acc[1]) * V], O.vel = [O.vel[0] + ($[0] - O.vel[0]) * V, O.vel[1] + ($[1] - O.vel[1]) * V], O.pos = [...U];
925
- const D = [-_.dir[1], _.dir[0]], H = -(O.acc[0] * D[0] + O.acc[1] * D[1]) / (_.L1 + _.L2) * C.inertia, L = (Math.sin(this.time * 0.9 + _.t.pivot[0]) * 0.6 + Math.sin(this.time * 0.37 + _.t.pivot[1]) * 0.4) * C.wind, Z = -B * C.hang + L, P = 2 * Math.PI * C.freq / Math.sqrt(Math.max(0.4, Y)), G = P * 1.35;
926
- for (let A = 0; A < f; A++) {
927
- const E = -P * P * (O.th[0] - Z) - 2 * C.zeta * P * O.w[0] + H;
928
- O.w[0] += E * w, O.th[0] += O.w[0] * w;
929
- const k = -G * G * (O.th[1] - O.th[0]) - 2 * C.zeta * G * O.w[1] + H * 0.4 + E * 0.5;
930
- O.w[1] += k * w, O.th[1] += O.w[1] * w;
921
+ const B = o(_.t, c, this.out, [0, 0]);
922
+ _.st || (_.st = { th: [0, 0], w: [0, 0], pos: [...B], vel: [0, 0], acc: [0, 0] });
923
+ const O = _.st, z = h, D = [(B[0] - O.pos[0]) / Math.max(T, 1e-3), (B[1] - O.pos[1]) / Math.max(T, 1e-3)], J = 1 - Math.exp(-T * z.smooth), j = [(D[0] - O.vel[0]) / Math.max(T, 1e-3), (D[1] - O.vel[1]) / Math.max(T, 1e-3)];
924
+ O.acc = [O.acc[0] + (j[0] - O.acc[0]) * J, O.acc[1] + (j[1] - O.acc[1]) * J], O.vel = [O.vel[0] + (D[0] - O.vel[0]) * J, O.vel[1] + (D[1] - O.vel[1]) * J], O.pos = [...B];
925
+ const H = [-_.dir[1], _.dir[0]], Z = -(O.acc[0] * H[0] + O.acc[1] * H[1]) / (_.L1 + _.L2) * z.inertia, $ = (Math.sin(this.time * 0.9 + _.t.pivot[0]) * 0.6 + Math.sin(this.time * 0.37 + _.t.pivot[1]) * 0.4) * z.wind, q = -F * z.hang + $, W = 2 * Math.PI * z.freq / Math.sqrt(Math.max(0.4, Y)), N = W * 1.35;
926
+ for (let M = 0; M < d; M++) {
927
+ const S = -W * W * (O.th[0] - q) - 2 * z.zeta * W * O.w[0] + Z;
928
+ O.w[0] += S * w, O.th[0] += O.w[0] * w;
929
+ const L = -N * N * (O.th[1] - O.th[0]) - 2 * z.zeta * N * O.w[1] + Z * 0.4 + S * 0.5;
930
+ O.w[1] += L * w, O.th[1] += O.w[1] * w;
931
931
  }
932
- O.th[0] = Math.max(-0.55, Math.min(C.max, O.th[0])), O.th[1] = Math.max(-0.55 * 1.4, Math.min(C.max * 1.4, O.th[1])), _.phi = [O.th[0], O.th[1]];
933
- const J = S(_.dir, O.th[0]), q = S(_.dir, O.th[1]), g = [U[0] + J[0] * _.L1, U[1] + J[1] * _.L1];
934
- _.pts = [[...U], g, [g[0] + q[0] * _.L2, g[1] + q[1] * _.L2]], _.anchor = U;
932
+ O.th[0] = Math.max(-0.55, Math.min(z.max, O.th[0])), O.th[1] = Math.max(-0.55 * 1.4, Math.min(z.max * 1.4, O.th[1])), _.phi = [O.th[0], O.th[1]];
933
+ const G = E(_.dir, O.th[0]), V = E(_.dir, O.th[1]), b = [B[0] + G[0] * _.L1, B[1] + G[1] * _.L1];
934
+ _.pts = [[...B], b, [b[0] + V[0] * _.L2, b[1] + V[1] * _.L2]], _.anchor = B;
935
935
  }
936
936
  return this.time += T, this.out;
937
937
  }
938
938
  }
939
939
  return { Physics: x };
940
940
  }
941
- function _n(n, e) {
942
- const { baseWeights: t, deformBase: r, MOUTH: a } = n, s = (f, w, B) => {
943
- const Y = Math.min(1, Math.max(0, (B - f) / (w - f)));
941
+ function Yn(n, e) {
942
+ const { baseWeights: t, deformBase: r, MOUTH: a } = n, o = (d, w, F) => {
943
+ const Y = Math.min(1, Math.max(0, (F - d) / (w - d)));
944
944
  return Y * Y * (3 - 2 * Y);
945
- }, l = e.mouth.area, m = {
945
+ }, i = e.mouth.area, f = {
946
946
  a: { sprite: "mouth_a", ref: 0.9, width: 1 },
947
947
  aHalf: { sprite: "mouth_a_half", ref: 0.55, width: 1 },
948
948
  i: { sprite: "mouth_i", ref: 0.55, width: 1 },
949
949
  e: { sprite: "mouth_a_half", ref: 0.65, width: 1.06 },
950
950
  o: { sprite: "mouth_o", ref: 0.75, width: 1 },
951
951
  u: { sprite: "mouth_o", ref: 0.75, width: 0.78 }
952
- }, b = 0.16, d = ["angry", "sad"];
953
- function p(f, w) {
954
- const Y = (U, O, C) => U >= O - (w ? 0.07 : 0) && U < C + (w ? 0.07 : 0), I = [["i", -9, -0.55], ["e", -0.55, -0.2], ["a", -0.2, 0.35], ["o", 0.35, 0.75], ["u", 0.75, 9]], _ = w && I.find((U) => U[0] === w || w === "aHalf" && U[0] === "a");
955
- return _ && Y(f, _[1], _[2]) ? _[0] : I.find((U) => f >= U[1] && f < U[2])[0];
956
- }
957
- const i = 0.75, u = 0.3, S = 0.06, y = ["sad", "surprise"];
958
- function c(f, w, B = null) {
959
- return B && f >= u ? B : f >= i ? null : f < u ? w >= 0.5 ? "eyes_smile" : "eyes_closed" : "eyes_half";
960
- }
961
- function v(f, w, B = null) {
962
- if (f < b) return null;
963
- const Y = p(w, B);
964
- return Y === "a" ? f >= 0.6 ? "a" : "aHalf" : Y;
965
- }
966
- function x(f) {
967
- return a.cy + (f - a.cx) * Math.tan(a.angle);
968
- }
969
- function o() {
970
- return l.cx;
971
- }
972
- function h(f, w) {
973
- const B = Math.cos(-l.angle), Y = Math.sin(-l.angle), I = f - l.cx, _ = w - l.cy, U = (I * B - _ * Y) / l.rx, O = (I * Y + _ * B) / l.ry;
974
- return 1 - s(0.55, 0.95, Math.hypot(U, O));
975
- }
976
- function T(f, w, B, Y, I) {
977
- const _ = {}, U = (L) => L.startsWith("eyes_closed") || L.startsWith("eyes_smile"), O = (L) => d.some((Z) => L === `mouth_${Z}`), C = (L) => U(L) ? 1 : L.startsWith("eyes_") ? 0 : O(L) ? 2 : 3, $ = Object.entries(w.layers).sort((L, Z) => C(L[0]) - C(Z[0]));
978
- for (const [L, Z] of $) {
979
- const P = Y(Z, e.mesh.spriteCell, I(B[L]), B[L].width), G = [], J = [];
980
- for (let g = 0; g < P.rest.length / 2; g++) {
981
- const A = P.rest[g * 2], E = P.rest[g * 2 + 1];
982
- G.push(t(A, E, 0)), J.push(L.startsWith("mouth") ? h(A, E) : 0);
952
+ }, m = 0.16, g = ["angry", "sad"];
953
+ function p(d, w) {
954
+ const Y = (B, O, z) => B >= O - (w ? 0.07 : 0) && B < z + (w ? 0.07 : 0), I = [["i", -9, -0.55], ["e", -0.55, -0.2], ["a", -0.2, 0.35], ["o", 0.35, 0.75], ["u", 0.75, 9]], _ = w && I.find((B) => B[0] === w || w === "aHalf" && B[0] === "a");
955
+ return _ && Y(d, _[1], _[2]) ? _[0] : I.find((B) => d >= B[1] && d < B[2])[0];
956
+ }
957
+ const l = 0.75, h = 0.3, E = 0.06, y = ["sad", "surprise"];
958
+ function u(d, w, F = null) {
959
+ return F && d >= h ? F : d >= l ? null : d < h ? w >= 0.5 ? "eyes_smile" : "eyes_closed" : "eyes_half";
960
+ }
961
+ function v(d, w, F = null) {
962
+ if (d < m) return null;
963
+ const Y = p(w, F);
964
+ return Y === "a" ? d >= 0.6 ? "a" : "aHalf" : Y;
965
+ }
966
+ function x(d) {
967
+ return a.cy + (d - a.cx) * Math.tan(a.angle);
968
+ }
969
+ function s() {
970
+ return i.cx;
971
+ }
972
+ function c(d, w) {
973
+ const F = Math.cos(-i.angle), Y = Math.sin(-i.angle), I = d - i.cx, _ = w - i.cy, B = (I * F - _ * Y) / i.rx, O = (I * Y + _ * F) / i.ry;
974
+ return 1 - o(0.55, 0.95, Math.hypot(B, O));
975
+ }
976
+ function T(d, w, F, Y, I) {
977
+ const _ = {}, B = (N) => N.startsWith("eyes_closed") || N.startsWith("eyes_smile"), O = (N) => g.some((G) => N === `mouth_${G}`), z = (N) => B(N) ? 1 : N.startsWith("eyes_") ? 0 : O(N) ? 2 : 3, D = Object.entries(w.layers).sort((N, G) => z(N[0]) - z(G[0]));
978
+ for (const [N, G] of D) {
979
+ const V = Y(G, e.mesh.spriteCell, I(F[N]), F[N].width), b = [], M = [];
980
+ for (let L = 0; L < V.rest.length / 2; L++) {
981
+ const U = V.rest[L * 2], X = V.rest[L * 2 + 1];
982
+ b.push(t(U, X, 0)), M.push(N.startsWith("mouth") ? c(U, X) : 0);
983
983
  }
984
- const q = f.addLayer(L, B[L], P, { color: [0.4, 1, 0.8, 0.6] });
985
- q.visible = !1, _[L] = { mesh: P, W: G, inner: J, layer: q };
986
- }
987
- const V = [0, 0];
988
- let X = null;
989
- const D = [0, 1].map(() => ({ cur: "open", prev: "open", t: 1 }));
990
- function H(L, Z, P, G, J = 1) {
991
- const q = L.mesh.rest, g = L.mesh.pos;
992
- for (let A = 0; A < L.W.length; A++) {
993
- let E = q[A * 2], k = q[A * 2 + 1];
994
- const N = L.inner[A];
995
- if (N > 0) {
996
- const z = x(E);
997
- k = z + (k - z) * (1 + (G - 1) * N), E = o() + (E - o()) * (1 + (J - 1) * N);
984
+ const S = d.addLayer(N, F[N], V, { color: [0.4, 1, 0.8, 0.6] });
985
+ S.visible = !1, _[N] = { mesh: V, W: b, inner: M, layer: S };
986
+ }
987
+ const J = [0, 1].map((N) => !!(_[`eyes_closed_${N}`] && _[`eyes_half_${N}`])), j = Object.values(f).some((N) => _[N.sprite]), H = (N, G) => (N === "eyes_smile" && !_[`eyes_smile_${G}`] && (N = "eyes_closed"), N === "open" || _[`${N}_${G}`] ? N : "open"), Z = [0, 0];
988
+ let $ = null;
989
+ const q = [0, 1].map(() => ({ cur: "open", prev: "open", t: 1 }));
990
+ function W(N, G, V, b, M = 1) {
991
+ const S = N.mesh.rest, L = N.mesh.pos;
992
+ for (let U = 0; U < N.W.length; U++) {
993
+ let X = S[U * 2], k = S[U * 2 + 1];
994
+ const P = N.inner[U];
995
+ if (P > 0) {
996
+ const A = x(X);
997
+ k = A + (k - A) * (1 + (b - 1) * P), X = s() + (X - s()) * (1 + (M - 1) * P);
998
998
  }
999
- r(E, k, L.W[A], Z, P, V), g[A * 2] = V[0], g[A * 2 + 1] = V[1];
999
+ r(X, k, N.W[U], G, V, Z), L[U * 2] = Z[0], L[U * 2 + 1] = Z[1];
1000
1000
  }
1001
1001
  }
1002
1002
  return {
1003
1003
  /**
1004
1004
  * Show / hide and deform the sprites for this frame.
1005
- * Returns which eyes are covered by a sprite, so the layered eye parts can be hidden.
1005
+ * Returns which eyes are covered by a sprite, so the layered eye parts can be hidden, and
1006
+ * whether a drawing shows the mouth, so the shader mouth can be left out.
1006
1007
  * `mood` (angry / sad / surprise) picks drawn expression eyes (sad, surprise) and closed
1007
1008
  * mouths (angry, sad) when the avatar has them.
1008
1009
  */
1009
- update(L, Z, P = 1 / 60, G = null) {
1010
- for (const N of Object.values(_)) N.layer.visible = !1;
1011
- const J = [!1, !1];
1010
+ update(N, G, V = 1 / 60, b = null) {
1011
+ for (const P of Object.values(_)) P.layer.visible = !1;
1012
+ const M = [!1, !1];
1012
1013
  [
1013
- [L.eyeROpen, L.eyeSmile],
1014
- [L.eyeLOpen, L.eyeSmileL ?? L.eyeSmile]
1015
- ].forEach(([N, z], F) => {
1016
- const j = D[F], M = y.includes(G) && _[`eyes_${G}_${F}`] ? `eyes_${G}` : null, R = c(N, z, M) ?? "open";
1017
- R !== j.cur && (j.prev = j.cur, j.cur = R, j.t = 0), j.t = P > 0 ? Math.min(1, j.t + P / S) : 1;
1018
- const W = s(0, 1, j.t), Q = (ee, he) => {
1019
- if (ee === "open" || he <= 1e-3) return;
1020
- const oe = _[`${ee}_${F}`];
1021
- oe && (oe.layer.visible = !0, oe.layer.alpha = he, H(oe, L, Z, 1));
1022
- }, ne = (ee) => ee === "open" ? -1 : U(ee) ? 1 : 0;
1023
- j.t >= 1 ? Q(j.cur, 1) : ne(j.cur) > ne(j.prev) ? (Q(j.prev, 1), Q(j.cur, W)) : (Q(j.cur, 1), Q(j.prev, 1 - W)), J[F] = j.cur !== "open" && W >= 0.999;
1014
+ [N.eyeROpen, N.eyeSmile],
1015
+ [N.eyeLOpen, N.eyeSmileL ?? N.eyeSmile]
1016
+ ].forEach(([P, A], R) => {
1017
+ const C = q[R], Q = y.includes(b) && _[`eyes_${b}_${R}`] ? `eyes_${b}` : null, te = H(u(P, A, Q) ?? "open", R);
1018
+ te !== C.cur && (C.prev = C.cur, C.cur = te, C.t = 0), C.t = V > 0 ? Math.min(1, C.t + V / E) : 1;
1019
+ const ne = o(0, 1, C.t), ie = (me, He) => {
1020
+ if (me === "open" || He <= 1e-3) return;
1021
+ const we = _[`${me}_${R}`];
1022
+ we && (we.layer.visible = !0, we.layer.alpha = He, W(we, N, G, 1));
1023
+ }, se = (me) => me === "open" ? -1 : B(me) ? 1 : 0;
1024
+ C.t >= 1 ? ie(C.cur, 1) : se(C.cur) > se(C.prev) ? (ie(C.prev, 1), ie(C.cur, ne)) : (ie(C.cur, 1), ie(C.prev, 1 - ne)), M[R] = C.cur !== "open" && ne >= 0.999;
1024
1025
  });
1025
- const g = v(L.mouthOpen, L.mouthForm, X);
1026
- X = g;
1027
- const A = g && m[g], E = A && _[A.sprite], k = d.includes(G) && _[`mouth_${G}`];
1028
- if (k && (!E || L.mouthOpen < b + 0.04) && (k.layer.visible = !0, k.layer.alpha = 1, H(k, L, Z, 1)), E) {
1029
- E.layer.visible = !0, E.layer.alpha = s(b, b + 0.04, L.mouthOpen);
1030
- const N = Math.min(1.1, Math.max(0.5, L.mouthOpen / A.ref));
1031
- H(E, L, Z, N, A.width);
1026
+ const L = v(N.mouthOpen, N.mouthForm, $);
1027
+ $ = L;
1028
+ const U = L && f[L], X = U && _[U.sprite], k = g.includes(b) && _[`mouth_${b}`];
1029
+ if (k && (!X || N.mouthOpen < m + 0.04) && (k.layer.visible = !0, k.layer.alpha = 1, W(k, N, G, 1)), X) {
1030
+ X.layer.visible = !0, X.layer.alpha = o(m, m + 0.04, N.mouthOpen);
1031
+ const P = Math.min(1.1, Math.max(0.5, N.mouthOpen / U.ref));
1032
+ W(X, N, G, P, U.width);
1032
1033
  }
1033
- return { eyes: J, mouth: g };
1034
- }
1034
+ return { eyes: M, mouth: L, mouthDrawn: j && (!U || !!X) };
1035
+ },
1036
+ /** Whether each eye has the closed and half-closed drawings, so the layered eye stays open. */
1037
+ eyesDrawn: J
1035
1038
  };
1036
1039
  }
1037
- return { createSprites: T, mouthShape: v, eyeSprite: c };
1040
+ return { createSprites: T, mouthShape: v, eyeSprite: u };
1038
1041
  }
1039
- const Ut = { angry: "angry", angryTalk: "angry", sad: "sad", sadTalk: "sad", surprise: "surprise", surprisedTalk: "surprise" };
1040
- function Fn(n, e) {
1041
- return n && n !== "neutral" ? Ut[n] ?? null : (e && Ut[e]) ?? null;
1042
+ const Nt = { angry: "angry", angryTalk: "angry", sad: "sad", sadTalk: "sad", surprise: "surprise", surprisedTalk: "surprise" };
1043
+ function In(n, e) {
1044
+ return n && n !== "neutral" ? Nt[n] ?? null : (e && Nt[e]) ?? null;
1042
1045
  }
1043
- const Bn = /* @__PURE__ */ new Set([
1046
+ function At(n) {
1047
+ if (!n || typeof n != "object" || Array.isArray(n)) throw new TypeError("lipSync: expected an object");
1048
+ const e = n, t = {};
1049
+ for (const r of ["granularity", "openness", "closeSpeed"]) {
1050
+ const a = e[r];
1051
+ if (a !== void 0) {
1052
+ if (typeof a != "number" || !Number.isFinite(a) || a < 0 || a > 1)
1053
+ throw new RangeError(`lipSync.${r}: expected 0–1`);
1054
+ t[r] = a;
1055
+ }
1056
+ }
1057
+ if (e.preset !== void 0) {
1058
+ if (!["calm", "default", "lively", "subtle", "big", "custom"].includes(e.preset))
1059
+ throw new RangeError("lipSync.preset: expected calm, default, lively, subtle, big or custom");
1060
+ t.preset = e.preset;
1061
+ }
1062
+ return t;
1063
+ }
1064
+ function jt(n = {}, e = {
1065
+ granularity: 0.5,
1066
+ openness: 0.5,
1067
+ closeSpeed: 0.5
1068
+ }) {
1069
+ const t = At(n);
1070
+ return {
1071
+ granularity: t.granularity ?? e.granularity,
1072
+ openness: t.openness ?? e.openness,
1073
+ closeSpeed: t.closeSpeed ?? e.closeSpeed
1074
+ };
1075
+ }
1076
+ const Se = (n, e, t, r) => n === 0.5 ? t : n < 0.5 ? e + (t - e) * n * 2 : t + (r - t) * (n - 0.5) * 2;
1077
+ function Xt(n) {
1078
+ return {
1079
+ arm: Se(n.granularity, 0.2, 0.6, 0.9),
1080
+ trigger: Se(n.granularity, 0.65, 0.8, 0.95),
1081
+ relax: Se(n.granularity, 1.5, 5, 12),
1082
+ range: Se(n.granularity, 0.7, 0.3, 0.05),
1083
+ risePower: Se(n.granularity, 0.05, 0.3, 0.8),
1084
+ openness: Se(n.openness, 0.55, 1, 1.25),
1085
+ audioRelease: Se(n.closeSpeed, 6, 32, 45),
1086
+ kanaRelease: Se(n.closeSpeed, 6, 22, 45)
1087
+ };
1088
+ }
1089
+ const Nn = /* @__PURE__ */ new Set([
1044
1090
  "angleX",
1045
1091
  "angleY",
1046
1092
  "angleZ",
@@ -1050,7 +1096,7 @@ const Bn = /* @__PURE__ */ new Set([
1050
1096
  "handAngle",
1051
1097
  "gazeX",
1052
1098
  "gazeY"
1053
- ]), xt = {
1099
+ ]), Mt = {
1054
1100
  nod: {
1055
1101
  label: "Nod",
1056
1102
  dur: 1.7,
@@ -1198,7 +1244,7 @@ const Bn = /* @__PURE__ */ new Set([
1198
1244
  blush: [[0, 0], [1.6, 0.3], [2.6, 0]]
1199
1245
  }
1200
1246
  }
1201
- }, wt = {
1247
+ }, Et = {
1202
1248
  lookAround: {
1203
1249
  label: "Look around",
1204
1250
  dur: 5.2,
@@ -1438,16 +1484,16 @@ const Bn = /* @__PURE__ */ new Set([
1438
1484
  }
1439
1485
  }
1440
1486
  };
1441
- function Un(n, e) {
1487
+ function jn(n, e) {
1442
1488
  if (e <= n[0][0]) return n[0][1];
1443
1489
  const t = n.length - 1;
1444
1490
  if (e >= n[t][0]) return n[t][1];
1445
1491
  let r = 0;
1446
1492
  for (; e > n[r + 1][0]; ) r++;
1447
- const [a, s] = n[r], [l, m] = n[r + 1], b = (c) => c <= 0 || c >= t ? 0 : (n[c + 1][1] - n[c - 1][1]) / (n[c + 1][0] - n[c - 1][0]), d = l - a, p = (e - a) / d, i = b(r) * d, u = b(r + 1) * d, S = p * p, y = S * p;
1448
- return (2 * y - 3 * S + 1) * s + (y - 2 * S + p) * i + (-2 * y + 3 * S) * m + (y - S) * u;
1493
+ const [a, o] = n[r], [i, f] = n[r + 1], m = (u) => u <= 0 || u >= t ? 0 : (n[u + 1][1] - n[u - 1][1]) / (n[u + 1][0] - n[u - 1][0]), g = i - a, p = (e - a) / g, l = m(r) * g, h = m(r + 1) * g, E = p * p, y = E * p;
1494
+ return (2 * y - 3 * E + 1) * o + (y - 2 * E + p) * l + (-2 * y + 3 * E) * f + (y - E) * h;
1449
1495
  }
1450
- const We = {
1496
+ const ze = {
1451
1497
  a: { open: 0.9, form: 0, label: "あ" },
1452
1498
  i: { open: 0.5, form: -0.85, label: "い" },
1453
1499
  u: { open: 0.4, form: 0.9, label: "う" },
@@ -1455,21 +1501,21 @@ const We = {
1455
1501
  o: { open: 0.75, form: 0.6, label: "お" },
1456
1502
  n: { open: 0, form: null, label: "ん" }
1457
1503
  // closes with the previous shape
1458
- }, Yn = {
1504
+ }, Xn = {
1459
1505
  a: "あかさたなはまやらわがざだばぱぁ",
1460
1506
  i: "いきしちにひみりぎじぢびぴぃ",
1461
1507
  u: "うくすつぬふむゆるぐずづぶぷぅゔ",
1462
1508
  e: "えけせてねへめれげぜでべぺぇ",
1463
1509
  o: "おこそとのほもよろをごぞどぼぽぉ"
1464
- }, Vt = {};
1465
- for (const [n, e] of Object.entries(Yn)) for (const t of e) Vt[t] = n;
1466
- const In = /* @__PURE__ */ new Set([..."まみむめもばびぶべぼぱぴぷぺぽ"]), Nn = /* @__PURE__ */ new Set([..."あいうえおぁぃぅぇぉ"]), Yt = { ゃ: "a", ゅ: "u", ょ: "o" }, Xn = /* @__PURE__ */ new Set([..."、。,.,.!?!?  …"]), jn = (n) => n.replace(/[ァ-ヶ]/g, (e) => String.fromCharCode(e.charCodeAt(0) - 96));
1467
- function Cn(n, e = 0.14) {
1510
+ }, en = {};
1511
+ for (const [n, e] of Object.entries(Xn)) for (const t of e) en[t] = n;
1512
+ const $n = /* @__PURE__ */ new Set([..."まみむめもばびぶべぼぱぴぷぺぽ"]), Cn = /* @__PURE__ */ new Set([..."あいうえおぁぃぅぇぉ"]), $t = { ゃ: "a", ゅ: "u", ょ: "o" }, zn = /* @__PURE__ */ new Set([..."、。,.,.!?!?  …"]), Pn = (n) => n.replace(/[ァ-ヶ]/g, (e) => String.fromCharCode(e.charCodeAt(0) - 96));
1513
+ function Dn(n, e = 0.14) {
1468
1514
  const t = [];
1469
- for (const r of jn(n)) {
1515
+ for (const r of Pn(n)) {
1470
1516
  const a = t[t.length - 1];
1471
- if (Yt[r] && a) {
1472
- a.vowel = Yt[r];
1517
+ if ($t[r] && a) {
1518
+ a.vowel = $t[r];
1473
1519
  continue;
1474
1520
  }
1475
1521
  if (r === "ー" && a) {
@@ -1484,27 +1530,41 @@ function Cn(n, e = 0.14) {
1484
1530
  t.push({ vowel: "n", dur: e, onset: null });
1485
1531
  continue;
1486
1532
  }
1487
- if (Xn.has(r)) {
1533
+ if (zn.has(r)) {
1488
1534
  t.push({ vowel: "n", dur: e * 2.2, onset: null });
1489
1535
  continue;
1490
1536
  }
1491
- const s = Vt[r];
1492
- s && t.push({ vowel: s, dur: e, onset: In.has(r) ? "lips" : Nn.has(r) ? null : "consonant" });
1537
+ const o = en[r];
1538
+ o && t.push({ vowel: o, dur: e, onset: $n.has(r) ? "lips" : Cn.has(r) ? null : "consonant" });
1493
1539
  }
1494
1540
  return t;
1495
1541
  }
1496
- function zn(n, e) {
1497
- let t = 0;
1498
- for (const r of n) {
1499
- if (e < t + r.dur) {
1500
- const a = (e - t) / r.dur, s = We[r.vowel], l = r.onset === "lips" ? 0.05 : r.onset === "consonant" ? 0.45 : 1, m = a < 0.35 ? l + (1 - l) * (a / 0.35) : 1;
1501
- return { open: s.open * m, form: s.form, vowel: r.vowel };
1542
+ function Hn(n, e, t = 0.5) {
1543
+ if (t !== 0.5) return Zn(n, e, t);
1544
+ let r = 0;
1545
+ for (const a of n) {
1546
+ if (e < r + a.dur) {
1547
+ const o = (e - r) / a.dur, i = ze[a.vowel], f = a.onset === "lips" ? 0.05 : a.onset === "consonant" ? 0.45 : 1, m = o < 0.35 ? f + (1 - f) * (o / 0.35) : 1;
1548
+ return { open: i.open * m, form: i.form, vowel: a.vowel };
1549
+ }
1550
+ r += a.dur;
1551
+ }
1552
+ return null;
1553
+ }
1554
+ function Zn(n, e, t) {
1555
+ const r = t < 0.5 ? (0.5 - t) * 0.72 : 0;
1556
+ let a = 0, o = 0, i = null;
1557
+ for (const f of n) {
1558
+ let m = f.vowel;
1559
+ if (f.vowel === "n" ? r && f.dur <= 0.2 && i ? m = i : (o = 0, i = null) : ((!i || o >= r) && (i = f.vowel, o = 0), o += f.dur, r && (m = i)), e < a + f.dur) {
1560
+ const g = ze[m], p = f.onset === "lips" ? 0.05 : f.onset === "consonant" ? 0.45 : 1, l = t < 0.5 ? 1 - (1 - p) * t * 2 : p * (2 - t * 2), h = Math.min(f.dur * 0.35, 0.05), E = (e - a) / h;
1561
+ return { open: g.open * (E < 1 ? l + (1 - l) * E : 1), form: g.form, vowel: m };
1502
1562
  }
1503
- t += r.dur;
1563
+ a += f.dur;
1504
1564
  }
1505
1565
  return null;
1506
1566
  }
1507
- const et = { ...xt, ...wt }, It = { amp: 1, stiff: 1.8 }, Pn = /^(angle|bodyAngle|armAngle|handAngle)/, $n = /* @__PURE__ */ new Set([
1567
+ const nt = { ...Mt, ...Et }, Ct = { amp: 1, stiff: 1.8 }, Wn = /^(angle|bodyAngle|armAngle|handAngle)/, Gn = /* @__PURE__ */ new Set([
1508
1568
  "eyeOpen",
1509
1569
  "eyeOpenL",
1510
1570
  "eyeSmileL",
@@ -1514,18 +1574,18 @@ const et = { ...xt, ...wt }, It = { amp: 1, stiff: 1.8 }, Pn = /^(angle|bodyAngl
1514
1574
  "blush",
1515
1575
  "browY",
1516
1576
  "browAngle"
1517
- ]), Ze = (n, e, t) => {
1577
+ ]), Ve = (n, e, t) => {
1518
1578
  const r = Math.min(1, Math.max(0, (t - n) / (e - n)));
1519
1579
  return r * r * (3 - 2 * r);
1520
1580
  };
1521
- function Nt(n, e) {
1522
- const t = Math.floor(n), r = n - t, a = (l) => {
1523
- const m = Math.sin((l + e * 57.3) * 127.1) * 43758.5453;
1524
- return m - Math.floor(m);
1525
- }, s = r * r * (3 - 2 * r);
1526
- return (a(t) * (1 - s) + a(t + 1) * s) * 2 - 1;
1581
+ function zt(n, e) {
1582
+ const t = Math.floor(n), r = n - t, a = (i) => {
1583
+ const f = Math.sin((i + e * 57.3) * 127.1) * 43758.5453;
1584
+ return f - Math.floor(f);
1585
+ }, o = r * r * (3 - 2 * r);
1586
+ return (a(t) * (1 - o) + a(t + 1) * o) * 2 - 1;
1527
1587
  }
1528
- const we = (n, e) => Nt(n, e) * 0.7 + Nt(n * 2.3, e + 9) * 0.3, me = (n, e, t) => Math.max(e, Math.min(t, n)), qt = {
1588
+ const Me = (n, e) => zt(n, e) * 0.7 + zt(n * 2.3, e + 9) * 0.3, pe = (n, e, t) => Math.max(e, Math.min(t, n)), tn = {
1529
1589
  normal: { label: "Neutral", p: {} },
1530
1590
  smile: { label: "Smile", p: { eyeOpen: 0, eyeSmile: 1, blush: 0.35, browY: 0.2 } },
1531
1591
  shy: { label: "Blush", p: { eyeOpen: 0.78, eyeSmile: 0.5, blush: 1, browAngle: -0.5, browY: -0.1, glance: [0.7, 0.35] } },
@@ -1539,14 +1599,14 @@ const we = (n, e) => Nt(n, e) * 0.7 + Nt(n * 2.3, e + 9) * 0.3, me = (n, e, t) =
1539
1599
  angryTalk: { label: "angry", p: { eyeOpen: 0.72, browAngle: 0.85, browY: -0.55, mouthForm: 0.2 } },
1540
1600
  surprisedTalk: { label: "surprised", p: { eyeOpen: 1.18, browY: 0.9, mouthForm: 0.9 } },
1541
1601
  relaxedTalk: { label: "relaxed", p: { eyeOpen: 0.82, eyeSmile: 0.35, blush: 0.15, browY: 0.1 } }
1542
- }, Xt = {
1602
+ }, Pt = {
1543
1603
  happy: ["happyTalk", "nod"],
1544
1604
  sad: ["sadTalk", "sigh"],
1545
1605
  angry: ["angryTalk", "no"],
1546
1606
  surprised: ["surprisedTalk", "surprise"],
1547
1607
  relaxed: ["relaxedTalk", "sway"],
1548
1608
  neutral: ["normal", null]
1549
- }, Dn = {
1609
+ }, Vn = {
1550
1610
  gazeX: [260, 0.9],
1551
1611
  gazeY: [260, 0.9],
1552
1612
  angleX: [55, 0.72],
@@ -1557,38 +1617,41 @@ const we = (n, e) => Nt(n, e) * 0.7 + Nt(n * 2.3, e + 9) * 0.3, me = (n, e, t) =
1557
1617
  armAngle: [20, 0.85],
1558
1618
  handAngle: [30, 0.8]
1559
1619
  };
1560
- class Hn {
1620
+ class qn {
1561
1621
  /** @param {number[]} gazeCenter */
1562
1622
  constructor(e) {
1563
- this.mode = "auto", this.P = Object.fromEntries(De.map((t) => [t.id, t.def])), this.manual = { ...this.P }, this.cur = { ...this.P }, this.vel = Object.fromEntries(De.map((t) => [t.id, 0])), this.expr = "normal", this.exprMix = {}, this.t = 0, this.blink = { t: 0, start: 1.5, double: !1 }, this.gaze = { x: 0, y: 0, next: 0 }, this.tap = { next: 4, until: -1 }, this.pointer = null, this.faceCenter = [...e], this.lipOpen = null, this.lipForm = 0, this.speaking = !1, this.voice = 0, this.mouth = 0, this.vowel = "a", this.vowelForm = 0, this.syllableArmed = !0, this.voicePeak = 0, this.voiceTrough = 0, this.kana = null, this.lipHold = null, this.emotionUntil = 0, this.talkGain = 1, this.play = null, this.autoMotion = !0, this.nextAuto = 14, this.autoIdle = !0, this.nextIdle = 3, this.lastAuto = null, this.onMotion = null;
1623
+ this.mode = "auto", this.P = Object.fromEntries(We.map((t) => [t.id, t.def])), this.manual = { ...this.P }, this.cur = { ...this.P }, this.vel = Object.fromEntries(We.map((t) => [t.id, 0])), this.expr = "normal", this.exprMix = {}, this.t = 0, this.blink = { t: 0, start: 1.5, double: !1 }, this.gaze = { x: 0, y: 0, next: 0 }, this.tap = { next: 4, until: -1 }, this.pointer = null, this.faceCenter = [...e], this.lipOpen = null, this.lipForm = 0, this.speaking = !1, this.voice = 0, this.mouth = 0, this.vowel = "a", this.vowelForm = 0, this.lipSync = jt(), this.lipMotion = Xt(this.lipSync), this.syllableArmed = !0, this.voicePeak = 0, this.voiceTrough = 0, this.kana = null, this.lipHold = null, this.emotionUntil = 0, this.talkGain = 1, this.play = null, this.autoMotion = !0, this.nextAuto = 14, this.autoIdle = !0, this.nextIdle = 3, this.lastAuto = null, this.onMotion = null;
1564
1624
  }
1565
1625
  setExpression(e) {
1566
1626
  this.expr = e;
1567
1627
  }
1568
1628
  hasMotion(e) {
1569
- return e in et;
1629
+ return e in nt;
1570
1630
  }
1571
1631
  // ---- speech (driven from outside, e.g. by the TTS audio analyser) ----
1572
1632
  setVoiceLevel(e) {
1573
1633
  this.voice = Math.min(1, Math.max(0, Number(e) || 0));
1574
1634
  }
1635
+ setLipSync(e) {
1636
+ this.lipSync = jt(e, this.lipSync), this.lipMotion = Xt(this.lipSync);
1637
+ }
1575
1638
  setSpeaking(e) {
1576
1639
  e !== this.speaking && (this.speaking = !!e, e || (this.emotionUntil = this.t + 1.2, this.voice = 0));
1577
1640
  }
1578
1641
  /** `playMotion: false` changes only the face (a caller that picks motions itself). */
1579
1642
  setEmotion(e, { playMotion: t = !0 } = {}) {
1580
- const r = Xt[e] ?? Xt.neutral;
1643
+ const r = Pt[e] ?? Pt.neutral;
1581
1644
  this.expr = r[0], this.emotionUntil = 1 / 0, r[1] && t && this.playMotion(r[1]);
1582
1645
  }
1583
1646
  /** Mouth shapes from kana text, without audio (preview / tuning). */
1584
1647
  /** @param {string} text @param {{ speed?: number, loop?: boolean }} [options] */
1585
1648
  speakKana(e, { speed: t, loop: r = !1 } = {}) {
1586
1649
  this.lipHold = null;
1587
- const a = Cn(e, t === void 0 ? 0.14 : 1 / me(Number(t) || 7, 4, 12));
1588
- this.kana = a.length ? { moras: a, t: 0, loop: r, duration: a.reduce((s, l) => s + l.dur, 0) } : null;
1650
+ const a = Dn(e, t === void 0 ? 0.14 : 1 / pe(Number(t) || 7, 4, 12));
1651
+ this.kana = a.length ? { moras: a, t: 0, loop: r, duration: a.reduce((o, i) => o + i.dur, 0) } : null;
1589
1652
  }
1590
1653
  holdMouth(e) {
1591
- this.kana = null, this.lipHold = Object.hasOwn(We, e) ? e : null;
1654
+ this.kana = null, this.lipHold = Object.hasOwn(ze, e) ? e : null;
1592
1655
  }
1593
1656
  stopLipSync() {
1594
1657
  this.kana = null, this.lipHold = null, this.lipOpen = null, this.mouth = 0;
@@ -1604,30 +1667,30 @@ class Hn {
1604
1667
  // the dip before each mora even when a loud voice never gets quiet.
1605
1668
  speechMouth(e) {
1606
1669
  if (this.kana || this.lipHold) {
1607
- let i;
1608
- if (this.lipHold ? i = We[this.lipHold] : (this.kana.t += e, this.kana.loop && (this.kana.t %= this.kana.duration), i = zn(this.kana.moras, this.kana.t)), !i)
1609
- return this.kana = null, this.mouth > 0.01 ? [this.mouth *= 0.6, this.vowelForm] : null;
1610
- const u = i.open > this.mouth ? 1 - Math.exp(-e * 30) : 1 - Math.exp(-e * 22);
1611
- return this.mouth += (i.open - this.mouth) * u, i.form !== null && (this.vowelForm = i.form), [this.mouth, this.vowelForm];
1670
+ let h;
1671
+ if (this.lipHold ? h = ze[this.lipHold] : (this.kana.t += e, this.kana.loop && (this.kana.t %= this.kana.duration), h = Hn(this.kana.moras, this.kana.t, this.lipSync.granularity)), !h)
1672
+ return this.kana = null, this.mouth > 0.01 ? [this.mouth *= this.lipSync.closeSpeed === 0.5 ? 0.6 : Math.exp(-e * this.lipMotion.kanaRelease), this.vowelForm] : null;
1673
+ const E = this.lipMotion.openness === 1 ? h.open : Math.min(1, h.open * this.lipMotion.openness), y = E > this.mouth ? 1 - Math.exp(-e * 30) : 1 - Math.exp(-e * this.lipMotion.kanaRelease);
1674
+ return this.mouth += (E - this.mouth) * y, h.form !== null && (this.vowelForm = h.form), [this.mouth, this.vowelForm];
1612
1675
  }
1613
- const t = this.speaking ? this.voice : 0, r = 1 - Math.exp(-e * 5);
1676
+ const t = this.speaking ? this.voice : 0, r = 1 - Math.exp(-e * this.lipMotion.relax);
1614
1677
  this.voicePeak = t > this.voicePeak ? t : this.voicePeak + (t - this.voicePeak) * r, this.voiceTrough = t < this.voiceTrough ? t : this.voiceTrough + (t - this.voiceTrough) * r;
1615
1678
  const a = Math.max(this.voicePeak, 0.05);
1616
- if (t < a * 0.6) this.syllableArmed = !0;
1617
- else if (this.syllableArmed && t > a * 0.8 && t > 0.1) {
1679
+ if (t < a * this.lipMotion.arm) this.syllableArmed = !0;
1680
+ else if (this.syllableArmed && t > a * this.lipMotion.trigger && t > 0.1) {
1618
1681
  this.syllableArmed = !1;
1619
- const i = Math.random();
1620
- this.vowel = i < 0.4 ? "a" : i < 0.58 ? "o" : i < 0.74 ? "e" : i < 0.88 ? "i" : "u";
1682
+ const h = Math.random();
1683
+ this.vowel = h < 0.4 ? "a" : h < 0.58 ? "o" : h < 0.74 ? "e" : h < 0.88 ? "i" : "u";
1621
1684
  }
1622
- const s = this.voicePeak - this.voiceTrough, l = s < a * 0.3 ? 1 : Math.max(0, (t - this.voiceTrough) / s), m = We[this.vowel ?? "a"], b = Math.min(1, Math.pow(t, 0.7) * 1.15) * Math.pow(l, 0.3), d = this.speaking ? Math.min(0.95, b) * (0.45 + 0.55 * m.open / 0.9) : 0, p = d > this.mouth ? 1 - Math.exp(-e * 40) : 1 - Math.exp(-e * 32);
1623
- return this.mouth += (d - this.mouth) * p, this.speaking && (this.vowelForm = m.form), this.speaking || this.mouth > 0.01 ? [this.mouth, this.vowelForm] : null;
1685
+ const o = this.voicePeak - this.voiceTrough, i = o < a * this.lipMotion.range ? 1 : Math.max(0, (t - this.voiceTrough) / o), f = ze[this.vowel ?? "a"], m = Math.min(1, Math.pow(t, 0.7) * 1.15) * Math.pow(i, this.lipMotion.risePower), g = this.speaking ? Math.min(0.95, m) * (0.45 + 0.55 * f.open / 0.9) : 0, p = this.lipMotion.openness === 1 ? g : Math.min(1, g * this.lipMotion.openness), l = p > this.mouth ? 1 - Math.exp(-e * 40) : 1 - Math.exp(-e * this.lipMotion.audioRelease);
1686
+ return this.mouth += (p - this.mouth) * l, this.speaking && (this.vowelForm = f.form), this.speaking || this.mouth > 0.01 ? [this.mouth, this.vowelForm] : null;
1624
1687
  }
1625
1688
  // Breathing: inhale ~40% of the cycle, a slower exhale, a short pause at the bottom,
1626
1689
  // and a period that drifts between ~3.2 and 4.6 s so it never looks metronomic.
1627
1690
  breathValue(e) {
1628
1691
  this.breathPhase = (this.breathPhase ?? 0) + e / (this.breathPeriod ?? 3.8), this.breathPhase >= 1 && (this.breathPhase -= 1, this.breathPeriod = 3.2 + Math.random() * 1.4);
1629
1692
  const t = this.breathPhase;
1630
- return t < 0.4 ? Ze(0, 0.4, t) : t < 0.88 ? 1 - Ze(0.4, 0.88, t) : 0;
1693
+ return t < 0.4 ? Ve(0, 0.4, t) : t < 0.88 ? 1 - Ve(0.4, 0.88, t) : 0;
1631
1694
  }
1632
1695
  // pick one at random, never the one that just played
1633
1696
  playRandom(e) {
@@ -1646,81 +1709,81 @@ class Hn {
1646
1709
  update(e) {
1647
1710
  this.t += e;
1648
1711
  const t = this.t, r = {};
1649
- for (const y of De) r[y.id] = y.def;
1712
+ for (const y of We) r[y.id] = y.def;
1650
1713
  if (this.mode === "manual")
1651
1714
  Object.assign(r, this.manual);
1652
1715
  else if (this.mode === "auto") {
1653
- if (r.angleX = we(t * 0.18, 1) * 10 + this.gaze.x * 11, r.angleY = we(t * 0.15, 2) * 6 - 1 + this.gaze.y * 7, r.angleZ = we(t * 0.12, 3) * 10, r.bodyAngleX = we(t * 0.1, 4) * 5, r.bodyAngleZ = we(t * 0.09, 5) * 4, r.armAngle = we(t * 0.14, 6) * 5, r.handAngle = we(t * 0.21, 7) * 5, t > this.gaze.next) {
1716
+ if (r.angleX = Me(t * 0.18, 1) * 10 + this.gaze.x * 11, r.angleY = Me(t * 0.15, 2) * 6 - 1 + this.gaze.y * 7, r.angleZ = Me(t * 0.12, 3) * 10, r.bodyAngleX = Me(t * 0.1, 4) * 5, r.bodyAngleZ = Me(t * 0.09, 5) * 4, r.armAngle = Me(t * 0.14, 6) * 5, r.handAngle = Me(t * 0.21, 7) * 5, t > this.gaze.next) {
1654
1717
  const y = Math.random();
1655
1718
  this.gaze.x = y < 0.45 ? 0 : (Math.random() * 2 - 1) * 0.8, this.gaze.y = y < 0.45 ? 0 : (Math.random() * 2 - 1) * 0.5, this.gaze.next = t + 0.8 + Math.random() * 2.5;
1656
1719
  }
1657
1720
  if (r.gazeX = this.gaze.x + r.angleX / 60, r.gazeY = this.gaze.y + r.angleY / 60, t > this.tap.next && (this.tap.until = t + 1.1, this.tap.next = t + 5 + Math.random() * 6), this.speaking) {
1658
1721
  this.nextIdle = Math.max(this.nextIdle, t + 2.5), this.nextAuto = Math.max(this.nextAuto, t + 6);
1659
1722
  const y = this.talkGain;
1660
- this.talkNod = (this.talkNod ?? 0) + (this.voice * 7 * y - (this.talkNod ?? 0)) * Math.min(1, e * 6), r.angleY -= this.talkNod, r.angleX += we(t * 0.6, 11) * 5 * y, r.angleZ += we(t * 0.5, 12) * 4 * y;
1723
+ this.talkNod = (this.talkNod ?? 0) + (this.voice * 7 * y - (this.talkNod ?? 0)) * Math.min(1, e * 6), r.angleY -= this.talkNod, r.angleX += Me(t * 0.6, 11) * 5 * y, r.angleZ += Me(t * 0.5, 12) * 4 * y;
1661
1724
  }
1662
- !this.speaking && t > this.emotionUntil && (this.expr = "normal", this.emotionUntil = 1 / 0), this.speaking || (!this.play && this.autoMotion && t > this.nextAuto ? (this.playRandom(Object.keys(xt).filter((y) => y !== "surprise")), this.nextAuto = t + 15 + Math.random() * 10, this.nextIdle = Math.max(this.nextIdle, t + 5)) : !this.play && this.autoIdle && t > this.nextIdle && (this.playRandom(Object.keys(wt)), this.nextIdle = t + 5 + Math.random() * 5));
1725
+ !this.speaking && t > this.emotionUntil && (this.expr = "normal", this.emotionUntil = 1 / 0), this.speaking || (!this.play && this.autoMotion && t > this.nextAuto ? (this.playRandom(Object.keys(Mt).filter((y) => y !== "surprise")), this.nextAuto = t + 15 + Math.random() * 10, this.nextIdle = Math.max(this.nextIdle, t + 5)) : !this.play && this.autoIdle && t > this.nextIdle && (this.playRandom(Object.keys(Et)), this.nextIdle = t + 5 + Math.random() * 5));
1663
1726
  } else if (this.mode === "mouse" && this.pointer) {
1664
- const y = (this.pointer[0] - this.faceCenter[0]) / 500, c = (this.pointer[1] - this.faceCenter[1]) / 500;
1665
- r.angleX = me(y * 30, -30, 30), r.angleY = me(-c * 30, -30, 30), r.angleZ = me(-y * c * 25, -12, 12), r.bodyAngleX = me(y * 10, -10, 10) * 0.6, r.gazeX = me(y * 1.4, -1, 1), r.gazeY = me(-c * 1.4, -1, 1), r.handAngle = me(y * 4, -5, 5);
1727
+ const y = (this.pointer[0] - this.faceCenter[0]) / 500, u = (this.pointer[1] - this.faceCenter[1]) / 500;
1728
+ r.angleX = pe(y * 30, -30, 30), r.angleY = pe(-u * 30, -30, 30), r.angleZ = pe(-y * u * 25, -12, 12), r.bodyAngleX = pe(y * 10, -10, 10) * 0.6, r.gazeX = pe(y * 1.4, -1, 1), r.gazeY = pe(-u * 1.4, -1, 1), r.handAngle = pe(y * 4, -5, 5);
1666
1729
  }
1667
1730
  this.mode !== "manual" && (r.breath = this.breathValue(e), t < this.tap.until && (r.fingerTap = Math.max(0, Math.sin((this.tap.until - t) * Math.PI * 3.6)) ** 2));
1668
- let a = null, s = 0;
1731
+ let a = null, o = 0;
1669
1732
  if (this.play) {
1670
- const y = et[this.play.id];
1733
+ const y = nt[this.play.id];
1671
1734
  if (this.play.t += e, this.play.t >= y.dur)
1672
1735
  this.play = null, this.onMotion?.(null);
1673
1736
  else {
1674
1737
  a = {};
1675
- for (const [c, v] of Object.entries(y.tracks))
1676
- a[c] = Un(v, this.play.t) * (y.idle && Pn.test(c) ? It.amp : 1);
1677
- s = Ze(0, 0.15, this.play.t) * (1 - Ze(y.dur - 0.25, y.dur, this.play.t));
1678
- for (const [c, v] of Object.entries(a))
1679
- Bn.has(c) ? r[c] += v : c === "breath" ? r[c] += (v - r[c]) * s : $n.has(c) || (r[c] = Math.max(r[c], Math.max(0, v)));
1738
+ for (const [u, v] of Object.entries(y.tracks))
1739
+ a[u] = jn(v, this.play.t) * (y.idle && Wn.test(u) ? Ct.amp : 1);
1740
+ o = Ve(0, 0.15, this.play.t) * (1 - Ve(y.dur - 0.25, y.dur, this.play.t));
1741
+ for (const [u, v] of Object.entries(a))
1742
+ Nn.has(u) ? r[u] += v : u === "breath" ? r[u] += (v - r[u]) * o : Gn.has(u) || (r[u] = Math.max(r[u], Math.max(0, v)));
1680
1743
  }
1681
1744
  }
1682
1745
  this.mode !== "manual" && (r.angleY += r.breath * 1.6);
1683
- const l = qt[this.expr].p, m = ["eyeOpen", "eyeOpenL", "eyeSmileL", "eyeSmile", "mouthOpen", "mouthForm", "blush", "browY", "browAngle", "gx", "gy"], b = {
1684
- eyeOpen: l.eyeOpen ?? 1,
1685
- eyeOpenL: l.eyeOpenL ?? l.eyeOpen ?? 1,
1686
- eyeSmileL: l.eyeSmileL ?? l.eyeSmile ?? 0,
1687
- eyeSmile: l.eyeSmile ?? 0,
1688
- mouthOpen: l.mouthOpen ?? 0,
1689
- mouthForm: l.mouthForm ?? 0,
1690
- blush: l.blush ?? 0,
1691
- browY: l.browY ?? 0,
1692
- browAngle: l.browAngle ?? 0,
1693
- gx: l.glance?.[0] ?? 0,
1694
- gy: l.glance?.[1] ?? 0
1695
- }, d = 1 - Math.exp(-e * 9);
1696
- for (const y of m)
1697
- this.exprMix[y] === void 0 && (this.exprMix[y] = b[y]), this.exprMix[y] += (b[y] - this.exprMix[y]) * d;
1698
- const p = this.exprMix, i = {};
1699
- for (const y of De) {
1700
- const c = y.id;
1746
+ const i = tn[this.expr].p, f = ["eyeOpen", "eyeOpenL", "eyeSmileL", "eyeSmile", "mouthOpen", "mouthForm", "blush", "browY", "browAngle", "gx", "gy"], m = {
1747
+ eyeOpen: i.eyeOpen ?? 1,
1748
+ eyeOpenL: i.eyeOpenL ?? i.eyeOpen ?? 1,
1749
+ eyeSmileL: i.eyeSmileL ?? i.eyeSmile ?? 0,
1750
+ eyeSmile: i.eyeSmile ?? 0,
1751
+ mouthOpen: i.mouthOpen ?? 0,
1752
+ mouthForm: i.mouthForm ?? 0,
1753
+ blush: i.blush ?? 0,
1754
+ browY: i.browY ?? 0,
1755
+ browAngle: i.browAngle ?? 0,
1756
+ gx: i.glance?.[0] ?? 0,
1757
+ gy: i.glance?.[1] ?? 0
1758
+ }, g = 1 - Math.exp(-e * 9);
1759
+ for (const y of f)
1760
+ this.exprMix[y] === void 0 && (this.exprMix[y] = m[y]), this.exprMix[y] += (m[y] - this.exprMix[y]) * g;
1761
+ const p = this.exprMix, l = {};
1762
+ for (const y of We) {
1763
+ const u = y.id;
1701
1764
  if (this.mode === "manual" && !a) {
1702
- i[c] = r[c], this.cur[c] = r[c], this.vel[c] = 0;
1765
+ l[u] = r[u], this.cur[u] = r[u], this.vel[u] = 0;
1703
1766
  continue;
1704
1767
  }
1705
- let [v, x] = Dn[c] ?? [120, 0.95];
1706
- a && /^angle|^body/.test(c) && (et[this.play?.id ?? ""]?.idle ? (v *= It.stiff, x = 0.8) : /^angle/.test(c) && (v *= 4.5, x = 0.75));
1707
- const o = 2 * Math.sqrt(v) * x;
1708
- this.vel[c] += (v * (r[c] - this.cur[c]) - o * this.vel[c]) * e, this.cur[c] += this.vel[c] * e, i[c] = this.cur[c];
1768
+ let [v, x] = Vn[u] ?? [120, 0.95];
1769
+ a && /^angle|^body/.test(u) && (nt[this.play?.id ?? ""]?.idle ? (v *= Ct.stiff, x = 0.8) : /^angle/.test(u) && (v *= 4.5, x = 0.75));
1770
+ const s = 2 * Math.sqrt(v) * x;
1771
+ this.vel[u] += (v * (r[u] - this.cur[u]) - s * this.vel[u]) * e, this.cur[u] += this.vel[u] * e, l[u] = this.cur[u];
1709
1772
  }
1710
- let u = 1;
1711
- if (this.mode !== "manual" ? (u = this.blinkValue(e), i.eyeROpen = p.eyeOpen * u, i.eyeLOpen = p.eyeOpenL * u, i.eyeSmile = p.eyeSmile, i.eyeSmileL = p.eyeSmileL, i.mouthOpen = p.mouthOpen, i.mouthForm = p.mouthForm, i.blush = p.blush, i.browY = p.browY + (i.angleY > 0 ? i.angleY / 60 : 0) - (1 - u) * 0.18, i.browAngle = p.browAngle, i.gazeX = me(i.gazeX + p.gx, -1, 1), i.gazeY = me(i.gazeY + p.gy, -1, 1)) : i.eyeSmileL = i.eyeSmile, a) {
1773
+ let h = 1;
1774
+ if (this.mode !== "manual" ? (h = this.blinkValue(e), l.eyeROpen = p.eyeOpen * h, l.eyeLOpen = p.eyeOpenL * h, l.eyeSmile = p.eyeSmile, l.eyeSmileL = p.eyeSmileL, l.mouthOpen = p.mouthOpen, l.mouthForm = p.mouthForm, l.blush = p.blush, l.browY = p.browY + (l.angleY > 0 ? l.angleY / 60 : 0) - (1 - h) * 0.18, l.browAngle = p.browAngle, l.gazeX = pe(l.gazeX + p.gx, -1, 1), l.gazeY = pe(l.gazeY + p.gy, -1, 1)) : l.eyeSmileL = l.eyeSmile, a) {
1712
1775
  const y = (v, x) => {
1713
- i[v] += (x - i[v]) * s;
1714
- }, c = (v) => Math.min(1.3, Math.max(0, v));
1715
- "eyeOpen" in a && (y("eyeROpen", c(a.eyeOpen) * u), "eyeOpenL" in a || y("eyeLOpen", c(a.eyeOpen) * u)), "eyeOpenL" in a && y("eyeLOpen", c(a.eyeOpenL) * u), "eyeSmile" in a && (y("eyeSmile", a.eyeSmile), "eyeSmileL" in a || y("eyeSmileL", a.eyeSmile)), "eyeSmileL" in a && y("eyeSmileL", a.eyeSmileL);
1776
+ l[v] += (x - l[v]) * o;
1777
+ }, u = (v) => Math.min(1.3, Math.max(0, v));
1778
+ "eyeOpen" in a && (y("eyeROpen", u(a.eyeOpen) * h), "eyeOpenL" in a || y("eyeLOpen", u(a.eyeOpen) * h)), "eyeOpenL" in a && y("eyeLOpen", u(a.eyeOpenL) * h), "eyeSmile" in a && (y("eyeSmile", a.eyeSmile), "eyeSmileL" in a || y("eyeSmileL", a.eyeSmile)), "eyeSmileL" in a && y("eyeSmileL", a.eyeSmileL);
1716
1779
  for (const v of ["mouthOpen", "mouthForm", "blush", "browY", "browAngle"])
1717
1780
  v in a && y(v, v === "mouthOpen" || v === "blush" ? Math.max(0, a[v]) : a[v]);
1718
1781
  }
1719
- const S = this.speechMouth(e);
1720
- return S ? (this.lipOpen = S[0], this.lipForm = S[1]) : this.lipOpen !== null && !this.speaking && !this.kana && (this.lipOpen = null), this.lipOpen !== null && (i.mouthOpen = Math.max(i.mouthOpen * 0.3, this.lipOpen), i.mouthForm = me(this.lipForm, -1, 1)), this.P = i, i;
1782
+ const E = this.speechMouth(e);
1783
+ return E ? (this.lipOpen = E[0], this.lipForm = E[1]) : this.lipOpen !== null && !this.speaking && !this.kana && (this.lipOpen = null), this.lipOpen !== null && (l.mouthOpen = Math.max(l.mouthOpen * 0.3, this.lipOpen), l.mouthForm = pe(this.lipForm, -1, 1)), this.P = l, l;
1721
1784
  }
1722
1785
  }
1723
- const At = {
1786
+ const St = {
1724
1787
  neutral: "normal",
1725
1788
  smile: "smile",
1726
1789
  shy: "shy",
@@ -1729,9 +1792,9 @@ const At = {
1729
1792
  angry: "angryTalk",
1730
1793
  sad: "sadTalk",
1731
1794
  wink: "wink"
1732
- }, Zn = { sad: { pitch: -6, gy: -0.45 } }, Fe = (n, e, t) => Math.max(e, Math.min(t, n)), Be = Object.freeze({ eyeOpen: 1, eyeOpenL: 1, eyeSmile: 0, eyeSmileL: 0, blush: 0, browY: 0, browAngle: 0, mouthOpen: 0, gx: 0, gy: 0, pitch: 0 });
1733
- function Wn(n) {
1734
- const e = qt[At[n]]?.p ?? {}, t = Zn[n] ?? {};
1795
+ }, Jn = { sad: { pitch: -6, gy: -0.45 } }, Ye = (n, e, t) => Math.max(e, Math.min(t, n)), Ie = Object.freeze({ eyeOpen: 1, eyeOpenL: 1, eyeSmile: 0, eyeSmileL: 0, blush: 0, browY: 0, browAngle: 0, mouthOpen: 0, gx: 0, gy: 0, pitch: 0 });
1796
+ function Kn(n) {
1797
+ const e = tn[St[n]]?.p ?? {}, t = Jn[n] ?? {};
1735
1798
  return {
1736
1799
  eyeOpen: e.eyeOpen ?? 1,
1737
1800
  eyeOpenL: e.eyeOpenL ?? e.eyeOpen ?? 1,
@@ -1746,168 +1809,170 @@ function Wn(n) {
1746
1809
  pitch: t.pitch ?? 0
1747
1810
  };
1748
1811
  }
1749
- function Gn(n, e) {
1812
+ function Qn(n, e) {
1750
1813
  const t = { ...n };
1751
- return t.eyeROpen = (n.eyeROpen ?? 1) * e.eyeOpen, t.eyeLOpen = (n.eyeLOpen ?? 1) * e.eyeOpenL, t.eyeSmile = Math.max(n.eyeSmile ?? 0, e.eyeSmile), t.eyeSmileL = Math.max(n.eyeSmileL ?? n.eyeSmile ?? 0, e.eyeSmileL), t.blush = Math.max(n.blush ?? 0, e.blush), t.browY = Fe((n.browY ?? 0) + e.browY, -1, 1), t.browAngle = Fe((n.browAngle ?? 0) + e.browAngle, -1, 1), t.mouthOpen = Math.max(n.mouthOpen ?? 0, e.mouthOpen), t.gazeX = Fe((n.gazeX ?? 0) + e.gx, -1, 1), t.gazeY = Fe((n.gazeY ?? 0) + e.gy, -1, 1), t.angleY = Fe((n.angleY ?? 0) + e.pitch, -30, 30), t;
1814
+ return t.eyeROpen = (n.eyeROpen ?? 1) * e.eyeOpen, t.eyeLOpen = (n.eyeLOpen ?? 1) * e.eyeOpenL, t.eyeSmile = Math.max(n.eyeSmile ?? 0, e.eyeSmile), t.eyeSmileL = Math.max(n.eyeSmileL ?? n.eyeSmile ?? 0, e.eyeSmileL), t.blush = Math.max(n.blush ?? 0, e.blush), t.browY = Ye((n.browY ?? 0) + e.browY, -1, 1), t.browAngle = Ye((n.browAngle ?? 0) + e.browAngle, -1, 1), t.mouthOpen = Math.max(n.mouthOpen ?? 0, e.mouthOpen), t.gazeX = Ye((n.gazeX ?? 0) + e.gx, -1, 1), t.gazeY = Ye((n.gazeY ?? 0) + e.gy, -1, 1), t.angleY = Ye((n.angleY ?? 0) + e.pitch, -30, 30), t;
1752
1815
  }
1753
- class Vn {
1816
+ class er {
1754
1817
  /** @type {keyof typeof OVERLAY_EXPRESSIONS} */
1755
1818
  name = "neutral";
1756
- mix = { ...Be };
1819
+ mix = { ...Ie };
1757
1820
  /** @param {string} name */
1758
1821
  set(e) {
1759
- this.name = Object.hasOwn(At, e) ? (
1822
+ this.name = Object.hasOwn(St, e) ? (
1760
1823
  /** @type {keyof typeof OVERLAY_EXPRESSIONS} */
1761
1824
  e
1762
1825
  ) : "neutral";
1763
1826
  }
1764
1827
  /** True while an expression is shown or still fading out. */
1765
1828
  get active() {
1766
- return this.name !== "neutral" || Object.keys(Be).some((e) => Math.abs(this.mix[e] - Be[e]) > 1e-3);
1829
+ return this.name !== "neutral" || Object.keys(Ie).some((e) => Math.abs(this.mix[e] - Ie[e]) > 1e-3);
1767
1830
  }
1768
1831
  apply(e, t) {
1769
1832
  if (!this.active)
1770
- return this.mix = { ...Be }, e;
1771
- const r = Wn(this.name), a = 1 - Math.exp(-Math.max(0, t) * 12);
1772
- for (const s of Object.keys(Be)) this.mix[s] += (r[s] - this.mix[s]) * a;
1773
- return Gn(e, this.mix);
1833
+ return this.mix = { ...Ie }, e;
1834
+ const r = Kn(this.name), a = 1 - Math.exp(-Math.max(0, t) * 12);
1835
+ for (const o of Object.keys(Ie)) this.mix[o] += (r[o] - this.mix[o]) * a;
1836
+ return Qn(e, this.mix);
1774
1837
  }
1775
1838
  }
1776
- const jt = ["ball", "low", "crease", "lash"], tt = /* @__PURE__ */ new Map(), nt = /* @__PURE__ */ new Map();
1777
- async function Ct(n) {
1778
- return nt.has(n) || nt.set(n, fetch(n).then((e) => {
1839
+ const Dt = ["ball", "low", "crease", "lash"], rt = /* @__PURE__ */ new Map(), at = /* @__PURE__ */ new Map();
1840
+ async function Ht(n) {
1841
+ return at.has(n) || at.set(n, fetch(n).then((e) => {
1779
1842
  if (!e.ok) throw new Error(`failed to load ${n}`);
1780
1843
  return e.json();
1781
- })), nt.get(n);
1844
+ })), at.get(n);
1782
1845
  }
1783
- function zt(n) {
1784
- if (tt.has(n)) return tt.get(n);
1846
+ function Zt(n) {
1847
+ if (rt.has(n)) return rt.get(n);
1785
1848
  const e = new Promise((t, r) => {
1786
1849
  const a = new Image();
1787
1850
  a.onload = () => t(a), a.onerror = () => r(new Error(`failed to load ${n}`)), a.src = n;
1788
1851
  });
1789
- return tt.set(n, e), e;
1852
+ return rt.set(n, e), e;
1790
1853
  }
1791
- function Jt(n, e) {
1854
+ function nn(n, e) {
1792
1855
  const t = document.createElement("canvas");
1793
1856
  t.width = n.width, t.height = n.height;
1794
1857
  const r = t.getContext("2d");
1795
1858
  r.drawImage(n, 0, 0);
1796
- const a = r.getImageData(0, 0, t.width, t.height).data, s = new Uint8Array(t.width * t.height);
1797
- for (let l = 0; l < s.length; l++) s[l] = a[l * 4 + e];
1798
- return s;
1859
+ const a = r.getImageData(0, 0, t.width, t.height).data, o = new Uint8Array(t.width * t.height);
1860
+ for (let i = 0; i < o.length; i++) o[i] = a[i * 4 + e];
1861
+ return o;
1799
1862
  }
1800
- const Ue = (n) => Jt(n, 3);
1801
- function qn(n, e) {
1802
- const [t, r] = n.t.pivot, a = n.dir, s = n.pts, l = (S, y, c) => {
1803
- const v = Math.min(1, Math.max(0, (c - S) / (y - S)));
1863
+ const Ne = (n) => nn(n, 3);
1864
+ function tr(n, e) {
1865
+ const [t, r] = n.t.pivot, a = n.dir, o = n.pts, i = (E, y, u) => {
1866
+ const v = Math.min(1, Math.max(0, (u - E) / (y - E)));
1804
1867
  return v * v * (3 - 2 * v);
1805
- }, m = Math.cos(n.phi[0]), b = Math.sin(n.phi[0]), d = Math.cos(n.phi[1]), p = Math.sin(n.phi[1]), i = e.rest, u = e.pos;
1806
- for (let S = 0; S < i.length; S += 2) {
1807
- const y = i[S] - t, c = i[S + 1] - r, v = y * a[0] + c * a[1], x = s[0][0] + y * m - c * b, o = s[0][1] + y * b + c * m, h = y - a[0] * n.L1, T = c - a[1] * n.L1, f = s[1][0] + h * d - T * p, w = s[1][1] + h * p + T * d, B = l(n.L1 * 0.55, n.L1 * 1.35, v);
1808
- u[S] = x + (f - x) * B, u[S + 1] = o + (w - o) * B;
1868
+ }, f = Math.cos(n.phi[0]), m = Math.sin(n.phi[0]), g = Math.cos(n.phi[1]), p = Math.sin(n.phi[1]), l = e.rest, h = e.pos;
1869
+ for (let E = 0; E < l.length; E += 2) {
1870
+ const y = l[E] - t, u = l[E + 1] - r, v = y * a[0] + u * a[1], x = o[0][0] + y * f - u * m, s = o[0][1] + y * m + u * f, c = y - a[0] * n.L1, T = u - a[1] * n.L1, d = o[1][0] + c * g - T * p, w = o[1][1] + c * p + T * g, F = i(n.L1 * 0.55, n.L1 * 1.35, v);
1871
+ h[E] = x + (d - x) * F, h[E + 1] = s + (w - s) * F;
1809
1872
  }
1810
1873
  }
1811
- async function Jn(n, e) {
1874
+ async function nr(n, e) {
1812
1875
  if (!e.assets && e.assetsBase === void 0)
1813
1876
  throw new Error("createMeshAvatar requires assets or assetsBase.");
1814
- const t = e.rig, r = dn(t), {
1877
+ const t = e.rig, r = bn(t), {
1815
1878
  IMG: a,
1816
- EYES: s,
1817
- baseWeights: l,
1818
- deformBase: m,
1819
- eyePartY: b,
1820
- eyePartAlpha: d,
1879
+ EYES: o,
1880
+ baseWeights: i,
1881
+ deformBase: f,
1882
+ eyePartY: m,
1883
+ eyePartAlpha: g,
1821
1884
  handWeights: p,
1822
- handFrame: i,
1823
- deformHand: u,
1824
- TASSELS: S
1825
- } = r, { Renderer: y, buildGrid: c } = Ln(r, t), { Physics: v } = kn(r, t), { createSprites: x } = _n(r, t), o = (e.assetsBase ?? "").replace(/\/?$/, "/"), h = (M, R) => {
1885
+ handFrame: l,
1886
+ deformHand: h,
1887
+ TASSELS: E
1888
+ } = r, { Renderer: y, buildGrid: u } = Bn(r, t), { Physics: v } = Un(r, t), { createSprites: x } = Yn(r, t), s = (e.assetsBase ?? "").replace(/\/?$/, "/"), c = (A, R) => {
1826
1889
  if (e.assets) {
1827
- if (!e.assets[M]) throw new Error(`Missing project asset: ${M}`);
1828
- return e.assets[M];
1829
- }
1830
- return `${o}${M}${R === void 0 ? "" : `?b=${R}`}`;
1831
- }, T = await Ct(h("layers.json")), f = ["base", ...t.hand ? ["hand"] : [], ...S.map((M) => M.name), ...[0, 1].flatMap((M) => jt.map((R) => `eye${M}_${R}`)), "hairmask"], w = Object.fromEntries(await Promise.all(f.map(async (M) => [M, await zt(h(`${M}.png`, T.build))]))), B = Jt(w.hairmask, 0), Y = (M, R) => B[Math.min(a.h - 1, Math.max(0, Math.round(R))) * a.w + Math.min(a.w - 1, Math.max(0, Math.round(M)))] / 255, I = new y(n, { padTop: e.padTop ?? t.view.padTop, padSide: e.padSide ?? t.view.padSide, fit: e.fit }), _ = { base: [0, 0, a.w, a.h], ...T.layers }, U = c(_.base, t.mesh.baseCell, Ue(w.base), w.base.width, t.mesh.fine), O = [];
1832
- for (let M = 0; M < U.rest.length / 2; M++) {
1833
- const R = U.rest[M * 2], W = U.rest[M * 2 + 1];
1834
- O.push(l(R, W, Y(R, W)));
1835
- }
1836
- I.addLayer("base", w.base, U, { face: !0 });
1837
- const C = [];
1838
- s.forEach((M, R) => {
1839
- for (const W of jt) {
1840
- const Q = `eye${R}_${W}`, ne = c(_[Q], W === "ball" ? t.mesh.eyeBallCell : t.mesh.eyeCell, Ue(w[Q]), w[Q].width), ee = [];
1841
- for (let oe = 0; oe < ne.rest.length / 2; oe++) ee.push(l(ne.rest[oe * 2], ne.rest[oe * 2 + 1], 0));
1842
- const he = I.addLayer(Q, w[Q], ne, { eyeBall: W === "ball" ? R : void 0 });
1843
- C.push({ e: M, eye: R, part: W, mesh: ne, W: ee, layer: he });
1890
+ if (!e.assets[A]) throw new Error(`Missing project asset: ${A}`);
1891
+ return e.assets[A];
1892
+ }
1893
+ return `${s}${A}${R === void 0 ? "" : `?b=${R}`}`;
1894
+ }, T = await Ht(c("layers.json")), d = ["base", ...t.hand ? ["hand"] : [], ...E.map((A) => A.name), ...[0, 1].flatMap((A) => Dt.map((R) => `eye${A}_${R}`)), "hairmask"], w = Object.fromEntries(await Promise.all(d.map(async (A) => [A, await Zt(c(`${A}.png`, T.build))]))), F = nn(w.hairmask, 0), Y = (A, R) => F[Math.min(a.h - 1, Math.max(0, Math.round(R))) * a.w + Math.min(a.w - 1, Math.max(0, Math.round(A)))] / 255, I = new y(n, { padTop: e.padTop ?? t.view.padTop, padSide: e.padSide ?? t.view.padSide, fit: e.fit }), _ = { base: [0, 0, a.w, a.h], ...T.layers }, B = u(_.base, t.mesh.baseCell, Ne(w.base), w.base.width, t.mesh.fine), O = [];
1895
+ for (let A = 0; A < B.rest.length / 2; A++) {
1896
+ const R = B.rest[A * 2], C = B.rest[A * 2 + 1];
1897
+ O.push(i(R, C, Y(R, C)));
1898
+ }
1899
+ I.addLayer("base", w.base, B, { face: !0 });
1900
+ const z = [];
1901
+ o.forEach((A, R) => {
1902
+ for (const C of Dt) {
1903
+ const Q = `eye${R}_${C}`, te = u(_[Q], C === "ball" ? t.mesh.eyeBallCell : t.mesh.eyeCell, Ne(w[Q]), w[Q].width), ne = [];
1904
+ for (let se = 0; se < te.rest.length / 2; se++) ne.push(i(te.rest[se * 2], te.rest[se * 2 + 1], 0));
1905
+ const ie = I.addLayer(Q, w[Q], te, { eyeBall: C === "ball" ? R : void 0 });
1906
+ z.push({ e: A, eye: R, part: C, mesh: te, W: ne, layer: ie });
1844
1907
  }
1845
1908
  });
1846
- let $ = null;
1909
+ let D = null;
1847
1910
  try {
1848
1911
  {
1849
- const M = await Ct(h("sprites/sprites.json")), R = Object.fromEntries(await Promise.all(Object.keys(M.layers).map(async (W) => [W, await zt(h(`sprites/${W}.png`, M.build))])));
1850
- $ = x(I, M, R, c, Ue);
1851
- }
1852
- } catch (M) {
1853
- console.warn("eye / mouth sprites not loaded:", M);
1854
- }
1855
- const V = S.map((M) => {
1856
- const R = c(_[M.name], t.mesh.tasselCell, Ue(w[M.name]), w[M.name].width);
1857
- return I.addLayer(M.name, w[M.name], R);
1858
- }), X = t.hand ? c(_.hand, t.mesh.handCell, Ue(w.hand), w.hand.width) : { rest: [], pos: [] }, D = [];
1859
- for (let M = 0; M < X.rest.length / 2; M++) D.push(p(X.rest[M * 2], X.rest[M * 2 + 1]));
1860
- t.hand && I.addLayer("hand", w.hand, X);
1861
- const H = new v(), L = new Hn(t.view.gazeCenter ?? [t.head.cx, t.head.cy]), Z = /* @__PURE__ */ new Set();
1862
- L.onMotion = (M) => {
1863
- for (const R of Z) R(M);
1912
+ const A = await Ht(c("sprites/sprites.json")), R = Object.fromEntries(await Promise.all(Object.keys(A.layers).map(async (C) => [C, await Zt(c(`sprites/${C}.png`, A.build))])));
1913
+ D = x(I, A, R, u, Ne);
1914
+ }
1915
+ } catch (A) {
1916
+ console.warn("eye / mouth sprites not loaded:", A);
1917
+ }
1918
+ const J = E.map((A) => {
1919
+ const R = u(_[A.name], t.mesh.tasselCell, Ne(w[A.name]), w[A.name].width);
1920
+ return I.addLayer(A.name, w[A.name], R);
1921
+ }), j = t.hand ? u(_.hand, t.mesh.handCell, Ne(w.hand), w.hand.width) : { rest: [], pos: [] }, H = [];
1922
+ for (let A = 0; A < j.rest.length / 2; A++) H.push(p(j.rest[A * 2], j.rest[A * 2 + 1]));
1923
+ t.hand && I.addLayer("hand", w.hand, j);
1924
+ const Z = new v(), $ = new qn(t.view.gazeCenter ?? [t.head.cx, t.head.cy]);
1925
+ e.lipSync !== void 0 && $.setLipSync(e.lipSync);
1926
+ const q = /* @__PURE__ */ new Set();
1927
+ $.onMotion = (A) => {
1928
+ for (const R of q) R(A);
1864
1929
  };
1865
- let P = {}, G = 1, J = {};
1866
- const q = new Vn(), g = [0, 0];
1867
- function A(M) {
1868
- const R = { ...L.update(M) };
1869
- for (const [Q, ne] of Object.entries(P)) R[Q] = G === 1 ? ne : (R[Q] ?? 0) + (ne - (R[Q] ?? 0)) * G;
1870
- L.lipOpen !== null && (R.mouthOpen = L.P.mouthOpen, (!e.preserveMouthForm || P.mouthForm === void 0) && (R.mouthForm = L.P.mouthForm));
1871
- const W = q.apply(R, M);
1872
- return J = W, W;
1873
- }
1874
- function E(M) {
1875
- const R = A(M), W = H.step(R, M), Q = U.pos, ne = U.rest;
1930
+ let W = {}, N = 1, G = {};
1931
+ const V = new er(), b = [0, 0];
1932
+ function M(A) {
1933
+ const R = { ...$.update(A) };
1934
+ for (const [Q, te] of Object.entries(W)) R[Q] = N === 1 ? te : (R[Q] ?? 0) + (te - (R[Q] ?? 0)) * N;
1935
+ $.lipOpen !== null && (R.mouthOpen = $.P.mouthOpen, (!e.preserveMouthForm || W.mouthForm === void 0) && (R.mouthForm = $.P.mouthForm));
1936
+ const C = V.apply(R, A);
1937
+ return G = C, C;
1938
+ }
1939
+ function S(A) {
1940
+ const R = M(A), C = Z.step(R, A), Q = B.pos, te = B.rest;
1876
1941
  for (let K = 0; K < O.length; K++)
1877
- m(ne[K * 2], ne[K * 2 + 1], O[K], R, W, g), Q[K * 2] = g[0], Q[K * 2 + 1] = g[1];
1878
- const ee = (K) => $ ? 1 : K;
1879
- for (const K of C) {
1880
- const Pe = ee(K.eye === 0 ? R.eyeROpen : R.eyeLOpen), Tt = K.eye === 0 ? R.eyeSmile : R.eyeSmileL ?? R.eyeSmile;
1881
- K.layer.alpha = d(K.part, Pe, Tt);
1882
- const Ot = K.mesh.rest, Rt = K.mesh.pos;
1883
- for (let Se = 0; Se < K.W.length; Se++) {
1884
- const Lt = Ot[Se * 2], mn = Ot[Se * 2 + 1];
1885
- m(Lt, b(K.e, K.part, Lt, mn, Pe, Tt), K.W[Se], R, W, g), Rt[Se * 2] = g[0], Rt[Se * 2 + 1] = g[1];
1942
+ f(te[K * 2], te[K * 2 + 1], O[K], R, C, b), Q[K * 2] = b[0], Q[K * 2 + 1] = b[1];
1943
+ const ne = (K, ke) => D?.eyesDrawn[ke] ? 1 : K;
1944
+ for (const K of z) {
1945
+ const ke = ne(K.eye === 0 ? R.eyeROpen : R.eyeLOpen, K.eye), Lt = K.eye === 0 ? R.eyeSmile : R.eyeSmileL ?? R.eyeSmile;
1946
+ K.layer.alpha = g(K.part, ke, Lt);
1947
+ const _t = K.mesh.rest, kt = K.mesh.pos;
1948
+ for (let Re = 0; Re < K.W.length; Re++) {
1949
+ const Ft = _t[Re * 2], yn = _t[Re * 2 + 1];
1950
+ f(Ft, m(K.e, K.part, Ft, yn, ke, Lt), K.W[Re], R, C, b), kt[Re * 2] = b[0], kt[Re * 2 + 1] = b[1];
1886
1951
  }
1887
1952
  }
1888
- const he = $?.update(R, W, M, Fn(q.name, L.mode === "manual" ? null : L.expr));
1889
- if (he) for (const K of C) he.eyes[K.eye] && (K.layer.alpha = 0);
1890
- const oe = X.pos, ke = X.rest, fn = i(R);
1891
- for (let K = 0; K < D.length; K++)
1892
- u(ke[K * 2], ke[K * 2 + 1], D[K], R, fn, g), oe[K * 2] = g[0], oe[K * 2 + 1] = g[1];
1893
- H.chains.forEach((K, Pe) => qn(K, V[Pe].mesh));
1894
- const ze = 7;
1953
+ const ie = D?.update(R, C, A, In(V.name, $.mode === "manual" ? null : $.expr));
1954
+ if (ie) for (const K of z) ie.eyes[K.eye] && (K.layer.alpha = 0);
1955
+ const se = j.pos, me = j.rest, He = l(R);
1956
+ for (let K = 0; K < H.length; K++)
1957
+ h(me[K * 2], me[K * 2 + 1], H[K], R, He, b), se[K * 2] = b[0], se[K * 2 + 1] = b[1];
1958
+ Z.chains.forEach((K, ke) => tr(K, J[ke].mesh));
1959
+ const we = 7;
1895
1960
  I.draw({
1896
1961
  angleX: R.angleX,
1897
1962
  angleY: R.angleY,
1898
1963
  angleZ: R.angleZ,
1899
1964
  eyes: [
1900
- ee(R.eyeROpen),
1965
+ ne(R.eyeROpen, 0),
1901
1966
  R.eyeSmile,
1902
- R.gazeX * ze,
1903
- -R.gazeY * ze * 0.6,
1904
- ee(R.eyeLOpen),
1967
+ R.gazeX * we,
1968
+ -R.gazeY * we * 0.6,
1969
+ ne(R.eyeLOpen, 1),
1905
1970
  R.eyeSmileL ?? R.eyeSmile,
1906
- R.gazeX * ze * 0.85,
1907
- -R.gazeY * ze * 0.6
1971
+ R.gazeX * we * 0.85,
1972
+ -R.gazeY * we * 0.6
1908
1973
  ],
1909
1974
  // with sprites the drawn mouths replace the shader-painted one
1910
- mouthOpen: $ ? 0 : R.mouthOpen,
1975
+ mouthOpen: ie?.mouthDrawn ? 0 : R.mouthOpen,
1911
1976
  mouthForm: R.mouthForm,
1912
1977
  cheek: R.blush,
1913
1978
  showMesh: !1,
@@ -1915,102 +1980,106 @@ async function Jn(n, e) {
1915
1980
  joints: []
1916
1981
  });
1917
1982
  }
1918
- let k = 0, N = performance.now(), z = !1;
1919
- const F = (M) => {
1920
- const R = Math.min(0.05, (M - N) / 1e3);
1921
- N = M, E(R), k = requestAnimationFrame(F);
1983
+ let L = 0, U = performance.now(), X = !1;
1984
+ const k = (A) => {
1985
+ const R = Math.min(0.05, (A - U) / 1e3);
1986
+ U = A, S(R), L = requestAnimationFrame(k);
1922
1987
  };
1923
- return e.manual || (k = requestAnimationFrame(F)), {
1988
+ return e.manual || (L = requestAnimationFrame(k)), {
1924
1989
  motions: [
1925
- ...Object.entries(xt).map(([M, R]) => ({ id: M, label: R.label, idle: !1 })),
1926
- ...Object.entries(wt).map(([M, R]) => ({ id: M, label: R.label, idle: !0 }))
1990
+ ...Object.entries(Mt).map(([A, R]) => ({ id: A, label: R.label, idle: !1 })),
1991
+ ...Object.entries(Et).map(([A, R]) => ({ id: A, label: R.label, idle: !0 }))
1927
1992
  ],
1928
- setParameters(M, R = 1) {
1929
- P = { ...M }, G = Math.min(1, Math.max(0, Number(R) || 0));
1993
+ setParameters(A, R = 1) {
1994
+ W = { ...A }, N = Math.min(1, Math.max(0, Number(R) || 0));
1930
1995
  },
1931
1996
  getParameters() {
1932
- return { ...J };
1997
+ return { ...G };
1933
1998
  },
1934
1999
  /** 0..1 loudness of the voice being played (e.g. normalised RMS). */
1935
- setVoiceLevel(M) {
1936
- L.setVoiceLevel(M);
2000
+ setVoiceLevel(A) {
2001
+ $.setVoiceLevel(A);
2002
+ },
2003
+ /** Partial mouth-movement settings; omitted fields retain their current values. */
2004
+ setLipSync(A) {
2005
+ $.setLipSync(A);
1937
2006
  },
1938
2007
  /** true while TTS audio is playing: idle motions pause and the head nods along. */
1939
- setSpeaking(M) {
1940
- L.setSpeaking(M);
2008
+ setSpeaking(A) {
2009
+ $.setSpeaking(A);
1941
2010
  },
1942
2011
  /** AITuber OnAir emotion tag: happy / sad / angry / surprised / relaxed / neutral (or null). */
1943
- setEmotion(M, R) {
1944
- L.setEmotion(M, R);
2012
+ setEmotion(A, R) {
2013
+ $.setEmotion(A, R);
1945
2014
  },
1946
2015
  /** Live expression layered over tracking (see OVERLAY_EXPRESSIONS); 'neutral' clears it. */
1947
- setExpression(M) {
1948
- q.set(M);
2016
+ setExpression(A) {
2017
+ V.set(A);
1949
2018
  },
1950
2019
  getExpression() {
1951
- return { name: q.name, active: q.active };
2020
+ return { name: V.name, active: V.active };
1952
2021
  },
1953
2022
  /** How much the head moves with the voice while speaking (1 = default, calmer below). */
1954
- setTalkGain(M) {
1955
- L.talkGain = Math.max(0, Number(M) || 0);
2023
+ setTalkGain(A) {
2024
+ $.talkGain = Math.max(0, Number(A) || 0);
1956
2025
  },
1957
2026
  /** Play a motion or idle motion by id (see `motions`). */
1958
- play(M) {
1959
- L.hasMotion(M) && L.playMotion(M);
2027
+ play(A) {
2028
+ $.hasMotion(A) && $.playMotion(A);
1960
2029
  },
1961
2030
  /** Move the mouth through the vowels of kana text (no audio; for previews). */
1962
- speakKana(M, R) {
1963
- L.speakKana(String(M ?? ""), R);
2031
+ speakKana(A, R) {
2032
+ $.speakKana(String(A ?? ""), R);
1964
2033
  },
1965
- holdMouth(M) {
1966
- L.holdMouth(M);
2034
+ holdMouth(A) {
2035
+ $.holdMouth(A);
1967
2036
  },
1968
2037
  stopLipSync() {
1969
- L.stopLipSync();
2038
+ $.stopLipSync();
1970
2039
  },
1971
2040
  getLipSyncState() {
1972
- return L.getLipSyncState();
2041
+ return $.getLipSyncState();
1973
2042
  },
1974
- setAutoIdle(M) {
1975
- L.autoIdle = !!M;
2043
+ setAutoIdle(A) {
2044
+ $.autoIdle = !!A;
1976
2045
  },
1977
- setLighting(M) {
1978
- I.setLighting(M);
2046
+ setLighting(A) {
2047
+ I.setLighting(A);
1979
2048
  },
1980
2049
  getLightingStats() {
1981
2050
  return { ...I.lightingStats };
1982
2051
  },
1983
- setAutoMotion(M) {
1984
- L.autoMotion = !!M;
2052
+ setAutoMotion(A) {
2053
+ $.autoMotion = !!A;
1985
2054
  },
1986
2055
  /** Hair / tassel sway multiplier (1 = default). */
1987
- setSwayGain(M) {
1988
- H.gain = M;
2056
+ setSwayGain(A) {
2057
+ Z.gain = A;
1989
2058
  },
1990
2059
  /** Called with the motion id when a motion starts and with null when it ends. */
1991
- onMotion(M) {
1992
- return Z.add(M), () => Z.delete(M);
2060
+ onMotion(A) {
2061
+ return q.add(A), () => q.delete(A);
1993
2062
  },
1994
2063
  /** Advance the simulation by `sec` and draw (for tests / hidden tabs). */
1995
- advance(M, R = 60) {
1996
- if (!z)
1997
- if (M === 0) E(0);
1998
- else for (let W = 0; W < Math.round(M * R); W++) E(1 / R);
2064
+ advance(A, R = 60) {
2065
+ if (!X)
2066
+ if (A === 0) S(0);
2067
+ else for (let C = 0; C < Math.round(A * R); C++) S(1 / R);
1999
2068
  },
2000
2069
  /** Update motion and lip sync without drawing a hidden preview. */
2001
- advanceParameters(M) {
2002
- z || A(M);
2070
+ advanceParameters(A) {
2071
+ X || M(A);
2003
2072
  },
2004
2073
  destroy() {
2005
- z || (z = !0, cancelAnimationFrame(k), Z.clear(), I.destroy());
2074
+ X || (X = !0, cancelAnimationFrame(L), q.clear(), I.destroy());
2006
2075
  }
2007
2076
  };
2008
2077
  }
2009
- const Tr = Object.keys(At);
2010
- async function Kn(n, e) {
2011
- return Jn(n, { ...e, rig: bt(e.rig) });
2078
+ const kr = Object.keys(St);
2079
+ async function rr(n, e) {
2080
+ return nr(n, { ...e, rig: wt(e.rig) });
2012
2081
  }
2013
- function Le(n) {
2082
+ function Be(n) {
2014
2083
  if (!n || typeof n != "object" || Array.isArray(n))
2015
2084
  throw new Error("avatar.json: expected an object");
2016
2085
  const e = n, t = [];
@@ -2022,115 +2091,121 @@ function Le(n) {
2022
2091
  const a = e.studio;
2023
2092
  !a || typeof a != "object" || Array.isArray(a) || !("version" in a) || typeof a.version != "string" || !a.version.trim() ? t.push("avatar.json.studio.version: expected a non-empty string") : r.studio = { version: a.version };
2024
2093
  }
2094
+ if (e.lipSync !== void 0)
2095
+ try {
2096
+ r.lipSync = At(e.lipSync);
2097
+ } catch (a) {
2098
+ t.push(`avatar.json.lipSync: ${a instanceof Error ? a.message : String(a)}`);
2099
+ }
2025
2100
  if (t.length) throw new Error(t.join(`
2026
2101
  `));
2027
2102
  return r;
2028
2103
  }
2029
- function Kt(n) {
2030
- return Le({ format: "mesh-avatar", version: 1, name: n });
2104
+ function rn(n) {
2105
+ return Be({ format: "mesh-avatar", version: 1, name: n });
2031
2106
  }
2032
- const rt = (n) => !!n && typeof n == "object" && !Array.isArray(n), Te = (n, e) => Array.isArray(n) && n.length === e && n.every((t) => typeof t == "number" && Number.isFinite(t)), at = (n, e) => Object.hasOwn(n, e);
2033
- function Qt(n) {
2107
+ const ot = (n) => !!n && typeof n == "object" && !Array.isArray(n), Le = (n, e) => Array.isArray(n) && n.length === e && n.every((t) => typeof t == "number" && Number.isFinite(t)), st = (n, e) => Object.hasOwn(n, e);
2108
+ function an(n) {
2034
2109
  const e = [];
2035
- function t(u, S = !0) {
2036
- if (!at(n, u)) {
2037
- S && e.push(`${u}: missing file`);
2110
+ function t(h, E = !0) {
2111
+ if (!st(n, h)) {
2112
+ E && e.push(`${h}: missing file`);
2038
2113
  return;
2039
2114
  }
2040
- const y = n[u];
2115
+ const y = n[h];
2041
2116
  if (!(y instanceof Uint8Array)) {
2042
- e.push(`${u}: JSON bytes are required`);
2117
+ e.push(`${h}: JSON bytes are required`);
2043
2118
  return;
2044
2119
  }
2045
- let c;
2120
+ let u;
2046
2121
  try {
2047
- c = JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(y));
2122
+ u = JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(y));
2048
2123
  } catch {
2049
- e.push(`${u}: invalid UTF-8 JSON`);
2124
+ e.push(`${h}: invalid UTF-8 JSON`);
2050
2125
  return;
2051
2126
  }
2052
- if (!rt(c)) {
2053
- e.push(`${u}: expected an object`);
2127
+ if (!ot(u)) {
2128
+ e.push(`${h}: expected an object`);
2054
2129
  return;
2055
2130
  }
2056
- return c;
2131
+ return u;
2057
2132
  }
2058
- function r(u, S, y = !0) {
2059
- return u.version === 1 || y && u.version === void 0 ? !0 : (e.push(`${S}.version: unsupported version ${JSON.stringify(u.version) ?? "missing"} (expected 1)`), !1);
2133
+ function r(h, E, y = !0) {
2134
+ return h.version === 1 || y && h.version === void 0 ? !0 : (e.push(`${E}.version: unsupported version ${JSON.stringify(h.version) ?? "missing"} (expected 1)`), !1);
2060
2135
  }
2061
- function a(u) {
2062
- if (!at(n, u)) {
2063
- e.push(`${u}: missing file`);
2136
+ function a(h) {
2137
+ if (!st(n, h)) {
2138
+ e.push(`${h}: missing file`);
2064
2139
  return;
2065
2140
  }
2066
- const S = n[u], y = S instanceof Uint8Array ? S.byteLength : S?.size;
2067
- (!Number.isSafeInteger(y) || y <= 0) && e.push(`${u}: expected a non-empty file`);
2141
+ const E = n[h], y = E instanceof Uint8Array ? E.byteLength : E?.size;
2142
+ (!Number.isSafeInteger(y) || y <= 0) && e.push(`${h}: expected a non-empty file`);
2068
2143
  }
2069
- function s(u, S, y, c) {
2070
- if (!rt(u)) {
2071
- e.push(`${S}.layers: expected a layer rectangle map`);
2144
+ function o(h, E, y, u) {
2145
+ if (!ot(h)) {
2146
+ e.push(`${E}.layers: expected a layer rectangle map`);
2072
2147
  return;
2073
2148
  }
2074
- for (const [v, x] of Object.entries(u)) {
2075
- const o = `${S}.layers.${v}`;
2149
+ for (const [v, x] of Object.entries(h)) {
2150
+ const s = `${E}.layers.${v}`;
2076
2151
  if (!/^[A-Za-z0-9_-]+$/.test(v)) {
2077
- e.push(`${o}: expected a safe layer name (letters, digits, hyphens or underscores)`);
2152
+ e.push(`${s}: expected a safe layer name (letters, digits, hyphens or underscores)`);
2078
2153
  continue;
2079
2154
  }
2080
- !Te(x, 4) || !x.every(Number.isInteger) || x[0] < 0 || x[1] < 0 || x[2] <= 0 || x[3] <= 0 ? e.push(`${o}: expected [x, y, width, height] with non-negative integer origins and positive integer dimensions`) : c && (x[0] + x[2] > c[0] || x[1] + x[3] > c[1]) && e.push(`${o}: rectangle must stay inside the image`), a(`${y}/${v}.png`);
2155
+ !Le(x, 4) || !x.every(Number.isInteger) || x[0] < 0 || x[1] < 0 || x[2] <= 0 || x[3] <= 0 ? e.push(`${s}: expected [x, y, width, height] with non-negative integer origins and positive integer dimensions`) : u && (x[0] + x[2] > u[0] || x[1] + x[3] > u[1]) && e.push(`${s}: rectangle must stay inside the image`), a(`${y}/${v}.png`);
2081
2156
  }
2082
- return u;
2157
+ return h;
2083
2158
  }
2084
- function l(u, S) {
2085
- (typeof u.build != "string" || !u.build.trim()) && e.push(`${S}.build: expected a non-empty string`);
2159
+ function i(h, E) {
2160
+ (typeof h.build != "string" || !h.build.trim()) && e.push(`${E}.build: expected a non-empty string`);
2086
2161
  }
2087
- const m = t("avatar.json", !1);
2088
- if (m)
2162
+ const f = t("avatar.json", !1);
2163
+ if (f)
2089
2164
  try {
2090
- Le(m);
2091
- } catch (u) {
2092
- e.push(u.message);
2165
+ Be(f);
2166
+ } catch (h) {
2167
+ e.push(h.message);
2093
2168
  }
2094
- const b = t("rig.json");
2095
- let d;
2096
- if (b && r(b, "rig.json", !1)) {
2097
- const u = Gt(b);
2098
- e.push(...u.map((S) => `rig.json: ${S}`)), u.length || (d = b);
2169
+ const m = t("rig.json");
2170
+ let g;
2171
+ if (m && r(m, "rig.json", !1)) {
2172
+ const h = Qt(m);
2173
+ e.push(...h.map((E) => `rig.json: ${E}`)), h.length || (g = m);
2099
2174
  }
2100
2175
  a("built/base.png"), a("built/hairmask.png");
2101
2176
  const p = t("built/layers.json");
2102
2177
  if (p && r(p, "built/layers.json")) {
2103
- l(p, "built/layers.json");
2104
- let u;
2105
- !Te(p.size, 2) || !p.size.every((y) => Number.isInteger(y) && y > 0) ? e.push("built/layers.json.size: expected [width, height] with positive integer dimensions") : (u = p.size, d && (u[0] !== d.image.width || u[1] !== d.image.height) && e.push("built/layers.json.size: must match rig.json.image"));
2106
- const S = s(p.layers, "built/layers.json", "built", u);
2107
- if (d && S) {
2178
+ i(p, "built/layers.json");
2179
+ let h;
2180
+ !Le(p.size, 2) || !p.size.every((y) => Number.isInteger(y) && y > 0) ? e.push("built/layers.json.size: expected [width, height] with positive integer dimensions") : (h = p.size, g && (h[0] !== g.image.width || h[1] !== g.image.height) && e.push("built/layers.json.size: must match rig.json.image"));
2181
+ const E = o(p.layers, "built/layers.json", "built", h);
2182
+ if (g && E) {
2108
2183
  const y = [
2109
- ...d.eyes.flatMap((c, v) => ["ball", "low", "crease", "lash"].map((x) => `eye${v}_${x}`)),
2110
- ...d.hand ? ["hand"] : [],
2111
- ...(d.accessories ?? []).map((c) => c.name)
2184
+ ...g.eyes.flatMap((u, v) => ["ball", "low", "crease", "lash"].map((x) => `eye${v}_${x}`)),
2185
+ ...g.hand ? ["hand"] : [],
2186
+ ...(g.accessories ?? []).map((u) => u.name)
2112
2187
  ];
2113
- for (const c of y) at(S, c) || e.push(`built/layers.json.layers.${c}: missing required layer`);
2188
+ for (const u of y) st(E, u) || e.push(`built/layers.json.layers.${u}: missing required layer`);
2114
2189
  }
2115
- !Array.isArray(p.eyes) || p.eyes.length !== 2 ? e.push("built/layers.json.eyes: expected two eye curves") : p.eyes.forEach((y, c) => {
2116
- const v = `built/layers.json.eyes[${c}]`;
2117
- if (!rt(y)) {
2190
+ !Array.isArray(p.eyes) || p.eyes.length !== 2 ? e.push("built/layers.json.eyes: expected two eye curves") : p.eyes.forEach((y, u) => {
2191
+ const v = `built/layers.json.eyes[${u}]`;
2192
+ if (!ot(y)) {
2118
2193
  e.push(`${v}: expected an object`);
2119
2194
  return;
2120
2195
  }
2121
- Te([y.x0, y.x1], 2) && y.x0 < y.x1 || e.push(`${v}: expected finite x0 < x1`);
2122
- for (const o of ["top", "bot"])
2123
- Te(y[o], 24) || e.push(`${v}.${o}: expected 24 finite numbers`);
2124
- if (Te(y.top, 24) && Te(y.bot, 24) && y.top.some((o, h) => o > y.bot[h]) && e.push(`${v}.top: must not exceed bottom curve`), d) for (const o of ["x0", "x1", "top", "bot"]) {
2125
- const h = y[o], T = d.eyes[c][o];
2126
- (Array.isArray(T) ? Te(h, T.length) && h.every((w, B) => w === T[B]) : h === T) || e.push(`${v}.${o}: must match rig.json.eyes[${c}].${o}`);
2196
+ Le([y.x0, y.x1], 2) && y.x0 < y.x1 || e.push(`${v}: expected finite x0 < x1`);
2197
+ for (const s of ["top", "bot"])
2198
+ Le(y[s], 24) || e.push(`${v}.${s}: expected 24 finite numbers`);
2199
+ if (Le(y.top, 24) && Le(y.bot, 24) && y.top.some((s, c) => s > y.bot[c]) && e.push(`${v}.top: must not exceed bottom curve`), g) for (const s of ["x0", "x1", "top", "bot"]) {
2200
+ const c = y[s], T = g.eyes[u][s];
2201
+ (Array.isArray(T) ? Le(c, T.length) && c.every((w, F) => w === T[F]) : c === T) || e.push(`${v}.${s}: must match rig.json.eyes[${u}].${s}`);
2127
2202
  }
2128
2203
  });
2129
2204
  }
2130
- const i = t("built/sprites/sprites.json", !1);
2131
- return i && r(i, "built/sprites/sprites.json") && (l(i, "built/sprites/sprites.json"), s(i.layers, "built/sprites/sprites.json", "built/sprites", d ? [d.image.width, d.image.height] : void 0)), e;
2205
+ const l = t("built/sprites/sprites.json", !1);
2206
+ return l && r(l, "built/sprites/sprites.json") && (i(l, "built/sprites/sprites.json"), o(l.layers, "built/sprites/sprites.json", "built/sprites", g ? [g.image.width, g.image.height] : void 0)), e;
2132
2207
  }
2133
- var ae = Uint8Array, ue = Uint16Array, Mt = Int32Array, qe = new ae([
2208
+ var ae = Uint8Array, ue = Uint16Array, Tt = Int32Array, Ke = new ae([
2134
2209
  0,
2135
2210
  0,
2136
2211
  0,
@@ -2165,7 +2240,7 @@ var ae = Uint8Array, ue = Uint16Array, Mt = Int32Array, qe = new ae([
2165
2240
  0,
2166
2241
  /* impossible */
2167
2242
  0
2168
- ]), Je = new ae([
2243
+ ]), Qe = new ae([
2169
2244
  0,
2170
2245
  0,
2171
2246
  0,
@@ -2199,65 +2274,65 @@ var ae = Uint8Array, ue = Uint16Array, Mt = Int32Array, qe = new ae([
2199
2274
  /* unused */
2200
2275
  0,
2201
2276
  0
2202
- ]), ct = new ae([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), en = function(n, e) {
2277
+ ]), ft = new ae([16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15]), on = function(n, e) {
2203
2278
  for (var t = new ue(31), r = 0; r < 31; ++r)
2204
2279
  t[r] = e += 1 << n[r - 1];
2205
- for (var a = new Mt(t[30]), r = 1; r < 30; ++r)
2206
- for (var s = t[r]; s < t[r + 1]; ++s)
2207
- a[s] = s - t[r] << 5 | r;
2280
+ for (var a = new Tt(t[30]), r = 1; r < 30; ++r)
2281
+ for (var o = t[r]; o < t[r + 1]; ++o)
2282
+ a[o] = o - t[r] << 5 | r;
2208
2283
  return { b: t, r: a };
2209
- }, tn = en(qe, 2), nn = tn.b, ut = tn.r;
2210
- nn[28] = 258, ut[258] = 28;
2211
- var rn = en(Je, 0), Qn = rn.b, Pt = rn.r, ft = new ue(32768);
2284
+ }, sn = on(Ke, 2), ln = sn.b, mt = sn.r;
2285
+ ln[28] = 258, mt[258] = 28;
2286
+ var cn = on(Qe, 0), ar = cn.b, Wt = cn.r, pt = new ue(32768);
2212
2287
  for (var re = 0; re < 32768; ++re) {
2213
- var Me = (re & 43690) >> 1 | (re & 21845) << 1;
2214
- Me = (Me & 52428) >> 2 | (Me & 13107) << 2, Me = (Me & 61680) >> 4 | (Me & 3855) << 4, ft[re] = ((Me & 65280) >> 8 | (Me & 255) << 8) >> 1;
2288
+ var Te = (re & 43690) >> 1 | (re & 21845) << 1;
2289
+ Te = (Te & 52428) >> 2 | (Te & 13107) << 2, Te = (Te & 61680) >> 4 | (Te & 3855) << 4, pt[re] = ((Te & 65280) >> 8 | (Te & 255) << 8) >> 1;
2215
2290
  }
2216
- var be = (function(n, e, t) {
2217
- for (var r = n.length, a = 0, s = new ue(e); a < r; ++a)
2218
- n[a] && ++s[n[a] - 1];
2219
- var l = new ue(e);
2291
+ var xe = (function(n, e, t) {
2292
+ for (var r = n.length, a = 0, o = new ue(e); a < r; ++a)
2293
+ n[a] && ++o[n[a] - 1];
2294
+ var i = new ue(e);
2220
2295
  for (a = 1; a < e; ++a)
2221
- l[a] = l[a - 1] + s[a - 1] << 1;
2222
- var m;
2296
+ i[a] = i[a - 1] + o[a - 1] << 1;
2297
+ var f;
2223
2298
  if (t) {
2224
- m = new ue(1 << e);
2225
- var b = 15 - e;
2299
+ f = new ue(1 << e);
2300
+ var m = 15 - e;
2226
2301
  for (a = 0; a < r; ++a)
2227
2302
  if (n[a])
2228
- for (var d = a << 4 | n[a], p = e - n[a], i = l[n[a] - 1]++ << p, u = i | (1 << p) - 1; i <= u; ++i)
2229
- m[ft[i] >> b] = d;
2303
+ for (var g = a << 4 | n[a], p = e - n[a], l = i[n[a] - 1]++ << p, h = l | (1 << p) - 1; l <= h; ++l)
2304
+ f[pt[l] >> m] = g;
2230
2305
  } else
2231
- for (m = new ue(r), a = 0; a < r; ++a)
2232
- n[a] && (m[a] = ft[l[n[a] - 1]++] >> 15 - n[a]);
2233
- return m;
2234
- }), Ee = new ae(288);
2306
+ for (f = new ue(r), a = 0; a < r; ++a)
2307
+ n[a] && (f[a] = pt[i[n[a] - 1]++] >> 15 - n[a]);
2308
+ return f;
2309
+ }), Oe = new ae(288);
2235
2310
  for (var re = 0; re < 144; ++re)
2236
- Ee[re] = 8;
2311
+ Oe[re] = 8;
2237
2312
  for (var re = 144; re < 256; ++re)
2238
- Ee[re] = 9;
2313
+ Oe[re] = 9;
2239
2314
  for (var re = 256; re < 280; ++re)
2240
- Ee[re] = 7;
2315
+ Oe[re] = 7;
2241
2316
  for (var re = 280; re < 288; ++re)
2242
- Ee[re] = 8;
2243
- var je = new ae(32);
2317
+ Oe[re] = 8;
2318
+ var Pe = new ae(32);
2244
2319
  for (var re = 0; re < 32; ++re)
2245
- je[re] = 5;
2246
- var er = /* @__PURE__ */ be(Ee, 9, 0), tr = /* @__PURE__ */ be(Ee, 9, 1), nr = /* @__PURE__ */ be(je, 5, 0), rr = /* @__PURE__ */ be(je, 5, 1), ot = function(n) {
2320
+ Pe[re] = 5;
2321
+ var or = /* @__PURE__ */ xe(Oe, 9, 0), sr = /* @__PURE__ */ xe(Oe, 9, 1), ir = /* @__PURE__ */ xe(Pe, 5, 0), lr = /* @__PURE__ */ xe(Pe, 5, 1), it = function(n) {
2247
2322
  for (var e = n[0], t = 1; t < n.length; ++t)
2248
2323
  n[t] > e && (e = n[t]);
2249
2324
  return e;
2250
- }, pe = function(n, e, t) {
2325
+ }, de = function(n, e, t) {
2251
2326
  var r = e / 8 | 0;
2252
2327
  return (n[r] | n[r + 1] << 8) >> (e & 7) & t;
2253
- }, st = function(n, e) {
2328
+ }, lt = function(n, e) {
2254
2329
  var t = e / 8 | 0;
2255
2330
  return (n[t] | n[t + 1] << 8 | n[t + 2] << 16) >> (e & 7);
2256
- }, Et = function(n) {
2331
+ }, Ot = function(n) {
2257
2332
  return (n + 7) / 8 | 0;
2258
- }, Ce = function(n, e, t) {
2333
+ }, De = function(n, e, t) {
2259
2334
  return (e == null || e < 0) && (e = 0), (t == null || t > n.length) && (t = n.length), new ae(n.subarray(e, t));
2260
- }, ar = [
2335
+ }, cr = [
2261
2336
  "unexpected EOF",
2262
2337
  "invalid block type",
2263
2338
  "invalid length/literal",
@@ -2274,562 +2349,562 @@ var er = /* @__PURE__ */ be(Ee, 9, 0), tr = /* @__PURE__ */ be(Ee, 9, 1), nr = /
2274
2349
  "stream finishing",
2275
2350
  "invalid zip data"
2276
2351
  // determined by unknown compression method
2277
- ], le = function(n, e, t) {
2278
- var r = new Error(e || ar[n]);
2279
- if (r.code = n, Error.captureStackTrace && Error.captureStackTrace(r, le), !t)
2352
+ ], ce = function(n, e, t) {
2353
+ var r = new Error(e || cr[n]);
2354
+ if (r.code = n, Error.captureStackTrace && Error.captureStackTrace(r, ce), !t)
2280
2355
  throw r;
2281
2356
  return r;
2282
- }, or = function(n, e, t, r) {
2283
- var a = n.length, s = r ? r.length : 0;
2357
+ }, hr = function(n, e, t, r) {
2358
+ var a = n.length, o = r ? r.length : 0;
2284
2359
  if (!a || e.f && !e.l)
2285
2360
  return t || new ae(0);
2286
- var l = !t, m = l || e.i != 2, b = e.i;
2287
- l && (t = new ae(a * 3));
2288
- var d = function(F) {
2289
- var j = t.length;
2290
- if (F > j) {
2291
- var M = new ae(Math.max(j * 2, F));
2292
- M.set(t), t = M;
2293
- }
2294
- }, p = e.f || 0, i = e.p || 0, u = e.b || 0, S = e.l, y = e.d, c = e.m, v = e.n, x = a * 8;
2361
+ var i = !t, f = i || e.i != 2, m = e.i;
2362
+ i && (t = new ae(a * 3));
2363
+ var g = function(k) {
2364
+ var P = t.length;
2365
+ if (k > P) {
2366
+ var A = new ae(Math.max(P * 2, k));
2367
+ A.set(t), t = A;
2368
+ }
2369
+ }, p = e.f || 0, l = e.p || 0, h = e.b || 0, E = e.l, y = e.d, u = e.m, v = e.n, x = a * 8;
2295
2370
  do {
2296
- if (!S) {
2297
- p = pe(n, i, 1);
2298
- var o = pe(n, i + 1, 3);
2299
- if (i += 3, o)
2300
- if (o == 1)
2301
- S = tr, y = rr, c = 9, v = 5;
2302
- else if (o == 2) {
2303
- var w = pe(n, i, 31) + 257, B = pe(n, i + 10, 15) + 4, Y = w + pe(n, i + 5, 31) + 1;
2304
- i += 14;
2305
- for (var I = new ae(Y), _ = new ae(19), U = 0; U < B; ++U)
2306
- _[ct[U]] = pe(n, i + U * 3, 7);
2307
- i += B * 3;
2308
- for (var O = ot(_), C = (1 << O) - 1, $ = be(_, O, 1), U = 0; U < Y; ) {
2309
- var V = $[pe(n, i, C)];
2310
- i += V & 15;
2311
- var h = V >> 4;
2312
- if (h < 16)
2313
- I[U++] = h;
2371
+ if (!E) {
2372
+ p = de(n, l, 1);
2373
+ var s = de(n, l + 1, 3);
2374
+ if (l += 3, s)
2375
+ if (s == 1)
2376
+ E = sr, y = lr, u = 9, v = 5;
2377
+ else if (s == 2) {
2378
+ var w = de(n, l, 31) + 257, F = de(n, l + 10, 15) + 4, Y = w + de(n, l + 5, 31) + 1;
2379
+ l += 14;
2380
+ for (var I = new ae(Y), _ = new ae(19), B = 0; B < F; ++B)
2381
+ _[ft[B]] = de(n, l + B * 3, 7);
2382
+ l += F * 3;
2383
+ for (var O = it(_), z = (1 << O) - 1, D = xe(_, O, 1), B = 0; B < Y; ) {
2384
+ var J = D[de(n, l, z)];
2385
+ l += J & 15;
2386
+ var c = J >> 4;
2387
+ if (c < 16)
2388
+ I[B++] = c;
2314
2389
  else {
2315
- var X = 0, D = 0;
2316
- for (h == 16 ? (D = 3 + pe(n, i, 3), i += 2, X = I[U - 1]) : h == 17 ? (D = 3 + pe(n, i, 7), i += 3) : h == 18 && (D = 11 + pe(n, i, 127), i += 7); D--; )
2317
- I[U++] = X;
2390
+ var j = 0, H = 0;
2391
+ for (c == 16 ? (H = 3 + de(n, l, 3), l += 2, j = I[B - 1]) : c == 17 ? (H = 3 + de(n, l, 7), l += 3) : c == 18 && (H = 11 + de(n, l, 127), l += 7); H--; )
2392
+ I[B++] = j;
2318
2393
  }
2319
2394
  }
2320
- var H = I.subarray(0, w), L = I.subarray(w);
2321
- c = ot(H), v = ot(L), S = be(H, c, 1), y = be(L, v, 1);
2395
+ var Z = I.subarray(0, w), $ = I.subarray(w);
2396
+ u = it(Z), v = it($), E = xe(Z, u, 1), y = xe($, v, 1);
2322
2397
  } else
2323
- le(1);
2398
+ ce(1);
2324
2399
  else {
2325
- var h = Et(i) + 4, T = n[h - 4] | n[h - 3] << 8, f = h + T;
2326
- if (f > a) {
2327
- b && le(0);
2400
+ var c = Ot(l) + 4, T = n[c - 4] | n[c - 3] << 8, d = c + T;
2401
+ if (d > a) {
2402
+ m && ce(0);
2328
2403
  break;
2329
2404
  }
2330
- m && d(u + T), t.set(n.subarray(h, f), u), e.b = u += T, e.p = i = f * 8, e.f = p;
2405
+ f && g(h + T), t.set(n.subarray(c, d), h), e.b = h += T, e.p = l = d * 8, e.f = p;
2331
2406
  continue;
2332
2407
  }
2333
- if (i > x) {
2334
- b && le(0);
2408
+ if (l > x) {
2409
+ m && ce(0);
2335
2410
  break;
2336
2411
  }
2337
2412
  }
2338
- m && d(u + 131072);
2339
- for (var Z = (1 << c) - 1, P = (1 << v) - 1, G = i; ; G = i) {
2340
- var X = S[st(n, i) & Z], J = X >> 4;
2341
- if (i += X & 15, i > x) {
2342
- b && le(0);
2413
+ f && g(h + 131072);
2414
+ for (var q = (1 << u) - 1, W = (1 << v) - 1, N = l; ; N = l) {
2415
+ var j = E[lt(n, l) & q], G = j >> 4;
2416
+ if (l += j & 15, l > x) {
2417
+ m && ce(0);
2343
2418
  break;
2344
2419
  }
2345
- if (X || le(2), J < 256)
2346
- t[u++] = J;
2347
- else if (J == 256) {
2348
- G = i, S = null;
2420
+ if (j || ce(2), G < 256)
2421
+ t[h++] = G;
2422
+ else if (G == 256) {
2423
+ N = l, E = null;
2349
2424
  break;
2350
2425
  } else {
2351
- var q = J - 254;
2352
- if (J > 264) {
2353
- var U = J - 257, g = qe[U];
2354
- q = pe(n, i, (1 << g) - 1) + nn[U], i += g;
2426
+ var V = G - 254;
2427
+ if (G > 264) {
2428
+ var B = G - 257, b = Ke[B];
2429
+ V = de(n, l, (1 << b) - 1) + ln[B], l += b;
2355
2430
  }
2356
- var A = y[st(n, i) & P], E = A >> 4;
2357
- A || le(3), i += A & 15;
2358
- var L = Qn[E];
2359
- if (E > 3) {
2360
- var g = Je[E];
2361
- L += st(n, i) & (1 << g) - 1, i += g;
2431
+ var M = y[lt(n, l) & W], S = M >> 4;
2432
+ M || ce(3), l += M & 15;
2433
+ var $ = ar[S];
2434
+ if (S > 3) {
2435
+ var b = Qe[S];
2436
+ $ += lt(n, l) & (1 << b) - 1, l += b;
2362
2437
  }
2363
- if (i > x) {
2364
- b && le(0);
2438
+ if (l > x) {
2439
+ m && ce(0);
2365
2440
  break;
2366
2441
  }
2367
- m && d(u + 131072);
2368
- var k = u + q;
2369
- if (u < L) {
2370
- var N = s - L, z = Math.min(L, k);
2371
- for (N + u < 0 && le(3); u < z; ++u)
2372
- t[u] = r[N + u];
2442
+ f && g(h + 131072);
2443
+ var L = h + V;
2444
+ if (h < $) {
2445
+ var U = o - $, X = Math.min($, L);
2446
+ for (U + h < 0 && ce(3); h < X; ++h)
2447
+ t[h] = r[U + h];
2373
2448
  }
2374
- for (; u < k; ++u)
2375
- t[u] = t[u - L];
2449
+ for (; h < L; ++h)
2450
+ t[h] = t[h - $];
2376
2451
  }
2377
2452
  }
2378
- e.l = S, e.p = G, e.b = u, e.f = p, S && (p = 1, e.m = c, e.d = y, e.n = v);
2453
+ e.l = E, e.p = N, e.b = h, e.f = p, E && (p = 1, e.m = u, e.d = y, e.n = v);
2379
2454
  } while (!p);
2380
- return u != t.length && l ? Ce(t, 0, u) : t.subarray(0, u);
2381
- }, Ae = function(n, e, t) {
2455
+ return h != t.length && i ? De(t, 0, h) : t.subarray(0, h);
2456
+ }, Ee = function(n, e, t) {
2382
2457
  t <<= e & 7;
2383
2458
  var r = e / 8 | 0;
2384
2459
  n[r] |= t, n[r + 1] |= t >> 8;
2385
- }, Ye = function(n, e, t) {
2460
+ }, je = function(n, e, t) {
2386
2461
  t <<= e & 7;
2387
2462
  var r = e / 8 | 0;
2388
2463
  n[r] |= t, n[r + 1] |= t >> 8, n[r + 2] |= t >> 16;
2389
- }, it = function(n, e) {
2464
+ }, ct = function(n, e) {
2390
2465
  for (var t = [], r = 0; r < n.length; ++r)
2391
2466
  n[r] && t.push({ s: r, f: n[r] });
2392
- var a = t.length, s = t.slice();
2467
+ var a = t.length, o = t.slice();
2393
2468
  if (!a)
2394
- return { t: on, l: 0 };
2469
+ return { t: un, l: 0 };
2395
2470
  if (a == 1) {
2396
- var l = new ae(t[0].s + 1);
2397
- return l[t[0].s] = 1, { t: l, l: 1 };
2471
+ var i = new ae(t[0].s + 1);
2472
+ return i[t[0].s] = 1, { t: i, l: 1 };
2398
2473
  }
2399
- t.sort(function(f, w) {
2400
- return f.f - w.f;
2474
+ t.sort(function(d, w) {
2475
+ return d.f - w.f;
2401
2476
  }), t.push({ s: -1, f: 25001 });
2402
- var m = t[0], b = t[1], d = 0, p = 1, i = 2;
2403
- for (t[0] = { s: -1, f: m.f + b.f, l: m, r: b }; p != a - 1; )
2404
- m = t[t[d].f < t[i].f ? d++ : i++], b = t[d != p && t[d].f < t[i].f ? d++ : i++], t[p++] = { s: -1, f: m.f + b.f, l: m, r: b };
2405
- for (var u = s[0].s, r = 1; r < a; ++r)
2406
- s[r].s > u && (u = s[r].s);
2407
- var S = new ue(u + 1), y = mt(t[p - 1], S, 0);
2477
+ var f = t[0], m = t[1], g = 0, p = 1, l = 2;
2478
+ for (t[0] = { s: -1, f: f.f + m.f, l: f, r: m }; p != a - 1; )
2479
+ f = t[t[g].f < t[l].f ? g++ : l++], m = t[g != p && t[g].f < t[l].f ? g++ : l++], t[p++] = { s: -1, f: f.f + m.f, l: f, r: m };
2480
+ for (var h = o[0].s, r = 1; r < a; ++r)
2481
+ o[r].s > h && (h = o[r].s);
2482
+ var E = new ue(h + 1), y = dt(t[p - 1], E, 0);
2408
2483
  if (y > e) {
2409
- var r = 0, c = 0, v = y - e, x = 1 << v;
2410
- for (s.sort(function(w, B) {
2411
- return S[B.s] - S[w.s] || w.f - B.f;
2484
+ var r = 0, u = 0, v = y - e, x = 1 << v;
2485
+ for (o.sort(function(w, F) {
2486
+ return E[F.s] - E[w.s] || w.f - F.f;
2412
2487
  }); r < a; ++r) {
2413
- var o = s[r].s;
2414
- if (S[o] > e)
2415
- c += x - (1 << y - S[o]), S[o] = e;
2488
+ var s = o[r].s;
2489
+ if (E[s] > e)
2490
+ u += x - (1 << y - E[s]), E[s] = e;
2416
2491
  else
2417
2492
  break;
2418
2493
  }
2419
- for (c >>= v; c > 0; ) {
2420
- var h = s[r].s;
2421
- S[h] < e ? c -= 1 << e - S[h]++ - 1 : ++r;
2494
+ for (u >>= v; u > 0; ) {
2495
+ var c = o[r].s;
2496
+ E[c] < e ? u -= 1 << e - E[c]++ - 1 : ++r;
2422
2497
  }
2423
- for (; r >= 0 && c; --r) {
2424
- var T = s[r].s;
2425
- S[T] == e && (--S[T], ++c);
2498
+ for (; r >= 0 && u; --r) {
2499
+ var T = o[r].s;
2500
+ E[T] == e && (--E[T], ++u);
2426
2501
  }
2427
2502
  y = e;
2428
2503
  }
2429
- return { t: new ae(S), l: y };
2430
- }, mt = function(n, e, t) {
2431
- return n.s == -1 ? Math.max(mt(n.l, e, t + 1), mt(n.r, e, t + 1)) : e[n.s] = t;
2432
- }, $t = function(n) {
2504
+ return { t: new ae(E), l: y };
2505
+ }, dt = function(n, e, t) {
2506
+ return n.s == -1 ? Math.max(dt(n.l, e, t + 1), dt(n.r, e, t + 1)) : e[n.s] = t;
2507
+ }, Gt = function(n) {
2433
2508
  for (var e = n.length; e && !n[--e]; )
2434
2509
  ;
2435
- for (var t = new ue(++e), r = 0, a = n[0], s = 1, l = function(b) {
2436
- t[r++] = b;
2437
- }, m = 1; m <= e; ++m)
2438
- if (n[m] == a && m != e)
2439
- ++s;
2510
+ for (var t = new ue(++e), r = 0, a = n[0], o = 1, i = function(m) {
2511
+ t[r++] = m;
2512
+ }, f = 1; f <= e; ++f)
2513
+ if (n[f] == a && f != e)
2514
+ ++o;
2440
2515
  else {
2441
- if (!a && s > 2) {
2442
- for (; s > 138; s -= 138)
2443
- l(32754);
2444
- s > 2 && (l(s > 10 ? s - 11 << 5 | 28690 : s - 3 << 5 | 12305), s = 0);
2445
- } else if (s > 3) {
2446
- for (l(a), --s; s > 6; s -= 6)
2447
- l(8304);
2448
- s > 2 && (l(s - 3 << 5 | 8208), s = 0);
2516
+ if (!a && o > 2) {
2517
+ for (; o > 138; o -= 138)
2518
+ i(32754);
2519
+ o > 2 && (i(o > 10 ? o - 11 << 5 | 28690 : o - 3 << 5 | 12305), o = 0);
2520
+ } else if (o > 3) {
2521
+ for (i(a), --o; o > 6; o -= 6)
2522
+ i(8304);
2523
+ o > 2 && (i(o - 3 << 5 | 8208), o = 0);
2449
2524
  }
2450
- for (; s--; )
2451
- l(a);
2452
- s = 1, a = n[m];
2525
+ for (; o--; )
2526
+ i(a);
2527
+ o = 1, a = n[f];
2453
2528
  }
2454
2529
  return { c: t.subarray(0, r), n: e };
2455
- }, Ie = function(n, e) {
2530
+ }, Xe = function(n, e) {
2456
2531
  for (var t = 0, r = 0; r < e.length; ++r)
2457
2532
  t += n[r] * e[r];
2458
2533
  return t;
2459
- }, an = function(n, e, t) {
2460
- var r = t.length, a = Et(e + 2);
2534
+ }, hn = function(n, e, t) {
2535
+ var r = t.length, a = Ot(e + 2);
2461
2536
  n[a] = r & 255, n[a + 1] = r >> 8, n[a + 2] = n[a] ^ 255, n[a + 3] = n[a + 1] ^ 255;
2462
- for (var s = 0; s < r; ++s)
2463
- n[a + s + 4] = t[s];
2537
+ for (var o = 0; o < r; ++o)
2538
+ n[a + o + 4] = t[o];
2464
2539
  return (a + 4 + r) * 8;
2465
- }, Dt = function(n, e, t, r, a, s, l, m, b, d, p) {
2466
- Ae(e, p++, t), ++a[256];
2467
- for (var i = it(a, 15), u = i.t, S = i.l, y = it(s, 15), c = y.t, v = y.l, x = $t(u), o = x.c, h = x.n, T = $t(c), f = T.c, w = T.n, B = new ue(19), Y = 0; Y < o.length; ++Y)
2468
- ++B[o[Y] & 31];
2469
- for (var Y = 0; Y < f.length; ++Y)
2470
- ++B[f[Y] & 31];
2471
- for (var I = it(B, 7), _ = I.t, U = I.l, O = 19; O > 4 && !_[ct[O - 1]]; --O)
2540
+ }, Vt = function(n, e, t, r, a, o, i, f, m, g, p) {
2541
+ Ee(e, p++, t), ++a[256];
2542
+ for (var l = ct(a, 15), h = l.t, E = l.l, y = ct(o, 15), u = y.t, v = y.l, x = Gt(h), s = x.c, c = x.n, T = Gt(u), d = T.c, w = T.n, F = new ue(19), Y = 0; Y < s.length; ++Y)
2543
+ ++F[s[Y] & 31];
2544
+ for (var Y = 0; Y < d.length; ++Y)
2545
+ ++F[d[Y] & 31];
2546
+ for (var I = ct(F, 7), _ = I.t, B = I.l, O = 19; O > 4 && !_[ft[O - 1]]; --O)
2472
2547
  ;
2473
- var C = d + 5 << 3, $ = Ie(a, Ee) + Ie(s, je) + l, V = Ie(a, u) + Ie(s, c) + l + 14 + 3 * O + Ie(B, _) + 2 * B[16] + 3 * B[17] + 7 * B[18];
2474
- if (b >= 0 && C <= $ && C <= V)
2475
- return an(e, p, n.subarray(b, b + d));
2476
- var X, D, H, L;
2477
- if (Ae(e, p, 1 + (V < $)), p += 2, V < $) {
2478
- X = be(u, S, 0), D = u, H = be(c, v, 0), L = c;
2479
- var Z = be(_, U, 0);
2480
- Ae(e, p, h - 257), Ae(e, p + 5, w - 1), Ae(e, p + 10, O - 4), p += 14;
2548
+ var z = g + 5 << 3, D = Xe(a, Oe) + Xe(o, Pe) + i, J = Xe(a, h) + Xe(o, u) + i + 14 + 3 * O + Xe(F, _) + 2 * F[16] + 3 * F[17] + 7 * F[18];
2549
+ if (m >= 0 && z <= D && z <= J)
2550
+ return hn(e, p, n.subarray(m, m + g));
2551
+ var j, H, Z, $;
2552
+ if (Ee(e, p, 1 + (J < D)), p += 2, J < D) {
2553
+ j = xe(h, E, 0), H = h, Z = xe(u, v, 0), $ = u;
2554
+ var q = xe(_, B, 0);
2555
+ Ee(e, p, c - 257), Ee(e, p + 5, w - 1), Ee(e, p + 10, O - 4), p += 14;
2481
2556
  for (var Y = 0; Y < O; ++Y)
2482
- Ae(e, p + 3 * Y, _[ct[Y]]);
2557
+ Ee(e, p + 3 * Y, _[ft[Y]]);
2483
2558
  p += 3 * O;
2484
- for (var P = [o, f], G = 0; G < 2; ++G)
2485
- for (var J = P[G], Y = 0; Y < J.length; ++Y) {
2486
- var q = J[Y] & 31;
2487
- Ae(e, p, Z[q]), p += _[q], q > 15 && (Ae(e, p, J[Y] >> 5 & 127), p += J[Y] >> 12);
2559
+ for (var W = [s, d], N = 0; N < 2; ++N)
2560
+ for (var G = W[N], Y = 0; Y < G.length; ++Y) {
2561
+ var V = G[Y] & 31;
2562
+ Ee(e, p, q[V]), p += _[V], V > 15 && (Ee(e, p, G[Y] >> 5 & 127), p += G[Y] >> 12);
2488
2563
  }
2489
2564
  } else
2490
- X = er, D = Ee, H = nr, L = je;
2491
- for (var Y = 0; Y < m; ++Y) {
2492
- var g = r[Y];
2493
- if (g > 255) {
2494
- var q = g >> 18 & 31;
2495
- Ye(e, p, X[q + 257]), p += D[q + 257], q > 7 && (Ae(e, p, g >> 23 & 31), p += qe[q]);
2496
- var A = g & 31;
2497
- Ye(e, p, H[A]), p += L[A], A > 3 && (Ye(e, p, g >> 5 & 8191), p += Je[A]);
2565
+ j = or, H = Oe, Z = ir, $ = Pe;
2566
+ for (var Y = 0; Y < f; ++Y) {
2567
+ var b = r[Y];
2568
+ if (b > 255) {
2569
+ var V = b >> 18 & 31;
2570
+ je(e, p, j[V + 257]), p += H[V + 257], V > 7 && (Ee(e, p, b >> 23 & 31), p += Ke[V]);
2571
+ var M = b & 31;
2572
+ je(e, p, Z[M]), p += $[M], M > 3 && (je(e, p, b >> 5 & 8191), p += Qe[M]);
2498
2573
  } else
2499
- Ye(e, p, X[g]), p += D[g];
2574
+ je(e, p, j[b]), p += H[b];
2500
2575
  }
2501
- return Ye(e, p, X[256]), p + D[256];
2502
- }, sr = /* @__PURE__ */ new Mt([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]), on = /* @__PURE__ */ new ae(0), ir = function(n, e, t, r, a, s) {
2503
- var l = s.z || n.length, m = new ae(r + l + 5 * (1 + Math.ceil(l / 7e3)) + a), b = m.subarray(r, m.length - a), d = s.l, p = (s.r || 0) & 7;
2576
+ return je(e, p, j[256]), p + H[256];
2577
+ }, ur = /* @__PURE__ */ new Tt([65540, 131080, 131088, 131104, 262176, 1048704, 1048832, 2114560, 2117632]), un = /* @__PURE__ */ new ae(0), fr = function(n, e, t, r, a, o) {
2578
+ var i = o.z || n.length, f = new ae(r + i + 5 * (1 + Math.ceil(i / 7e3)) + a), m = f.subarray(r, f.length - a), g = o.l, p = (o.r || 0) & 7;
2504
2579
  if (e) {
2505
- p && (b[0] = s.r >> 3);
2506
- for (var i = sr[e - 1], u = i >> 13, S = i & 8191, y = (1 << t) - 1, c = s.p || new ue(32768), v = s.h || new ue(y + 1), x = Math.ceil(t / 3), o = 2 * x, h = function(R) {
2507
- return (n[R] ^ n[R + 1] << x ^ n[R + 2] << o) & y;
2508
- }, T = new Mt(25e3), f = new ue(288), w = new ue(32), B = 0, Y = 0, I = s.i || 0, _ = 0, U = s.w || 0, O = 0; I + 2 < l; ++I) {
2509
- var C = h(I), $ = I & 32767, V = v[C];
2510
- if (c[$] = V, v[C] = $, U <= I) {
2511
- var X = l - I;
2512
- if ((B > 7e3 || _ > 24576) && (X > 423 || !d)) {
2513
- p = Dt(n, b, 0, T, f, w, Y, _, O, I - O, p), _ = B = Y = 0, O = I;
2514
- for (var D = 0; D < 286; ++D)
2515
- f[D] = 0;
2516
- for (var D = 0; D < 30; ++D)
2517
- w[D] = 0;
2580
+ p && (m[0] = o.r >> 3);
2581
+ for (var l = ur[e - 1], h = l >> 13, E = l & 8191, y = (1 << t) - 1, u = o.p || new ue(32768), v = o.h || new ue(y + 1), x = Math.ceil(t / 3), s = 2 * x, c = function(R) {
2582
+ return (n[R] ^ n[R + 1] << x ^ n[R + 2] << s) & y;
2583
+ }, T = new Tt(25e3), d = new ue(288), w = new ue(32), F = 0, Y = 0, I = o.i || 0, _ = 0, B = o.w || 0, O = 0; I + 2 < i; ++I) {
2584
+ var z = c(I), D = I & 32767, J = v[z];
2585
+ if (u[D] = J, v[z] = D, B <= I) {
2586
+ var j = i - I;
2587
+ if ((F > 7e3 || _ > 24576) && (j > 423 || !g)) {
2588
+ p = Vt(n, m, 0, T, d, w, Y, _, O, I - O, p), _ = F = Y = 0, O = I;
2589
+ for (var H = 0; H < 286; ++H)
2590
+ d[H] = 0;
2591
+ for (var H = 0; H < 30; ++H)
2592
+ w[H] = 0;
2518
2593
  }
2519
- var H = 2, L = 0, Z = S, P = $ - V & 32767;
2520
- if (X > 2 && C == h(I - P))
2521
- for (var G = Math.min(u, X) - 1, J = Math.min(32767, I), q = Math.min(258, X); P <= J && --Z && $ != V; ) {
2522
- if (n[I + H] == n[I + H - P]) {
2523
- for (var g = 0; g < q && n[I + g] == n[I + g - P]; ++g)
2594
+ var Z = 2, $ = 0, q = E, W = D - J & 32767;
2595
+ if (j > 2 && z == c(I - W))
2596
+ for (var N = Math.min(h, j) - 1, G = Math.min(32767, I), V = Math.min(258, j); W <= G && --q && D != J; ) {
2597
+ if (n[I + Z] == n[I + Z - W]) {
2598
+ for (var b = 0; b < V && n[I + b] == n[I + b - W]; ++b)
2524
2599
  ;
2525
- if (g > H) {
2526
- if (H = g, L = P, g > G)
2600
+ if (b > Z) {
2601
+ if (Z = b, $ = W, b > N)
2527
2602
  break;
2528
- for (var A = Math.min(P, g - 2), E = 0, D = 0; D < A; ++D) {
2529
- var k = I - P + D & 32767, N = c[k], z = k - N & 32767;
2530
- z > E && (E = z, V = k);
2603
+ for (var M = Math.min(W, b - 2), S = 0, H = 0; H < M; ++H) {
2604
+ var L = I - W + H & 32767, U = u[L], X = L - U & 32767;
2605
+ X > S && (S = X, J = L);
2531
2606
  }
2532
2607
  }
2533
2608
  }
2534
- $ = V, V = c[$], P += $ - V & 32767;
2609
+ D = J, J = u[D], W += D - J & 32767;
2535
2610
  }
2536
- if (L) {
2537
- T[_++] = 268435456 | ut[H] << 18 | Pt[L];
2538
- var F = ut[H] & 31, j = Pt[L] & 31;
2539
- Y += qe[F] + Je[j], ++f[257 + F], ++w[j], U = I + H, ++B;
2611
+ if ($) {
2612
+ T[_++] = 268435456 | mt[Z] << 18 | Wt[$];
2613
+ var k = mt[Z] & 31, P = Wt[$] & 31;
2614
+ Y += Ke[k] + Qe[P], ++d[257 + k], ++w[P], B = I + Z, ++F;
2540
2615
  } else
2541
- T[_++] = n[I], ++f[n[I]];
2616
+ T[_++] = n[I], ++d[n[I]];
2542
2617
  }
2543
2618
  }
2544
- for (I = Math.max(I, U); I < l; ++I)
2545
- T[_++] = n[I], ++f[n[I]];
2546
- p = Dt(n, b, d, T, f, w, Y, _, O, I - O, p), d || (s.r = p & 7 | b[p / 8 | 0] << 3, p -= 7, s.h = v, s.p = c, s.i = I, s.w = U);
2619
+ for (I = Math.max(I, B); I < i; ++I)
2620
+ T[_++] = n[I], ++d[n[I]];
2621
+ p = Vt(n, m, g, T, d, w, Y, _, O, I - O, p), g || (o.r = p & 7 | m[p / 8 | 0] << 3, p -= 7, o.h = v, o.p = u, o.i = I, o.w = B);
2547
2622
  } else {
2548
- for (var I = s.w || 0; I < l + d; I += 65535) {
2549
- var M = I + 65535;
2550
- M >= l && (b[p / 8 | 0] = d, M = l), p = an(b, p + 1, n.subarray(I, M));
2623
+ for (var I = o.w || 0; I < i + g; I += 65535) {
2624
+ var A = I + 65535;
2625
+ A >= i && (m[p / 8 | 0] = g, A = i), p = hn(m, p + 1, n.subarray(I, A));
2551
2626
  }
2552
- s.i = l;
2627
+ o.i = i;
2553
2628
  }
2554
- return Ce(m, 0, r + Et(p) + a);
2555
- }, lr = /* @__PURE__ */ (function() {
2629
+ return De(f, 0, r + Ot(p) + a);
2630
+ }, mr = /* @__PURE__ */ (function() {
2556
2631
  for (var n = new Int32Array(256), e = 0; e < 256; ++e) {
2557
2632
  for (var t = e, r = 9; --r; )
2558
2633
  t = (t & 1 && -306674912) ^ t >>> 1;
2559
2634
  n[e] = t;
2560
2635
  }
2561
2636
  return n;
2562
- })(), hr = function() {
2637
+ })(), pr = function() {
2563
2638
  var n = -1;
2564
2639
  return {
2565
2640
  p: function(e) {
2566
2641
  for (var t = n, r = 0; r < e.length; ++r)
2567
- t = lr[t & 255 ^ e[r]] ^ t >>> 8;
2642
+ t = mr[t & 255 ^ e[r]] ^ t >>> 8;
2568
2643
  n = t;
2569
2644
  },
2570
2645
  d: function() {
2571
2646
  return ~n;
2572
2647
  }
2573
2648
  };
2574
- }, cr = function(n, e, t, r, a) {
2649
+ }, dr = function(n, e, t, r, a) {
2575
2650
  if (!a && (a = { l: 1 }, e.dictionary)) {
2576
- var s = e.dictionary.subarray(-32768), l = new ae(s.length + n.length);
2577
- l.set(s), l.set(n, s.length), n = l, a.w = s.length;
2651
+ var o = e.dictionary.subarray(-32768), i = new ae(o.length + n.length);
2652
+ i.set(o), i.set(n, o.length), n = i, a.w = o.length;
2578
2653
  }
2579
- return ir(n, e.level == null ? 6 : e.level, e.mem == null ? a.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(n.length))) * 1.5) : 20 : 12 + e.mem, t, r, a);
2580
- }, sn = function(n, e) {
2654
+ return fr(n, e.level == null ? 6 : e.level, e.mem == null ? a.l ? Math.ceil(Math.max(8, Math.min(13, Math.log(n.length))) * 1.5) : 20 : 12 + e.mem, t, r, a);
2655
+ }, fn = function(n, e) {
2581
2656
  var t = {};
2582
2657
  for (var r in n)
2583
2658
  t[r] = n[r];
2584
2659
  for (var r in e)
2585
2660
  t[r] = e[r];
2586
2661
  return t;
2587
- }, ve = function(n, e) {
2662
+ }, be = function(n, e) {
2588
2663
  return n[e] | n[e + 1] << 8;
2589
2664
  }, fe = function(n, e) {
2590
2665
  return (n[e] | n[e + 1] << 8 | n[e + 2] << 16 | n[e + 3] << 24) >>> 0;
2591
- }, lt = function(n, e) {
2666
+ }, ht = function(n, e) {
2592
2667
  return fe(n, e) + fe(n, e + 4) * 4294967296;
2593
- }, ie = function(n, e, t) {
2668
+ }, le = function(n, e, t) {
2594
2669
  for (; t; ++e)
2595
2670
  n[e] = t, t >>>= 8;
2596
2671
  };
2597
- function ur(n, e) {
2598
- return cr(n, e || {}, 0, 0);
2672
+ function gr(n, e) {
2673
+ return dr(n, e || {}, 0, 0);
2599
2674
  }
2600
- function fr(n, e) {
2601
- return or(n, { i: 2 }, e && e.out, e && e.dictionary);
2675
+ function yr(n, e) {
2676
+ return hr(n, { i: 2 }, e && e.out, e && e.dictionary);
2602
2677
  }
2603
- var ln = function(n, e, t, r) {
2678
+ var mn = function(n, e, t, r) {
2604
2679
  for (var a in n) {
2605
- var s = n[a], l = e + a, m = r;
2606
- Array.isArray(s) && (m = sn(r, s[1]), s = s[0]), ArrayBuffer.isView(s) ? t[l] = [s, m] : (t[l += "/"] = [new ae(0), m], ln(s, l, t, r));
2680
+ var o = n[a], i = e + a, f = r;
2681
+ Array.isArray(o) && (f = fn(r, o[1]), o = o[0]), ArrayBuffer.isView(o) ? t[i] = [o, f] : (t[i += "/"] = [new ae(0), f], mn(o, i, t, r));
2607
2682
  }
2608
- }, Ht = typeof TextEncoder < "u" && /* @__PURE__ */ new TextEncoder(), pt = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), mr = 0;
2683
+ }, qt = typeof TextEncoder < "u" && /* @__PURE__ */ new TextEncoder(), gt = typeof TextDecoder < "u" && /* @__PURE__ */ new TextDecoder(), vr = 0;
2609
2684
  try {
2610
- pt.decode(on, { stream: !0 }), mr = 1;
2685
+ gt.decode(un, { stream: !0 }), vr = 1;
2611
2686
  } catch {
2612
2687
  }
2613
- var pr = function(n) {
2688
+ var br = function(n) {
2614
2689
  for (var e = "", t = 0; ; ) {
2615
2690
  var r = n[t++], a = (r > 127) + (r > 223) + (r > 239);
2616
2691
  if (t + a > n.length)
2617
- return { s: e, r: Ce(n, t - 1) };
2692
+ return { s: e, r: De(n, t - 1) };
2618
2693
  a ? a == 3 ? (r = ((r & 15) << 18 | (n[t++] & 63) << 12 | (n[t++] & 63) << 6 | n[t++] & 63) - 65536, e += String.fromCharCode(55296 | r >> 10, 56320 | r & 1023)) : a & 1 ? e += String.fromCharCode((r & 31) << 6 | n[t++] & 63) : e += String.fromCharCode((r & 15) << 12 | (n[t++] & 63) << 6 | n[t++] & 63) : e += String.fromCharCode(r);
2619
2694
  }
2620
2695
  };
2621
- function Zt(n, e) {
2696
+ function Jt(n, e) {
2622
2697
  var t;
2623
- if (Ht)
2624
- return Ht.encode(n);
2625
- for (var r = n.length, a = new ae(n.length + (n.length >> 1)), s = 0, l = function(d) {
2626
- a[s++] = d;
2698
+ if (qt)
2699
+ return qt.encode(n);
2700
+ for (var r = n.length, a = new ae(n.length + (n.length >> 1)), o = 0, i = function(g) {
2701
+ a[o++] = g;
2627
2702
  }, t = 0; t < r; ++t) {
2628
- if (s + 5 > a.length) {
2629
- var m = new ae(s + 8 + (r - t << 1));
2630
- m.set(a), a = m;
2703
+ if (o + 5 > a.length) {
2704
+ var f = new ae(o + 8 + (r - t << 1));
2705
+ f.set(a), a = f;
2631
2706
  }
2632
- var b = n.charCodeAt(t);
2633
- b < 128 || e ? l(b) : b < 2048 ? (l(192 | b >> 6), l(128 | b & 63)) : b > 55295 && b < 57344 ? (b = 65536 + (b & 1047552) | n.charCodeAt(++t) & 1023, l(240 | b >> 18), l(128 | b >> 12 & 63), l(128 | b >> 6 & 63), l(128 | b & 63)) : (l(224 | b >> 12), l(128 | b >> 6 & 63), l(128 | b & 63));
2707
+ var m = n.charCodeAt(t);
2708
+ m < 128 || e ? i(m) : m < 2048 ? (i(192 | m >> 6), i(128 | m & 63)) : m > 55295 && m < 57344 ? (m = 65536 + (m & 1047552) | n.charCodeAt(++t) & 1023, i(240 | m >> 18), i(128 | m >> 12 & 63), i(128 | m >> 6 & 63), i(128 | m & 63)) : (i(224 | m >> 12), i(128 | m >> 6 & 63), i(128 | m & 63));
2634
2709
  }
2635
- return Ce(a, 0, s);
2710
+ return De(a, 0, o);
2636
2711
  }
2637
- function dr(n, e) {
2712
+ function xr(n, e) {
2638
2713
  if (e) {
2639
2714
  for (var t = "", r = 0; r < n.length; r += 16384)
2640
2715
  t += String.fromCharCode.apply(null, n.subarray(r, r + 16384));
2641
2716
  return t;
2642
2717
  } else {
2643
- if (pt)
2644
- return pt.decode(n);
2645
- var a = pr(n), s = a.s, t = a.r;
2646
- return t.length && le(8), s;
2718
+ if (gt)
2719
+ return gt.decode(n);
2720
+ var a = br(n), o = a.s, t = a.r;
2721
+ return t.length && ce(8), o;
2647
2722
  }
2648
2723
  }
2649
- var gr = function(n, e) {
2650
- return e + 30 + ve(n, e + 26) + ve(n, e + 28);
2651
- }, yr = function(n, e, t) {
2652
- var r = ve(n, e + 28), a = ve(n, e + 30), s = dr(n.subarray(e + 46, e + 46 + r), !(ve(n, e + 8) & 2048)), l = e + 46 + r, m = vr(n, l, a, t, fe(n, e + 20), fe(n, e + 24), fe(n, e + 42)), b = m[0], d = m[1], p = m[2];
2653
- return [ve(n, e + 10), b, d, s, l + a + ve(n, e + 32), p];
2654
- }, vr = function(n, e, t, r, a, s, l) {
2655
- var m = a == 4294967295, b = s == 4294967295, d = l == 4294967295, p = e + t, i = m + b + d;
2656
- if (r && i) {
2657
- for (; e + 4 < p; e += 4 + ve(n, e + 2))
2658
- if (ve(n, e) == 1)
2724
+ var wr = function(n, e) {
2725
+ return e + 30 + be(n, e + 26) + be(n, e + 28);
2726
+ }, Ar = function(n, e, t) {
2727
+ var r = be(n, e + 28), a = be(n, e + 30), o = xr(n.subarray(e + 46, e + 46 + r), !(be(n, e + 8) & 2048)), i = e + 46 + r, f = Mr(n, i, a, t, fe(n, e + 20), fe(n, e + 24), fe(n, e + 42)), m = f[0], g = f[1], p = f[2];
2728
+ return [be(n, e + 10), m, g, o, i + a + be(n, e + 32), p];
2729
+ }, Mr = function(n, e, t, r, a, o, i) {
2730
+ var f = a == 4294967295, m = o == 4294967295, g = i == 4294967295, p = e + t, l = f + m + g;
2731
+ if (r && l) {
2732
+ for (; e + 4 < p; e += 4 + be(n, e + 2))
2733
+ if (be(n, e) == 1)
2659
2734
  return [
2660
- m ? lt(n, e + 4 + 8 * b) : a,
2661
- b ? lt(n, e + 4) : s,
2662
- d ? lt(n, e + 4 + 8 * (b + m)) : l,
2735
+ f ? ht(n, e + 4 + 8 * m) : a,
2736
+ m ? ht(n, e + 4) : o,
2737
+ g ? ht(n, e + 4 + 8 * (m + f)) : i,
2663
2738
  1
2664
2739
  ];
2665
- r < 2 && le(13);
2740
+ r < 2 && ce(13);
2666
2741
  }
2667
- return [a, s, l, 0];
2668
- }, dt = function(n) {
2742
+ return [a, o, i, 0];
2743
+ }, yt = function(n) {
2669
2744
  var e = 0;
2670
2745
  if (n)
2671
2746
  for (var t in n) {
2672
2747
  var r = n[t].length;
2673
- r > 65535 && le(9), e += r + 4;
2748
+ r > 65535 && ce(9), e += r + 4;
2674
2749
  }
2675
2750
  return e;
2676
- }, Wt = function(n, e, t, r, a, s, l, m) {
2677
- var b = r.length, d = t.extra, p = m && m.length, i = dt(d);
2678
- ie(n, e, l != null ? 33639248 : 67324752), e += 4, l != null && (n[e++] = 20, n[e++] = t.os), n[e] = 20, e += 2, n[e++] = t.flag << 1 | (s < 0 && 8), n[e++] = a && 8, n[e++] = t.compression & 255, n[e++] = t.compression >> 8;
2679
- var u = new Date(t.mtime == null ? Date.now() : t.mtime), S = u.getFullYear() - 1980;
2680
- if ((S < 0 || S > 119) && le(10), ie(n, e, S << 25 | u.getMonth() + 1 << 21 | u.getDate() << 16 | u.getHours() << 11 | u.getMinutes() << 5 | u.getSeconds() >> 1), e += 4, s != -1 && (ie(n, e, t.crc), ie(n, e + 4, s < 0 ? -s - 2 : s), ie(n, e + 8, t.size)), ie(n, e + 12, b), ie(n, e + 14, i), e += 16, l != null && (ie(n, e, p), ie(n, e + 6, t.attrs), ie(n, e + 10, l), e += 14), n.set(r, e), e += b, i)
2681
- for (var y in d) {
2682
- var c = d[y], v = c.length;
2683
- ie(n, e, +y), ie(n, e + 2, v), n.set(c, e + 4), e += 4 + v;
2684
- }
2685
- return p && (n.set(m, e), e += p), e;
2686
- }, br = function(n, e, t, r, a) {
2687
- ie(n, e, 101010256), ie(n, e + 8, t), ie(n, e + 10, t), ie(n, e + 12, r), ie(n, e + 16, a);
2751
+ }, Kt = function(n, e, t, r, a, o, i, f) {
2752
+ var m = r.length, g = t.extra, p = f && f.length, l = yt(g);
2753
+ le(n, e, i != null ? 33639248 : 67324752), e += 4, i != null && (n[e++] = 20, n[e++] = t.os), n[e] = 20, e += 2, n[e++] = t.flag << 1 | (o < 0 && 8), n[e++] = a && 8, n[e++] = t.compression & 255, n[e++] = t.compression >> 8;
2754
+ var h = new Date(t.mtime == null ? Date.now() : t.mtime), E = h.getFullYear() - 1980;
2755
+ if ((E < 0 || E > 119) && ce(10), le(n, e, E << 25 | h.getMonth() + 1 << 21 | h.getDate() << 16 | h.getHours() << 11 | h.getMinutes() << 5 | h.getSeconds() >> 1), e += 4, o != -1 && (le(n, e, t.crc), le(n, e + 4, o < 0 ? -o - 2 : o), le(n, e + 8, t.size)), le(n, e + 12, m), le(n, e + 14, l), e += 16, i != null && (le(n, e, p), le(n, e + 6, t.attrs), le(n, e + 10, i), e += 14), n.set(r, e), e += m, l)
2756
+ for (var y in g) {
2757
+ var u = g[y], v = u.length;
2758
+ le(n, e, +y), le(n, e + 2, v), n.set(u, e + 4), e += 4 + v;
2759
+ }
2760
+ return p && (n.set(f, e), e += p), e;
2761
+ }, Er = function(n, e, t, r, a) {
2762
+ le(n, e, 101010256), le(n, e + 8, t), le(n, e + 10, t), le(n, e + 12, r), le(n, e + 16, a);
2688
2763
  };
2689
- function xr(n, e) {
2764
+ function Sr(n, e) {
2690
2765
  e || (e = {});
2691
2766
  var t = {}, r = [];
2692
- ln(n, "", t, e);
2693
- var a = 0, s = 0;
2694
- for (var l in t) {
2695
- var m = t[l], b = m[0], d = m[1], p = d.level == 0 ? 0 : 8, i = Zt(l), u = i.length, S = d.comment, y = S && Zt(S), c = y && y.length, v = dt(d.extra);
2696
- u > 65535 && le(11);
2697
- var x = p ? ur(b, d) : b, o = x.length, h = hr();
2698
- h.p(b), r.push(sn(d, {
2699
- size: b.length,
2700
- crc: h.d(),
2767
+ mn(n, "", t, e);
2768
+ var a = 0, o = 0;
2769
+ for (var i in t) {
2770
+ var f = t[i], m = f[0], g = f[1], p = g.level == 0 ? 0 : 8, l = Jt(i), h = l.length, E = g.comment, y = E && Jt(E), u = y && y.length, v = yt(g.extra);
2771
+ h > 65535 && ce(11);
2772
+ var x = p ? gr(m, g) : m, s = x.length, c = pr();
2773
+ c.p(m), r.push(fn(g, {
2774
+ size: m.length,
2775
+ crc: c.d(),
2701
2776
  c: x,
2702
- f: i,
2777
+ f: l,
2703
2778
  m: y,
2704
- u: u != l.length || y && S.length != c,
2779
+ u: h != i.length || y && E.length != u,
2705
2780
  o: a,
2706
2781
  compression: p
2707
- })), a += 30 + u + v + o, s += 76 + 2 * (u + v) + (c || 0) + o;
2782
+ })), a += 30 + h + v + s, o += 76 + 2 * (h + v) + (u || 0) + s;
2708
2783
  }
2709
- for (var T = new ae(s + 22), f = a, w = s - a, B = 0; B < r.length; ++B) {
2710
- var i = r[B];
2711
- Wt(T, i.o, i, i.f, i.u, i.c.length);
2712
- var Y = 30 + i.f.length + dt(i.extra);
2713
- T.set(i.c, i.o + Y), Wt(T, a, i, i.f, i.u, i.c.length, i.o, i.m), a += 16 + Y + (i.m ? i.m.length : 0);
2784
+ for (var T = new ae(o + 22), d = a, w = o - a, F = 0; F < r.length; ++F) {
2785
+ var l = r[F];
2786
+ Kt(T, l.o, l, l.f, l.u, l.c.length);
2787
+ var Y = 30 + l.f.length + yt(l.extra);
2788
+ T.set(l.c, l.o + Y), Kt(T, a, l, l.f, l.u, l.c.length, l.o, l.m), a += 16 + Y + (l.m ? l.m.length : 0);
2714
2789
  }
2715
- return br(T, a, r.length, w, f), T;
2790
+ return Er(T, a, r.length, w, d), T;
2716
2791
  }
2717
- function wr(n, e) {
2792
+ function Tr(n, e) {
2718
2793
  for (var t = {}, r = n.length - 22; fe(n, r) != 101010256; --r)
2719
- (!r || n.length - r > 65558) && le(13);
2720
- var a = ve(n, r + 8);
2794
+ (!r || n.length - r > 65558) && ce(13);
2795
+ var a = be(n, r + 8);
2721
2796
  if (!a)
2722
2797
  return {};
2723
- var s = fe(n, r + 16), l = fe(n, r - 20) == 117853008;
2724
- if (l) {
2725
- var m = fe(n, r - 12);
2726
- l = fe(n, m) == 101075792, l && (a = fe(n, m + 32), s = fe(n, m + 48));
2727
- }
2728
- for (var b = e && e.filter, d = 0; d < a; ++d) {
2729
- var p = yr(n, s, l), i = p[0], u = p[1], S = p[2], y = p[3], c = p[4], v = p[5], x = gr(n, v);
2730
- s = c, (!b || b({
2798
+ var o = fe(n, r + 16), i = fe(n, r - 20) == 117853008;
2799
+ if (i) {
2800
+ var f = fe(n, r - 12);
2801
+ i = fe(n, f) == 101075792, i && (a = fe(n, f + 32), o = fe(n, f + 48));
2802
+ }
2803
+ for (var m = e && e.filter, g = 0; g < a; ++g) {
2804
+ var p = Ar(n, o, i), l = p[0], h = p[1], E = p[2], y = p[3], u = p[4], v = p[5], x = wr(n, v);
2805
+ o = u, (!m || m({
2731
2806
  name: y,
2732
- size: u,
2733
- originalSize: S,
2734
- compression: i
2735
- })) && (i ? i == 8 ? t[y] = fr(n.subarray(x, x + u), { out: new ae(S) }) : le(14, "unknown compression type " + i) : t[y] = Ce(n, x, x + u));
2807
+ size: h,
2808
+ originalSize: E,
2809
+ compression: l
2810
+ })) && (l ? l == 8 ? t[y] = yr(n.subarray(x, x + h), { out: new ae(E) }) : ce(14, "unknown compression type " + l) : t[y] = De(n, x, x + h));
2736
2811
  }
2737
2812
  return t;
2738
2813
  }
2739
- const Ve = 200, gt = 64 * 1024 * 1024, yt = new TextDecoder("utf-8", { fatal: !0 });
2740
- function St(n) {
2814
+ const Je = 200, vt = 64 * 1024 * 1024, bt = new TextDecoder("utf-8", { fatal: !0 });
2815
+ function Rt(n) {
2741
2816
  if (!n || n.startsWith("/") || /^[A-Za-z]:/.test(n) || n.includes("\\") || n.includes("\0") || n.split("/").includes(".."))
2742
2817
  throw new Error(`ZIP entry ${JSON.stringify(n)}: path must be relative, without .. or backslashes`);
2743
2818
  }
2744
- function vt(n) {
2745
- const e = new DataView(n.buffer, n.byteOffset, n.byteLength), t = (u = "(archive)") => {
2746
- throw new Error(`ZIP entry ${JSON.stringify(u)}: invalid or truncated ZIP`);
2747
- }, r = (u) => u >= 0 && u + 2 <= n.length ? e.getUint16(u, !0) : t(), a = (u) => u >= 0 && u + 4 <= n.length ? e.getUint32(u, !0) : t();
2748
- let s = n.length - 22;
2749
- for (; s >= Math.max(0, n.length - 65557) && !(a(s) === 101010256 && s + 22 + r(s + 20) === n.length); s--)
2819
+ function xt(n) {
2820
+ const e = new DataView(n.buffer, n.byteOffset, n.byteLength), t = (h = "(archive)") => {
2821
+ throw new Error(`ZIP entry ${JSON.stringify(h)}: invalid or truncated ZIP`);
2822
+ }, r = (h) => h >= 0 && h + 2 <= n.length ? e.getUint16(h, !0) : t(), a = (h) => h >= 0 && h + 4 <= n.length ? e.getUint32(h, !0) : t();
2823
+ let o = n.length - 22;
2824
+ for (; o >= Math.max(0, n.length - 65557) && !(a(o) === 101010256 && o + 22 + r(o + 20) === n.length); o--)
2750
2825
  ;
2751
- (s < 0 || s < n.length - 65557) && t(), (r(s + 4) || r(s + 6) || r(s + 8) !== r(s + 10)) && t();
2752
- const l = r(s + 10), m = a(s + 16), b = m + a(s + 12);
2753
- b !== s && t();
2754
- const d = [], p = /* @__PURE__ */ new Set();
2755
- let i = m;
2756
- for (let u = 0; u < l; u++) {
2757
- (i + 46 > b || a(i) !== 33639248) && t();
2758
- const S = r(i + 28), y = i + 46 + S + r(i + 30) + r(i + 32);
2759
- y > b && t();
2760
- let c;
2826
+ (o < 0 || o < n.length - 65557) && t(), (r(o + 4) || r(o + 6) || r(o + 8) !== r(o + 10)) && t();
2827
+ const i = r(o + 10), f = a(o + 16), m = f + a(o + 12);
2828
+ m !== o && t();
2829
+ const g = [], p = /* @__PURE__ */ new Set();
2830
+ let l = f;
2831
+ for (let h = 0; h < i; h++) {
2832
+ (l + 46 > m || a(l) !== 33639248) && t();
2833
+ const E = r(l + 28), y = l + 46 + E + r(l + 30) + r(l + 32);
2834
+ y > m && t();
2835
+ let u;
2761
2836
  try {
2762
- c = yt.decode(n.subarray(i + 46, i + 46 + S));
2837
+ u = bt.decode(n.subarray(l + 46, l + 46 + E));
2763
2838
  } catch {
2764
2839
  throw new Error("ZIP entry (invalid UTF-8 name): invalid filename");
2765
2840
  }
2766
- if (St(c), u >= Ve) throw new Error(`ZIP entry ${JSON.stringify(c)}: more than ${Ve} entries`);
2767
- if (p.has(c)) throw new Error(`ZIP entry ${JSON.stringify(c)}: duplicate entry`);
2768
- p.add(c);
2769
- const v = a(i + 24), x = a(i + 20), o = a(i + 42);
2770
- if (v > gt || x > gt) throw new Error(`ZIP entry ${JSON.stringify(c)}: exceeds 64 MB`);
2771
- if (r(i + 10) !== 0) throw new Error(`ZIP entry ${JSON.stringify(c)}: expected stored compression (method 0)`);
2772
- if (r(i + 8) & 1) throw new Error(`ZIP entry ${JSON.stringify(c)}: encrypted entries are not supported`);
2773
- (x !== v || o + 30 > m || a(o) !== 67324752) && t(c);
2774
- const h = o + 30 + r(o + 26) + r(o + 28);
2775
- (h + v > m || r(o + 8) !== 0 || r(o + 6) !== r(i + 8)) && t(c);
2841
+ if (Rt(u), h >= Je) throw new Error(`ZIP entry ${JSON.stringify(u)}: more than ${Je} entries`);
2842
+ if (p.has(u)) throw new Error(`ZIP entry ${JSON.stringify(u)}: duplicate entry`);
2843
+ p.add(u);
2844
+ const v = a(l + 24), x = a(l + 20), s = a(l + 42);
2845
+ if (v > vt || x > vt) throw new Error(`ZIP entry ${JSON.stringify(u)}: exceeds 64 MB`);
2846
+ if (r(l + 10) !== 0) throw new Error(`ZIP entry ${JSON.stringify(u)}: expected stored compression (method 0)`);
2847
+ if (r(l + 8) & 1) throw new Error(`ZIP entry ${JSON.stringify(u)}: encrypted entries are not supported`);
2848
+ (x !== v || s + 30 > f || a(s) !== 67324752) && t(u);
2849
+ const c = s + 30 + r(s + 26) + r(s + 28);
2850
+ (c + v > f || r(s + 8) !== 0 || r(s + 6) !== r(l + 8)) && t(u);
2776
2851
  let T;
2777
2852
  try {
2778
- T = yt.decode(n.subarray(o + 30, o + 30 + r(o + 26)));
2853
+ T = bt.decode(n.subarray(s + 30, s + 30 + r(s + 26)));
2779
2854
  } catch {
2780
- t(c);
2855
+ t(u);
2781
2856
  }
2782
- T !== c && t(c), d.push({ name: c, offset: o, start: h, size: v, central: i }), i = y;
2857
+ T !== u && t(u), g.push({ name: u, offset: s, start: c, size: v, central: l }), l = y;
2783
2858
  }
2784
- return i !== b && t(), { files: d };
2859
+ return l !== m && t(), { files: g };
2785
2860
  }
2786
- function Ar(n) {
2787
- const e = n instanceof Uint8Array ? n : new Uint8Array(n), t = vt(e), r = wr(e, { filter: (s) => s.name !== "__proto__" }), a = /* @__PURE__ */ Object.create(null);
2788
- for (const s of t.files) {
2789
- const l = s.name === "__proto__" ? e.slice(s.start, s.start + s.size) : r[s.name];
2790
- if (!(l instanceof Uint8Array) || l.length !== s.size) throw new Error(`ZIP entry ${JSON.stringify(s.name)}: invalid size`);
2791
- a[s.name] = l;
2861
+ function Or(n) {
2862
+ const e = n instanceof Uint8Array ? n : new Uint8Array(n), t = xt(e), r = Tr(e, { filter: (o) => o.name !== "__proto__" }), a = /* @__PURE__ */ Object.create(null);
2863
+ for (const o of t.files) {
2864
+ const i = o.name === "__proto__" ? e.slice(o.start, o.start + o.size) : r[o.name];
2865
+ if (!(i instanceof Uint8Array) || i.length !== o.size) throw new Error(`ZIP entry ${JSON.stringify(o.name)}: invalid size`);
2866
+ a[o.name] = i;
2792
2867
  }
2793
2868
  return a;
2794
2869
  }
2795
- function Or(n, e = {}) {
2796
- const t = Object.hasOwn(n, "avatar.json") ? n["avatar.json"] : void 0, r = t ? Le(JSON.parse(yt.decode(t))) : Kt("Avatar"), a = t && !e.manifest ? t : new TextEncoder().encode(JSON.stringify(Le({ ...r, ...e.manifest }), null, 2) + `
2797
- `), s = /* @__PURE__ */ Object.create(null);
2798
- s["avatar.json"] = a;
2799
- for (const [u, S] of Object.entries(n)) u !== "avatar.json" && (s[u] = S);
2800
- for (const [u, [S, y]] of Object.entries(s).entries()) {
2801
- if (St(S), u >= Ve) throw new Error(`ZIP entry ${JSON.stringify(S)}: more than ${Ve} entries`);
2802
- if (y.byteLength > gt) throw new Error(`ZIP entry ${JSON.stringify(S)}: exceeds 64 MB`);
2803
- }
2804
- const l = Qt(s);
2805
- if (l.length) throw new Error(l.join(`
2870
+ function Fr(n, e = {}) {
2871
+ const t = Object.hasOwn(n, "avatar.json") ? n["avatar.json"] : void 0, r = t ? Be(JSON.parse(bt.decode(t))) : rn("Avatar"), a = t && !e.manifest ? t : new TextEncoder().encode(JSON.stringify(Be({ ...r, ...e.manifest }), null, 2) + `
2872
+ `), o = /* @__PURE__ */ Object.create(null);
2873
+ o["avatar.json"] = a;
2874
+ for (const [h, E] of Object.entries(n)) h !== "avatar.json" && (o[h] = E);
2875
+ for (const [h, [E, y]] of Object.entries(o).entries()) {
2876
+ if (Rt(E), h >= Je) throw new Error(`ZIP entry ${JSON.stringify(E)}: more than ${Je} entries`);
2877
+ if (y.byteLength > vt) throw new Error(`ZIP entry ${JSON.stringify(E)}: exceeds 64 MB`);
2878
+ }
2879
+ const i = an(o);
2880
+ if (i.length) throw new Error(i.join(`
2806
2881
  `));
2807
- let m = "proto0000";
2808
- for (let u = 0; Object.hasOwn(s, m); u++) m = `proto${String(u + 1).padStart(4, "0")}`;
2809
- const b = Object.fromEntries(Object.entries(s).map(([u, S]) => [u === "__proto__" ? m : u, S])), d = xr(b, { level: 0 });
2810
- if (Object.hasOwn(s, "__proto__")) {
2811
- const u = vt(d).files.find((y) => y.name === m), S = new TextEncoder().encode("__proto__");
2812
- d.set(S, u.offset + 30), d.set(S, u.central + 46);
2813
- }
2814
- const p = vt(d), i = p.files.find((u) => u.name === "avatar.json");
2815
- if (i.offset !== 0) {
2816
- const u = i.start + i.size - i.offset, S = new Uint8Array(d.length);
2817
- S.set(d.subarray(i.offset, i.offset + u)), S.set(d.subarray(0, i.offset), u), S.set(d.subarray(i.offset + u), i.offset + u);
2818
- const y = new DataView(S.buffer);
2819
- for (const c of p.files) y.setUint32(c.central + 42, c === i ? 0 : c.offset < i.offset ? c.offset + u : c.offset, !0);
2820
- return S;
2821
- }
2822
- return d;
2882
+ let f = "proto0000";
2883
+ for (let h = 0; Object.hasOwn(o, f); h++) f = `proto${String(h + 1).padStart(4, "0")}`;
2884
+ const m = Object.fromEntries(Object.entries(o).map(([h, E]) => [h === "__proto__" ? f : h, E])), g = Sr(m, { level: 0 });
2885
+ if (Object.hasOwn(o, "__proto__")) {
2886
+ const h = xt(g).files.find((y) => y.name === f), E = new TextEncoder().encode("__proto__");
2887
+ g.set(E, h.offset + 30), g.set(E, h.central + 46);
2888
+ }
2889
+ const p = xt(g), l = p.files.find((h) => h.name === "avatar.json");
2890
+ if (l.offset !== 0) {
2891
+ const h = l.start + l.size - l.offset, E = new Uint8Array(g.length);
2892
+ E.set(g.subarray(l.offset, l.offset + h)), E.set(g.subarray(0, l.offset), h), E.set(g.subarray(l.offset + h), l.offset + h);
2893
+ const y = new DataView(E.buffer);
2894
+ for (const u of p.files) y.setUint32(u.central + 42, u === l ? 0 : u.offset < l.offset ? u.offset + h : u.offset, !0);
2895
+ return E;
2896
+ }
2897
+ return g;
2823
2898
  }
2824
- const Mr = (n) => JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(n));
2825
- function Xe(n, e) {
2899
+ const Rr = (n) => JSON.parse(new TextDecoder("utf-8", { fatal: !0 }).decode(n));
2900
+ function Ce(n, e) {
2826
2901
  try {
2827
- return Mr(n);
2902
+ return Rr(n);
2828
2903
  } catch {
2829
2904
  throw new Error(`${e}: invalid UTF-8 JSON`);
2830
2905
  }
2831
2906
  }
2832
- function hn(n, e) {
2907
+ function pn(n, e) {
2833
2908
  return [
2834
2909
  "layers.json",
2835
2910
  "base.png",
@@ -2838,109 +2913,109 @@ function hn(n, e) {
2838
2913
  ...e ? ["sprites/sprites.json", ...Object.keys(e.layers ?? {}).map((t) => `sprites/${t}.png`)] : []
2839
2914
  ];
2840
2915
  }
2841
- function cn(n) {
2842
- const e = Qt(n);
2916
+ function dn(n) {
2917
+ const e = an(n);
2843
2918
  if (e.length) throw new Error(e.join(`
2844
2919
  `));
2845
2920
  }
2846
- function un(n) {
2921
+ function gn(n) {
2847
2922
  return !!n && typeof n == "object" && "manifest" in n && "rig" in n && "assets" in n && "release" in n;
2848
2923
  }
2849
- function ht(n) {
2850
- const e = Ar(n);
2924
+ function ut(n) {
2925
+ const e = Or(n);
2851
2926
  if (!Object.hasOwn(e, "avatar.json")) throw new Error("avatar.json: missing file in .mavatar archive");
2852
- cn(e);
2853
- const t = Le(Xe(e["avatar.json"], "avatar.json")), r = bt(Xe(e["rig.json"], "rig.json")), a = hn(
2854
- Xe(e["built/layers.json"], "built/layers.json"),
2855
- e["built/sprites/sprites.json"] ? Xe(e["built/sprites/sprites.json"], "built/sprites/sprites.json") : void 0
2856
- ), s = {}, l = [], m = () => {
2857
- l.splice(0).forEach((b) => URL.revokeObjectURL(b));
2927
+ dn(e);
2928
+ const t = Be(Ce(e["avatar.json"], "avatar.json")), r = wt(Ce(e["rig.json"], "rig.json")), a = pn(
2929
+ Ce(e["built/layers.json"], "built/layers.json"),
2930
+ e["built/sprites/sprites.json"] ? Ce(e["built/sprites/sprites.json"], "built/sprites/sprites.json") : void 0
2931
+ ), o = {}, i = [], f = () => {
2932
+ i.splice(0).forEach((m) => URL.revokeObjectURL(m));
2858
2933
  };
2859
2934
  try {
2860
- for (const b of new Set(a)) {
2861
- const d = URL.createObjectURL(new Blob([new Uint8Array(e[`built/${b}`])], { type: b.endsWith(".json") ? "application/json" : "image/png" }));
2862
- l.push(d), s[b] = d;
2935
+ for (const m of new Set(a)) {
2936
+ const g = URL.createObjectURL(new Blob([new Uint8Array(e[`built/${m}`])], { type: m.endsWith(".json") ? "application/json" : "image/png" }));
2937
+ i.push(g), o[m] = g;
2863
2938
  }
2864
- } catch (b) {
2865
- throw m(), b;
2939
+ } catch (m) {
2940
+ throw f(), m;
2866
2941
  }
2867
- return { manifest: t, rig: r, assets: s, release: m };
2942
+ return { manifest: t, rig: r, assets: o, release: f };
2868
2943
  }
2869
- async function Er(n, e = {}) {
2870
- if (un(n)) return n;
2871
- if (n instanceof Blob) return ht(await n.arrayBuffer());
2872
- if (n instanceof ArrayBuffer || n instanceof Uint8Array) return ht(n);
2944
+ async function Lr(n, e = {}) {
2945
+ if (gn(n)) return n;
2946
+ if (n instanceof Blob) return ut(await n.arrayBuffer());
2947
+ if (n instanceof ArrayBuffer || n instanceof Uint8Array) return ut(n);
2873
2948
  const t = new URL(n, typeof location > "u" ? void 0 : location.href);
2874
2949
  if (/\.mavatar$/i.test(t.pathname)) {
2875
- const c = await fetch(t);
2876
- if (!c.ok) throw new Error(`.mavatar: could not load (${c.status})`);
2877
- return ht(await c.arrayBuffer());
2950
+ const u = await fetch(t);
2951
+ if (!u.ok) throw new Error(`.mavatar: could not load (${u.status})`);
2952
+ return ut(await u.arrayBuffer());
2878
2953
  }
2879
2954
  t.pathname.endsWith("/") || (t.pathname += "/");
2880
- const r = (c) => {
2955
+ const r = (u) => {
2881
2956
  const v = new URL(t);
2882
- return v.pathname += c.split("/").map(encodeURIComponent).join("/"), e.version !== void 0 && v.searchParams.set("v", String(e.version)), v.href;
2957
+ return v.pathname += u.split("/").map(encodeURIComponent).join("/"), e.version !== void 0 && v.searchParams.set("v", String(e.version)), v.href;
2883
2958
  }, a = {};
2884
- async function s(c, v = !1) {
2885
- const x = await fetch(r(c));
2959
+ async function o(u, v = !1) {
2960
+ const x = await fetch(r(u));
2886
2961
  if (v && (x.status === 404 || x.ok && x.headers.get("content-type")?.includes("text/html"))) return;
2887
- if (!x.ok) throw new Error(`${c}: could not load (${x.status})`);
2888
- const o = new Uint8Array(await x.arrayBuffer());
2889
- return a[c] = o, Xe(o, c);
2890
- }
2891
- const l = e.rigFile ?? "rig.json";
2892
- St(l);
2893
- const [m, b, d, p] = await Promise.all([
2894
- s(l),
2895
- s("built/layers.json"),
2896
- s("avatar.json", !0),
2897
- s("built/sprites/sprites.json", !0)
2962
+ if (!x.ok) throw new Error(`${u}: could not load (${x.status})`);
2963
+ const s = new Uint8Array(await x.arrayBuffer());
2964
+ return a[u] = s, Ce(s, u);
2965
+ }
2966
+ const i = e.rigFile ?? "rig.json";
2967
+ Rt(i);
2968
+ const [f, m, g, p] = await Promise.all([
2969
+ o(i),
2970
+ o("built/layers.json"),
2971
+ o("avatar.json", !0),
2972
+ o("built/sprites/sprites.json", !0)
2898
2973
  ]);
2899
- Array.isArray(m?.eyes) && Array.isArray(b?.eyes) && (m.eyes = m.eyes.map((c, v) => {
2900
- if (!c || typeof c != "object") return c;
2901
- const x = { ...c };
2902
- for (const o of ["x0", "x1", "top", "bot"]) x[o] === void 0 && (x[o] = b.eyes[v]?.[o]);
2974
+ Array.isArray(f?.eyes) && Array.isArray(m?.eyes) && (f.eyes = f.eyes.map((u, v) => {
2975
+ if (!u || typeof u != "object") return u;
2976
+ const x = { ...u };
2977
+ for (const s of ["x0", "x1", "top", "bot"]) x[s] === void 0 && (x[s] = m.eyes[v]?.[s]);
2903
2978
  return x;
2904
- })), a["rig.json"] = new TextEncoder().encode(JSON.stringify(m));
2905
- const i = hn(b, p);
2906
- for (const c of i) c.endsWith(".png") && (a[`built/${c}`] = { size: 1 });
2907
- cn(a);
2908
- const u = bt(m), S = Object.fromEntries(i.map((c) => [c, r(`built/${c}`)])), y = decodeURIComponent(t.pathname.split("/").filter(Boolean).at(-1) ?? "Avatar");
2909
- return { manifest: d === void 0 ? Kt(y) : Le(d), rig: u, assets: S, release() {
2979
+ })), a["rig.json"] = new TextEncoder().encode(JSON.stringify(f));
2980
+ const l = pn(m, p);
2981
+ for (const u of l) u.endsWith(".png") && (a[`built/${u}`] = { size: 1 });
2982
+ dn(a);
2983
+ const h = wt(f), E = Object.fromEntries(l.map((u) => [u, r(`built/${u}`)])), y = decodeURIComponent(t.pathname.split("/").filter(Boolean).at(-1) ?? "Avatar");
2984
+ return { manifest: g === void 0 ? rn(y) : Be(g), rig: h, assets: E, release() {
2910
2985
  } };
2911
2986
  }
2912
- async function Rr(n, e, t = {}) {
2913
- const r = !un(e), a = await Er(e);
2987
+ async function Br(n, e, t = {}) {
2988
+ const r = !gn(e), a = await Lr(e);
2914
2989
  try {
2915
- const s = await Kn(n, { ...t, rig: a.rig, assets: a.assets }), l = s.destroy.bind(s);
2990
+ const o = t.lipSync === void 0 ? a.manifest.lipSync : { ...a.manifest.lipSync, ...At(t.lipSync) }, i = await rr(n, { ...t, ...o === void 0 ? {} : { lipSync: o }, rig: a.rig, assets: a.assets }), f = i.destroy.bind(i);
2916
2991
  let m = !1;
2917
- return Object.assign(s, { package: a, destroy() {
2992
+ return Object.assign(i, { package: a, destroy() {
2918
2993
  if (!m) {
2919
2994
  m = !0;
2920
2995
  try {
2921
- l();
2996
+ f();
2922
2997
  } finally {
2923
2998
  r && a.release();
2924
2999
  }
2925
3000
  }
2926
3001
  } });
2927
- } catch (s) {
2928
- throw r && a.release(), s;
3002
+ } catch (o) {
3003
+ throw r && a.release(), o;
2929
3004
  }
2930
3005
  }
2931
3006
  export {
2932
- Re as DEFAULT_LIGHTING,
2933
- Tr as LIVE_EXPRESSIONS,
2934
- De as PARAMS,
2935
- Sr as colorHex,
2936
- Kn as createMeshAvatar,
2937
- Rr as loadMeshAvatar,
2938
- Er as openAvatar,
2939
- Or as packAvatar,
2940
- An as parseLighting,
2941
- Le as parseManifest,
2942
- bt as parseRig,
2943
- Ar as unpackAvatar,
2944
- Qt as validateAvatarFiles,
2945
- Gt as validateRig
3007
+ Fe as DEFAULT_LIGHTING,
3008
+ kr as LIVE_EXPRESSIONS,
3009
+ We as PARAMS,
3010
+ _r as colorHex,
3011
+ rr as createMeshAvatar,
3012
+ Br as loadMeshAvatar,
3013
+ Lr as openAvatar,
3014
+ Fr as packAvatar,
3015
+ Tn as parseLighting,
3016
+ Be as parseManifest,
3017
+ wt as parseRig,
3018
+ Or as unpackAvatar,
3019
+ an as validateAvatarFiles,
3020
+ Qt as validateRig
2946
3021
  };