@extable/core 0.3.3 → 0.3.4

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.
@@ -0,0 +1,480 @@
1
+ import { v as at, g as rt, c as X, u as st, R as V, H as J, D as Q, d as _, e as N, h as it, i as lt, j as z, p as ct, k as dt, a as Y, b as tt, m as q, t as ut } from "../numberIO-CmW6eOR7.js";
2
+ class et {
3
+ constructor() {
4
+ this.parts = [];
5
+ }
6
+ openTag(e, t) {
7
+ let o = `<${e}`;
8
+ if (t)
9
+ for (const [i, a] of Object.entries(t))
10
+ a === !0 ? o += ` ${i}` : a !== !1 && a !== null && a !== void 0 && (o += ` ${i}="${I(String(a))}"`);
11
+ return o += ">", this.parts.push(o), this;
12
+ }
13
+ tag(e, t, o) {
14
+ let i = `<${e}`;
15
+ if (t)
16
+ for (const [a, c] of Object.entries(t))
17
+ c === !0 ? i += ` ${a}` : c !== !1 && c !== null && c !== void 0 && (i += ` ${a}="${I(String(c))}"`);
18
+ return i += ">", i += I(o), i += `</${e}>`, this.parts.push(i), this;
19
+ }
20
+ closeTag(e) {
21
+ return this.parts.push(`</${e}>`), this;
22
+ }
23
+ text(e) {
24
+ return this.parts.push(I(e)), this;
25
+ }
26
+ html(e) {
27
+ return this.parts.push(e), this;
28
+ }
29
+ build() {
30
+ return this.parts.join("");
31
+ }
32
+ }
33
+ function I(n) {
34
+ return n.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\"/g, "&quot;").replace(/'/g, "&#39;");
35
+ }
36
+ function O(n) {
37
+ const e = [];
38
+ for (const [t, o] of Object.entries(n)) {
39
+ if (o == null || o === !1) continue;
40
+ const i = gt(t);
41
+ e.push(`${i}:${String(o)};`);
42
+ }
43
+ return e.join("");
44
+ }
45
+ class ft {
46
+ constructor() {
47
+ this.rules = /* @__PURE__ */ new Map();
48
+ }
49
+ addRule(e, t) {
50
+ const o = this.rules.get(e) ?? {};
51
+ this.rules.set(e, { ...o, ...t });
52
+ }
53
+ build(e) {
54
+ const t = e?.minify ?? !1, o = [];
55
+ for (const [i, a] of this.rules.entries()) {
56
+ const c = O(a);
57
+ c && (t ? o.push(`${i}{${c}}`) : o.push(`${i} { ${c} }`));
58
+ }
59
+ return o.join(t ? "" : `
60
+ `);
61
+ }
62
+ }
63
+ function gt(n) {
64
+ return n.startsWith("--") ? n : n.includes("-") ? n.toLowerCase() : n.replace(/[A-Z]/g, (e) => `-${e.toLowerCase()}`);
65
+ }
66
+ function mt(n) {
67
+ const e = n.cssMode ?? "inline", t = n.wrapWithRoot ?? !1, o = at(n.defaultClass) ?? [], i = n.defaultStyle, a = n.includeStyles ?? !1, c = n.includeRawAttributes ?? !1, f = n.data ?? [], $ = {}, v = n.schema, T = v.columns, F = rt(v, $), y = T.some((s) => !!s.formula), B = T.some((s) => !!s.conditionalStyle) || !!v.row?.conditionalStyle, r = a && e !== "inline" ? new ft() : null, d = [], h = /* @__PURE__ */ new Map(), w = a ? /* @__PURE__ */ new Map() : null, g = T.map((s) => {
68
+ const u = String(s.key);
69
+ h.set(u, yt(s, a)), w && w.set(u, X(s));
70
+ const m = ["extable-cell"];
71
+ s.type === "boolean" && m.push("extable-boolean");
72
+ const M = s.wrapText;
73
+ m.push(M ? "cell-wrap" : "cell-nowrap");
74
+ const W = s.style?.align ?? (s.type === "number" || s.type === "int" || s.type === "uint" ? "right" : "left");
75
+ return m.push(W === "right" ? "align-right" : "align-left"), {
76
+ col: s,
77
+ colKey: u,
78
+ baseClass: m.join(" "),
79
+ tdAttrPrefix: ` class="${m.join(" ")} extable-editable" data-col-key="${I(
80
+ u
81
+ )}"`,
82
+ isActionType: s.type === "button" || s.type === "link"
83
+ };
84
+ }), k = T.some((s) => !!(s.readonly || s.style?.readonly || s.style?.disabled)) || f.some((s) => !!s._readonly);
85
+ if (!a && !c && !y && !B && !k)
86
+ return bt({
87
+ data: f,
88
+ columns: T,
89
+ columnMeta: g,
90
+ colWidths: F,
91
+ wrapWithRoot: t,
92
+ defaultClass: o,
93
+ defaultStyle: i,
94
+ valueFormatters: h
95
+ });
96
+ const C = new st(f, v, $), D = C.listRows(), b = t ? ["extable-root", ...o] : o, L = b.length ? `.${b[0]}` : 'table[data-extable-renderer="html"]';
97
+ if (r && e !== "inline")
98
+ for (const s of T) {
99
+ const u = U(X(s));
100
+ Object.keys(u).length !== 0 && r.addRule(`${L} tbody td[data-col-key="${String(s.key)}"]`, u);
101
+ }
102
+ const R = { width: `${V + F.reduce((s, u) => s + (u ?? 0), 0)}px` };
103
+ !t && i && Object.assign(R, P(i));
104
+ const S = {
105
+ "data-extable-renderer": "html"
106
+ };
107
+ !t && b.length && (S.class = b.join(" "));
108
+ const p = O(R);
109
+ p && (S.style = p);
110
+ const l = new et();
111
+ if (t) {
112
+ const s = {
113
+ class: b.join(" ").trim()
114
+ };
115
+ if (i) {
116
+ const u = O(P(i));
117
+ u && (s.style = u);
118
+ }
119
+ l.openTag("div", s), l.openTag("div", { class: "extable-shell" }), l.openTag("div", { class: "extable-viewport" });
120
+ }
121
+ l.openTag("table", S), l.openTag("thead"), l.openTag("tr", { style: `height:${J}px;` });
122
+ const H = {
123
+ class: "extable-row-header extable-corner",
124
+ "data-col-key": "",
125
+ style: `width:${V}px;`
126
+ };
127
+ return l.tag("th", H, ""), T.forEach((s, u) => {
128
+ const m = {
129
+ "data-col-key": s.key
130
+ }, M = F[u] ?? s.width;
131
+ M && (m.style = `width:${M}px;`), l.openTag("th", m), l.openTag("div", { class: "extable-col-header" }), l.tag("span", { class: "extable-col-header-text" }, s.header ?? String(s.key)), l.openTag("button", {
132
+ type: "button",
133
+ class: "extable-filter-sort-trigger",
134
+ "data-extable-fs-open": "1",
135
+ "data-extable-col-key": s.key,
136
+ title: "Filter / Sort"
137
+ }), l.html(nt()), l.closeTag("button"), l.closeTag("div"), l.closeTag("th");
138
+ }), l.closeTag("tr"), l.closeTag("thead"), l.openTag("tbody"), D.forEach((s, u) => {
139
+ const m = {
140
+ style: `height:${Q}px;`
141
+ };
142
+ l.openTag("tr", m);
143
+ const M = {
144
+ class: "extable-row-header"
145
+ }, W = C.getDisplayIndex(s.id) ?? "";
146
+ l.openTag("th", M).text(String(W)).closeTag("th");
147
+ for (const j of g)
148
+ pt({
149
+ html: l,
150
+ row: s,
151
+ rowIndex: u,
152
+ meta: j,
153
+ dataModel: C,
154
+ cssMode: e,
155
+ cssBuilder: r,
156
+ rootSelector: L,
157
+ errors: d,
158
+ valueFormatters: h,
159
+ baseStyles: w,
160
+ includeStyles: a,
161
+ includeRawAttributes: c,
162
+ hasInteraction: k
163
+ });
164
+ l.closeTag("tr");
165
+ }), l.closeTag("tbody"), l.closeTag("table"), t && (l.closeTag("div"), l.openTag("div", { class: "extable-overlay-layer" }).closeTag("div"), l.closeTag("div"), l.closeTag("div")), {
166
+ html: l.build(),
167
+ css: r?.build({ minify: !0 }),
168
+ metadata: {
169
+ rowCount: D.length,
170
+ columnCount: T.length,
171
+ hasFormulas: y,
172
+ hasConditionalStyles: B,
173
+ errors: d
174
+ }
175
+ };
176
+ }
177
+ function bt(n) {
178
+ const {
179
+ data: e,
180
+ columns: t,
181
+ columnMeta: o,
182
+ colWidths: i,
183
+ wrapWithRoot: a,
184
+ defaultClass: c,
185
+ defaultStyle: f,
186
+ valueFormatters: $
187
+ } = n, v = a ? ["extable-root", ...c] : c;
188
+ let T = V;
189
+ for (const d of i) T += d;
190
+ const F = { width: `${T}px` };
191
+ !a && f && Object.assign(F, P(f));
192
+ const y = {
193
+ "data-extable-renderer": "html"
194
+ };
195
+ !a && v.length && (y.class = v.join(" "));
196
+ const B = O(F);
197
+ B && (y.style = B);
198
+ const r = new et();
199
+ if (a) {
200
+ const d = {
201
+ class: v.join(" ").trim()
202
+ };
203
+ if (f) {
204
+ const h = O(P(f));
205
+ h && (d.style = h);
206
+ }
207
+ r.openTag("div", d), r.openTag("div", { class: "extable-shell" }), r.openTag("div", { class: "extable-viewport" });
208
+ }
209
+ r.openTag("table", y), r.openTag("thead"), r.openTag("tr", { style: `height:${J}px;` }), r.tag(
210
+ "th",
211
+ {
212
+ class: "extable-row-header extable-corner",
213
+ "data-col-key": "",
214
+ style: `width:${V}px;`
215
+ },
216
+ ""
217
+ ), t.forEach((d, h) => {
218
+ const w = {
219
+ "data-col-key": d.key
220
+ }, g = i[h] ?? d.width;
221
+ g && (w.style = `width:${g}px;`), r.openTag("th", w), r.openTag("div", { class: "extable-col-header" }), r.tag("span", { class: "extable-col-header-text" }, d.header ?? String(d.key)), r.openTag("button", {
222
+ type: "button",
223
+ class: "extable-filter-sort-trigger",
224
+ "data-extable-fs-open": "1",
225
+ "data-extable-col-key": d.key,
226
+ title: "Filter / Sort"
227
+ }), r.html(nt()), r.closeTag("button"), r.closeTag("div"), r.closeTag("th");
228
+ }), r.closeTag("tr"), r.closeTag("thead"), r.openTag("tbody");
229
+ for (let d = 0; d < e.length; d += 1) {
230
+ const h = e[d];
231
+ r.openTag("tr", {
232
+ style: `height:${Q}px;`
233
+ }), r.tag("th", { class: "extable-row-header" }, String(d + 1));
234
+ for (const w of o) {
235
+ const { col: g, colKey: k, tdAttrPrefix: A, isActionType: C } = w, D = $.get(k), b = h[k], L = D ? D(b) : { text: String(b ?? "") }, E = g.type === "tags" ? G(b) : null, R = C ? g.type === "button" ? Y(b) : tt(b) : null, S = C ? g.type === "button" ? _(b) : N(b) : "", p = C && R && S;
236
+ if (E && E.length)
237
+ r.openTag("td", {
238
+ class: `${w.baseClass} extable-editable`,
239
+ "data-col-key": g.key
240
+ }), r.openTag("div", { class: "extable-tag-list" }), E.forEach((l, H) => {
241
+ r.openTag("span", { class: "extable-tag" }), r.tag("span", { class: "extable-tag-label" }, l), r.openTag("button", {
242
+ type: "button",
243
+ class: "extable-tag-remove",
244
+ "data-extable-tag-remove": "1",
245
+ "data-extable-tag-index": String(H),
246
+ disabled: !1
247
+ }), r.text("×"), r.closeTag("button"), r.closeTag("span");
248
+ }), r.closeTag("div"), r.closeTag("td");
249
+ else if (p)
250
+ r.openTag("td", {
251
+ class: `${w.baseClass} extable-editable`,
252
+ "data-col-key": g.key
253
+ }), g.type === "button" ? r.tag(
254
+ "button",
255
+ { class: "extable-action-button", "data-extable-action": "button", type: "button" },
256
+ S
257
+ ) : r.tag(
258
+ "span",
259
+ { class: "extable-action-link", "data-extable-action": "link" },
260
+ S
261
+ ), r.closeTag("td");
262
+ else {
263
+ const l = I(S || L.text);
264
+ r.html(`<td${A}>${l}</td>`);
265
+ }
266
+ }
267
+ r.closeTag("tr");
268
+ }
269
+ return r.closeTag("tbody"), r.closeTag("table"), a && (r.closeTag("div"), r.openTag("div", { class: "extable-overlay-layer" }).closeTag("div"), r.closeTag("div"), r.closeTag("div")), {
270
+ html: r.build(),
271
+ metadata: {
272
+ rowCount: e.length,
273
+ columnCount: t.length,
274
+ hasFormulas: !1,
275
+ hasConditionalStyles: !1,
276
+ errors: []
277
+ }
278
+ };
279
+ }
280
+ function pt(n) {
281
+ const {
282
+ html: e,
283
+ row: t,
284
+ rowIndex: o,
285
+ meta: i,
286
+ dataModel: a,
287
+ cssMode: c,
288
+ cssBuilder: f,
289
+ rootSelector: $,
290
+ errors: v,
291
+ valueFormatters: T,
292
+ baseStyles: F,
293
+ includeStyles: y,
294
+ includeRawAttributes: B,
295
+ hasInteraction: r
296
+ } = n, { col: d, colKey: h, baseClass: w, isActionType: g } = i, k = r ? a.getCellInteraction(t.id, d.key) : { readonly: !1, muted: !1, disabled: !1 };
297
+ let A = w;
298
+ k.readonly ? A += " extable-readonly" : A += " extable-editable", k.muted && (A += " extable-readonly-muted"), k.disabled && (A += " extable-disabled");
299
+ const C = y ? a.resolveConditionalStyle(t.id, d) : { delta: null, forceErrorText: !1 }, D = y ? a.getCellStyle(t.id, d.key) : null, b = y ? F?.get(h) ?? {} : {}, L = y && C.delta ? q(b, C.delta) : b, E = y && D ? q(L, D) : L, R = y ? a.getCellDiagnostic(t.id, d.key) : null;
300
+ R && (A += R.level === "warning" ? " extable-diag-warning" : " extable-diag-error");
301
+ const S = a.getRawCell(t.id, d.key), p = a.resolveCellValue(t.id, d);
302
+ let l = p.textOverride ?? (C.forceErrorText ? "#ERROR" : void 0);
303
+ p.diagnostic?.source === "formula" && (l || (l = "#ERROR"), v.push({ row: o, col: h, message: p.diagnostic.message }));
304
+ const H = T.get(h), s = l ? { text: l } : H ? H(p.value) : { text: String(p.value ?? "") }, u = s.color && s.color !== E.textColor ? { ...E, textColor: s.color } : E, m = d.type === "tags" && !l ? G(p.value) : null, M = g ? d.type === "button" ? Y(p.value) : tt(p.value) : null, W = g ? d.type === "button" ? _(p.value) : N(p.value) : "", j = {
305
+ class: A,
306
+ "data-col-key": d.key
307
+ };
308
+ if (y && R && (j["data-extable-diag-message"] = R.message), B) {
309
+ const x = ut(S, p.value, d);
310
+ if (x !== null)
311
+ j["data-raw"] = x;
312
+ else {
313
+ const K = S == null ? "" : String(S);
314
+ j["data-raw"] = K;
315
+ }
316
+ }
317
+ if (y) {
318
+ if (c === "inline" || c === "both") {
319
+ if (Z(u)) {
320
+ const x = O(U(u));
321
+ x && (j.style = x);
322
+ }
323
+ } else if (c === "external" && f && Z(u)) {
324
+ const x = `${$} tbody tr:nth-child(${o + 1}) td[data-col-key="${h}"]`;
325
+ f.addRule(x, U(u));
326
+ }
327
+ }
328
+ const ot = g && !l && M && W;
329
+ if (m && m.length)
330
+ e.openTag("td", j), e.openTag("div", { class: "extable-tag-list" }), m.forEach((x, K) => {
331
+ e.openTag("span", { class: "extable-tag" }), e.tag("span", { class: "extable-tag-label" }, x), e.openTag("button", {
332
+ type: "button",
333
+ class: "extable-tag-remove",
334
+ "data-extable-tag-remove": "1",
335
+ "data-extable-tag-index": String(K),
336
+ disabled: k.readonly || k.disabled
337
+ }), e.text("×"), e.closeTag("button"), e.closeTag("span");
338
+ }), e.closeTag("div"), e.closeTag("td");
339
+ else if (ot) {
340
+ e.openTag("td", j);
341
+ const x = {
342
+ class: d.type === "button" ? "extable-action-button" : "extable-action-link",
343
+ "data-extable-action": d.type
344
+ };
345
+ k.disabled && (x.class = `${x.class} extable-action-disabled`), d.type === "button" ? (x.type = "button", e.tag("button", x, W)) : e.tag("span", x, W), e.closeTag("td");
346
+ } else
347
+ e.tag("td", j, W || s.text);
348
+ }
349
+ function yt(n, e) {
350
+ if (!e)
351
+ return ht(n);
352
+ if (n.type === "button")
353
+ return (t) => t == null ? { text: "" } : { text: _(t) || String(t) };
354
+ if (n.type === "link")
355
+ return (t) => t == null ? { text: "" } : { text: N(t) || String(t) };
356
+ if (n.type === "tags")
357
+ return (t) => {
358
+ if (t == null) return { text: "" };
359
+ const o = G(t);
360
+ return o ? { text: o.join(", ") } : { text: String(t) };
361
+ };
362
+ if (n.type === "enum")
363
+ return (t) => {
364
+ if (t == null) return { text: "" };
365
+ if (t && typeof t == "object") {
366
+ const o = t;
367
+ if (o.kind === "enum" && typeof o.value == "string")
368
+ return { text: o.value };
369
+ }
370
+ return { text: String(t) };
371
+ };
372
+ if (n.type === "boolean")
373
+ return (t) => t == null ? { text: "" } : n.format === "checkbox" || !n.format ? { text: t ? "☑" : "☐" } : Array.isArray(n.format) && n.format.length >= 2 ? { text: String(t ? n.format[0] : n.format[1]) } : { text: t ? String(n.format) : "" };
374
+ if (n.type === "number") {
375
+ const t = n.format;
376
+ if ((t?.format ?? "decimal") === "scientific")
377
+ return (c) => {
378
+ if (c == null) return { text: "" };
379
+ if (typeof c != "number") return { text: String(c) };
380
+ const f = it(c, {
381
+ format: "scientific",
382
+ precision: t?.precision
383
+ }), $ = t?.negativeRed && c < 0 ? "#b91c1c" : void 0;
384
+ return { text: f, color: $ };
385
+ };
386
+ const i = {};
387
+ t?.scale !== void 0 && (i.minimumFractionDigits = t.scale, i.maximumFractionDigits = t.scale), i.useGrouping = !!t?.thousandSeparator;
388
+ const a = new Intl.NumberFormat("en-US", i);
389
+ return (c) => {
390
+ if (c == null) return { text: "" };
391
+ if (typeof c != "number") return { text: String(c) };
392
+ const f = a.format(c), $ = t?.negativeRed && c < 0 ? "#b91c1c" : void 0;
393
+ return { text: f, color: $ };
394
+ };
395
+ }
396
+ if (n.type === "int" || n.type === "uint") {
397
+ const t = n.format, o = t?.format ?? "decimal";
398
+ if (o === "binary" || o === "octal" || o === "hex")
399
+ return (a) => {
400
+ if (a == null) return { text: "" };
401
+ if (typeof a != "number") return { text: String(a) };
402
+ const c = lt(a, o), f = t?.negativeRed && a < 0 ? "#b91c1c" : void 0;
403
+ return { text: c, color: f };
404
+ };
405
+ const i = new Intl.NumberFormat("en-US", {
406
+ minimumFractionDigits: 0,
407
+ maximumFractionDigits: 0,
408
+ useGrouping: !!t?.thousandSeparator
409
+ });
410
+ return (a) => {
411
+ if (a == null) return { text: "" };
412
+ if (typeof a != "number") return { text: String(a) };
413
+ const c = i.format(a), f = t?.negativeRed && a < 0 ? "#b91c1c" : void 0;
414
+ return { text: c, color: f };
415
+ };
416
+ }
417
+ if (n.type === "date" || n.type === "time" || n.type === "datetime") {
418
+ const t = n.format, o = n.type === "date" ? z(t, "date") : n.type === "time" ? z(t, "time") : z(t, "datetime");
419
+ return (i) => {
420
+ if (i == null) return { text: "" };
421
+ let a = null;
422
+ return i instanceof Date ? a = i : typeof i == "string" && (a = ct(i)), a ? { text: dt(a, o) } : { text: String(i) };
423
+ };
424
+ }
425
+ return (t) => t == null ? { text: "" } : { text: String(t) };
426
+ }
427
+ function ht(n) {
428
+ return n.type === "button" ? (e) => e == null ? { text: "" } : { text: _(e) || String(e) } : n.type === "link" ? (e) => e == null ? { text: "" } : { text: N(e) || String(e) } : n.type === "tags" ? (e) => {
429
+ if (e == null) return { text: "" };
430
+ const t = G(e);
431
+ return t ? { text: t.join(", ") } : { text: String(e) };
432
+ } : n.type === "enum" ? (e) => {
433
+ if (e == null) return { text: "" };
434
+ if (e && typeof e == "object") {
435
+ const t = e;
436
+ if (t.kind === "enum" && typeof t.value == "string")
437
+ return { text: t.value };
438
+ }
439
+ return { text: String(e) };
440
+ } : (e) => e == null ? { text: "" } : { text: String(e) };
441
+ }
442
+ function G(n) {
443
+ if (Array.isArray(n) && n.every((e) => typeof e == "string"))
444
+ return n;
445
+ if (n && typeof n == "object") {
446
+ const e = n;
447
+ if (e.kind === "tags") {
448
+ const t = e.values;
449
+ if (Array.isArray(t))
450
+ return t.filter((o) => typeof o == "string");
451
+ }
452
+ }
453
+ return null;
454
+ }
455
+ function Z(n) {
456
+ return !!(n.backgroundColor || n.textColor || n.bold || n.italic || n.underline || n.strike);
457
+ }
458
+ function U(n) {
459
+ const e = {};
460
+ n.backgroundColor && (e.backgroundColor = n.backgroundColor), n.textColor && (e.color = n.textColor), n.bold && (e.fontWeight = "600"), n.italic && (e.fontStyle = "italic");
461
+ const t = [];
462
+ return n.underline && t.push("underline"), n.strike && t.push("line-through"), t.length && (e.textDecorationLine = t.join(" ")), e;
463
+ }
464
+ function nt() {
465
+ return `
466
+ <svg viewBox="0 0 24 24" width="16" height="16" aria-hidden="true" focusable="false">
467
+ <path d="M3 5h18l-7 8v6l-4 2v-8L3 5z" fill="none" stroke="currentColor" stroke-width="2" stroke-linejoin="round"/>
468
+ </svg>
469
+ `.trim();
470
+ }
471
+ function P(n) {
472
+ const e = {};
473
+ for (const [t, o] of Object.entries(n))
474
+ o == null || o === "" || typeof o != "string" && typeof o != "number" || (e[t] = o);
475
+ return e;
476
+ }
477
+ export {
478
+ mt as renderTableHTML
479
+ };
480
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/ssr/htmlBuilder.ts","../../src/ssr/styleSerializer.ts","../../src/ssr/renderer.ts"],"sourcesContent":["export type HTMLAttributeValue = string | number | boolean | null | undefined;\n\nexport class HTMLBuilder {\n private parts: string[] = [];\n\n openTag(tag: string, attrs?: Record<string, HTMLAttributeValue>): this {\n let html = `<${tag}`;\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === true) {\n html += ` ${key}`;\n } else if (value !== false && value !== null && value !== undefined) {\n html += ` ${key}=\"${escapeHtml(String(value))}\"`;\n }\n }\n }\n html += \">\";\n this.parts.push(html);\n return this;\n }\n\n tag(tag: string, attrs: Record<string, HTMLAttributeValue> | undefined, content: string): this {\n let html = `<${tag}`;\n if (attrs) {\n for (const [key, value] of Object.entries(attrs)) {\n if (value === true) {\n html += ` ${key}`;\n } else if (value !== false && value !== null && value !== undefined) {\n html += ` ${key}=\"${escapeHtml(String(value))}\"`;\n }\n }\n }\n html += \">\";\n html += escapeHtml(content);\n html += `</${tag}>`;\n this.parts.push(html);\n return this;\n }\n\n closeTag(tag: string): this {\n this.parts.push(`</${tag}>`);\n return this;\n }\n\n text(content: string): this {\n this.parts.push(escapeHtml(content));\n return this;\n }\n\n html(content: string): this {\n this.parts.push(content);\n return this;\n }\n\n build(): string {\n return this.parts.join(\"\");\n }\n}\n\nexport function escapeHtml(text: string): string {\n return text\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\\\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n}\n","export type CSSValue = string | number | null | undefined | false;\nexport type CSSStyleMap = Record<string, CSSValue>;\n\nexport function serializeStyle(style: CSSStyleMap): string {\n const parts: string[] = [];\n for (const [key, value] of Object.entries(style)) {\n if (value === null || value === undefined || value === false) continue;\n const prop = toKebabCase(key);\n parts.push(`${prop}:${String(value)};`);\n }\n return parts.join(\"\");\n}\n\nexport class CSSBuilder {\n private rules = new Map<string, CSSStyleMap>();\n\n addRule(selector: string, style: CSSStyleMap) {\n const prev = this.rules.get(selector) ?? {};\n this.rules.set(selector, { ...prev, ...style });\n }\n\n build(options?: { minify?: boolean }): string {\n const minify = options?.minify ?? false;\n const lines: string[] = [];\n for (const [selector, style] of this.rules.entries()) {\n const body = serializeStyle(style);\n if (!body) continue;\n if (minify) {\n lines.push(`${selector}{${body}}`);\n } else {\n lines.push(`${selector} { ${body} }`);\n }\n }\n return lines.join(minify ? \"\" : \"\\n\");\n }\n}\n\nfunction toKebabCase(input: string): string {\n if (input.startsWith(\"--\")) return input;\n if (input.includes(\"-\")) return input.toLowerCase();\n return input.replace(/[A-Z]/g, (m) => `-${m.toLowerCase()}`);\n}\n","import { DataModel } from \"../dataModel\";\nimport { columnFormatToStyle, mergeStyle } from \"../styleResolver\";\nimport type {\n ColumnSchema,\n InternalRow,\n NumberFormat,\n IntegerFormat,\n Schema,\n View,\n RowObject,\n ResolvedCellStyle,\n} from \"../types\";\nimport { coerceDatePattern, formatDateLite, parseIsoDate } from \"../dateUtils\";\nimport { formatIntegerWithPrefix, formatNumberForEdit } from \"../numberIO\";\nimport { toRawValue } from \"../cellValueCodec\";\nimport { getButtonLabel, getLinkLabel, resolveButtonAction, resolveLinkAction } from \"../actionValue\";\nimport { DEFAULT_ROW_HEIGHT_PX, HEADER_HEIGHT_PX, ROW_HEADER_WIDTH_PX, getColumnWidths } from \"../geometry\";\nimport { toArray } from \"../utils\";\nimport { HTMLBuilder, escapeHtml } from \"./htmlBuilder\";\nimport { CSSBuilder, type CSSStyleMap, serializeStyle } from \"./styleSerializer\";\n\nexport interface SSROptions<T extends object = Record<string, unknown>> {\n data: T[] | null | undefined;\n schema: Schema<any>;\n cssMode?: \"inline\" | \"external\" | \"both\";\n wrapWithRoot?: boolean;\n defaultClass?: string | string[];\n defaultStyle?: Partial<CSSStyleDeclaration>;\n includeStyles?: boolean;\n includeRawAttributes?: boolean;\n}\n\nexport interface SSRResult {\n html: string;\n css?: string;\n metadata: {\n rowCount: number;\n columnCount: number;\n hasFormulas: boolean;\n hasConditionalStyles: boolean;\n errors: Array<{ row: number; col: string; message: string }>;\n };\n}\n\nexport function renderTableHTML<T extends object = Record<string, unknown>>(\n options: SSROptions<T>,\n): SSRResult {\n const cssMode = options.cssMode ?? \"inline\";\n const wrapWithRoot = options.wrapWithRoot ?? false;\n const defaultClass = toArray(options.defaultClass) ?? [];\n const defaultStyle = options.defaultStyle;\n const includeStyles = options.includeStyles ?? false;\n const includeRawAttributes = options.includeRawAttributes ?? false;\n const data = (options.data ?? []) as RowObject[];\n\n const baseView: View = {};\n const schema = options.schema;\n const columns = schema.columns;\n const colWidths = getColumnWidths(schema, baseView);\n const hasFormulas = columns.some((c) => Boolean(c.formula));\n const hasConditionalStyles =\n columns.some((c) => Boolean(c.conditionalStyle)) || Boolean(schema.row?.conditionalStyle);\n\n const cssBuilder = includeStyles && cssMode !== \"inline\" ? new CSSBuilder() : null;\n const errors: Array<{ row: number; col: string; message: string }> = [];\n const valueFormatters = new Map<string, (value: unknown) => { text: string; color?: string }>();\n const baseStyles = includeStyles ? new Map<string, ResolvedCellStyle>() : null;\n const columnMeta = columns.map((col) => {\n const colKey = String(col.key);\n valueFormatters.set(colKey, createValueFormatter(col, includeStyles));\n if (baseStyles) baseStyles.set(colKey, columnFormatToStyle(col));\n const baseClasses = [\"extable-cell\"];\n if (col.type === \"boolean\") baseClasses.push(\"extable-boolean\");\n const wrap = col.wrapText;\n baseClasses.push(wrap ? \"cell-wrap\" : \"cell-nowrap\");\n const align =\n col.style?.align ??\n (col.type === \"number\" || col.type === \"int\" || col.type === \"uint\" ? \"right\" : \"left\");\n baseClasses.push(align === \"right\" ? \"align-right\" : \"align-left\");\n return {\n col,\n colKey,\n baseClass: baseClasses.join(\" \"),\n tdAttrPrefix: ` class=\"${baseClasses.join(\" \")} extable-editable\" data-col-key=\"${escapeHtml(\n colKey,\n )}\"`,\n isActionType: col.type === \"button\" || col.type === \"link\",\n };\n });\n const hasInteraction =\n columns.some((col) => Boolean(col.readonly || col.style?.readonly || col.style?.disabled)) ||\n data.some((row) => Boolean(row._readonly));\n const useFastPath =\n !includeStyles &&\n !includeRawAttributes &&\n !hasFormulas &&\n !hasConditionalStyles &&\n !hasInteraction;\n\n if (useFastPath) {\n return renderFastTableHTML({\n data,\n columns,\n columnMeta,\n colWidths,\n wrapWithRoot,\n defaultClass,\n defaultStyle,\n valueFormatters,\n });\n }\n\n const dataModel = new DataModel(data, schema, baseView);\n const rows = dataModel.listRows();\n\n const rootClasses = wrapWithRoot ? [\"extable-root\", ...defaultClass] : defaultClass;\n const rootSelector = rootClasses.length ? `.${rootClasses[0]}` : 'table[data-extable-renderer=\"html\"]';\n\n if (cssBuilder && cssMode !== \"inline\") {\n for (const col of columns) {\n const baseStyle = resolvedStyleToMap(columnFormatToStyle(col));\n if (Object.keys(baseStyle).length === 0) continue;\n cssBuilder.addRule(`${rootSelector} tbody td[data-col-key=\\\"${String(col.key)}\\\"]`, baseStyle);\n }\n }\n\n const totalWidth = ROW_HEADER_WIDTH_PX + colWidths.reduce((acc, w) => acc + (w ?? 0), 0);\n const tableStyle: CSSStyleMap = { width: `${totalWidth}px` };\n if (!wrapWithRoot && defaultStyle) {\n Object.assign(tableStyle, normalizeStyle(defaultStyle));\n }\n const tableAttrs: Record<string, string | number | boolean> = {\n \"data-extable-renderer\": \"html\",\n };\n if (!wrapWithRoot && rootClasses.length) {\n tableAttrs.class = rootClasses.join(\" \");\n }\n const tableStyleAttr = serializeStyle(tableStyle);\n if (tableStyleAttr) {\n tableAttrs.style = tableStyleAttr;\n }\n\n const html = new HTMLBuilder();\n if (wrapWithRoot) {\n const rootAttrs: Record<string, string | number | boolean> = {\n class: rootClasses.join(\" \").trim(),\n };\n if (defaultStyle) {\n const rootStyle = serializeStyle(normalizeStyle(defaultStyle));\n if (rootStyle) rootAttrs.style = rootStyle;\n }\n html.openTag(\"div\", rootAttrs);\n html.openTag(\"div\", { class: \"extable-shell\" });\n html.openTag(\"div\", { class: \"extable-viewport\" });\n }\n\n html.openTag(\"table\", tableAttrs);\n html.openTag(\"thead\");\n html.openTag(\"tr\", { style: `height:${HEADER_HEIGHT_PX}px;` });\n\n const rowHeaderAttrs: Record<string, string | number | boolean> = {\n class: \"extable-row-header extable-corner\",\n \"data-col-key\": \"\",\n style: `width:${ROW_HEADER_WIDTH_PX}px;`,\n };\n html.tag(\"th\", rowHeaderAttrs, \"\");\n\n columns.forEach((col, colIndex) => {\n const thAttrs: Record<string, string | number | boolean> = {\n \"data-col-key\": col.key,\n };\n const width = colWidths[colIndex] ?? col.width;\n if (width) thAttrs.style = `width:${width}px;`;\n\n html.openTag(\"th\", thAttrs);\n html.openTag(\"div\", { class: \"extable-col-header\" });\n html.tag(\"span\", { class: \"extable-col-header-text\" }, col.header ?? String(col.key));\n html.openTag(\"button\", {\n type: \"button\",\n class: \"extable-filter-sort-trigger\",\n \"data-extable-fs-open\": \"1\",\n \"data-extable-col-key\": col.key,\n title: \"Filter / Sort\",\n });\n html.html(svgFunnel());\n html.closeTag(\"button\");\n html.closeTag(\"div\");\n html.closeTag(\"th\");\n });\n\n html.closeTag(\"tr\");\n html.closeTag(\"thead\");\n html.openTag(\"tbody\");\n\n rows.forEach((row, rowIndex) => {\n const trAttrs: Record<string, string | number | boolean> = {\n style: `height:${DEFAULT_ROW_HEIGHT_PX}px;`,\n };\n html.openTag(\"tr\", trAttrs);\n\n const rowHeader: Record<string, string | number | boolean> = {\n class: \"extable-row-header\",\n };\n const displayIndex = dataModel.getDisplayIndex(row.id) ?? \"\";\n html.openTag(\"th\", rowHeader).text(String(displayIndex)).closeTag(\"th\");\n\n for (const meta of columnMeta) {\n renderCell({\n html,\n row,\n rowIndex,\n meta,\n dataModel,\n cssMode,\n cssBuilder,\n rootSelector,\n errors,\n valueFormatters,\n baseStyles,\n includeStyles,\n includeRawAttributes,\n hasInteraction,\n });\n }\n\n html.closeTag(\"tr\");\n });\n\n html.closeTag(\"tbody\");\n html.closeTag(\"table\");\n\n if (wrapWithRoot) {\n html.closeTag(\"div\");\n html.openTag(\"div\", { class: \"extable-overlay-layer\" }).closeTag(\"div\");\n html.closeTag(\"div\");\n html.closeTag(\"div\");\n }\n\n return {\n html: html.build(),\n css: cssBuilder?.build({ minify: true }),\n metadata: {\n rowCount: rows.length,\n columnCount: columns.length,\n hasFormulas,\n hasConditionalStyles,\n errors,\n },\n };\n}\n\nfunction renderFastTableHTML(options: {\n data: RowObject[];\n columns: ColumnSchema[];\n columnMeta: Array<{\n col: ColumnSchema;\n colKey: string;\n baseClass: string;\n tdAttrPrefix: string;\n isActionType: boolean;\n }>;\n colWidths: number[];\n wrapWithRoot: boolean;\n defaultClass: string[];\n defaultStyle: Partial<CSSStyleDeclaration> | undefined;\n valueFormatters: Map<string, (value: unknown) => { text: string; color?: string }>;\n}): SSRResult {\n const {\n data,\n columns,\n columnMeta,\n colWidths,\n wrapWithRoot,\n defaultClass,\n defaultStyle,\n valueFormatters,\n } = options;\n const rootClasses = wrapWithRoot ? [\"extable-root\", ...defaultClass] : defaultClass;\n\n let totalWidth = ROW_HEADER_WIDTH_PX;\n for (const width of colWidths) totalWidth += width;\n const tableStyle: CSSStyleMap = { width: `${totalWidth}px` };\n if (!wrapWithRoot && defaultStyle) {\n Object.assign(tableStyle, normalizeStyle(defaultStyle));\n }\n const tableAttrs: Record<string, string | number | boolean> = {\n \"data-extable-renderer\": \"html\",\n };\n if (!wrapWithRoot && rootClasses.length) {\n tableAttrs.class = rootClasses.join(\" \");\n }\n const tableStyleAttr = serializeStyle(tableStyle);\n if (tableStyleAttr) {\n tableAttrs.style = tableStyleAttr;\n }\n\n const html = new HTMLBuilder();\n if (wrapWithRoot) {\n const rootAttrs: Record<string, string | number | boolean> = {\n class: rootClasses.join(\" \").trim(),\n };\n if (defaultStyle) {\n const rootStyle = serializeStyle(normalizeStyle(defaultStyle));\n if (rootStyle) rootAttrs.style = rootStyle;\n }\n html.openTag(\"div\", rootAttrs);\n html.openTag(\"div\", { class: \"extable-shell\" });\n html.openTag(\"div\", { class: \"extable-viewport\" });\n }\n\n html.openTag(\"table\", tableAttrs);\n html.openTag(\"thead\");\n html.openTag(\"tr\", { style: `height:${HEADER_HEIGHT_PX}px;` });\n html.tag(\n \"th\",\n {\n class: \"extable-row-header extable-corner\",\n \"data-col-key\": \"\",\n style: `width:${ROW_HEADER_WIDTH_PX}px;`,\n },\n \"\",\n );\n columns.forEach((col, colIndex) => {\n const thAttrs: Record<string, string | number | boolean> = {\n \"data-col-key\": col.key,\n };\n const width = colWidths[colIndex] ?? col.width;\n if (width) thAttrs.style = `width:${width}px;`;\n html.openTag(\"th\", thAttrs);\n html.openTag(\"div\", { class: \"extable-col-header\" });\n html.tag(\"span\", { class: \"extable-col-header-text\" }, col.header ?? String(col.key));\n html.openTag(\"button\", {\n type: \"button\",\n class: \"extable-filter-sort-trigger\",\n \"data-extable-fs-open\": \"1\",\n \"data-extable-col-key\": col.key,\n title: \"Filter / Sort\",\n });\n html.html(svgFunnel());\n html.closeTag(\"button\");\n html.closeTag(\"div\");\n html.closeTag(\"th\");\n });\n html.closeTag(\"tr\");\n html.closeTag(\"thead\");\n html.openTag(\"tbody\");\n\n for (let rowIndex = 0; rowIndex < data.length; rowIndex += 1) {\n const row = data[rowIndex] as RowObject;\n html.openTag(\"tr\", {\n style: `height:${DEFAULT_ROW_HEIGHT_PX}px;`,\n });\n html.tag(\"th\", { class: \"extable-row-header\" }, String(rowIndex + 1));\n for (const meta of columnMeta) {\n const { col, colKey, tdAttrPrefix, isActionType } = meta;\n const formatter = valueFormatters.get(colKey);\n const value = (row as Record<string, unknown>)[colKey];\n const formatted = formatter ? formatter(value) : { text: String(value ?? \"\") };\n const tagValues = col.type === \"tags\" ? resolveTagValues(value) : null;\n const actionValue = isActionType\n ? col.type === \"button\"\n ? resolveButtonAction(value)\n : resolveLinkAction(value)\n : null;\n const actionLabel = isActionType\n ? col.type === \"button\"\n ? getButtonLabel(value)\n : getLinkLabel(value)\n : \"\";\n const hasActionContent = isActionType && actionValue && actionLabel;\n if (tagValues && tagValues.length) {\n html.openTag(\"td\", {\n class: `${meta.baseClass} extable-editable`,\n \"data-col-key\": col.key,\n });\n html.openTag(\"div\", { class: \"extable-tag-list\" });\n tagValues.forEach((tag, index) => {\n html.openTag(\"span\", { class: \"extable-tag\" });\n html.tag(\"span\", { class: \"extable-tag-label\" }, tag);\n html.openTag(\"button\", {\n type: \"button\",\n class: \"extable-tag-remove\",\n \"data-extable-tag-remove\": \"1\",\n \"data-extable-tag-index\": String(index),\n disabled: false,\n });\n html.text(\"×\");\n html.closeTag(\"button\");\n html.closeTag(\"span\");\n });\n html.closeTag(\"div\");\n html.closeTag(\"td\");\n } else if (hasActionContent) {\n html.openTag(\"td\", {\n class: `${meta.baseClass} extable-editable`,\n \"data-col-key\": col.key,\n });\n if (col.type === \"button\") {\n html.tag(\n \"button\",\n { class: \"extable-action-button\", \"data-extable-action\": \"button\", type: \"button\" },\n actionLabel,\n );\n } else {\n html.tag(\n \"span\",\n { class: \"extable-action-link\", \"data-extable-action\": \"link\" },\n actionLabel,\n );\n }\n html.closeTag(\"td\");\n } else {\n const text = escapeHtml(actionLabel || formatted.text);\n html.html(`<td${tdAttrPrefix}>${text}</td>`);\n }\n }\n html.closeTag(\"tr\");\n }\n\n html.closeTag(\"tbody\");\n html.closeTag(\"table\");\n\n if (wrapWithRoot) {\n html.closeTag(\"div\");\n html.openTag(\"div\", { class: \"extable-overlay-layer\" }).closeTag(\"div\");\n html.closeTag(\"div\");\n html.closeTag(\"div\");\n }\n\n return {\n html: html.build(),\n metadata: {\n rowCount: data.length,\n columnCount: columns.length,\n hasFormulas: false,\n hasConditionalStyles: false,\n errors: [],\n },\n };\n}\n\nfunction renderCell(options: {\n html: HTMLBuilder;\n row: InternalRow;\n rowIndex: number;\n meta: {\n col: ColumnSchema;\n colKey: string;\n baseClass: string;\n isActionType: boolean;\n };\n dataModel: DataModel;\n cssMode: \"inline\" | \"external\" | \"both\";\n cssBuilder: CSSBuilder | null;\n rootSelector: string;\n errors: Array<{ row: number; col: string; message: string }>;\n valueFormatters: Map<string, (value: unknown) => { text: string; color?: string }>;\n baseStyles: Map<string, ResolvedCellStyle> | null;\n includeStyles: boolean;\n includeRawAttributes: boolean;\n hasInteraction: boolean;\n}) {\n const {\n html,\n row,\n rowIndex,\n meta,\n dataModel,\n cssMode,\n cssBuilder,\n rootSelector,\n errors,\n valueFormatters,\n baseStyles,\n includeStyles,\n includeRawAttributes,\n hasInteraction,\n } = options;\n\n const { col, colKey, baseClass, isActionType } = meta;\n\n const interaction = hasInteraction\n ? dataModel.getCellInteraction(row.id, col.key)\n : { readonly: false, muted: false, disabled: false };\n let className = baseClass;\n if (interaction.readonly) className += \" extable-readonly\";\n else className += \" extable-editable\";\n if (interaction.muted) className += \" extable-readonly-muted\";\n if (interaction.disabled) className += \" extable-disabled\";\n\n const condRes = includeStyles\n ? dataModel.resolveConditionalStyle(row.id, col)\n : { delta: null, forceErrorText: false };\n const cellStyle = includeStyles ? dataModel.getCellStyle(row.id, col.key) : null;\n const baseStyle = includeStyles ? baseStyles?.get(colKey) ?? {} : {};\n const withCond = includeStyles && condRes.delta ? mergeStyle(baseStyle, condRes.delta) : baseStyle;\n const resolved = includeStyles && cellStyle ? mergeStyle(withCond, cellStyle) : withCond;\n\n const diagnostic = includeStyles ? dataModel.getCellDiagnostic(row.id, col.key) : null;\n if (diagnostic) {\n className += diagnostic.level === \"warning\" ? \" extable-diag-warning\" : \" extable-diag-error\";\n }\n\n const raw = dataModel.getRawCell(row.id, col.key);\n const valueRes = dataModel.resolveCellValue(row.id, col);\n let textOverride = valueRes.textOverride ?? (condRes.forceErrorText ? \"#ERROR\" : undefined);\n\n if (valueRes.diagnostic?.source === \"formula\") {\n if (!textOverride) textOverride = \"#ERROR\";\n errors.push({ row: rowIndex, col: colKey, message: valueRes.diagnostic.message });\n }\n\n const formatter = valueFormatters.get(colKey);\n const formatted = textOverride\n ? { text: textOverride }\n : (formatter ? formatter(valueRes.value) : { text: String(valueRes.value ?? \"\") });\n const resolvedWithFormat =\n formatted.color && formatted.color !== resolved.textColor\n ? { ...resolved, textColor: formatted.color }\n : resolved;\n\n const tagValues = col.type === \"tags\" && !textOverride ? resolveTagValues(valueRes.value) : null;\n const actionValue = isActionType\n ? col.type === \"button\"\n ? resolveButtonAction(valueRes.value)\n : resolveLinkAction(valueRes.value)\n : null;\n const actionLabel = isActionType\n ? col.type === \"button\"\n ? getButtonLabel(valueRes.value)\n : getLinkLabel(valueRes.value)\n : \"\";\n\n const tdAttrs: Record<string, string | number | boolean> = {\n class: className,\n \"data-col-key\": col.key,\n };\n\n if (includeStyles && diagnostic) tdAttrs[\"data-extable-diag-message\"] = diagnostic.message;\n\n if (includeRawAttributes) {\n const rawNumbered = toRawValue(raw, valueRes.value, col);\n if (rawNumbered !== null) {\n tdAttrs[\"data-raw\"] = rawNumbered;\n } else {\n const rawStr = raw === null || raw === undefined ? \"\" : String(raw);\n tdAttrs[\"data-raw\"] = rawStr;\n }\n }\n\n if (includeStyles) {\n if (cssMode === \"inline\" || cssMode === \"both\") {\n if (hasRenderableStyle(resolvedWithFormat)) {\n const inlineStyle = serializeStyle(resolvedStyleToMap(resolvedWithFormat));\n if (inlineStyle) tdAttrs.style = inlineStyle;\n }\n } else if (cssMode === \"external\" && cssBuilder && hasRenderableStyle(resolvedWithFormat)) {\n const selector = `${rootSelector} tbody tr:nth-child(${rowIndex + 1}) td[data-col-key=\\\"${colKey}\\\"]`;\n cssBuilder.addRule(selector, resolvedStyleToMap(resolvedWithFormat));\n }\n }\n\n const hasActionContent = isActionType && !textOverride && actionValue && actionLabel;\n if (tagValues && tagValues.length) {\n html.openTag(\"td\", tdAttrs);\n html.openTag(\"div\", { class: \"extable-tag-list\" });\n tagValues.forEach((tag, index) => {\n html.openTag(\"span\", { class: \"extable-tag\" });\n html.tag(\"span\", { class: \"extable-tag-label\" }, tag);\n html.openTag(\"button\", {\n type: \"button\",\n class: \"extable-tag-remove\",\n \"data-extable-tag-remove\": \"1\",\n \"data-extable-tag-index\": String(index),\n disabled: interaction.readonly || interaction.disabled,\n });\n html.text(\"×\");\n html.closeTag(\"button\");\n html.closeTag(\"span\");\n });\n html.closeTag(\"div\");\n html.closeTag(\"td\");\n } else if (hasActionContent) {\n html.openTag(\"td\", tdAttrs);\n const actionAttrs: Record<string, string | number | boolean> = {\n class: col.type === \"button\" ? \"extable-action-button\" : \"extable-action-link\",\n \"data-extable-action\": col.type,\n };\n if (interaction.disabled) {\n actionAttrs.class = `${actionAttrs.class} extable-action-disabled`;\n }\n if (col.type === \"button\") {\n actionAttrs.type = \"button\";\n html.tag(\"button\", actionAttrs, actionLabel);\n } else {\n html.tag(\"span\", actionAttrs, actionLabel);\n }\n html.closeTag(\"td\");\n } else {\n html.tag(\"td\", tdAttrs, actionLabel || formatted.text);\n }\n}\n\nfunction createValueFormatter(\n col: ColumnSchema,\n includeStyles: boolean,\n): (value: unknown) => { text: string; color?: string } {\n if (!includeStyles) {\n return createFastValueFormatter(col);\n }\n if (col.type === \"button\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n };\n }\n if (col.type === \"link\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n };\n }\n if (col.type === \"tags\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n return { text: String(value) };\n };\n }\n if (col.type === \"enum\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"enum\" && typeof obj.value === \"string\") {\n return { text: obj.value };\n }\n }\n return { text: String(value) };\n };\n }\n if (col.type === \"boolean\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (col.format === \"checkbox\" || !col.format) {\n return { text: value ? \"☑\" : \"☐\" };\n }\n if (Array.isArray(col.format) && col.format.length >= 2) {\n return { text: value ? String(col.format[0]) : String(col.format[1]) };\n }\n return { text: value ? String(col.format) : \"\" };\n };\n }\n if (col.type === \"number\") {\n const fmt = col.format as NumberFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"scientific\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value !== \"number\") return { text: String(value) };\n const text = formatNumberForEdit(value, {\n format: \"scientific\",\n precision: fmt?.precision,\n });\n const color = fmt?.negativeRed && value < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n };\n }\n const opts: Intl.NumberFormatOptions = {};\n if (fmt?.scale !== undefined) {\n opts.minimumFractionDigits = fmt.scale;\n opts.maximumFractionDigits = fmt.scale;\n }\n opts.useGrouping = Boolean(fmt?.thousandSeparator);\n const formatter = new Intl.NumberFormat(\"en-US\", opts);\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value !== \"number\") return { text: String(value) };\n const text = formatter.format(value);\n const color = fmt?.negativeRed && value < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n };\n }\n if (col.type === \"int\" || col.type === \"uint\") {\n const fmt = col.format as IntegerFormat | undefined;\n const token = fmt?.format ?? \"decimal\";\n if (token === \"binary\" || token === \"octal\" || token === \"hex\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value !== \"number\") return { text: String(value) };\n const text = formatIntegerWithPrefix(value, token);\n const color = fmt?.negativeRed && value < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n };\n }\n const formatter = new Intl.NumberFormat(\"en-US\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n useGrouping: Boolean(fmt?.thousandSeparator),\n });\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (typeof value !== \"number\") return { text: String(value) };\n const text = formatter.format(value);\n const color = fmt?.negativeRed && value < 0 ? \"#b91c1c\" : undefined;\n return { text, color };\n };\n }\n if (col.type === \"date\" || col.type === \"time\" || col.type === \"datetime\") {\n const fmtValue = col.format as string | undefined;\n const fmt =\n col.type === \"date\"\n ? coerceDatePattern(fmtValue, \"date\")\n : col.type === \"time\"\n ? coerceDatePattern(fmtValue, \"time\")\n : coerceDatePattern(fmtValue, \"datetime\");\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n let d: Date | null = null;\n if (value instanceof Date) d = value;\n else if (typeof value === \"string\") d = parseIsoDate(value);\n if (!d) return { text: String(value) };\n return { text: formatDateLite(d, fmt) };\n };\n }\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n return { text: String(value) };\n };\n}\n\nfunction createFastValueFormatter(col: ColumnSchema): (value: unknown) => { text: string; color?: string } {\n if (col.type === \"button\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const label = getButtonLabel(value);\n return { text: label || String(value) };\n };\n }\n if (col.type === \"link\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const label = getLinkLabel(value);\n return { text: label || String(value) };\n };\n }\n if (col.type === \"tags\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n const tags = resolveTagValues(value);\n if (tags) return { text: tags.join(\", \") };\n return { text: String(value) };\n };\n }\n if (col.type === \"enum\") {\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"enum\" && typeof obj.value === \"string\") {\n return { text: obj.value };\n }\n }\n return { text: String(value) };\n };\n }\n return (value) => {\n if (value === null || value === undefined) return { text: \"\" };\n return { text: String(value) };\n };\n}\n\nfunction resolveTagValues(value: unknown): string[] | null {\n if (Array.isArray(value) && value.every((v) => typeof v === \"string\")) {\n return value as string[];\n }\n if (value && typeof value === \"object\") {\n const obj = value as Record<string, unknown>;\n if (obj.kind === \"tags\") {\n const values = obj.values;\n if (Array.isArray(values)) {\n return values.filter((v): v is string => typeof v === \"string\");\n }\n }\n }\n return null;\n}\n\nfunction hasRenderableStyle(style: ResolvedCellStyle): boolean {\n return Boolean(\n style.backgroundColor ||\n style.textColor ||\n style.bold ||\n style.italic ||\n style.underline ||\n style.strike,\n );\n}\n\nfunction resolvedStyleToMap(style: ResolvedCellStyle): CSSStyleMap {\n const css: CSSStyleMap = {};\n if (style.backgroundColor) css.backgroundColor = style.backgroundColor;\n if (style.textColor) css.color = style.textColor;\n if (style.bold) css.fontWeight = \"600\";\n if (style.italic) css.fontStyle = \"italic\";\n const dec: string[] = [];\n if (style.underline) dec.push(\"underline\");\n if (style.strike) dec.push(\"line-through\");\n if (dec.length) css.textDecorationLine = dec.join(\" \");\n return css;\n}\n\nfunction svgFunnel() {\n return `\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M3 5h18l-7 8v6l-4 2v-8L3 5z\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linejoin=\"round\"/>\n </svg>\n `.trim();\n}\n\nfunction normalizeStyle(style: Partial<CSSStyleDeclaration>): CSSStyleMap {\n const out: CSSStyleMap = {};\n for (const [key, value] of Object.entries(style)) {\n if (value === undefined || value === null || value === \"\") continue;\n if (typeof value !== \"string\" && typeof value !== \"number\") continue;\n out[key] = value;\n }\n return out;\n}\n"],"names":["HTMLBuilder","tag","attrs","html","key","value","escapeHtml","content","text","serializeStyle","style","parts","prop","toKebabCase","CSSBuilder","selector","prev","options","minify","lines","body","input","m","renderTableHTML","cssMode","wrapWithRoot","defaultClass","toArray","defaultStyle","includeStyles","includeRawAttributes","data","baseView","schema","columns","colWidths","getColumnWidths","hasFormulas","c","hasConditionalStyles","cssBuilder","errors","valueFormatters","baseStyles","columnMeta","col","colKey","createValueFormatter","columnFormatToStyle","baseClasses","wrap","align","hasInteraction","row","renderFastTableHTML","dataModel","DataModel","rows","rootClasses","rootSelector","baseStyle","resolvedStyleToMap","tableStyle","ROW_HEADER_WIDTH_PX","acc","w","normalizeStyle","tableAttrs","tableStyleAttr","rootAttrs","rootStyle","HEADER_HEIGHT_PX","rowHeaderAttrs","colIndex","thAttrs","width","svgFunnel","rowIndex","trAttrs","DEFAULT_ROW_HEIGHT_PX","rowHeader","displayIndex","meta","renderCell","totalWidth","tdAttrPrefix","isActionType","formatter","formatted","tagValues","resolveTagValues","actionValue","resolveButtonAction","resolveLinkAction","actionLabel","getButtonLabel","getLinkLabel","hasActionContent","index","baseClass","interaction","className","condRes","cellStyle","withCond","mergeStyle","resolved","diagnostic","raw","valueRes","textOverride","resolvedWithFormat","tdAttrs","rawNumbered","toRawValue","rawStr","hasRenderableStyle","inlineStyle","actionAttrs","createFastValueFormatter","tags","obj","fmt","formatNumberForEdit","color","opts","token","formatIntegerWithPrefix","fmtValue","coerceDatePattern","d","parseIsoDate","formatDateLite","v","values","css","dec","out"],"mappings":";AAEO,MAAMA,GAAY;AAAA,EAAlB,cAAA;AACL,SAAQ,QAAkB,CAAA;AAAA,EAAC;AAAA,EAE3B,QAAQC,GAAaC,GAAkD;AACrE,QAAIC,IAAO,IAAIF,CAAG;AAClB,QAAIC;AACF,iBAAW,CAACE,GAAKC,CAAK,KAAK,OAAO,QAAQH,CAAK;AAC7C,QAAIG,MAAU,KACZF,KAAQ,IAAIC,CAAG,KACNC,MAAU,MAASA,MAAU,QAAQA,MAAU,WACxDF,KAAQ,IAAIC,CAAG,KAAKE,EAAW,OAAOD,CAAK,CAAC,CAAC;AAInD,WAAAF,KAAQ,KACR,KAAK,MAAM,KAAKA,CAAI,GACb;AAAA,EACT;AAAA,EAEA,IAAIF,GAAaC,GAAuDK,GAAuB;AAC7F,QAAIJ,IAAO,IAAIF,CAAG;AAClB,QAAIC;AACF,iBAAW,CAACE,GAAKC,CAAK,KAAK,OAAO,QAAQH,CAAK;AAC7C,QAAIG,MAAU,KACZF,KAAQ,IAAIC,CAAG,KACNC,MAAU,MAASA,MAAU,QAAQA,MAAU,WACxDF,KAAQ,IAAIC,CAAG,KAAKE,EAAW,OAAOD,CAAK,CAAC,CAAC;AAInD,WAAAF,KAAQ,KACRA,KAAQG,EAAWC,CAAO,GAC1BJ,KAAQ,KAAKF,CAAG,KAChB,KAAK,MAAM,KAAKE,CAAI,GACb;AAAA,EACT;AAAA,EAEA,SAASF,GAAmB;AAC1B,gBAAK,MAAM,KAAK,KAAKA,CAAG,GAAG,GACpB;AAAA,EACT;AAAA,EAEA,KAAKM,GAAuB;AAC1B,gBAAK,MAAM,KAAKD,EAAWC,CAAO,CAAC,GAC5B;AAAA,EACT;AAAA,EAEA,KAAKA,GAAuB;AAC1B,gBAAK,MAAM,KAAKA,CAAO,GAChB;AAAA,EACT;AAAA,EAEA,QAAgB;AACd,WAAO,KAAK,MAAM,KAAK,EAAE;AAAA,EAC3B;AACF;AAEO,SAASD,EAAWE,GAAsB;AAC/C,SAAOA,EACJ,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM,EACpB,QAAQ,OAAO,QAAQ,EACvB,QAAQ,MAAM,OAAO;AAC1B;AC/DO,SAASC,EAAeC,GAA4B;AACzD,QAAMC,IAAkB,CAAA;AACxB,aAAW,CAACP,GAAKC,CAAK,KAAK,OAAO,QAAQK,CAAK,GAAG;AAChD,QAAIL,KAAU,QAA+BA,MAAU,GAAO;AAC9D,UAAMO,IAAOC,GAAYT,CAAG;AAC5B,IAAAO,EAAM,KAAK,GAAGC,CAAI,IAAI,OAAOP,CAAK,CAAC,GAAG;AAAA,EACxC;AACA,SAAOM,EAAM,KAAK,EAAE;AACtB;AAEO,MAAMG,GAAW;AAAA,EAAjB,cAAA;AACL,SAAQ,4BAAY,IAAA;AAAA,EAAyB;AAAA,EAE7C,QAAQC,GAAkBL,GAAoB;AAC5C,UAAMM,IAAO,KAAK,MAAM,IAAID,CAAQ,KAAK,CAAA;AACzC,SAAK,MAAM,IAAIA,GAAU,EAAE,GAAGC,GAAM,GAAGN,GAAO;AAAA,EAChD;AAAA,EAEA,MAAMO,GAAwC;AAC5C,UAAMC,IAASD,GAAS,UAAU,IAC5BE,IAAkB,CAAA;AACxB,eAAW,CAACJ,GAAUL,CAAK,KAAK,KAAK,MAAM,WAAW;AACpD,YAAMU,IAAOX,EAAeC,CAAK;AACjC,MAAKU,MACDF,IACFC,EAAM,KAAK,GAAGJ,CAAQ,IAAIK,CAAI,GAAG,IAEjCD,EAAM,KAAK,GAAGJ,CAAQ,MAAMK,CAAI,IAAI;AAAA,IAExC;AACA,WAAOD,EAAM,KAAKD,IAAS,KAAK;AAAA,CAAI;AAAA,EACtC;AACF;AAEA,SAASL,GAAYQ,GAAuB;AAC1C,SAAIA,EAAM,WAAW,IAAI,IAAUA,IAC/BA,EAAM,SAAS,GAAG,IAAUA,EAAM,YAAA,IAC/BA,EAAM,QAAQ,UAAU,CAACC,MAAM,IAAIA,EAAE,YAAA,CAAa,EAAE;AAC7D;ACGO,SAASC,GACdN,GACW;AACX,QAAMO,IAAUP,EAAQ,WAAW,UAC7BQ,IAAeR,EAAQ,gBAAgB,IACvCS,IAAeC,GAAQV,EAAQ,YAAY,KAAK,CAAA,GAChDW,IAAeX,EAAQ,cACvBY,IAAgBZ,EAAQ,iBAAiB,IACzCa,IAAuBb,EAAQ,wBAAwB,IACvDc,IAAQd,EAAQ,QAAQ,CAAA,GAExBe,IAAiB,CAAA,GACjBC,IAAShB,EAAQ,QACjBiB,IAAUD,EAAO,SACjBE,IAAYC,GAAgBH,GAAQD,CAAQ,GAC5CK,IAAcH,EAAQ,KAAK,CAACI,MAAM,EAAQA,EAAE,OAAQ,GACpDC,IACJL,EAAQ,KAAK,CAACI,MAAM,EAAQA,EAAE,gBAAiB,KAAK,EAAQL,EAAO,KAAK,kBAEpEO,IAAaX,KAAiBL,MAAY,WAAW,IAAIV,OAAe,MACxE2B,IAA+D,CAAA,GAC/DC,wBAAsB,IAAA,GACtBC,IAAad,IAAgB,oBAAI,IAAA,IAAmC,MACpEe,IAAaV,EAAQ,IAAI,CAACW,MAAQ;AACtC,UAAMC,IAAS,OAAOD,EAAI,GAAG;AAC7B,IAAAH,EAAgB,IAAII,GAAQC,GAAqBF,GAAKhB,CAAa,CAAC,GAChEc,KAAYA,EAAW,IAAIG,GAAQE,EAAoBH,CAAG,CAAC;AAC/D,UAAMI,IAAc,CAAC,cAAc;AACnC,IAAIJ,EAAI,SAAS,aAAWI,EAAY,KAAK,iBAAiB;AAC9D,UAAMC,IAAOL,EAAI;AACjB,IAAAI,EAAY,KAAKC,IAAO,cAAc,aAAa;AACnD,UAAMC,IACJN,EAAI,OAAO,UACVA,EAAI,SAAS,YAAYA,EAAI,SAAS,SAASA,EAAI,SAAS,SAAS,UAAU;AAClF,WAAAI,EAAY,KAAKE,MAAU,UAAU,gBAAgB,YAAY,GAC1D;AAAA,MACL,KAAAN;AAAA,MACA,QAAAC;AAAA,MACA,WAAWG,EAAY,KAAK,GAAG;AAAA,MAC/B,cAAc,WAAWA,EAAY,KAAK,GAAG,CAAC,oCAAoC3C;AAAA,QAChFwC;AAAA,MAAA,CACD;AAAA,MACD,cAAcD,EAAI,SAAS,YAAYA,EAAI,SAAS;AAAA,IAAA;AAAA,EAExD,CAAC,GACKO,IACJlB,EAAQ,KAAK,CAACW,MAAQ,GAAQA,EAAI,YAAYA,EAAI,OAAO,YAAYA,EAAI,OAAO,SAAS,KACzFd,EAAK,KAAK,CAACsB,MAAQ,EAAQA,EAAI,SAAU;AAQ3C,MANE,CAACxB,KACD,CAACC,KACD,CAACO,KACD,CAACE,KACD,CAACa;AAGD,WAAOE,GAAoB;AAAA,MACzB,MAAAvB;AAAA,MACA,SAAAG;AAAA,MACA,YAAAU;AAAA,MACA,WAAAT;AAAA,MACA,cAAAV;AAAA,MACA,cAAAC;AAAA,MACA,cAAAE;AAAA,MACA,iBAAAc;AAAA,IAAA,CACD;AAGH,QAAMa,IAAY,IAAIC,GAAUzB,GAAME,GAAQD,CAAQ,GAChDyB,IAAOF,EAAU,SAAA,GAEjBG,IAAcjC,IAAe,CAAC,gBAAgB,GAAGC,CAAY,IAAIA,GACjEiC,IAAeD,EAAY,SAAS,IAAIA,EAAY,CAAC,CAAC,KAAK;AAEjE,MAAIlB,KAAchB,MAAY;AAC5B,eAAWqB,KAAOX,GAAS;AACzB,YAAM0B,IAAYC,EAAmBb,EAAoBH,CAAG,CAAC;AAC7D,MAAI,OAAO,KAAKe,CAAS,EAAE,WAAW,KACtCpB,EAAW,QAAQ,GAAGmB,CAAY,2BAA4B,OAAOd,EAAI,GAAG,CAAC,MAAOe,CAAS;AAAA,IAC/F;AAIF,QAAME,IAA0B,EAAE,OAAO,GADtBC,IAAsB5B,EAAU,OAAO,CAAC6B,GAAKC,MAAMD,KAAOC,KAAK,IAAI,CAAC,CACjC,KAAA;AACtD,EAAI,CAACxC,KAAgBG,KACnB,OAAO,OAAOkC,GAAYI,EAAetC,CAAY,CAAC;AAExD,QAAMuC,IAAwD;AAAA,IAC5D,yBAAyB;AAAA,EAAA;AAE3B,EAAI,CAAC1C,KAAgBiC,EAAY,WAC/BS,EAAW,QAAQT,EAAY,KAAK,GAAG;AAEzC,QAAMU,IAAiB3D,EAAeqD,CAAU;AAChD,EAAIM,MACFD,EAAW,QAAQC;AAGrB,QAAMjE,IAAO,IAAIH,GAAA;AACjB,MAAIyB,GAAc;AAChB,UAAM4C,IAAuD;AAAA,MAC3D,OAAOX,EAAY,KAAK,GAAG,EAAE,KAAA;AAAA,IAAK;AAEpC,QAAI9B,GAAc;AAChB,YAAM0C,IAAY7D,EAAeyD,EAAetC,CAAY,CAAC;AAC7D,MAAI0C,QAAqB,QAAQA;AAAA,IACnC;AACA,IAAAnE,EAAK,QAAQ,OAAOkE,CAAS,GAC7BlE,EAAK,QAAQ,OAAO,EAAE,OAAO,iBAAiB,GAC9CA,EAAK,QAAQ,OAAO,EAAE,OAAO,oBAAoB;AAAA,EACnD;AAEA,EAAAA,EAAK,QAAQ,SAASgE,CAAU,GAChChE,EAAK,QAAQ,OAAO,GACpBA,EAAK,QAAQ,MAAM,EAAE,OAAO,UAAUoE,CAAgB,OAAO;AAE7D,QAAMC,IAA4D;AAAA,IAChE,OAAO;AAAA,IACP,gBAAgB;AAAA,IAChB,OAAO,SAAST,CAAmB;AAAA,EAAA;AAErC,SAAA5D,EAAK,IAAI,MAAMqE,GAAgB,EAAE,GAEjCtC,EAAQ,QAAQ,CAACW,GAAK4B,MAAa;AACjC,UAAMC,IAAqD;AAAA,MACzD,gBAAgB7B,EAAI;AAAA,IAAA,GAEhB8B,IAAQxC,EAAUsC,CAAQ,KAAK5B,EAAI;AACzC,IAAI8B,MAAOD,EAAQ,QAAQ,SAASC,CAAK,QAEzCxE,EAAK,QAAQ,MAAMuE,CAAO,GAC1BvE,EAAK,QAAQ,OAAO,EAAE,OAAO,sBAAsB,GACnDA,EAAK,IAAI,QAAQ,EAAE,OAAO,0BAAA,GAA6B0C,EAAI,UAAU,OAAOA,EAAI,GAAG,CAAC,GACpF1C,EAAK,QAAQ,UAAU;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,wBAAwB;AAAA,MACxB,wBAAwB0C,EAAI;AAAA,MAC5B,OAAO;AAAA,IAAA,CACR,GACD1C,EAAK,KAAKyE,IAAW,GACrBzE,EAAK,SAAS,QAAQ,GACtBA,EAAK,SAAS,KAAK,GACnBA,EAAK,SAAS,IAAI;AAAA,EACpB,CAAC,GAEDA,EAAK,SAAS,IAAI,GAClBA,EAAK,SAAS,OAAO,GACrBA,EAAK,QAAQ,OAAO,GAEpBsD,EAAK,QAAQ,CAACJ,GAAKwB,MAAa;AAC9B,UAAMC,IAAqD;AAAA,MACzD,OAAO,UAAUC,CAAqB;AAAA,IAAA;AAExC,IAAA5E,EAAK,QAAQ,MAAM2E,CAAO;AAE1B,UAAME,IAAuD;AAAA,MAC3D,OAAO;AAAA,IAAA,GAEHC,IAAe1B,EAAU,gBAAgBF,EAAI,EAAE,KAAK;AAC1D,IAAAlD,EAAK,QAAQ,MAAM6E,CAAS,EAAE,KAAK,OAAOC,CAAY,CAAC,EAAE,SAAS,IAAI;AAEtE,eAAWC,KAAQtC;AACjB,MAAAuC,GAAW;AAAA,QACT,MAAAhF;AAAA,QACA,KAAAkD;AAAA,QACA,UAAAwB;AAAA,QACA,MAAAK;AAAA,QACA,WAAA3B;AAAA,QACA,SAAA/B;AAAA,QACA,YAAAgB;AAAA,QACA,cAAAmB;AAAA,QACA,QAAAlB;AAAA,QACA,iBAAAC;AAAA,QACA,YAAAC;AAAA,QACA,eAAAd;AAAA,QACA,sBAAAC;AAAA,QACA,gBAAAsB;AAAA,MAAA,CACD;AAGH,IAAAjD,EAAK,SAAS,IAAI;AAAA,EACpB,CAAC,GAEDA,EAAK,SAAS,OAAO,GACrBA,EAAK,SAAS,OAAO,GAEjBsB,MACFtB,EAAK,SAAS,KAAK,GACnBA,EAAK,QAAQ,OAAO,EAAE,OAAO,yBAAyB,EAAE,SAAS,KAAK,GACtEA,EAAK,SAAS,KAAK,GACnBA,EAAK,SAAS,KAAK,IAGd;AAAA,IACL,MAAMA,EAAK,MAAA;AAAA,IACX,KAAKqC,GAAY,MAAM,EAAE,QAAQ,IAAM;AAAA,IACvC,UAAU;AAAA,MACR,UAAUiB,EAAK;AAAA,MACf,aAAavB,EAAQ;AAAA,MACrB,aAAAG;AAAA,MACA,sBAAAE;AAAA,MACA,QAAAE;AAAA,IAAA;AAAA,EACF;AAEJ;AAEA,SAASa,GAAoBrC,GAef;AACZ,QAAM;AAAA,IACJ,MAAAc;AAAA,IACA,SAAAG;AAAA,IACA,YAAAU;AAAA,IACA,WAAAT;AAAA,IACA,cAAAV;AAAA,IACA,cAAAC;AAAA,IACA,cAAAE;AAAA,IACA,iBAAAc;AAAA,EAAA,IACEzB,GACEyC,IAAcjC,IAAe,CAAC,gBAAgB,GAAGC,CAAY,IAAIA;AAEvE,MAAI0D,IAAarB;AACjB,aAAWY,KAASxC,EAAW,CAAAiD,KAAcT;AAC7C,QAAMb,IAA0B,EAAE,OAAO,GAAGsB,CAAU,KAAA;AACtD,EAAI,CAAC3D,KAAgBG,KACnB,OAAO,OAAOkC,GAAYI,EAAetC,CAAY,CAAC;AAExD,QAAMuC,IAAwD;AAAA,IAC5D,yBAAyB;AAAA,EAAA;AAE3B,EAAI,CAAC1C,KAAgBiC,EAAY,WAC/BS,EAAW,QAAQT,EAAY,KAAK,GAAG;AAEzC,QAAMU,IAAiB3D,EAAeqD,CAAU;AAChD,EAAIM,MACFD,EAAW,QAAQC;AAGrB,QAAMjE,IAAO,IAAIH,GAAA;AACjB,MAAIyB,GAAc;AAChB,UAAM4C,IAAuD;AAAA,MAC3D,OAAOX,EAAY,KAAK,GAAG,EAAE,KAAA;AAAA,IAAK;AAEpC,QAAI9B,GAAc;AAChB,YAAM0C,IAAY7D,EAAeyD,EAAetC,CAAY,CAAC;AAC7D,MAAI0C,QAAqB,QAAQA;AAAA,IACnC;AACA,IAAAnE,EAAK,QAAQ,OAAOkE,CAAS,GAC7BlE,EAAK,QAAQ,OAAO,EAAE,OAAO,iBAAiB,GAC9CA,EAAK,QAAQ,OAAO,EAAE,OAAO,oBAAoB;AAAA,EACnD;AAEA,EAAAA,EAAK,QAAQ,SAASgE,CAAU,GAChChE,EAAK,QAAQ,OAAO,GACpBA,EAAK,QAAQ,MAAM,EAAE,OAAO,UAAUoE,CAAgB,OAAO,GAC7DpE,EAAK;AAAA,IACH;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,OAAO,SAAS4D,CAAmB;AAAA,IAAA;AAAA,IAErC;AAAA,EAAA,GAEF7B,EAAQ,QAAQ,CAACW,GAAK4B,MAAa;AAC/B,UAAMC,IAAqD;AAAA,MACzD,gBAAgB7B,EAAI;AAAA,IAAA,GAElB8B,IAAQxC,EAAUsC,CAAQ,KAAK5B,EAAI;AACzC,IAAI8B,MAAOD,EAAQ,QAAQ,SAASC,CAAK,QACzCxE,EAAK,QAAQ,MAAMuE,CAAO,GAC1BvE,EAAK,QAAQ,OAAO,EAAE,OAAO,sBAAsB,GACnDA,EAAK,IAAI,QAAQ,EAAE,OAAO,0BAAA,GAA6B0C,EAAI,UAAU,OAAOA,EAAI,GAAG,CAAC,GACpF1C,EAAK,QAAQ,UAAU;AAAA,MACrB,MAAM;AAAA,MACN,OAAO;AAAA,MACP,wBAAwB;AAAA,MACxB,wBAAwB0C,EAAI;AAAA,MAC5B,OAAO;AAAA,IAAA,CACR,GACD1C,EAAK,KAAKyE,IAAW,GACrBzE,EAAK,SAAS,QAAQ,GACtBA,EAAK,SAAS,KAAK,GACnBA,EAAK,SAAS,IAAI;AAAA,EACpB,CAAC,GACDA,EAAK,SAAS,IAAI,GAClBA,EAAK,SAAS,OAAO,GACrBA,EAAK,QAAQ,OAAO;AAEpB,WAAS0E,IAAW,GAAGA,IAAW9C,EAAK,QAAQ8C,KAAY,GAAG;AAC5D,UAAMxB,IAAMtB,EAAK8C,CAAQ;AACzB,IAAA1E,EAAK,QAAQ,MAAM;AAAA,MACjB,OAAO,UAAU4E,CAAqB;AAAA,IAAA,CACvC,GACD5E,EAAK,IAAI,MAAM,EAAE,OAAO,wBAAwB,OAAO0E,IAAW,CAAC,CAAC;AACpE,eAAWK,KAAQtC,GAAY;AAC7B,YAAM,EAAE,KAAAC,GAAK,QAAAC,GAAQ,cAAAuC,GAAc,cAAAC,MAAiBJ,GAC9CK,IAAY7C,EAAgB,IAAII,CAAM,GACtCzC,IAASgD,EAAgCP,CAAM,GAC/C0C,IAAYD,IAAYA,EAAUlF,CAAK,IAAI,EAAE,MAAM,OAAOA,KAAS,EAAE,EAAA,GACrEoF,IAAY5C,EAAI,SAAS,SAAS6C,EAAiBrF,CAAK,IAAI,MAC5DsF,IAAcL,IAChBzC,EAAI,SAAS,WACX+C,EAAoBvF,CAAK,IACzBwF,GAAkBxF,CAAK,IACzB,MACEyF,IAAcR,IAChBzC,EAAI,SAAS,WACXkD,EAAe1F,CAAK,IACpB2F,EAAa3F,CAAK,IACpB,IACE4F,IAAmBX,KAAgBK,KAAeG;AACxD,UAAIL,KAAaA,EAAU;AACzB,QAAAtF,EAAK,QAAQ,MAAM;AAAA,UACjB,OAAO,GAAG+E,EAAK,SAAS;AAAA,UACxB,gBAAgBrC,EAAI;AAAA,QAAA,CACrB,GACD1C,EAAK,QAAQ,OAAO,EAAE,OAAO,oBAAoB,GACjDsF,EAAU,QAAQ,CAACxF,GAAKiG,MAAU;AAChC,UAAA/F,EAAK,QAAQ,QAAQ,EAAE,OAAO,eAAe,GAC7CA,EAAK,IAAI,QAAQ,EAAE,OAAO,oBAAA,GAAuBF,CAAG,GACpDE,EAAK,QAAQ,UAAU;AAAA,YACrB,MAAM;AAAA,YACN,OAAO;AAAA,YACP,2BAA2B;AAAA,YAC3B,0BAA0B,OAAO+F,CAAK;AAAA,YACtC,UAAU;AAAA,UAAA,CACX,GACD/F,EAAK,KAAK,GAAG,GACbA,EAAK,SAAS,QAAQ,GACtBA,EAAK,SAAS,MAAM;AAAA,QACtB,CAAC,GACDA,EAAK,SAAS,KAAK,GACnBA,EAAK,SAAS,IAAI;AAAA,eACT8F;AACT,QAAA9F,EAAK,QAAQ,MAAM;AAAA,UACjB,OAAO,GAAG+E,EAAK,SAAS;AAAA,UACxB,gBAAgBrC,EAAI;AAAA,QAAA,CACrB,GACGA,EAAI,SAAS,WACf1C,EAAK;AAAA,UACH;AAAA,UACA,EAAE,OAAO,yBAAyB,uBAAuB,UAAU,MAAM,SAAA;AAAA,UACzE2F;AAAA,QAAA,IAGF3F,EAAK;AAAA,UACH;AAAA,UACA,EAAE,OAAO,uBAAuB,uBAAuB,OAAA;AAAA,UACvD2F;AAAA,QAAA,GAGJ3F,EAAK,SAAS,IAAI;AAAA,WACb;AACL,cAAMK,IAAOF,EAAWwF,KAAeN,EAAU,IAAI;AACrD,QAAArF,EAAK,KAAK,MAAMkF,CAAY,IAAI7E,CAAI,OAAO;AAAA,MAC7C;AAAA,IACF;AACA,IAAAL,EAAK,SAAS,IAAI;AAAA,EACpB;AAEA,SAAAA,EAAK,SAAS,OAAO,GACrBA,EAAK,SAAS,OAAO,GAEjBsB,MACFtB,EAAK,SAAS,KAAK,GACnBA,EAAK,QAAQ,OAAO,EAAE,OAAO,yBAAyB,EAAE,SAAS,KAAK,GACtEA,EAAK,SAAS,KAAK,GACnBA,EAAK,SAAS,KAAK,IAGd;AAAA,IACL,MAAMA,EAAK,MAAA;AAAA,IACX,UAAU;AAAA,MACR,UAAU4B,EAAK;AAAA,MACf,aAAaG,EAAQ;AAAA,MACrB,aAAa;AAAA,MACb,sBAAsB;AAAA,MACtB,QAAQ,CAAA;AAAA,IAAC;AAAA,EACX;AAEJ;AAEA,SAASiD,GAAWlE,GAoBjB;AACD,QAAM;AAAA,IACJ,MAAAd;AAAA,IACA,KAAAkD;AAAA,IACA,UAAAwB;AAAA,IACA,MAAAK;AAAA,IACA,WAAA3B;AAAA,IACA,SAAA/B;AAAA,IACA,YAAAgB;AAAA,IACA,cAAAmB;AAAA,IACA,QAAAlB;AAAA,IACA,iBAAAC;AAAA,IACA,YAAAC;AAAA,IACA,eAAAd;AAAA,IACA,sBAAAC;AAAA,IACA,gBAAAsB;AAAA,EAAA,IACEnC,GAEE,EAAE,KAAA4B,GAAK,QAAAC,GAAQ,WAAAqD,GAAW,cAAAb,MAAiBJ,GAE3CkB,IAAchD,IAChBG,EAAU,mBAAmBF,EAAI,IAAIR,EAAI,GAAG,IAC5C,EAAE,UAAU,IAAO,OAAO,IAAO,UAAU,GAAA;AAC/C,MAAIwD,IAAYF;AAChB,EAAIC,EAAY,WAAUC,KAAa,sBAClCA,KAAa,qBACdD,EAAY,UAAOC,KAAa,4BAChCD,EAAY,aAAUC,KAAa;AAEvC,QAAMC,IAAUzE,IACZ0B,EAAU,wBAAwBF,EAAI,IAAIR,CAAG,IAC7C,EAAE,OAAO,MAAM,gBAAgB,GAAA,GAC7B0D,IAAY1E,IAAgB0B,EAAU,aAAaF,EAAI,IAAIR,EAAI,GAAG,IAAI,MACtEe,IAAY/B,IAAgBc,GAAY,IAAIG,CAAM,KAAK,CAAA,IAAK,CAAA,GAC5D0D,IAAW3E,KAAiByE,EAAQ,QAAQG,EAAW7C,GAAW0C,EAAQ,KAAK,IAAI1C,GACnF8C,IAAW7E,KAAiB0E,IAAYE,EAAWD,GAAUD,CAAS,IAAIC,GAE1EG,IAAa9E,IAAgB0B,EAAU,kBAAkBF,EAAI,IAAIR,EAAI,GAAG,IAAI;AAClF,EAAI8D,MACFN,KAAaM,EAAW,UAAU,YAAY,0BAA0B;AAG1E,QAAMC,IAAMrD,EAAU,WAAWF,EAAI,IAAIR,EAAI,GAAG,GAC1CgE,IAAWtD,EAAU,iBAAiBF,EAAI,IAAIR,CAAG;AACvD,MAAIiE,IAAeD,EAAS,iBAAiBP,EAAQ,iBAAiB,WAAW;AAEjF,EAAIO,EAAS,YAAY,WAAW,cAC7BC,MAAcA,IAAe,WAClCrE,EAAO,KAAK,EAAE,KAAKoC,GAAU,KAAK/B,GAAQ,SAAS+D,EAAS,WAAW,QAAA,CAAS;AAGlF,QAAMtB,IAAY7C,EAAgB,IAAII,CAAM,GACtC0C,IAAYsB,IACd,EAAE,MAAMA,EAAA,IACPvB,IAAYA,EAAUsB,EAAS,KAAK,IAAI,EAAE,MAAM,OAAOA,EAAS,SAAS,EAAE,EAAA,GAC1EE,IACJvB,EAAU,SAASA,EAAU,UAAUkB,EAAS,YAC5C,EAAE,GAAGA,GAAU,WAAWlB,EAAU,UACpCkB,GAEAjB,IAAY5C,EAAI,SAAS,UAAU,CAACiE,IAAepB,EAAiBmB,EAAS,KAAK,IAAI,MACtFlB,IAAcL,IAChBzC,EAAI,SAAS,WACX+C,EAAoBiB,EAAS,KAAK,IAClChB,GAAkBgB,EAAS,KAAK,IAClC,MACEf,IAAcR,IAChBzC,EAAI,SAAS,WACXkD,EAAec,EAAS,KAAK,IAC7Bb,EAAaa,EAAS,KAAK,IAC7B,IAEEG,IAAqD;AAAA,IACzD,OAAOX;AAAA,IACP,gBAAgBxD,EAAI;AAAA,EAAA;AAKtB,MAFIhB,KAAiB8E,MAAYK,EAAQ,2BAA2B,IAAIL,EAAW,UAE/E7E,GAAsB;AACxB,UAAMmF,IAAcC,GAAWN,GAAKC,EAAS,OAAOhE,CAAG;AACvD,QAAIoE,MAAgB;AAClB,MAAAD,EAAQ,UAAU,IAAIC;AAAA,SACjB;AACL,YAAME,IAASP,KAAQ,OAA4B,KAAK,OAAOA,CAAG;AAClE,MAAAI,EAAQ,UAAU,IAAIG;AAAA,IACxB;AAAA,EACF;AAEA,MAAItF;AACF,QAAIL,MAAY,YAAYA,MAAY;AACtC,UAAI4F,EAAmBL,CAAkB,GAAG;AAC1C,cAAMM,IAAc5G,EAAeoD,EAAmBkD,CAAkB,CAAC;AACzE,QAAIM,QAAqB,QAAQA;AAAA,MACnC;AAAA,eACS7F,MAAY,cAAcgB,KAAc4E,EAAmBL,CAAkB,GAAG;AACzF,YAAMhG,IAAW,GAAG4C,CAAY,uBAAuBkB,IAAW,CAAC,sBAAuB/B,CAAM;AAChG,MAAAN,EAAW,QAAQzB,GAAU8C,EAAmBkD,CAAkB,CAAC;AAAA,IACrE;AAAA;AAGF,QAAMd,KAAmBX,KAAgB,CAACwB,KAAgBnB,KAAeG;AACzE,MAAIL,KAAaA,EAAU;AACzB,IAAAtF,EAAK,QAAQ,MAAM6G,CAAO,GAC1B7G,EAAK,QAAQ,OAAO,EAAE,OAAO,oBAAoB,GACjDsF,EAAU,QAAQ,CAACxF,GAAKiG,MAAU;AAChC,MAAA/F,EAAK,QAAQ,QAAQ,EAAE,OAAO,eAAe,GAC7CA,EAAK,IAAI,QAAQ,EAAE,OAAO,oBAAA,GAAuBF,CAAG,GACpDE,EAAK,QAAQ,UAAU;AAAA,QACrB,MAAM;AAAA,QACN,OAAO;AAAA,QACP,2BAA2B;AAAA,QAC3B,0BAA0B,OAAO+F,CAAK;AAAA,QACtC,UAAUE,EAAY,YAAYA,EAAY;AAAA,MAAA,CAC/C,GACDjG,EAAK,KAAK,GAAG,GACbA,EAAK,SAAS,QAAQ,GACtBA,EAAK,SAAS,MAAM;AAAA,IACtB,CAAC,GACDA,EAAK,SAAS,KAAK,GACnBA,EAAK,SAAS,IAAI;AAAA,WACT8F,IAAkB;AAC3B,IAAA9F,EAAK,QAAQ,MAAM6G,CAAO;AAC1B,UAAMM,IAAyD;AAAA,MAC7D,OAAOzE,EAAI,SAAS,WAAW,0BAA0B;AAAA,MACzD,uBAAuBA,EAAI;AAAA,IAAA;AAE7B,IAAIuD,EAAY,aACdkB,EAAY,QAAQ,GAAGA,EAAY,KAAK,6BAEtCzE,EAAI,SAAS,YACfyE,EAAY,OAAO,UACnBnH,EAAK,IAAI,UAAUmH,GAAaxB,CAAW,KAE3C3F,EAAK,IAAI,QAAQmH,GAAaxB,CAAW,GAE3C3F,EAAK,SAAS,IAAI;AAAA,EACpB;AACE,IAAAA,EAAK,IAAI,MAAM6G,GAASlB,KAAeN,EAAU,IAAI;AAEzD;AAEA,SAASzC,GACPF,GACAhB,GACsD;AACtD,MAAI,CAACA;AACH,WAAO0F,GAAyB1E,CAAG;AAErC,MAAIA,EAAI,SAAS;AACf,WAAO,CAACxC,MACFA,KAAU,OAAoC,EAAE,MAAM,GAAA,IAEnD,EAAE,MADK0F,EAAe1F,CAAK,KACV,OAAOA,CAAK,EAAA;AAGxC,MAAIwC,EAAI,SAAS;AACf,WAAO,CAACxC,MACFA,KAAU,OAAoC,EAAE,MAAM,GAAA,IAEnD,EAAE,MADK2F,EAAa3F,CAAK,KACR,OAAOA,CAAK,EAAA;AAGxC,MAAIwC,EAAI,SAAS;AACf,WAAO,CAACxC,MAAU;AAChB,UAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,YAAMmH,IAAO9B,EAAiBrF,CAAK;AACnC,aAAImH,IAAa,EAAE,MAAMA,EAAK,KAAK,IAAI,EAAA,IAChC,EAAE,MAAM,OAAOnH,CAAK,EAAA;AAAA,IAC7B;AAEF,MAAIwC,EAAI,SAAS;AACf,WAAO,CAACxC,MAAU;AAChB,UAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,UAAIA,KAAS,OAAOA,KAAU,UAAU;AACtC,cAAMoH,IAAMpH;AACZ,YAAIoH,EAAI,SAAS,UAAU,OAAOA,EAAI,SAAU;AAC9C,iBAAO,EAAE,MAAMA,EAAI,MAAA;AAAA,MAEvB;AACA,aAAO,EAAE,MAAM,OAAOpH,CAAK,EAAA;AAAA,IAC7B;AAEF,MAAIwC,EAAI,SAAS;AACf,WAAO,CAACxC,MACFA,KAAU,OAAoC,EAAE,MAAM,GAAA,IACtDwC,EAAI,WAAW,cAAc,CAACA,EAAI,SAC7B,EAAE,MAAMxC,IAAQ,MAAM,IAAA,IAE3B,MAAM,QAAQwC,EAAI,MAAM,KAAKA,EAAI,OAAO,UAAU,IAC7C,EAAE,MAAc,OAARxC,IAAewC,EAAI,OAAO,CAAC,IAAYA,EAAI,OAAO,CAAC,CAAvB,EAAwB,IAE9D,EAAE,MAAMxC,IAAQ,OAAOwC,EAAI,MAAM,IAAI,GAAA;AAGhD,MAAIA,EAAI,SAAS,UAAU;AACzB,UAAM6E,IAAM7E,EAAI;AAEhB,SADc6E,GAAK,UAAU,eACf;AACZ,aAAO,CAACrH,MAAU;AAChB,YAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,YAAI,OAAOA,KAAU,SAAU,QAAO,EAAE,MAAM,OAAOA,CAAK,EAAA;AAC1D,cAAMG,IAAOmH,GAAoBtH,GAAO;AAAA,UACtC,QAAQ;AAAA,UACR,WAAWqH,GAAK;AAAA,QAAA,CACjB,GACKE,IAAQF,GAAK,eAAerH,IAAQ,IAAI,YAAY;AAC1D,eAAO,EAAE,MAAAG,GAAM,OAAAoH,EAAA;AAAA,MACjB;AAEF,UAAMC,IAAiC,CAAA;AACvC,IAAIH,GAAK,UAAU,WACjBG,EAAK,wBAAwBH,EAAI,OACjCG,EAAK,wBAAwBH,EAAI,QAEnCG,EAAK,cAAc,EAAQH,GAAK;AAChC,UAAMnC,IAAY,IAAI,KAAK,aAAa,SAASsC,CAAI;AACrD,WAAO,CAACxH,MAAU;AAChB,UAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,UAAI,OAAOA,KAAU,SAAU,QAAO,EAAE,MAAM,OAAOA,CAAK,EAAA;AAC1D,YAAMG,IAAO+E,EAAU,OAAOlF,CAAK,GAC7BuH,IAAQF,GAAK,eAAerH,IAAQ,IAAI,YAAY;AAC1D,aAAO,EAAE,MAAAG,GAAM,OAAAoH,EAAA;AAAA,IACjB;AAAA,EACF;AACA,MAAI/E,EAAI,SAAS,SAASA,EAAI,SAAS,QAAQ;AAC7C,UAAM6E,IAAM7E,EAAI,QACViF,IAAQJ,GAAK,UAAU;AAC7B,QAAII,MAAU,YAAYA,MAAU,WAAWA,MAAU;AACvD,aAAO,CAACzH,MAAU;AAChB,YAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,YAAI,OAAOA,KAAU,SAAU,QAAO,EAAE,MAAM,OAAOA,CAAK,EAAA;AAC1D,cAAMG,IAAOuH,GAAwB1H,GAAOyH,CAAK,GAC3CF,IAAQF,GAAK,eAAerH,IAAQ,IAAI,YAAY;AAC1D,eAAO,EAAE,MAAAG,GAAM,OAAAoH,EAAA;AAAA,MACjB;AAEF,UAAMrC,IAAY,IAAI,KAAK,aAAa,SAAS;AAAA,MAC/C,uBAAuB;AAAA,MACvB,uBAAuB;AAAA,MACvB,aAAa,EAAQmC,GAAK;AAAA,IAAiB,CAC5C;AACD,WAAO,CAACrH,MAAU;AAChB,UAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,UAAI,OAAOA,KAAU,SAAU,QAAO,EAAE,MAAM,OAAOA,CAAK,EAAA;AAC1D,YAAMG,IAAO+E,EAAU,OAAOlF,CAAK,GAC7BuH,IAAQF,GAAK,eAAerH,IAAQ,IAAI,YAAY;AAC1D,aAAO,EAAE,MAAAG,GAAM,OAAAoH,EAAA;AAAA,IACjB;AAAA,EACF;AACA,MAAI/E,EAAI,SAAS,UAAUA,EAAI,SAAS,UAAUA,EAAI,SAAS,YAAY;AACzE,UAAMmF,IAAWnF,EAAI,QACf6E,IACJ7E,EAAI,SAAS,SACToF,EAAkBD,GAAU,MAAM,IAClCnF,EAAI,SAAS,SACXoF,EAAkBD,GAAU,MAAM,IAClCC,EAAkBD,GAAU,UAAU;AAC9C,WAAO,CAAC3H,MAAU;AAChB,UAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,UAAI6H,IAAiB;AAGrB,aAFI7H,aAAiB,OAAM6H,IAAI7H,IACtB,OAAOA,KAAU,aAAU6H,IAAIC,GAAa9H,CAAK,IACrD6H,IACE,EAAE,MAAME,GAAeF,GAAGR,CAAG,EAAA,IADrB,EAAE,MAAM,OAAOrH,CAAK,EAAA;AAAA,IAErC;AAAA,EACF;AACA,SAAO,CAACA,MACFA,KAAU,OAAoC,EAAE,MAAM,GAAA,IACnD,EAAE,MAAM,OAAOA,CAAK,EAAA;AAE/B;AAEA,SAASkH,GAAyB1E,GAAyE;AACzG,SAAIA,EAAI,SAAS,WACR,CAACxC,MACFA,KAAU,OAAoC,EAAE,MAAM,GAAA,IAEnD,EAAE,MADK0F,EAAe1F,CAAK,KACV,OAAOA,CAAK,EAAA,IAGpCwC,EAAI,SAAS,SACR,CAACxC,MACFA,KAAU,OAAoC,EAAE,MAAM,GAAA,IAEnD,EAAE,MADK2F,EAAa3F,CAAK,KACR,OAAOA,CAAK,EAAA,IAGpCwC,EAAI,SAAS,SACR,CAACxC,MAAU;AAChB,QAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,UAAMmH,IAAO9B,EAAiBrF,CAAK;AACnC,WAAImH,IAAa,EAAE,MAAMA,EAAK,KAAK,IAAI,EAAA,IAChC,EAAE,MAAM,OAAOnH,CAAK,EAAA;AAAA,EAC7B,IAEEwC,EAAI,SAAS,SACR,CAACxC,MAAU;AAChB,QAAIA,KAAU,KAA6B,QAAO,EAAE,MAAM,GAAA;AAC1D,QAAIA,KAAS,OAAOA,KAAU,UAAU;AACtC,YAAMoH,IAAMpH;AACZ,UAAIoH,EAAI,SAAS,UAAU,OAAOA,EAAI,SAAU;AAC9C,eAAO,EAAE,MAAMA,EAAI,MAAA;AAAA,IAEvB;AACA,WAAO,EAAE,MAAM,OAAOpH,CAAK,EAAA;AAAA,EAC7B,IAEK,CAACA,MACFA,KAAU,OAAoC,EAAE,MAAM,GAAA,IACnD,EAAE,MAAM,OAAOA,CAAK,EAAA;AAE/B;AAEA,SAASqF,EAAiBrF,GAAiC;AACzD,MAAI,MAAM,QAAQA,CAAK,KAAKA,EAAM,MAAM,CAACgI,MAAM,OAAOA,KAAM,QAAQ;AAClE,WAAOhI;AAET,MAAIA,KAAS,OAAOA,KAAU,UAAU;AACtC,UAAMoH,IAAMpH;AACZ,QAAIoH,EAAI,SAAS,QAAQ;AACvB,YAAMa,IAASb,EAAI;AACnB,UAAI,MAAM,QAAQa,CAAM;AACtB,eAAOA,EAAO,OAAO,CAACD,MAAmB,OAAOA,KAAM,QAAQ;AAAA,IAElE;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAASjB,EAAmB1G,GAAmC;AAC7D,SAAO,GACLA,EAAM,mBACJA,EAAM,aACNA,EAAM,QACNA,EAAM,UACNA,EAAM,aACNA,EAAM;AAEZ;AAEA,SAASmD,EAAmBnD,GAAuC;AACjE,QAAM6H,IAAmB,CAAA;AACzB,EAAI7H,EAAM,oBAAiB6H,EAAI,kBAAkB7H,EAAM,kBACnDA,EAAM,cAAW6H,EAAI,QAAQ7H,EAAM,YACnCA,EAAM,SAAM6H,EAAI,aAAa,QAC7B7H,EAAM,WAAQ6H,EAAI,YAAY;AAClC,QAAMC,IAAgB,CAAA;AACtB,SAAI9H,EAAM,aAAW8H,EAAI,KAAK,WAAW,GACrC9H,EAAM,UAAQ8H,EAAI,KAAK,cAAc,GACrCA,EAAI,WAAQD,EAAI,qBAAqBC,EAAI,KAAK,GAAG,IAC9CD;AACT;AAEA,SAAS3D,KAAY;AACnB,SAAO;AAAA;AAAA;AAAA;AAAA,IAIL,KAAA;AACJ;AAEA,SAASV,EAAexD,GAAkD;AACxE,QAAM+H,IAAmB,CAAA;AACzB,aAAW,CAACrI,GAAKC,CAAK,KAAK,OAAO,QAAQK,CAAK;AAC7C,IAA2BL,KAAU,QAAQA,MAAU,MACnD,OAAOA,KAAU,YAAY,OAAOA,KAAU,aAClDoI,EAAIrI,CAAG,IAAIC;AAEb,SAAOoI;AACT;"}