@livetemplate/client 0.8.37 → 0.8.39
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/README.md +11 -1
- package/dist/dom/event-delegation.d.ts +1 -1
- package/dist/dom/event-delegation.d.ts.map +1 -1
- package/dist/dom/event-delegation.js +79 -0
- package/dist/dom/event-delegation.js.map +1 -1
- package/dist/livetemplate-client.browser.js +5 -5
- package/dist/livetemplate-client.browser.js.map +4 -4
- package/dist/livetemplate-client.d.ts +12 -0
- package/dist/livetemplate-client.d.ts.map +1 -1
- package/dist/livetemplate-client.js +199 -24
- package/dist/livetemplate-client.js.map +1 -1
- package/dist/state/range-dom-applier.d.ts +124 -0
- package/dist/state/range-dom-applier.d.ts.map +1 -0
- package/dist/state/range-dom-applier.js +510 -0
- package/dist/state/range-dom-applier.js.map +1 -0
- package/dist/state/tree-renderer.d.ts +32 -1
- package/dist/state/tree-renderer.d.ts.map +1 -1
- package/dist/state/tree-renderer.js +81 -54
- package/dist/state/tree-renderer.js.map +1 -1
- package/dist/tests/event-delegation.test.js +354 -0
- package/dist/tests/event-delegation.test.js.map +1 -1
- package/dist/tests/range-dom-applier.test.d.ts +2 -0
- package/dist/tests/range-dom-applier.test.d.ts.map +1 -0
- package/dist/tests/range-dom-applier.test.js +581 -0
- package/dist/tests/range-dom-applier.test.js.map +1 -0
- package/dist/tests/tree-renderer.test.js +61 -0
- package/dist/tests/tree-renderer.test.js.map +1 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,581 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
/**
|
|
37
|
+
* RangeDomApplier Tests
|
|
38
|
+
*
|
|
39
|
+
* Verifies per-op targeted DOM mutation for range diff ops:
|
|
40
|
+
* r (remove), u (update), i (insert after), a (append),
|
|
41
|
+
* p (prepend), o (reorder)
|
|
42
|
+
*
|
|
43
|
+
* The applier bypasses full HTML reconstruction + morphdom diff for
|
|
44
|
+
* the common case of single-row mutation on a large keyed range.
|
|
45
|
+
*/
|
|
46
|
+
const range_dom_applier_1 = require("../state/range-dom-applier");
|
|
47
|
+
const tree_renderer_1 = require("../state/tree-renderer");
|
|
48
|
+
const logger_1 = require("../utils/logger");
|
|
49
|
+
const ROW_STATICS = ['<tr data-key="', '"><td>', "</td></tr>"];
|
|
50
|
+
const RANGE_PATH = "0";
|
|
51
|
+
function makeFixture(itemCount) {
|
|
52
|
+
const logger = (0, logger_1.createLogger)({ level: "silent" });
|
|
53
|
+
const renderer = new tree_renderer_1.TreeRenderer(logger);
|
|
54
|
+
const items = Array.from({ length: itemCount }, (_, i) => ({
|
|
55
|
+
_k: `row-${i}`,
|
|
56
|
+
"0": `row-${i}`,
|
|
57
|
+
"1": `value-${i}`,
|
|
58
|
+
}));
|
|
59
|
+
const result = renderer.applyUpdate({
|
|
60
|
+
s: ["<div><table><tbody>", "</tbody></table></div>"],
|
|
61
|
+
[RANGE_PATH]: {
|
|
62
|
+
d: items,
|
|
63
|
+
s: ROW_STATICS,
|
|
64
|
+
m: { idKey: "0" },
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
document.body.innerHTML = result.html;
|
|
68
|
+
const wrapper = document.body.firstElementChild;
|
|
69
|
+
const container = wrapper.querySelector("tbody");
|
|
70
|
+
const itemState = new Map();
|
|
71
|
+
for (const it of items) {
|
|
72
|
+
itemState.set(it._k, it);
|
|
73
|
+
}
|
|
74
|
+
const hookCalls = [];
|
|
75
|
+
const applier = new range_dom_applier_1.RangeDomApplier({
|
|
76
|
+
logger,
|
|
77
|
+
renderItem: (item, idx, statics, sm, sp) => renderer.renderRangeItem(item, idx, statics, sm, sp),
|
|
78
|
+
executeLifecycleHook: (el, hook) => {
|
|
79
|
+
hookCalls.push({ hook, key: el.getAttribute("data-key") });
|
|
80
|
+
},
|
|
81
|
+
itemLookup: (path, key) => {
|
|
82
|
+
if (path === RANGE_PATH)
|
|
83
|
+
return itemState.get(key);
|
|
84
|
+
return undefined;
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
// Mirror the production flow: callers run canApplyTargeted (which
|
|
88
|
+
// resolves and caches the container) before calling apply. Without
|
|
89
|
+
// this, a/p ops can't locate the container — they have no key in
|
|
90
|
+
// op[1] for findContainer to walk to.
|
|
91
|
+
if (items.length > 0) {
|
|
92
|
+
applier.findContainer(wrapper, RANGE_PATH, items[0]._k);
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
wrapper,
|
|
96
|
+
container,
|
|
97
|
+
renderer,
|
|
98
|
+
applier,
|
|
99
|
+
hookCalls,
|
|
100
|
+
rangePath: RANGE_PATH,
|
|
101
|
+
statics: ROW_STATICS,
|
|
102
|
+
itemState,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function makeTargetedOp(ops) {
|
|
106
|
+
return {
|
|
107
|
+
rangePath: RANGE_PATH,
|
|
108
|
+
ops,
|
|
109
|
+
statics: ROW_STATICS,
|
|
110
|
+
idKey: "0",
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
describe("RangeDomApplier - container & predicate", () => {
|
|
114
|
+
it("findContainer locates the items' parent via data-key sample", () => {
|
|
115
|
+
const fx = makeFixture(5);
|
|
116
|
+
const c = fx.applier.findContainer(fx.wrapper, RANGE_PATH, "row-2");
|
|
117
|
+
expect(c).toBe(fx.container);
|
|
118
|
+
});
|
|
119
|
+
it("findContainer returns null when no sample key is provided and cache empty", () => {
|
|
120
|
+
const fx = makeFixture(5);
|
|
121
|
+
fx.applier.invalidate();
|
|
122
|
+
// No anyKnownItemKey → must NOT fall back to an unscoped wrapper walk
|
|
123
|
+
// (which could return a container belonging to a different keyed range).
|
|
124
|
+
expect(fx.applier.findContainer(fx.wrapper, RANGE_PATH)).toBeNull();
|
|
125
|
+
});
|
|
126
|
+
it("findContainer returns null when sample key doesn't match any element", () => {
|
|
127
|
+
const fx = makeFixture(5);
|
|
128
|
+
fx.applier.invalidate();
|
|
129
|
+
expect(fx.applier.findContainer(fx.wrapper, RANGE_PATH, "ghost-key")).toBeNull();
|
|
130
|
+
});
|
|
131
|
+
it("findContainer re-resolves when cached element detaches", () => {
|
|
132
|
+
const fx = makeFixture(5);
|
|
133
|
+
fx.applier.findContainer(fx.wrapper, RANGE_PATH, "row-2");
|
|
134
|
+
fx.container.remove();
|
|
135
|
+
expect(fx.applier.findContainer(fx.wrapper, RANGE_PATH, "row-2")).toBeNull();
|
|
136
|
+
});
|
|
137
|
+
it("canApplyTargeted ok for keyed range with no nested ranges", () => {
|
|
138
|
+
const fx = makeFixture(5);
|
|
139
|
+
const result = fx.applier.canApplyTargeted(fx.wrapper, { d: [...fx.itemState.values()], s: ROW_STATICS, m: { idKey: "0" } }, RANGE_PATH);
|
|
140
|
+
expect(result.ok).toBe(true);
|
|
141
|
+
expect(result.container).toBe(fx.container);
|
|
142
|
+
});
|
|
143
|
+
it("canApplyTargeted rejects when statics lack data-key", () => {
|
|
144
|
+
const fx = makeFixture(5);
|
|
145
|
+
const result = fx.applier.canApplyTargeted(fx.wrapper, {
|
|
146
|
+
d: [{ _k: "x", "0": "a" }],
|
|
147
|
+
s: ["<li>", "</li>"],
|
|
148
|
+
}, RANGE_PATH);
|
|
149
|
+
expect(result.ok).toBe(false);
|
|
150
|
+
expect(result.reason).toMatch(/data-key/);
|
|
151
|
+
});
|
|
152
|
+
it("canApplyTargeted rejects nested-range items", () => {
|
|
153
|
+
const fx = makeFixture(5);
|
|
154
|
+
const result = fx.applier.canApplyTargeted(fx.wrapper, {
|
|
155
|
+
d: [
|
|
156
|
+
{
|
|
157
|
+
_k: "row-0",
|
|
158
|
+
"0": "row-0",
|
|
159
|
+
"1": { d: [{ "0": "nested" }], s: ["<i>", "</i>"] },
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
s: ROW_STATICS,
|
|
163
|
+
}, RANGE_PATH);
|
|
164
|
+
expect(result.ok).toBe(false);
|
|
165
|
+
expect(result.reason).toMatch(/nested-range/);
|
|
166
|
+
});
|
|
167
|
+
it("canApplyTargeted rejects when lvt-ignore is on the wrapper path", () => {
|
|
168
|
+
const fx = makeFixture(5);
|
|
169
|
+
const tableEl = fx.wrapper.querySelector("table");
|
|
170
|
+
tableEl.setAttribute("lvt-ignore", "");
|
|
171
|
+
const result = fx.applier.canApplyTargeted(fx.wrapper, { d: [...fx.itemState.values()], s: ROW_STATICS, m: { idKey: "0" } }, RANGE_PATH);
|
|
172
|
+
expect(result.ok).toBe(false);
|
|
173
|
+
expect(result.reason).toMatch(/lvt-ignore/);
|
|
174
|
+
});
|
|
175
|
+
it("canApplyTargeted rejects when lvt-ignore is on the wrapper element itself", () => {
|
|
176
|
+
const fx = makeFixture(5);
|
|
177
|
+
fx.wrapper.setAttribute("lvt-ignore", "");
|
|
178
|
+
const result = fx.applier.canApplyTargeted(fx.wrapper, { d: [...fx.itemState.values()], s: ROW_STATICS, m: { idKey: "0" } }, RANGE_PATH);
|
|
179
|
+
expect(result.ok).toBe(false);
|
|
180
|
+
expect(result.reason).toMatch(/lvt-ignore/);
|
|
181
|
+
});
|
|
182
|
+
});
|
|
183
|
+
describe("RangeDomApplier - r (remove)", () => {
|
|
184
|
+
it("removes a row by key", () => {
|
|
185
|
+
const fx = makeFixture(5);
|
|
186
|
+
expect(fx.container.querySelectorAll("tr").length).toBe(5);
|
|
187
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["r", "row-2"]]));
|
|
188
|
+
expect(fx.container.querySelectorAll("tr").length).toBe(4);
|
|
189
|
+
expect(fx.container.querySelector('[data-key="row-2"]')).toBeNull();
|
|
190
|
+
});
|
|
191
|
+
it("fires lvt-destroyed on the row before removal", () => {
|
|
192
|
+
const fx = makeFixture(3);
|
|
193
|
+
fx.container.querySelector('[data-key="row-1"]').setAttribute("lvt-destroyed", "/* hook */");
|
|
194
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["r", "row-1"]]));
|
|
195
|
+
expect(fx.hookCalls).toEqual([
|
|
196
|
+
{ hook: "lvt-destroyed", key: "row-1" },
|
|
197
|
+
]);
|
|
198
|
+
});
|
|
199
|
+
it("fires lvt-destroyed on descendants too", () => {
|
|
200
|
+
const fx = makeFixture(3);
|
|
201
|
+
const row = fx.container.querySelector('[data-key="row-0"]');
|
|
202
|
+
const td = row.querySelector("td");
|
|
203
|
+
td.setAttribute("lvt-destroyed", "/* hook */");
|
|
204
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["r", "row-0"]]));
|
|
205
|
+
expect(fx.hookCalls.some((c) => c.hook === "lvt-destroyed" && c.key === null)).toBe(true);
|
|
206
|
+
});
|
|
207
|
+
it("is a no-op when key is missing (logs debug)", () => {
|
|
208
|
+
const fx = makeFixture(3);
|
|
209
|
+
expect(() => fx.applier.apply(fx.wrapper, makeTargetedOp([["r", "missing-key"]]))).not.toThrow();
|
|
210
|
+
expect(fx.container.querySelectorAll("tr").length).toBe(3);
|
|
211
|
+
});
|
|
212
|
+
});
|
|
213
|
+
describe("RangeDomApplier - u (update)", () => {
|
|
214
|
+
it("updates a single row in place", () => {
|
|
215
|
+
const fx = makeFixture(3);
|
|
216
|
+
fx.itemState.set("row-1", {
|
|
217
|
+
_k: "row-1",
|
|
218
|
+
"0": "row-1",
|
|
219
|
+
"1": "updated-value",
|
|
220
|
+
});
|
|
221
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["u", "row-1", { "1": "updated-value" }]]));
|
|
222
|
+
const row = fx.container.querySelector('[data-key="row-1"]');
|
|
223
|
+
expect(row.textContent).toContain("updated-value");
|
|
224
|
+
expect(fx.container.querySelectorAll("tr").length).toBe(3);
|
|
225
|
+
});
|
|
226
|
+
it("fires lvt-destroyed/lvt-mounted when called without morphdomOptions", () => {
|
|
227
|
+
const fx = makeFixture(3);
|
|
228
|
+
const oldRow = fx.container.querySelector('[data-key="row-1"]');
|
|
229
|
+
oldRow.setAttribute("lvt-destroyed", "/* d */");
|
|
230
|
+
fx.itemState.set("row-1", {
|
|
231
|
+
_k: "row-1",
|
|
232
|
+
"0": "row-1",
|
|
233
|
+
"1": "v1-updated",
|
|
234
|
+
});
|
|
235
|
+
// Override renderItem to return HTML with lvt-mounted on the row.
|
|
236
|
+
const ctx = fx.applier.ctx;
|
|
237
|
+
const origRender = ctx.renderItem;
|
|
238
|
+
ctx.renderItem = () => '<tr data-key="row-1" lvt-mounted="/* m */"><td>v1-updated</td></tr>';
|
|
239
|
+
// Reset hookCalls and count manual onNodeAdded notifications.
|
|
240
|
+
fx.hookCalls.length = 0;
|
|
241
|
+
let nodeAddedCalls = 0;
|
|
242
|
+
ctx.onNodeAdded = () => {
|
|
243
|
+
nodeAddedCalls++;
|
|
244
|
+
};
|
|
245
|
+
// Call apply WITHOUT passing morphdomOptions (third arg).
|
|
246
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["u", "row-1", { "1": "v1-updated" }]]));
|
|
247
|
+
// Restore.
|
|
248
|
+
ctx.renderItem = origRender;
|
|
249
|
+
ctx.onNodeAdded = undefined;
|
|
250
|
+
// Both lifecycle hooks fired AND the host was notified about the new node.
|
|
251
|
+
expect(fx.hookCalls.find((c) => c.hook === "lvt-destroyed")).toBeDefined();
|
|
252
|
+
expect(fx.hookCalls.find((c) => c.hook === "lvt-mounted")).toBeDefined();
|
|
253
|
+
expect(nodeAddedCalls).toBe(1);
|
|
254
|
+
});
|
|
255
|
+
it("morphs the row with childrenOnly:false so root-element attrs are diffed", async () => {
|
|
256
|
+
// Row attribute (class) changes between renders. With childrenOnly:true
|
|
257
|
+
// morphdom would skip attr diffing on the row root. Verify we override
|
|
258
|
+
// and the class makes it onto the live element.
|
|
259
|
+
const morphdom = (await Promise.resolve().then(() => __importStar(require("morphdom")))).default;
|
|
260
|
+
const fx = makeFixture(2);
|
|
261
|
+
fx.itemState.set("row-0", {
|
|
262
|
+
_k: "row-0",
|
|
263
|
+
"0": "row-0",
|
|
264
|
+
"1": "v0",
|
|
265
|
+
});
|
|
266
|
+
const ctx = fx.applier.ctx;
|
|
267
|
+
const origRender = ctx.renderItem;
|
|
268
|
+
ctx.renderItem = () => '<tr data-key="row-0" class="highlighted"><td>v0</td></tr>';
|
|
269
|
+
const morphdomOpts = { childrenOnly: true }; // intentionally provoke the bug
|
|
270
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["u", "row-0", { "1": "v0" }]]), morphdomOpts);
|
|
271
|
+
ctx.renderItem = origRender;
|
|
272
|
+
// The row root's class attribute should now be "highlighted" — only
|
|
273
|
+
// possible if the applier overrode childrenOnly to false.
|
|
274
|
+
const row = fx.container.querySelector('[data-key="row-0"]');
|
|
275
|
+
expect(row.getAttribute("class")).toBe("highlighted");
|
|
276
|
+
// morphdom is referenced just to ensure the import path stays alive
|
|
277
|
+
void morphdom;
|
|
278
|
+
});
|
|
279
|
+
it("returns null from apply() when u op silently no-ops (item state missing)", () => {
|
|
280
|
+
// Stale state: item is in DOM but lookup returns nothing. Previously,
|
|
281
|
+
// applyUpdateRow would log + return silently and apply() would still
|
|
282
|
+
// mark the container as TARGETED_APPLIED → morphdom skips → live DOM
|
|
283
|
+
// stays out of sync forever. With the boolean-return fix, apply()
|
|
284
|
+
// returns null and updateDOM falls back to a full rebuild.
|
|
285
|
+
const fx = makeFixture(3);
|
|
286
|
+
fx.itemState.delete("row-1"); // simulate desync
|
|
287
|
+
const result = fx.applier.apply(fx.wrapper, makeTargetedOp([["u", "row-1", { "1": "v1-new" }]]));
|
|
288
|
+
expect(result).toBeNull();
|
|
289
|
+
});
|
|
290
|
+
it("returns null from apply() when i op anchor is missing", () => {
|
|
291
|
+
const fx = makeFixture(3);
|
|
292
|
+
const result = fx.applier.apply(fx.wrapper, makeTargetedOp([["i", "ghost-anchor", { _k: "row-new" }]]));
|
|
293
|
+
expect(result).toBeNull();
|
|
294
|
+
});
|
|
295
|
+
it("r op is idempotent (apply succeeds even when row already gone)", () => {
|
|
296
|
+
const fx = makeFixture(3);
|
|
297
|
+
fx.container.querySelector('[data-key="row-1"]').remove();
|
|
298
|
+
const result = fx.applier.apply(fx.wrapper, makeTargetedOp([["r", "row-1"]]));
|
|
299
|
+
expect(result).toBe(fx.container);
|
|
300
|
+
});
|
|
301
|
+
it("apply() returns null for unknown op type (forward-compat fail-safe)", () => {
|
|
302
|
+
const fx = makeFixture(3);
|
|
303
|
+
const result = fx.applier.apply(fx.wrapper, makeTargetedOp([["zz-future-op", "row-0"]]));
|
|
304
|
+
expect(result).toBeNull();
|
|
305
|
+
});
|
|
306
|
+
it("applyAppend bails entirely on partial render failure (no DOM mutation)", () => {
|
|
307
|
+
const fx = makeFixture(2);
|
|
308
|
+
const ctx = fx.applier.ctx;
|
|
309
|
+
const origRender = ctx.renderItem;
|
|
310
|
+
let calls = 0;
|
|
311
|
+
ctx.renderItem = (item, idx, statics) => {
|
|
312
|
+
calls++;
|
|
313
|
+
if (calls === 2)
|
|
314
|
+
return "<!--bad-->"; // parses to no element
|
|
315
|
+
return origRender(item, idx, statics);
|
|
316
|
+
};
|
|
317
|
+
const items = [
|
|
318
|
+
{ _k: "row-a", "0": "row-a", "1": "va" },
|
|
319
|
+
{ _k: "row-b", "0": "row-b", "1": "vb" },
|
|
320
|
+
];
|
|
321
|
+
const result = fx.applier.apply(fx.wrapper, makeTargetedOp([["a", items]]));
|
|
322
|
+
ctx.renderItem = origRender;
|
|
323
|
+
// Without atomic insert, row-a would have been appended before row-b's
|
|
324
|
+
// failure → 3 children. With atomic insert: still 2.
|
|
325
|
+
expect(fx.container.querySelectorAll("tr").length).toBe(2);
|
|
326
|
+
expect(result).toBeNull();
|
|
327
|
+
});
|
|
328
|
+
it("applyPrepend bails entirely on partial render failure", () => {
|
|
329
|
+
const fx = makeFixture(2);
|
|
330
|
+
const ctx = fx.applier.ctx;
|
|
331
|
+
const origRender = ctx.renderItem;
|
|
332
|
+
let calls = 0;
|
|
333
|
+
ctx.renderItem = (item, idx, statics) => {
|
|
334
|
+
calls++;
|
|
335
|
+
if (calls === 2)
|
|
336
|
+
return "<!--bad-->";
|
|
337
|
+
return origRender(item, idx, statics);
|
|
338
|
+
};
|
|
339
|
+
const items = [
|
|
340
|
+
{ _k: "row-x", "0": "row-x", "1": "vx" },
|
|
341
|
+
{ _k: "row-y", "0": "row-y", "1": "vy" },
|
|
342
|
+
];
|
|
343
|
+
const result = fx.applier.apply(fx.wrapper, makeTargetedOp([["p", items]]));
|
|
344
|
+
ctx.renderItem = origRender;
|
|
345
|
+
expect(fx.container.querySelectorAll("tr").length).toBe(2);
|
|
346
|
+
expect(result).toBeNull();
|
|
347
|
+
});
|
|
348
|
+
it("staticsContainKeyAttribute rejects longer-named attributes (data-keystone)", () => {
|
|
349
|
+
// Plain `s.includes('data-key=')` returned true here because
|
|
350
|
+
// `data-keystone=` contains `data-key=`-as-substring. The boundary
|
|
351
|
+
// check fixes it: `data-key\s*=` requires `=` after optional
|
|
352
|
+
// whitespace, so `data-keystone=` doesn't match.
|
|
353
|
+
const fx = makeFixture(1);
|
|
354
|
+
const result = fx.applier.canApplyTargeted(fx.wrapper, {
|
|
355
|
+
d: [{ _k: "x", "0": "value" }],
|
|
356
|
+
s: ['<tr data-keystone="', '"><td>', "</td></tr>"],
|
|
357
|
+
}, RANGE_PATH);
|
|
358
|
+
expect(result.ok).toBe(false);
|
|
359
|
+
});
|
|
360
|
+
it("staticsContainKeyAttribute accepts data-key as a real attribute", () => {
|
|
361
|
+
const fx = makeFixture(1);
|
|
362
|
+
const result = fx.applier.canApplyTargeted(fx.wrapper, {
|
|
363
|
+
d: [{ _k: "row-0", "0": "v" }],
|
|
364
|
+
s: ['<tr data-key="', '"><td>', "</td></tr>"],
|
|
365
|
+
}, RANGE_PATH);
|
|
366
|
+
expect(result.ok).toBe(true);
|
|
367
|
+
});
|
|
368
|
+
it("preserves focus on an input inside the updated row when morphdomOptions provided", () => {
|
|
369
|
+
const fx = makeFixture(3);
|
|
370
|
+
const formStatics = [
|
|
371
|
+
'<tr data-key="',
|
|
372
|
+
'"><td><input name="',
|
|
373
|
+
'" value="',
|
|
374
|
+
'" /></td></tr>',
|
|
375
|
+
];
|
|
376
|
+
const items = [
|
|
377
|
+
{ _k: "row-0", "0": "row-0", "1": "name0", "2": "v0" },
|
|
378
|
+
{ _k: "row-1", "0": "row-1", "1": "name1", "2": "v1" },
|
|
379
|
+
];
|
|
380
|
+
const reslt = fx.renderer.applyUpdate({
|
|
381
|
+
s: ["<div><table><tbody>", "</tbody></table></div>"],
|
|
382
|
+
[RANGE_PATH]: { d: items, s: formStatics, m: { idKey: "0" } },
|
|
383
|
+
});
|
|
384
|
+
document.body.innerHTML = reslt.html;
|
|
385
|
+
const wrapper = document.body.firstElementChild;
|
|
386
|
+
const container = wrapper.querySelector("tbody");
|
|
387
|
+
fx.applier.invalidate();
|
|
388
|
+
fx.itemState.clear();
|
|
389
|
+
for (const it of items)
|
|
390
|
+
fx.itemState.set(it._k, it);
|
|
391
|
+
fx.itemState.set("row-1", {
|
|
392
|
+
_k: "row-1",
|
|
393
|
+
"0": "row-1",
|
|
394
|
+
"1": "name1",
|
|
395
|
+
"2": "v1-updated",
|
|
396
|
+
});
|
|
397
|
+
const input = container.querySelector('[data-key="row-1"] input');
|
|
398
|
+
input.focus();
|
|
399
|
+
expect(document.activeElement).toBe(input);
|
|
400
|
+
const morphdomOpts = {
|
|
401
|
+
childrenOnly: false,
|
|
402
|
+
onBeforeElUpdated: (fromEl, toEl) => {
|
|
403
|
+
if (fromEl === input) {
|
|
404
|
+
for (const a of Array.from(toEl.attributes)) {
|
|
405
|
+
const attr = a;
|
|
406
|
+
if (attr.name !== "value") {
|
|
407
|
+
fromEl.setAttribute(attr.name, attr.value);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
return false;
|
|
411
|
+
}
|
|
412
|
+
return true;
|
|
413
|
+
},
|
|
414
|
+
};
|
|
415
|
+
fx.applier.apply(wrapper, {
|
|
416
|
+
rangePath: RANGE_PATH,
|
|
417
|
+
ops: [["u", "row-1", { "2": "v1-updated" }]],
|
|
418
|
+
statics: formStatics,
|
|
419
|
+
idKey: "0",
|
|
420
|
+
}, morphdomOpts);
|
|
421
|
+
expect(document.activeElement).toBe(input);
|
|
422
|
+
});
|
|
423
|
+
});
|
|
424
|
+
describe("RangeDomApplier - i (insert after)", () => {
|
|
425
|
+
it("inserts a single new row after the anchor", () => {
|
|
426
|
+
const fx = makeFixture(3);
|
|
427
|
+
const newItem = { _k: "row-new", "0": "row-new", "1": "val-new" };
|
|
428
|
+
fx.itemState.set("row-new", newItem);
|
|
429
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["i", "row-1", newItem]]));
|
|
430
|
+
const rows = Array.from(fx.container.querySelectorAll("tr"));
|
|
431
|
+
expect(rows.length).toBe(4);
|
|
432
|
+
expect(rows[2].getAttribute("data-key")).toBe("row-new");
|
|
433
|
+
});
|
|
434
|
+
it("fires lvt-mounted on the inserted row + descendants", () => {
|
|
435
|
+
const fx = makeFixture(3);
|
|
436
|
+
const itemHtml = `<tr data-key="row-new" lvt-mounted="/* */"><td lvt-mounted="/* */">val-new</td></tr>`;
|
|
437
|
+
const ctx = fx.applier.ctx;
|
|
438
|
+
ctx.renderItem = () => itemHtml;
|
|
439
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["i", "row-1", { _k: "row-new" }]]));
|
|
440
|
+
expect(fx.hookCalls.filter((c) => c.hook === "lvt-mounted").length).toBe(2);
|
|
441
|
+
});
|
|
442
|
+
});
|
|
443
|
+
describe("RangeDomApplier - a (append)", () => {
|
|
444
|
+
it("appends rows to the end", () => {
|
|
445
|
+
const fx = makeFixture(2);
|
|
446
|
+
const items = [
|
|
447
|
+
{ _k: "row-a", "0": "row-a", "1": "va" },
|
|
448
|
+
{ _k: "row-b", "0": "row-b", "1": "vb" },
|
|
449
|
+
];
|
|
450
|
+
items.forEach((it) => fx.itemState.set(it._k, it));
|
|
451
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["a", items]]));
|
|
452
|
+
const rows = Array.from(fx.container.querySelectorAll("tr"));
|
|
453
|
+
expect(rows.length).toBe(4);
|
|
454
|
+
expect(rows[2].getAttribute("data-key")).toBe("row-a");
|
|
455
|
+
expect(rows[3].getAttribute("data-key")).toBe("row-b");
|
|
456
|
+
});
|
|
457
|
+
});
|
|
458
|
+
describe("RangeDomApplier - p (prepend)", () => {
|
|
459
|
+
it("prepends rows to the start", () => {
|
|
460
|
+
const fx = makeFixture(2);
|
|
461
|
+
const items = [
|
|
462
|
+
{ _k: "row-x", "0": "row-x", "1": "vx" },
|
|
463
|
+
{ _k: "row-y", "0": "row-y", "1": "vy" },
|
|
464
|
+
];
|
|
465
|
+
items.forEach((it) => fx.itemState.set(it._k, it));
|
|
466
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["p", items]]));
|
|
467
|
+
const rows = Array.from(fx.container.querySelectorAll("tr"));
|
|
468
|
+
expect(rows.length).toBe(4);
|
|
469
|
+
expect(rows[0].getAttribute("data-key")).toBe("row-x");
|
|
470
|
+
expect(rows[1].getAttribute("data-key")).toBe("row-y");
|
|
471
|
+
});
|
|
472
|
+
});
|
|
473
|
+
describe("RangeDomApplier - o (reorder)", () => {
|
|
474
|
+
it("reorders existing rows in-place via DocumentFragment", () => {
|
|
475
|
+
const fx = makeFixture(4);
|
|
476
|
+
const beforeRefs = Array.from(fx.container.children);
|
|
477
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["o", ["row-3", "row-1", "row-0", "row-2"]]]));
|
|
478
|
+
const after = Array.from(fx.container.children);
|
|
479
|
+
expect(after.map((r) => r.getAttribute("data-key"))).toEqual([
|
|
480
|
+
"row-3",
|
|
481
|
+
"row-1",
|
|
482
|
+
"row-0",
|
|
483
|
+
"row-2",
|
|
484
|
+
]);
|
|
485
|
+
// Same element identities — no re-creation
|
|
486
|
+
expect(after.every((el) => beforeRefs.includes(el))).toBe(true);
|
|
487
|
+
});
|
|
488
|
+
it("ignores keys not present in the container", () => {
|
|
489
|
+
const fx = makeFixture(3);
|
|
490
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["o", ["row-2", "ghost", "row-0", "row-1"]]]));
|
|
491
|
+
const after = Array.from(fx.container.children).map((r) => r.getAttribute("data-key"));
|
|
492
|
+
expect(after).toEqual(["row-2", "row-0", "row-1"]);
|
|
493
|
+
});
|
|
494
|
+
it("fires lvt-destroyed on dropped children (partial newKeyOrder)", () => {
|
|
495
|
+
const fx = makeFixture(4);
|
|
496
|
+
// Tag two of the rows with lvt-destroyed so we can assert hooks fire.
|
|
497
|
+
fx.container
|
|
498
|
+
.querySelector('[data-key="row-1"]')
|
|
499
|
+
.setAttribute("lvt-destroyed", "/* hook1 */");
|
|
500
|
+
fx.container
|
|
501
|
+
.querySelector('[data-key="row-3"]')
|
|
502
|
+
.setAttribute("lvt-destroyed", "/* hook3 */");
|
|
503
|
+
fx.hookCalls.length = 0;
|
|
504
|
+
// newKeyOrder excludes row-1 and row-3 → both should be destroyed.
|
|
505
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["o", ["row-2", "row-0"]]]));
|
|
506
|
+
const destroyedKeys = fx.hookCalls
|
|
507
|
+
.filter((c) => c.hook === "lvt-destroyed")
|
|
508
|
+
.map((c) => c.key)
|
|
509
|
+
.sort();
|
|
510
|
+
expect(destroyedKeys).toEqual(["row-1", "row-3"]);
|
|
511
|
+
const after = Array.from(fx.container.children).map((r) => r.getAttribute("data-key"));
|
|
512
|
+
expect(after).toEqual(["row-2", "row-0"]);
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
describe("RangeDomApplier - skip mechanism with morphdom", () => {
|
|
516
|
+
it("morphdom preserves the live container's children when skip marker present", async () => {
|
|
517
|
+
const morphdom = (await Promise.resolve().then(() => __importStar(require("morphdom")))).default;
|
|
518
|
+
const fx = makeFixture(50);
|
|
519
|
+
// Snapshot row identities before any change
|
|
520
|
+
fx.itemState.delete("row-25");
|
|
521
|
+
fx.applier.apply(fx.wrapper, makeTargetedOp([["r", "row-25"]]));
|
|
522
|
+
fx.container.setAttribute(range_dom_applier_1.TARGETED_APPLIED_ATTR, "");
|
|
523
|
+
const liveRowsAfterApply = Array.from(fx.container.children);
|
|
524
|
+
expect(liveRowsAfterApply.length).toBe(49);
|
|
525
|
+
// Build a tempWrapper that mimics what reconstructFromTree+placeholder
|
|
526
|
+
// produces: the rebuilt container is empty + tagged with the skip marker.
|
|
527
|
+
const tempWrapper = document.createElement(fx.wrapper.tagName);
|
|
528
|
+
tempWrapper.innerHTML =
|
|
529
|
+
"<table><tbody data-lvt-targeted-skip=\"0\"></tbody></table>";
|
|
530
|
+
let beforeElUpdatedCallsInRange = 0;
|
|
531
|
+
morphdom(fx.wrapper, tempWrapper, {
|
|
532
|
+
childrenOnly: true,
|
|
533
|
+
getNodeKey: (node) => {
|
|
534
|
+
if (node.nodeType === 1) {
|
|
535
|
+
return (node.getAttribute("data-key") ||
|
|
536
|
+
node.getAttribute("data-lvt-key") ||
|
|
537
|
+
undefined);
|
|
538
|
+
}
|
|
539
|
+
},
|
|
540
|
+
onBeforeElUpdated: (fromEl, toEl) => {
|
|
541
|
+
if (toEl.nodeType === Node.ELEMENT_NODE &&
|
|
542
|
+
toEl.hasAttribute(range_dom_applier_1.TARGETED_SKIP_ATTR)) {
|
|
543
|
+
return false;
|
|
544
|
+
}
|
|
545
|
+
if (fromEl.nodeType === 1 &&
|
|
546
|
+
fromEl.hasAttribute("data-key")) {
|
|
547
|
+
beforeElUpdatedCallsInRange++;
|
|
548
|
+
}
|
|
549
|
+
return true;
|
|
550
|
+
},
|
|
551
|
+
});
|
|
552
|
+
// Children survived intact — morphdom did NOT remove them despite
|
|
553
|
+
// toEl having an empty container.
|
|
554
|
+
const liveRowsAfterMorph = Array.from(fx.container.children);
|
|
555
|
+
expect(liveRowsAfterMorph.length).toBe(49);
|
|
556
|
+
// Same element identities — no replacement, no rebuild.
|
|
557
|
+
expect(liveRowsAfterMorph.every((row, i) => row === liveRowsAfterApply[i])).toBe(true);
|
|
558
|
+
// Critical: morphdom never invoked onBeforeElUpdated on any of the
|
|
559
|
+
// 49 keyed rows — the subtree was short-circuited. This is the
|
|
560
|
+
// savings vs. the full-rebuild path (which would call it 49 times,
|
|
561
|
+
// each with attribute diffing + descendant walk).
|
|
562
|
+
expect(beforeElUpdatedCallsInRange).toBe(0);
|
|
563
|
+
});
|
|
564
|
+
});
|
|
565
|
+
describe("RangeDomApplier - cleanupMarkers", () => {
|
|
566
|
+
it("strips both data-lvt-targeted-applied and data-lvt-targeted-skip", () => {
|
|
567
|
+
const fx = makeFixture(2);
|
|
568
|
+
fx.container.setAttribute(range_dom_applier_1.TARGETED_APPLIED_ATTR, "");
|
|
569
|
+
fx.container.setAttribute(range_dom_applier_1.TARGETED_SKIP_ATTR, "8");
|
|
570
|
+
fx.applier.cleanupMarkers(fx.wrapper);
|
|
571
|
+
expect(fx.container.hasAttribute(range_dom_applier_1.TARGETED_APPLIED_ATTR)).toBe(false);
|
|
572
|
+
expect(fx.container.hasAttribute(range_dom_applier_1.TARGETED_SKIP_ATTR)).toBe(false);
|
|
573
|
+
});
|
|
574
|
+
it("strips marker even when set on the wrapper itself", () => {
|
|
575
|
+
const fx = makeFixture(1);
|
|
576
|
+
fx.wrapper.setAttribute(range_dom_applier_1.TARGETED_APPLIED_ATTR, "");
|
|
577
|
+
fx.applier.cleanupMarkers(fx.wrapper);
|
|
578
|
+
expect(fx.wrapper.hasAttribute(range_dom_applier_1.TARGETED_APPLIED_ATTR)).toBe(false);
|
|
579
|
+
});
|
|
580
|
+
});
|
|
581
|
+
//# sourceMappingURL=range-dom-applier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"range-dom-applier.test.js","sourceRoot":"","sources":["../../tests/range-dom-applier.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;GASG;AACH,kEAIoC;AACpC,0DAAsD;AACtD,4CAA+C;AAc/C,MAAM,WAAW,GAAG,CAAC,gBAAgB,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AAC/D,MAAM,UAAU,GAAG,GAAG,CAAC;AAEvB,SAAS,WAAW,CAAC,SAAiB;IACpC,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,4BAAY,CAAC,MAAM,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACzD,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,GAAG,EAAE,OAAO,CAAC,EAAE;QACf,GAAG,EAAE,SAAS,CAAC,EAAE;KAClB,CAAC,CAAC,CAAC;IACJ,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC;QAClC,CAAC,EAAE,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;QACpD,CAAC,UAAU,CAAC,EAAE;YACZ,CAAC,EAAE,KAAK;YACR,CAAC,EAAE,WAAW;YACd,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SAClB;KACF,CAAC,CAAC;IAEH,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAA4B,CAAC;IAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAY,CAAC;IAE5D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAe,CAAC;IACzC,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,SAAS,GAAgD,EAAE,CAAC;IAClE,MAAM,OAAO,GAAG,IAAI,mCAAe,CAAC;QAClC,MAAM;QACN,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CACzC,QAAQ,CAAC,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC;QACtD,oBAAoB,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE;YACjC,SAAS,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,UAAU,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnD,OAAO,SAAS,CAAC;QACnB,CAAC;KACF,CAAC,CAAC;IACH,kEAAkE;IAClE,mEAAmE;IACnE,iEAAiE;IACjE,sCAAsC;IACtC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,OAAO,CAAC,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO;QACL,OAAO;QACP,SAAS;QACT,QAAQ;QACR,OAAO;QACP,SAAS;QACT,SAAS,EAAE,UAAU;QACrB,OAAO,EAAE,WAAW;QACpB,SAAS;KACV,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAU;IAChC,OAAO;QACL,SAAS,EAAE,UAAU;QACrB,GAAG;QACH,OAAO,EAAE,WAAW;QACpB,KAAK,EAAE,GAAG;KACX,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,6DAA6D,EAAE,GAAG,EAAE;QACrE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACpE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,sEAAsE;QACtE,yEAAyE;QACzE,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;QAC9E,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,MAAM,CACJ,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,WAAW,CAAC,CAC9D,CAAC,QAAQ,EAAE,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAC1D,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC;QACtB,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CACxC,EAAE,CAAC,OAAO,EACV,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EACpE,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CACxC,EAAE,CAAC,OAAO,EACV;YACE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC1B,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SACrB,EACD,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CACxC,EAAE,CAAC,OAAO,EACV;YACE,CAAC,EAAE;gBACD;oBACE,EAAE,EAAE,OAAO;oBACX,GAAG,EAAE,OAAO;oBACZ,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE;iBACpD;aACF;YACD,CAAC,EAAE,WAAW;SACf,EACD,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,CAAE,CAAC;QACnD,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CACxC,EAAE,CAAC,OAAO,EACV,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EACpE,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CACxC,EAAE,CAAC,OAAO,EACV,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,EACpE,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAE,CAAC,YAAY,CAC5D,eAAe,EACf,YAAY,CACb,CAAC;QACF,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC;YAC3B,EAAE,IAAI,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE;SACxC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAE,CAAC;QAC9D,MAAM,EAAE,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAE,CAAC;QACpC,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,YAAY,CAAC,CAAC;QAC/C,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/D,MAAM,CACJ,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CACvE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,EAAE,CACV,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,CACrE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;YACxB,EAAE,EAAE,OAAO;YACX,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,eAAe;SACrB,CAAC,CAAC;QACH,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,CAC3D,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAE,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACnD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CACvC,oBAAoB,CACV,CAAC;QACb,MAAM,CAAC,YAAY,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;QAChD,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;YACxB,EAAE,EAAE,OAAO;YACX,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,YAAY;SAClB,CAAC,CAAC;QACH,kEAAkE;QAClE,MAAM,GAAG,GAAI,EAAE,CAAC,OAAe,CAAC,GAAG,CAAC;QACpC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,CACpB,qEAAqE,CAAC;QACxE,8DAA8D;QAC9D,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,IAAI,cAAc,GAAG,CAAC,CAAC;QACvB,GAAG,CAAC,WAAW,GAAG,GAAG,EAAE;YACrB,cAAc,EAAE,CAAC;QACnB,CAAC,CAAC;QACF,0DAA0D;QAC1D,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,CACxD,CAAC;QACF,WAAW;QACX,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;QAC5B,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;QAE5B,2EAA2E;QAC3E,MAAM,CACJ,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CACrD,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,CACJ,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CACnD,CAAC,WAAW,EAAE,CAAC;QAChB,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACvF,wEAAwE;QACxE,uEAAuE;QACvE,gDAAgD;QAChD,MAAM,QAAQ,GAAG,CAAC,wDAAa,UAAU,GAAC,CAAC,CAAC,OAAO,CAAC;QACpD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;YACxB,EAAE,EAAE,OAAO;YACX,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,IAAI;SACV,CAAC,CAAC;QACH,MAAM,GAAG,GAAI,EAAE,CAAC,OAAe,CAAC,GAAG,CAAC;QACpC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,CACpB,2DAA2D,CAAC;QAE9D,MAAM,YAAY,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,gCAAgC;QAC7E,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAC/C,YAAY,CACb,CAAC;QACF,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;QAE5B,oEAAoE;QACpE,0DAA0D;QAC1D,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAE,CAAC;QAC9D,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QACtD,oEAAoE;QACpE,KAAK,QAAQ,CAAC;IAChB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,sEAAsE;QACtE,qEAAqE;QACrE,qEAAqE;QACrE,kEAAkE;QAClE,2DAA2D;QAC3D,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB;QAChD,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAC7B,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CACpD,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAC7B,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAC3D,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,aAAa,CAAC,oBAAoB,CAAE,CAAC,MAAM,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAC7B,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,CACjC,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC7E,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAC7B,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC,CAAC,CAC5C,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAI,EAAE,CAAC,OAAe,CAAC,GAAG,CAAC;QACpC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,UAAU,GAAG,CAAC,IAAS,EAAE,GAAW,EAAE,OAAiB,EAAE,EAAE;YAC7D,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,YAAY,CAAC,CAAC,uBAAuB;YAC7D,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;YACxC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;SACzC,CAAC;QACF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAC7B,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAC/B,CAAC;QACF,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;QAC5B,uEAAuE;QACvE,qDAAqD;QACrD,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,GAAG,GAAI,EAAE,CAAC,OAAe,CAAC,GAAG,CAAC;QACpC,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;QAClC,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,GAAG,CAAC,UAAU,GAAG,CAAC,IAAS,EAAE,GAAW,EAAE,OAAiB,EAAE,EAAE;YAC7D,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,YAAY,CAAC;YACrC,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;YACxC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;SACzC,CAAC;QACF,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAC7B,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAC/B,CAAC;QACF,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;QAC5B,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,6DAA6D;QAC7D,mEAAmE;QACnE,6DAA6D;QAC7D,iDAAiD;QACjD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CACxC,EAAE,CAAC,OAAO,EACV;YACE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;YAC9B,CAAC,EAAE,CAAC,qBAAqB,EAAE,QAAQ,EAAE,YAAY,CAAC;SACnD,EACD,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACzE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,CACxC,EAAE,CAAC,OAAO,EACV;YACE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;YAC9B,CAAC,EAAE,CAAC,gBAAgB,EAAE,QAAQ,EAAE,YAAY,CAAC;SAC9C,EACD,UAAU,CACX,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kFAAkF,EAAE,GAAG,EAAE;QAC1F,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,WAAW,GAAG;YAClB,gBAAgB;YAChB,qBAAqB;YACrB,WAAW;YACX,gBAAgB;SACjB,CAAC;QACF,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;YACtD,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;SACvD,CAAC;QACF,MAAM,KAAK,GAAG,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YACpC,CAAC,EAAE,CAAC,qBAAqB,EAAE,wBAAwB,CAAC;YACpD,CAAC,UAAU,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;SAC9D,CAAC,CAAC;QACH,QAAQ,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,iBAA4B,CAAC;QAC3D,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAY,CAAC;QAC5D,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QACxB,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACrB,KAAK,MAAM,EAAE,IAAI,KAAK;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE;YACxB,EAAE,EAAE,OAAO;YACX,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,OAAO;YACZ,GAAG,EAAE,YAAY;SAClB,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,SAAS,CAAC,aAAa,CACnC,0BAA0B,CACP,CAAC;QACtB,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE3C,MAAM,YAAY,GAAG;YACnB,YAAY,EAAE,KAAK;YACnB,iBAAiB,EAAE,CAAC,MAAW,EAAE,IAAS,EAAE,EAAE;gBAC5C,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;oBACrB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC5C,MAAM,IAAI,GAAG,CAAS,CAAC;wBACvB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;4BAC1B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;wBAC7C,CAAC;oBACH,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC;QAEF,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,OAAO,EACP;YACE,SAAS,EAAE,UAAU;YACrB,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,WAAW;YACpB,KAAK,EAAE,GAAG;SACX,EACD,YAAY,CACb,CAAC;QAEF,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,OAAO,GAAG,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;QAClE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACrC,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAC1C,CAAC;QACF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,QAAQ,GAAG,sFAAsF,CAAC;QACxG,MAAM,GAAG,GAAI,EAAE,CAAC,OAAe,CAAC,GAAG,CAAC;QACpC,GAAG,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC,QAAQ,CAAC;QAChC,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CACpD,CAAC;QACF,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;YACxC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;SACzC,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG;YACZ,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;YACxC,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE;SACzC,CAAC;QACF,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;QACnD,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACrD,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAC9D,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC3D,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;SACR,CAAC,CAAC;QACH,2CAA2C;QAC3C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAC9D,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACxD,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAC3B,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACvE,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,sEAAsE;QACtE,EAAE,CAAC,SAAS;aACT,aAAa,CAAC,oBAAoB,CAAE;aACpC,YAAY,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAChD,EAAE,CAAC,SAAS;aACT,aAAa,CAAC,oBAAoB,CAAE;aACpC,YAAY,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;QAChD,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QACxB,mEAAmE;QACnE,EAAE,CAAC,OAAO,CAAC,KAAK,CACd,EAAE,CAAC,OAAO,EACV,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAC5C,CAAC;QACF,MAAM,aAAa,GAAG,EAAE,CAAC,SAAS;aAC/B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC;aACzC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;aACjB,IAAI,EAAE,CAAC;QACV,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACxD,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAC3B,CAAC;QACF,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,QAAQ,GAAG,CAAC,wDAAa,UAAU,GAAC,CAAC,CAAC,OAAO,CAAC;QACpD,MAAM,EAAE,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;QAE3B,4CAA4C;QAC5C,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC9B,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAChE,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,yCAAqB,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE3C,uEAAuE;QACvE,0EAA0E;QAC1E,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC/D,WAAW,CAAC,SAAS;YACnB,6DAA6D,CAAC;QAEhE,IAAI,2BAA2B,GAAG,CAAC,CAAC;QACpC,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE;YAChC,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,CAAC,IAAS,EAAE,EAAE;gBACxB,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;oBACxB,OAAO,CACL,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC;wBAC7B,IAAI,CAAC,YAAY,CAAC,cAAc,CAAC;wBACjC,SAAS,CACV,CAAC;gBACJ,CAAC;YACH,CAAC;YACD,iBAAiB,EAAE,CAAC,MAAW,EAAE,IAAS,EAAE,EAAE;gBAC5C,IACE,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,YAAY;oBAClC,IAAgB,CAAC,YAAY,CAAC,sCAAkB,CAAC,EAClD,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC;gBACD,IACE,MAAM,CAAC,QAAQ,KAAK,CAAC;oBACpB,MAAkB,CAAC,YAAY,CAAC,UAAU,CAAC,EAC5C,CAAC;oBACD,2BAA2B,EAAE,CAAC;gBAChC,CAAC;gBACD,OAAO,IAAI,CAAC;YACd,CAAC;SACF,CAAC,CAAC;QAEH,kEAAkE;QAClE,kCAAkC;QAClC,MAAM,kBAAkB,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3C,wDAAwD;QACxD,MAAM,CACJ,kBAAkB,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC,CACpE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,mEAAmE;QACnE,+DAA+D;QAC/D,mEAAmE;QACnE,kDAAkD;QAClD,MAAM,CAAC,2BAA2B,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAChD,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,yCAAqB,EAAE,EAAE,CAAC,CAAC;QACrD,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,sCAAkB,EAAE,GAAG,CAAC,CAAC;QACnD,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,yCAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrE,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,YAAY,CAAC,sCAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QAC1B,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,yCAAqB,EAAE,EAAE,CAAC,CAAC;QACnD,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,YAAY,CAAC,yCAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|