@elaraai/east 1.0.76 → 1.0.78

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/dist/src/fuzz.d.ts +103 -11
  2. package/dist/src/fuzz.d.ts.map +1 -1
  3. package/dist/src/fuzz.js +226 -16
  4. package/dist/src/fuzz.js.map +1 -1
  5. package/dist/src/patch/fuzz.d.ts +26 -0
  6. package/dist/src/patch/fuzz.d.ts.map +1 -1
  7. package/dist/src/patch/fuzz.js +42 -4
  8. package/dist/src/patch/fuzz.js.map +1 -1
  9. package/dist/src/patch/type_of_patch.d.ts +14 -1
  10. package/dist/src/patch/type_of_patch.d.ts.map +1 -1
  11. package/dist/src/patch/type_of_patch.js +8 -13
  12. package/dist/src/patch/type_of_patch.js.map +1 -1
  13. package/dist/src/patch/type_of_patch.spec.d.ts +6 -0
  14. package/dist/src/patch/type_of_patch.spec.d.ts.map +1 -0
  15. package/dist/src/patch/type_of_patch.spec.js +74 -0
  16. package/dist/src/patch/type_of_patch.spec.js.map +1 -0
  17. package/dist/src/serialization/beast2/index.d.ts +22 -1
  18. package/dist/src/serialization/beast2/index.d.ts.map +1 -1
  19. package/dist/src/serialization/beast2/index.js +56 -1
  20. package/dist/src/serialization/beast2/index.js.map +1 -1
  21. package/dist/src/serialization/beast2/index.spec.js +16 -0
  22. package/dist/src/serialization/beast2/index.spec.js.map +1 -1
  23. package/dist/src/serialization/beast2/v4/container.js +10 -15
  24. package/dist/src/serialization/beast2/v4/container.js.map +1 -1
  25. package/dist/src/serialization/beast2/v4/type-table.d.ts +63 -34
  26. package/dist/src/serialization/beast2/v4/type-table.d.ts.map +1 -1
  27. package/dist/src/serialization/beast2/v4/type-table.js +353 -403
  28. package/dist/src/serialization/beast2/v4/type-table.js.map +1 -1
  29. package/dist/src/serialization/beast2/v5/deflate.d.ts.map +1 -1
  30. package/dist/src/serialization/beast2/v5/deflate.js +147 -50
  31. package/dist/src/serialization/beast2/v5/deflate.js.map +1 -1
  32. package/dist/src/serialization/beast2/v5/deflate.spec.d.ts +6 -0
  33. package/dist/src/serialization/beast2/v5/deflate.spec.d.ts.map +1 -0
  34. package/dist/src/serialization/beast2/v5/deflate.spec.js +237 -0
  35. package/dist/src/serialization/beast2/v5/deflate.spec.js.map +1 -0
  36. package/dist/src/serialization/beast2/v5/frame-pool.d.ts +119 -0
  37. package/dist/src/serialization/beast2/v5/frame-pool.d.ts.map +1 -0
  38. package/dist/src/serialization/beast2/v5/frame-pool.js +235 -0
  39. package/dist/src/serialization/beast2/v5/frame-pool.js.map +1 -0
  40. package/dist/src/serialization/beast2/v5/frame-pool.spec.d.ts +6 -0
  41. package/dist/src/serialization/beast2/v5/frame-pool.spec.d.ts.map +1 -0
  42. package/dist/src/serialization/beast2/v5/frame-pool.spec.js +287 -0
  43. package/dist/src/serialization/beast2/v5/frame-pool.spec.js.map +1 -0
  44. package/dist/src/serialization/beast2/v5/frame-worker.d.ts +6 -0
  45. package/dist/src/serialization/beast2/v5/frame-worker.d.ts.map +1 -0
  46. package/dist/src/serialization/beast2/v5/frame-worker.js +40 -0
  47. package/dist/src/serialization/beast2/v5/frame-worker.js.map +1 -0
  48. package/dist/src/serialization/beast2/v5/index.spec.js +292 -5
  49. package/dist/src/serialization/beast2/v5/index.spec.js.map +1 -1
  50. package/dist/src/serialization/beast2/v5/lazy.d.ts +11 -8
  51. package/dist/src/serialization/beast2/v5/lazy.d.ts.map +1 -1
  52. package/dist/src/serialization/beast2/v5/lazy.js +49 -39
  53. package/dist/src/serialization/beast2/v5/lazy.js.map +1 -1
  54. package/dist/src/serialization/beast2/v5/lazy.spec.js +98 -3
  55. package/dist/src/serialization/beast2/v5/lazy.spec.js.map +1 -1
  56. package/dist/src/serialization/beast2/v5/stream.d.ts +88 -2
  57. package/dist/src/serialization/beast2/v5/stream.d.ts.map +1 -1
  58. package/dist/src/serialization/beast2/v5/stream.js +175 -22
  59. package/dist/src/serialization/beast2/v5/stream.js.map +1 -1
  60. package/dist/src/serialization/index.d.ts +1 -1
  61. package/dist/src/serialization/index.d.ts.map +1 -1
  62. package/dist/src/serialization/index.js +1 -1
  63. package/dist/src/serialization/index.js.map +1 -1
  64. package/dist/src/type_of_type.d.ts +0 -5
  65. package/dist/src/type_of_type.d.ts.map +1 -1
  66. package/dist/src/type_of_type.js +51 -49
  67. package/dist/src/type_of_type.js.map +1 -1
  68. package/dist/src/type_of_type.to_etv.spec.js +75 -0
  69. package/dist/src/type_of_type.to_etv.spec.js.map +1 -1
  70. package/package.json +1 -1
@@ -0,0 +1,287 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * The parallel frame writer (issue #763), held to the serial algorithm.
7
+ *
8
+ * A pooled writer puts the same frames on the wire in the same order, so the
9
+ * one thing that could move is the SEGMENTATION: the paged encoder sizes each
10
+ * batch from the bytes emitted so far, and with frames still deflating on
11
+ * workers those bytes are only known within bounds. The encoder decides at
12
+ * both bounds and settles when they disagree. The oracle below is the serial
13
+ * algorithm as it stood before #763 — a writer that never pools, refined from
14
+ * the bytes its sink actually received — and every case must match it byte
15
+ * for byte: at a target that pins the element cap (bounds always agree) and at
16
+ * targets small enough that the refinement is live on every batch (bounds
17
+ * often disagree).
18
+ *
19
+ * Throughput is printed under `EAST_POOL_BENCH=1`, never asserted.
20
+ */
21
+ import { describe, test } from "node:test";
22
+ import assert from "node:assert/strict";
23
+ import { ArrayType, DictType, IntegerType, StringType } from "../../../types.js";
24
+ import { compareFor } from "../../../comparison.js";
25
+ import { SortedMap } from "../../../index.js";
26
+ import { Beast2Writer, BEAST2_PAGED_BATCH_DEFAULT, decodeBeast2For, encodeBeast2PagedFor, } from "../index.js";
27
+ import { configureFramePool, framePool } from "./frame-pool.js";
28
+ /** xorshift32 — a fixed stream, so a failure reproduces exactly. */
29
+ function rng(seed) {
30
+ let s = seed >>> 0 || 1;
31
+ return () => {
32
+ s ^= s << 13;
33
+ s >>>= 0;
34
+ s ^= s >>> 17;
35
+ s ^= s << 5;
36
+ s >>>= 0;
37
+ return s;
38
+ };
39
+ }
40
+ /** Strings of widely varying width — the running average moves, so the
41
+ * refinement is exercised. Well past the pool's 8 MiB start threshold. */
42
+ function strings(n, seed) {
43
+ const next = rng(seed);
44
+ const out = new Array(n);
45
+ for (let i = 0; i < n; i++) {
46
+ const width = 8 + (next() % 1400);
47
+ let s = "";
48
+ for (let k = 0; k < width; k++)
49
+ s += String.fromCharCode(97 + (next() % 26));
50
+ out[i] = s;
51
+ }
52
+ return out;
53
+ }
54
+ /** The serial paged encode exactly as it stood before #763. */
55
+ function serialPaged(type, items, makeBatch, target) {
56
+ const chunks = [];
57
+ let bytes = 0;
58
+ const probeN = Math.min(16, items.length);
59
+ let next = BEAST2_PAGED_BATCH_DEFAULT;
60
+ if (probeN > 0) {
61
+ let scratch = 0;
62
+ const probe = new Beast2Writer(type, (b) => { scratch += b.length; });
63
+ const header = scratch;
64
+ probe.write(makeBatch(items.slice(0, probeN)));
65
+ const avg = Math.max(1, (scratch - header) / probeN);
66
+ next = Math.max(1, Math.min(BEAST2_PAGED_BATCH_DEFAULT, Math.floor(target / avg)));
67
+ }
68
+ const writer = new Beast2Writer(type, (b) => { chunks.push(b); bytes += b.length; });
69
+ const header = bytes;
70
+ let written = 0;
71
+ for (let i = 0; i < items.length;) {
72
+ const j = Math.min(items.length, i + next);
73
+ writer.write(makeBatch(items.slice(i, j)));
74
+ written += j - i;
75
+ i = j;
76
+ const avg = Math.max(1, (bytes - header) / written);
77
+ next = Math.max(1, Math.min(BEAST2_PAGED_BATCH_DEFAULT, Math.floor(target / avg)));
78
+ }
79
+ writer.finish();
80
+ const out = new Uint8Array(bytes);
81
+ let pos = 0;
82
+ for (const c of chunks) {
83
+ out.set(c, pos);
84
+ pos += c.length;
85
+ }
86
+ return out;
87
+ }
88
+ /** Resolves after `ms` milliseconds. */
89
+ function sleep(ms) {
90
+ return new Promise((resolve) => setTimeout(resolve, ms));
91
+ }
92
+ /** Chunks joined into one buffer. */
93
+ function concat(chunks) {
94
+ let length = 0;
95
+ for (const c of chunks)
96
+ length += c.length;
97
+ const out = new Uint8Array(length);
98
+ let pos = 0;
99
+ for (const c of chunks) {
100
+ out.set(c, pos);
101
+ pos += c.length;
102
+ }
103
+ return out;
104
+ }
105
+ /** First differing index, or -1. */
106
+ function firstDifference(a, b) {
107
+ const n = Math.min(a.length, b.length);
108
+ for (let i = 0; i < n; i++)
109
+ if (a[i] !== b[i])
110
+ return i;
111
+ return a.length === b.length ? -1 : n;
112
+ }
113
+ describe("beast2 v5 parallel frame writer", () => {
114
+ const TARGETS = [2 * 1024 * 1024, 64 * 1024, 4096];
115
+ test("a pooled Array encode is byte-identical to the serial algorithm", () => {
116
+ const items = strings(24_000, 0x5eed);
117
+ const type = ArrayType(StringType);
118
+ for (const target of TARGETS) {
119
+ const pooled = encodeBeast2PagedFor(type, { targetSegmentBytes: target })(items);
120
+ const serial = serialPaged(type, items, (batch) => batch, target);
121
+ assert.equal(firstDifference(pooled, serial), -1, `target ${target}: pooled and serial bytes differ`);
122
+ }
123
+ });
124
+ test("a pooled Dict encode is byte-identical to the serial algorithm, and decodes", () => {
125
+ const values = strings(20_000, 0xd1c7);
126
+ const cmp = compareFor(IntegerType);
127
+ const entries = values.map((v, i) => [BigInt(i * 3), v]);
128
+ const type = DictType(IntegerType, StringType);
129
+ const value = new SortedMap(entries, cmp);
130
+ for (const target of TARGETS) {
131
+ const pooled = encodeBeast2PagedFor(type, { targetSegmentBytes: target })(value);
132
+ const serial = serialPaged(type, entries, (batch) => new Map(batch), target);
133
+ assert.equal(firstDifference(pooled, serial), -1, `target ${target}: pooled and serial bytes differ`);
134
+ if (target === TARGETS[0]) {
135
+ const decoded = decodeBeast2For(type)(pooled);
136
+ assert.equal(decoded.size, entries.length);
137
+ assert.equal(decoded.get(3n * 777n), values[777]);
138
+ }
139
+ }
140
+ });
141
+ test("the pool is created on a multi-core Node host", () => {
142
+ // Informational context for the identity tests above: on a single-core
143
+ // runner the writer frames inline and they still hold, trivially.
144
+ const pool = framePool();
145
+ if (pool !== null)
146
+ assert.ok(pool.workers >= 2);
147
+ });
148
+ test("reports throughput when asked", { skip: process.env.EAST_POOL_BENCH !== "1" }, () => {
149
+ const items = strings(60_000, 0xbe7c);
150
+ const type = ArrayType(StringType);
151
+ framePool(); // start-up is once per process; keep it out of the timing
152
+ const t0 = performance.now();
153
+ const serial = serialPaged(type, items, (batch) => batch, 2 * 1024 * 1024);
154
+ const t1 = performance.now();
155
+ const pooled = encodeBeast2PagedFor(type)(items);
156
+ const t2 = performance.now();
157
+ console.log(` paged encode of ${(serial.length / 1e6).toFixed(1)} MB: serial ${(t1 - t0).toFixed(0)} ms, ` +
158
+ `pooled ${(t2 - t1).toFixed(0)} ms (${((t1 - t0) / (t2 - t1)).toFixed(2)}x on ${framePool()?.workers ?? 1} workers), ` +
159
+ `identical: ${firstDifference(serial, pooled) === -1}`);
160
+ });
161
+ test("an idle pool retires its workers, and the next pooled encode starts a new pool", async (t) => {
162
+ const before = framePool();
163
+ if (before === null) {
164
+ t.skip("no frame pool on this host — frames are written inline");
165
+ return;
166
+ }
167
+ const previous = configureFramePool({ idleMs: 50 });
168
+ try {
169
+ const type = ArrayType(StringType);
170
+ const items = strings(24_000, 0x1d1e);
171
+ const target = 64 * 1024;
172
+ const serial = serialPaged(type, items, (batch) => batch, target);
173
+ assert.equal(firstDifference(encodeBeast2PagedFor(type, { targetSegmentBytes: target })(items), serial), -1);
174
+ // The check runs on a timer, so wait for the retirement rather than for
175
+ // a fixed time — a loaded host delays timers.
176
+ const deadline = Date.now() + 10_000;
177
+ while (framePool() === before && Date.now() < deadline)
178
+ await sleep(25);
179
+ assert.notEqual(framePool(), before, "the idle pool retired and a new one started");
180
+ assert.equal(firstDifference(encodeBeast2PagedFor(type, { targetSegmentBytes: target })(items), serial), -1, "the new pool writes the same bytes");
181
+ }
182
+ finally {
183
+ configureFramePool(previous);
184
+ }
185
+ });
186
+ test("a writer that outlives an idle retirement frames on the new pool, byte-identically", async (t) => {
187
+ const pool = framePool();
188
+ if (pool === null) {
189
+ t.skip("no frame pool on this host — frames are written inline");
190
+ return;
191
+ }
192
+ // A shorter wait too: if the writer handed frames to the retired workers,
193
+ // this fails in seconds rather than a minute — yet far longer than any
194
+ // healthy frame takes on a loaded runner.
195
+ const previous = configureFramePool({ idleMs: 50, waitTimeoutMs: 10_000 });
196
+ try {
197
+ const type = ArrayType(StringType);
198
+ const items = strings(24_000, 0x0a7e);
199
+ const batches = (from, to) => {
200
+ const out = [];
201
+ for (let i = from; i < to; i += 500)
202
+ out.push(items.slice(i, Math.min(to, i + 500)));
203
+ return out;
204
+ };
205
+ // A long-lived writer (an emit sink between batches) goes quiet with
206
+ // nothing in flight, long enough for its pool to retire.
207
+ const chunks = [];
208
+ const writer = new Beast2Writer(type, (b) => { chunks.push(b); }, { parallel: true });
209
+ for (const batch of batches(0, 16_000))
210
+ writer.write(batch);
211
+ writer.settle();
212
+ const deadline = Date.now() + 10_000;
213
+ while (framePool() === pool && Date.now() < deadline)
214
+ await sleep(25);
215
+ assert.notEqual(framePool(), pool, "the quiet pool retired");
216
+ for (const batch of batches(16_000, items.length))
217
+ writer.write(batch);
218
+ writer.finish();
219
+ const inlineChunks = [];
220
+ const inline = new Beast2Writer(type, (b) => { inlineChunks.push(b); });
221
+ for (const batch of batches(0, items.length))
222
+ inline.write(batch);
223
+ inline.finish();
224
+ assert.equal(firstDifference(concat(chunks), concat(inlineChunks)), -1, "the writer's stream is the inline stream");
225
+ assert.notEqual(framePool(), null, "no worker was lost along the way");
226
+ }
227
+ finally {
228
+ configureFramePool(previous);
229
+ }
230
+ });
231
+ // LAST in this file: losing a worker abandons the process's pool, so every
232
+ // encode after it in this process frames inline.
233
+ test("a lost frame worker fails its frame instead of hanging, and the process frames inline after", async (t) => {
234
+ const pool = framePool();
235
+ if (pool === null) {
236
+ t.skip("no frame pool on this host — frames are written inline");
237
+ return;
238
+ }
239
+ const type = ArrayType(StringType);
240
+ const items = strings(24_000, 0x1057);
241
+ const batches = (from, to) => {
242
+ const out = [];
243
+ for (let i = from; i < to; i += 500)
244
+ out.push(items.slice(i, Math.min(to, i + 500)));
245
+ return out;
246
+ };
247
+ // A parallel writer already framing on the pool — well past the pool's
248
+ // start threshold — with nothing in flight when the worker is lost.
249
+ const survivorChunks = [];
250
+ const survivor = new Beast2Writer(type, (b) => { survivorChunks.push(b); }, { parallel: true });
251
+ for (const batch of batches(0, 16_000))
252
+ survivor.write(batch);
253
+ survivor.settle();
254
+ const logical = new Uint8Array(64 * 1024).fill(0x61);
255
+ assert.ok(pool.submit(logical, "deflate").take().length > 0, "a live worker builds the frame");
256
+ // A worker that dies without reporting: the thread is gone, the frame it
257
+ // was handed stays pending. Only this wait is shortened — a healthy frame
258
+ // on a loaded runner must never be mistaken for a lost one.
259
+ await pool.terminateWorkers();
260
+ const previous = configureFramePool({ waitTimeoutMs: 200 });
261
+ try {
262
+ const orphan = pool.submit(logical, "deflate");
263
+ const started = Date.now();
264
+ assert.throws(() => orphan.take(), /a frame worker stopped responding — its thread was lost/);
265
+ assert.ok(Date.now() - started < 10_000, "the configured wait applies, not the minute-long default");
266
+ }
267
+ finally {
268
+ configureFramePool(previous);
269
+ }
270
+ assert.equal(framePool(), null, "the process frames inline from then on");
271
+ // The surviving writer follows the process inline rather than handing
272
+ // frames to the abandoned pool, and its stream is the inline stream.
273
+ for (const batch of batches(16_000, items.length))
274
+ survivor.write(batch);
275
+ survivor.finish();
276
+ const inlineChunks = [];
277
+ const inline = new Beast2Writer(type, (b) => { inlineChunks.push(b); });
278
+ for (const batch of batches(0, items.length))
279
+ inline.write(batch);
280
+ inline.finish();
281
+ assert.equal(firstDifference(concat(survivorChunks), concat(inlineChunks)), -1, "a writer that outlives the loss writes the inline bytes");
282
+ // ...and a new encode writes exactly the serial bytes.
283
+ const target = 64 * 1024;
284
+ assert.equal(firstDifference(encodeBeast2PagedFor(type, { targetSegmentBytes: target })(items), serialPaged(type, items, (batch) => batch, target)), -1, "inline framing after the loss is byte-identical to the serial algorithm");
285
+ });
286
+ });
287
+ //# sourceMappingURL=frame-pool.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-pool.spec.js","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/frame-pool.spec.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EACL,YAAY,EACZ,0BAA0B,EAC1B,eAAe,EACf,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAEhE,oEAAoE;AACpE,SAAS,GAAG,CAAC,IAAY;IACvB,IAAI,CAAC,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,GAAG,EAAE;QACV,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAAC,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QACd,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAAC,CAAC,MAAM,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC,CAAC;AACJ,CAAC;AAED;2EAC2E;AAC3E,SAAS,OAAO,CAAC,CAAS,EAAE,IAAY;IACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,GAAG,GAAa,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACX,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;YAAE,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;QAC7E,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACb,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,+DAA+D;AAC/D,SAAS,WAAW,CAAI,IAAgD,EAAE,KAAU,EAAE,SAAkC,EAAE,MAAc;IACtI,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,IAAI,GAAG,0BAA0B,CAAC;IACtC,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;QACf,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,MAAM,GAAG,OAAO,CAAC;QACvB,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAU,CAAC,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC;QACrD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,MAAM,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAU,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,GAAG,CAAC,CAAC;QACN,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC;QACpD,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,0BAA0B,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,MAAM,CAAC,MAAM,EAAE,CAAC;IAChB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAClC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;IAAC,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,wCAAwC;AACxC,SAAS,KAAK,CAAC,EAAU;IACvB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3D,CAAC;AAED,qCAAqC;AACrC,SAAS,MAAM,CAAC,MAAoB;IAClC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,CAAC,IAAI,MAAM;QAAE,MAAM,IAAI,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;IACnC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAAC;IAAC,CAAC;IAC7D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,oCAAoC;AACpC,SAAS,eAAe,CAAC,CAAa,EAAE,CAAa;IACnD,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACxD,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC;IAEnD,IAAI,CAAC,iEAAiE,EAAE,GAAG,EAAE;QAC3E,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,MAAM,kCAAkC,CAAC,CAAC;QACxG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACvF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,MAAM,GAAG,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAqB,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;YACjF,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7E,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,MAAM,kCAAkC,CAAC,CAAC;YACtG,IAAI,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1B,MAAM,OAAO,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC3C,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACzD,uEAAuE;QACvE,kEAAkE;QAClE,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI;YAAE,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+BAA+B,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,GAAG,EAAE,EAAE,GAAG,EAAE;QACxF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,SAAS,EAAE,CAAC,CAAC,0DAA0D;QACvE,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC;QAC3E,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;QACjD,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;YACzG,UAAU,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,SAAS,EAAE,EAAE,OAAO,IAAI,CAAC,aAAa;YACtH,cAAc,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gFAAgF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjG,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;QAC3B,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;YACzB,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAClE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAE7G,wEAAwE;YACxE,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;YACrC,OAAO,SAAS,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;gBAAE,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;YACxE,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,6CAA6C,CAAC,CAAC;YACpF,MAAM,CAAC,KAAK,CACV,eAAe,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,EAC1F,CAAC,CAAC,EACF,oCAAoC,CACrC,CAAC;QACJ,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oFAAoF,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACrG,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,0EAA0E;QAC1E,uEAAuE;QACvE,0CAA0C;QAC1C,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAU,EAAc,EAAE;gBACvD,MAAM,GAAG,GAAe,EAAE,CAAC;gBAC3B,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG;oBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrF,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YACF,qEAAqE;YACrE,yDAAyD;YACzD,MAAM,MAAM,GAAiB,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;YACtF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC;YACrC,OAAO,SAAS,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;gBAAE,MAAM,KAAK,CAAC,EAAE,CAAC,CAAC;YACtE,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,wBAAwB,CAAC,CAAC;YAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,YAAY,GAAiB,EAAE,CAAC;YACtC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACxE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;gBAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAClE,MAAM,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,0CAA0C,CAAC,CAAC;YACpH,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,kCAAkC,CAAC,CAAC;QACzE,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,iDAAiD;IACjD,IAAI,CAAC,6FAA6F,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9G,MAAM,IAAI,GAAG,SAAS,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAClB,CAAC,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;YACjE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QACnC,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,EAAU,EAAc,EAAE;YACvD,MAAM,GAAG,GAAe,EAAE,CAAC;YAC3B,KAAK,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,GAAG;gBAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YACrF,OAAO,GAAG,CAAC;QACb,CAAC,CAAC;QACF,uEAAuE;QACvE,oEAAoE;QACpE,MAAM,cAAc,GAAiB,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAChG,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE,MAAM,CAAC;YAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC9D,QAAQ,CAAC,MAAM,EAAE,CAAC;QAElB,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,gCAAgC,CAAC,CAAC;QAE/F,yEAAyE;QACzE,0EAA0E;QAC1E,4DAA4D;QAC5D,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,kBAAkB,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3B,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,yDAAyD,CAAC,CAAC;YAC9F,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,MAAM,EAAE,0DAA0D,CAAC,CAAC;QACvG,CAAC;gBAAS,CAAC;YACT,kBAAkB,CAAC,QAAQ,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,wCAAwC,CAAC,CAAC;QAE1E,sEAAsE;QACtE,qEAAqE;QACrE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YAAE,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzE,QAAQ,CAAC,MAAM,EAAE,CAAC;QAClB,MAAM,YAAY,GAAiB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC;YAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAClE,MAAM,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,yDAAyD,CAAC,CAAC;QAE3I,uDAAuD;QACvD,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,KAAK,CACV,eAAe,CAAC,oBAAoB,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EACtI,CAAC,CAAC,EACF,yEAAyE,CAC1E,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=frame-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-worker.d.ts","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/frame-worker.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Copyright (c) 2025 Elara AI Pty Ltd
3
+ * Dual-licensed under AGPL-3.0 and commercial license. See LICENSE for details.
4
+ */
5
+ /**
6
+ * Beast2 v5 frame worker — one of {@link framePool}'s threads.
7
+ *
8
+ * Receives a segment's logical bytes in a `SharedArrayBuffer`, writes the frame
9
+ * with the same `writeFrame` the inline writer uses (so the bytes cannot
10
+ * differ), copies it into the job's output buffer, and flips the job's status
11
+ * cell. Only bytes cross the thread boundary — never an East value.
12
+ *
13
+ * @packageDocumentation
14
+ */
15
+ import { parentPort, workerData } from "node:worker_threads";
16
+ import { BufferWriter } from "../../binary-utils.js";
17
+ import { FRAME_STATUS } from "./frame-pool.js";
18
+ import { writeFrame } from "./frames.js";
19
+ // Report that this worker loaded — the pool hands itself out only once every
20
+ // worker has (see `framePool`).
21
+ const { ready, index } = workerData;
22
+ const readyCells = new Int32Array(ready);
23
+ Atomics.store(readyCells, index, 1);
24
+ Atomics.notify(readyCells, index);
25
+ parentPort?.on("message", (job) => {
26
+ const status = new Int32Array(job.status);
27
+ try {
28
+ const frame = new BufferWriter();
29
+ writeFrame(frame, new Uint8Array(job.input, 0, job.length), job.codec);
30
+ const bytes = frame.toUint8Array();
31
+ new Uint8Array(job.output).set(bytes);
32
+ Atomics.store(status, 1, bytes.length);
33
+ Atomics.store(status, 0, FRAME_STATUS.DONE);
34
+ }
35
+ catch {
36
+ Atomics.store(status, 0, FRAME_STATUS.FAILED);
37
+ }
38
+ Atomics.notify(status, 0);
39
+ });
40
+ //# sourceMappingURL=frame-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frame-worker.js","sourceRoot":"","sources":["../../../../../src/serialization/beast2/v5/frame-worker.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAoB,MAAM,aAAa,CAAC;AAE3D,6EAA6E;AAC7E,gCAAgC;AAChC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,UAAyD,CAAC;AACnF,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;AACzC,OAAO,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AACpC,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;AAWlC,UAAU,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,GAAa,EAAE,EAAE;IAC1C,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,IAAI,YAAY,EAAE,CAAC;QACjC,UAAU,CAAC,KAAK,EAAE,IAAI,UAAU,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACnC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,YAAY,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAC5B,CAAC,CAAC,CAAC"}