@moyodb/sdk 1.4.0 → 1.5.0

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 (36) hide show
  1. package/README.md +2 -2
  2. package/dist/assets/browser-worker-p7uX85l-.js +4 -0
  3. package/dist/assets/browser-worker-p7uX85l-.js.map +1 -0
  4. package/dist/assets/shared-worker-BALTqEUe.js +2 -0
  5. package/dist/assets/shared-worker-BALTqEUe.js.map +1 -0
  6. package/dist/chunks/{indexing-B0duqlUs.js → indexing-DdpU69Fd.js} +302 -69
  7. package/dist/chunks/{indexing-B0duqlUs.js.map → indexing-DdpU69Fd.js.map} +1 -1
  8. package/dist/codec.d.ts.map +1 -1
  9. package/dist/compression.d.ts.map +1 -1
  10. package/dist/engine/README.md +2 -2
  11. package/dist/engine/moyodb_engine.d.ts +2 -2
  12. package/dist/engine/moyodb_engine.js +22 -22
  13. package/dist/engine/moyodb_engine_bg.wasm +0 -0
  14. package/dist/engine/moyodb_engine_bg.wasm.d.ts +2 -2
  15. package/dist/engine/package.json +1 -1
  16. package/dist/engine/snippets/{moyodb-engine-1d53039816cbc2f7 → moyodb-engine-1f8134232168280b}/js/opfs_shim.js +8 -2
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/indexing.d.ts +7 -0
  19. package/dist/indexing.d.ts.map +1 -1
  20. package/dist/moyodb-sdk.js +1329 -931
  21. package/dist/moyodb-sdk.js.map +1 -1
  22. package/dist/node-engine.js +382 -47
  23. package/dist/node-engine.js.map +1 -1
  24. package/dist/node.js +332 -44
  25. package/dist/node.js.map +1 -1
  26. package/dist/registry.d.ts.map +1 -1
  27. package/dist/subscriptions.d.ts.map +1 -1
  28. package/dist/worker-client.d.ts.map +1 -1
  29. package/dist/worker-server.d.ts.map +1 -1
  30. package/dist/worker.d.ts +10 -3
  31. package/dist/worker.d.ts.map +1 -1
  32. package/package.json +2 -1
  33. package/dist/assets/browser-worker-Bj2ErRvC.js +0 -4
  34. package/dist/assets/browser-worker-Bj2ErRvC.js.map +0 -1
  35. package/dist/assets/shared-worker-CMeTcusa.js +0 -2
  36. package/dist/assets/shared-worker-CMeTcusa.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-worker-BALTqEUe.js","names":[],"sources":["../../src/internal.ts","../../src/worker-protocol.ts","../../src/worker-client.ts","../../src/worker-server.ts","../../src/shared-worker-protocol.ts","../../src/shared-worker.ts"],"sourcesContent":["export function isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object';\n}\n\nexport function compareStringsByCodeUnit(left: string, right: string): number {\n if (left < right) {\n return -1;\n }\n return left > right ? 1 : 0;\n}\n\n/**\n * Delays above 2^31-1 do not fit in the platform timer word. Node fires them\n * after 1ms; other runtimes can wrap them to zero. Clamp instead of aborting.\n */\nexport const MAX_TIMER_DELAY_MS = 2_147_483_647;\n\nexport function clampTimerDelayMs(delayMs: number): number {\n if (!Number.isFinite(delayMs) || delayMs <= 0) {\n return 0;\n }\n return delayMs > MAX_TIMER_DELAY_MS ? MAX_TIMER_DELAY_MS : delayMs;\n}\n\nexport function withTimeout<T>(promise: Promise<T>, timeoutMs: number, fallback: T): Promise<T> {\n return new Promise((resolve) => {\n const timeout = setTimeout(() => resolve(fallback), clampTimerDelayMs(timeoutMs));\n promise.then(\n (value) => {\n clearTimeout(timeout);\n resolve(value);\n },\n () => {\n clearTimeout(timeout);\n resolve(fallback);\n }\n );\n });\n}\n","import type { IndexScanPage, WorkerApi, WorkerScanPage } from './worker-api';\nimport type { BatchOp } from './types';\nimport { isRecord } from './internal';\n\nexport const WORKER_PROTOCOL_VERSION = 1;\nexport const WORKER_PROTOCOL_READY = 'moyodb:worker-protocol:ready';\nexport const WORKER_PROTOCOL_REQUEST = 'moyodb:worker-protocol:request';\nexport const WORKER_PROTOCOL_RESPONSE = 'moyodb:worker-protocol:response';\nexport const WORKER_PROTOCOL_REQUEST_BATCH = 'moyodb:worker-protocol:request-batch';\nexport const WORKER_PROTOCOL_RESPONSE_BATCH = 'moyodb:worker-protocol:response-batch';\nexport const MAX_WORKER_BATCH_MESSAGES = 128;\nexport const MAX_WORKER_BATCH_BYTES = 1024 * 1024;\n\nexport const WORKER_COMMANDS = [\n 'open',\n 'close',\n 'destroy',\n 'deleteDB',\n 'begin',\n 'commit',\n 'rollback',\n 'autocommit',\n 'createStore',\n 'dropStore',\n 'clearStore',\n 'get',\n 'getMany',\n 'has',\n 'put',\n 'putMany',\n 'delete',\n 'deleteMany',\n 'applyBatch',\n 'scan',\n 'scanPage',\n 'closeCursor',\n 'getByIndex',\n 'scanByIndex',\n 'scanByIndexPage',\n 'getIndexes',\n 'reconcileIndexes',\n 'listStores',\n 'getVersion',\n 'changesSince',\n 'setSchemaVersion',\n 'exportSnapshot',\n 'importSnapshot',\n 'reset',\n 'compact',\n 'rebuild',\n 'stats',\n 'storageInfo',\n 'requestPersistence',\n 'setFailpoint'\n] as const;\n\nexport type WorkerCommand = (typeof WORKER_COMMANDS)[number];\n\ntype WorkerMethod<M extends WorkerCommand> = WorkerApi[M] extends (...args: infer Args) => Promise<infer Result>\n ? { args: Args; result: Result }\n : never;\n\nexport type WorkerCommandArgs<M extends WorkerCommand> = WorkerMethod<M>['args'];\nexport type WorkerCommandResult<M extends WorkerCommand> = WorkerMethod<M>['result'];\n/** Arguments of an autocommit command without the leading transaction id. */\nexport type AutocommitArgs<M extends AutocommitCommand> =\n WorkerCommandArgs<M> extends [number, ...infer Rest] ? Rest : never;\n\nexport const AUTOCOMMIT_COMMANDS = [\n 'get',\n 'getMany',\n 'has',\n 'put',\n 'putMany',\n 'delete',\n 'deleteMany',\n 'applyBatch',\n 'scan',\n 'getByIndex',\n 'scanByIndex',\n 'createStore',\n 'dropStore',\n 'clearStore'\n] as const;\n\n/**\n * Commands supported in one autocommit request. The worker replies after\n * commit (readwrite) or rollback (readonly).\n */\nexport type AutocommitCommand = (typeof AUTOCOMMIT_COMMANDS)[number];\n\nconst AUTOCOMMIT_COMMAND_SET = new Set<string>(AUTOCOMMIT_COMMANDS);\n\nexport function isAutocommitCommand(value: unknown): value is AutocommitCommand {\n return typeof value === 'string' && AUTOCOMMIT_COMMAND_SET.has(value);\n}\n\nexport type PackedBatchOpKey = {\n kind: 'put' | 'delete';\n key: Uint8Array;\n};\n\ntype PreparedWorkerCommandArgs<M extends WorkerCommand> = WorkerCommandArgs<M> | unknown[];\n\nconst PACKED_BINARY_LIST_V1 = 'moyodb:packed-binary-list:v1';\nconst PACKED_NULLABLE_BINARY_LIST_V1 = 'moyodb:packed-nullable-binary-list:v1';\nconst PACKED_SCAN_ROWS_V1 = 'moyodb:packed-scan-rows:v1';\nconst PACKED_ENGINE_SCAN_ROWS_V1 = 'moyodb:packed-engine-scan-rows:v1';\nconst PACKED_BATCH_OPS_V1 = 'moyodb:packed-batch-ops:v1';\n// Engine getMany format: u32 count | count x u32 length | concatenated values.\n// Integers are little-endian; u32::MAX marks a missing value. No repacking is needed.\nconst PACKED_OPTIONAL_VALUES_V1 = 'moyodb:packed-optional-values:v1';\nconst BATCH_OP_DELETE = 0;\nconst BATCH_OP_PUT = 1;\nconst U32_MAX = 0xffff_ffff;\nconst MAX_PACKED_RESPONSE_BYTES = 16 * 1024 * 1024;\nconst EMPTY_TRANSFERABLES: Transferable[] = [];\n\ninterface PackedBinaryListV1 {\n __moyodbPacked: typeof PACKED_BINARY_LIST_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedNullableBinaryListV1 {\n __moyodbPacked: typeof PACKED_NULLABLE_BINARY_LIST_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedScanRowsV1 {\n __moyodbPacked: typeof PACKED_SCAN_ROWS_V1;\n bytes: Uint8Array;\n}\nexport interface PackedEngineScanRowsV1 {\n __moyodbPacked: typeof PACKED_ENGINE_SCAN_ROWS_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedBatchOpsV1 {\n __moyodbPacked: typeof PACKED_BATCH_OPS_V1;\n bytes: Uint8Array;\n}\n\nexport interface PackedOptionalValuesV1 {\n __moyodbPacked: typeof PACKED_OPTIONAL_VALUES_V1;\n bytes: Uint8Array;\n}\n\ninterface PackedBytes {\n __moyodbPacked: string;\n bytes: Uint8Array;\n}\n\ninterface PackedIndexScanPage {\n rows: PackedScanRowsV1 | IndexScanPage['rows'];\n cursor: Uint8Array | null;\n}\n\nexport type WorkerProtocolReadyMessage = {\n type: typeof WORKER_PROTOCOL_READY;\n version: typeof WORKER_PROTOCOL_VERSION;\n /** Enables batching; omitted by peers that use single messages. */\n batching?: 1;\n};\n\nexport type WorkerProtocolRequestMessage = {\n [M in WorkerCommand]: {\n type: typeof WORKER_PROTOCOL_REQUEST;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n command: M;\n args: PreparedWorkerCommandArgs<M>;\n };\n}[WorkerCommand];\n\nexport interface WorkerProtocolRequestBatchMessage {\n type: typeof WORKER_PROTOCOL_REQUEST_BATCH;\n version: typeof WORKER_PROTOCOL_VERSION;\n requests: WorkerProtocolRequestMessage[];\n}\n\nexport interface SerializedWorkerError {\n name: string;\n code?: string;\n message: string;\n stack?: string;\n}\n\nexport type WorkerProtocolSuccessMessage = {\n [M in WorkerCommand]: {\n type: typeof WORKER_PROTOCOL_RESPONSE;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n ok: true;\n result: WorkerCommandResult<M>;\n };\n}[WorkerCommand];\n\nexport interface WorkerProtocolErrorMessage {\n type: typeof WORKER_PROTOCOL_RESPONSE;\n version: typeof WORKER_PROTOCOL_VERSION;\n id: number;\n ok: false;\n error: SerializedWorkerError;\n}\n\nexport type WorkerProtocolResponseMessage = WorkerProtocolSuccessMessage | WorkerProtocolErrorMessage;\n\nexport interface WorkerProtocolResponseBatchMessage {\n type: typeof WORKER_PROTOCOL_RESPONSE_BATCH;\n version: typeof WORKER_PROTOCOL_VERSION;\n responses: WorkerProtocolResponseMessage[];\n}\n\nconst WORKER_COMMAND_SET = new Set<string>(WORKER_COMMANDS);\n\nexport function isWorkerCommand(value: unknown): value is WorkerCommand {\n return typeof value === 'string' && WORKER_COMMAND_SET.has(value);\n}\n\nexport function isWorkerProtocolReadyMessage(value: unknown): value is WorkerProtocolReadyMessage {\n return (\n isWorkerProtocolReadyEnvelope(value) &&\n value.version === WORKER_PROTOCOL_VERSION &&\n (value.batching === undefined || value.batching === 1)\n );\n}\n\nexport function isWorkerProtocolReadyEnvelope(\n value: unknown\n): value is { type: typeof WORKER_PROTOCOL_READY; version?: unknown; batching?: unknown } {\n return isRecord(value) && value.type === WORKER_PROTOCOL_READY;\n}\n\nexport function isWorkerProtocolResponseMessage(value: unknown): value is WorkerProtocolResponseMessage {\n return (\n isRecord(value) &&\n value.type === WORKER_PROTOCOL_RESPONSE &&\n value.version === WORKER_PROTOCOL_VERSION &&\n typeof value.id === 'number' &&\n Number.isSafeInteger(value.id) &&\n typeof value.ok === 'boolean'\n );\n}\n\nexport function isWorkerProtocolRequestMessage(value: unknown): value is WorkerProtocolRequestMessage {\n return (\n isRecord(value) &&\n value.type === WORKER_PROTOCOL_REQUEST &&\n value.version === WORKER_PROTOCOL_VERSION &&\n typeof value.id === 'number' &&\n Number.isSafeInteger(value.id) &&\n typeof value.command === 'string' &&\n Array.isArray(value.args)\n );\n}\n\nexport function isWorkerProtocolRequestBatchMessage(value: unknown): value is WorkerProtocolRequestBatchMessage {\n return isWorkerProtocolBatch(value, WORKER_PROTOCOL_REQUEST_BATCH, 'requests');\n}\n\nexport function isWorkerProtocolResponseBatchMessage(value: unknown): value is WorkerProtocolResponseBatchMessage {\n if (!isWorkerProtocolBatch(value, WORKER_PROTOCOL_RESPONSE_BATCH, 'responses')) {\n return false;\n }\n for (const response of (value as WorkerProtocolResponseBatchMessage).responses) {\n if (!isWorkerProtocolResponseMessage(response)) return false;\n }\n return true;\n}\n\nfunction isWorkerProtocolBatch(value: unknown, type: string, items: string): boolean {\n return (\n isRecord(value) &&\n value.type === type &&\n value.version === WORKER_PROTOCOL_VERSION &&\n Array.isArray(value[items]) &&\n value[items].length > 0 &&\n value[items].length <= MAX_WORKER_BATCH_MESSAGES\n );\n}\n\nexport function isWorkerProtocolEnvelope(value: unknown): value is { type: string; id?: unknown } {\n return (\n isRecord(value) &&\n (value.type === WORKER_PROTOCOL_REQUEST ||\n value.type === WORKER_PROTOCOL_RESPONSE ||\n value.type === WORKER_PROTOCOL_REQUEST_BATCH ||\n value.type === WORKER_PROTOCOL_RESPONSE_BATCH ||\n value.type === WORKER_PROTOCOL_READY)\n );\n}\n\nexport function serializeWorkerError(error: unknown): SerializedWorkerError {\n if (isRecord(error)) {\n const code = stringOrUndefined(error.code);\n const name = stringOrUndefined(error.name) ?? code ?? 'Error';\n return {\n name,\n code,\n message: stringOrUndefined(error.message) ?? 'Unknown error',\n stack: stringOrUndefined(error.stack)\n };\n }\n return {\n name: 'Error',\n message: String(error)\n };\n}\n\nexport function deserializeWorkerError(error: unknown): Error {\n if (\n !isRecord(error) ||\n typeof error.name !== 'string' ||\n typeof error.message !== 'string' ||\n (error.code !== undefined && typeof error.code !== 'string') ||\n (error.stack !== undefined && typeof error.stack !== 'string')\n ) {\n throw workerProtocolError('WorkerProtocolError', 'invalid serialized worker error');\n }\n const deserialized = new Error(error.message);\n deserialized.name = error.name || error.code || 'Error';\n if (error.stack) {\n deserialized.stack = error.stack;\n }\n if (error.code) {\n defineErrorCode(deserialized, error.code);\n }\n return deserialized;\n}\n\nexport function workerProtocolError(name: string, message: string, code = name): Error {\n const error = new Error(message);\n error.name = name;\n defineErrorCode(error, code);\n return error;\n}\n\nfunction defineErrorCode(error: Error, code: string): void {\n Object.defineProperty(error, 'code', {\n value: code,\n enumerable: true,\n configurable: true\n });\n}\n\nexport function prepareWorkerCommandPayload<M extends WorkerCommand>(\n command: M,\n args: WorkerCommandArgs<M>\n): { args: PreparedWorkerCommandArgs<M>; transfer: Transferable[] } {\n if (command === 'autocommit') {\n const [mode, inner, innerArgs] = args as WorkerCommandArgs<'autocommit'>;\n if (isAutocommitCommand(inner) && Array.isArray(innerArgs)) {\n // The normal packer expects a transaction ID. Use a placeholder, then remove it.\n const prepared = prepareWorkerCommandPayload(inner, [0, ...innerArgs] as never);\n return {\n args: [mode, inner, (prepared.args as unknown[]).slice(1)],\n transfer: prepared.transfer\n };\n }\n }\n\n if (\n command === 'get' ||\n command === 'has' ||\n command === 'delete' ||\n command === 'getByIndex' ||\n command === 'put'\n ) {\n const keyIndex = command === 'getByIndex' ? 3 : 2;\n let copiedArgs: unknown[] | null = null;\n let transfer: Transferable[] | null = null;\n for (let index = keyIndex; index <= (command === 'put' ? 3 : keyIndex); index += 1) {\n const value = args[index];\n if (\n value instanceof Uint8Array &&\n value.buffer instanceof ArrayBuffer &&\n (value.byteOffset !== 0 || value.byteLength !== value.buffer.byteLength)\n ) {\n const owned = copyToOwnedUint8Array(value);\n copiedArgs ??= [...args];\n copiedArgs[index] = owned;\n (transfer ??= []).push(owned.buffer);\n }\n }\n if (copiedArgs !== null) {\n return { args: copiedArgs, transfer: transfer ?? EMPTY_TRANSFERABLES };\n }\n }\n\n if (command === 'importSnapshot') {\n const data = args[0];\n if (data instanceof Uint8Array) {\n const owned = copyToOwnedUint8Array(data);\n return {\n args: [owned] as WorkerCommandArgs<M>,\n transfer: [owned.buffer]\n };\n }\n }\n\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args as WorkerCommandArgs<'getMany'> | WorkerCommandArgs<'deleteMany'>;\n if (Array.isArray(keys) && keys.length > 0) {\n const packed = packBinaryList(keys);\n return {\n args: [txId, store, packed],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args as WorkerCommandArgs<'putMany'>;\n if (Array.isArray(entries) && entries.length > 0) {\n const packed = packBinaryPairs(entries);\n return {\n args: [txId, store, packed, options],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args as WorkerCommandArgs<'applyBatch'>;\n if (Array.isArray(ops) && ops.length > 0) {\n const packed = packBatchOps(ops);\n return {\n args: [txId, store, packed],\n transfer: [packed.bytes.buffer]\n };\n }\n }\n\n return { args, transfer: EMPTY_TRANSFERABLES };\n}\n\nexport function decodeWorkerCommandPayload<M extends WorkerCommand>(\n command: M,\n args: PreparedWorkerCommandArgs<M>\n): WorkerCommandArgs<M> {\n if (command === 'autocommit') {\n const [mode, inner, innerArgs] = args as WorkerCommandArgs<'autocommit'>;\n if (isAutocommitCommand(inner) && Array.isArray(innerArgs)) {\n const decoded = decodeWorkerCommandPayload(inner, [0, ...innerArgs]) as unknown[];\n return [mode, inner, decoded.slice(1)] as WorkerCommandArgs<M>;\n }\n }\n\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args as WorkerCommandArgs<'getMany'> | WorkerCommandArgs<'deleteMany'>;\n if (!Array.isArray(keys)) {\n if (!isPackedPayload(keys, PACKED_BINARY_LIST_V1)) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed binary-list argument');\n }\n return [txId, store, unpackBinaryList(keys)] as WorkerCommandArgs<M>;\n }\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args as WorkerCommandArgs<'putMany'>;\n if (!Array.isArray(entries)) {\n if (!isPackedPayload(entries, PACKED_BINARY_LIST_V1)) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed putMany argument');\n }\n return [txId, store, unpackPutManyPayload(entries, false), options] as WorkerCommandArgs<M>;\n }\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args as WorkerCommandArgs<'applyBatch'>;\n if (!Array.isArray(ops)) {\n if (!isPackedPayload(ops, PACKED_BATCH_OPS_V1)) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed batch argument');\n }\n return [txId, store, unpackBatchPayload(ops, false)] as WorkerCommandArgs<M>;\n }\n }\n\n return args;\n}\n\nexport function packedBinaryListBytes(value: unknown): Uint8Array | null {\n return isPackedPayload(value, PACKED_BINARY_LIST_V1) ? value.bytes : null;\n}\n\nexport function packedBatchOpsBytes(value: unknown): Uint8Array | null {\n return isPackedPayload(value, PACKED_BATCH_OPS_V1) ? value.bytes : null;\n}\n\nexport function unpackPackedBinaryList(bytes: Uint8Array): Uint8Array[] {\n return unpackBinaryList({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes });\n}\n\nexport function unpackPackedBinaryPairs(bytes: Uint8Array): Array<[Uint8Array, Uint8Array]> {\n return unpackPutManyPayload({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes }, false);\n}\n\nexport function unpackPackedBinaryPairKeys(bytes: Uint8Array): Uint8Array[] {\n return unpackPutManyPayload({ __moyodbPacked: PACKED_BINARY_LIST_V1, bytes }, true);\n}\n\nexport function unpackPackedBatchOps(bytes: Uint8Array): Array<BatchOp> {\n return unpackBatchPayload({ __moyodbPacked: PACKED_BATCH_OPS_V1, bytes }, false);\n}\n\nexport function unpackPackedBatchOpKeys(bytes: Uint8Array): PackedBatchOpKey[] {\n return unpackBatchPayload({ __moyodbPacked: PACKED_BATCH_OPS_V1, bytes }, true);\n}\n\nexport function packedOptionalValues(bytes: Uint8Array): PackedOptionalValuesV1 {\n return { __moyodbPacked: PACKED_OPTIONAL_VALUES_V1, bytes };\n}\n\nexport function unpackPackedOptionalValues(bytes: Uint8Array): Array<Uint8Array | null> {\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed optional-values payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 4, 'packed optional-values metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed optional-values header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed optional-values metadata exceeds payload length');\n }\n const items = new Array<Uint8Array | null>(count);\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const byteLength = view.getUint32(4 + index * 4, true);\n if (byteLength === U32_MAX) {\n items[index] = null;\n continue;\n }\n const end = readOffset + byteLength;\n if (end > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed optional-values item exceeds payload length');\n }\n items[index] = bytes.subarray(readOffset, end);\n readOffset = end;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed optional-values payload has trailing bytes');\n }\n return items;\n}\n\nexport function prepareWorkerResponsePayload<M extends WorkerCommand>(\n command: M,\n result: WorkerCommandResult<M>\n): { result: unknown; transfer: Transferable[] } {\n if (\n (command === 'scan' || command === 'scanByIndex') &&\n (isPackedEngineScanRows(result) || isPackedPayload(result, PACKED_SCAN_ROWS_V1))\n ) {\n return { result, transfer: collectDirectBinaryTransferable(result.bytes) };\n }\n if (command === 'scanPage') {\n const page = result as WorkerScanPage;\n if (isRecord(page) && (isPackedEngineScanRows(page.rows) || isPackedPayload(page.rows, PACKED_SCAN_ROWS_V1))) {\n return { result: page, transfer: collectDirectBinaryTransferable(page.rows.bytes) };\n }\n if (isRecord(page) && Array.isArray(page.rows)) {\n const packed = packScanRows(page.rows);\n return {\n result: { ...page, rows: packed ?? page.rows },\n transfer: packed ? [packed.bytes.buffer] : collectTransferablesForValue(page.rows)\n };\n }\n }\n if (command === 'getMany' && isPackedPayload(result, PACKED_OPTIONAL_VALUES_V1)) {\n return {\n result,\n transfer: collectDirectBinaryTransferable(result.bytes)\n };\n }\n\n if (command === 'scanByIndexPage') {\n const page = result as WorkerCommandResult<'scanByIndexPage'>;\n if (isRecord(page) && isPackedPayload(page.rows, PACKED_SCAN_ROWS_V1)) {\n return { result: page, transfer: collectTransferablesForValue(page) };\n }\n if (isRecord(page) && Array.isArray(page.rows)) {\n const packed = page.rows.length > 0 ? packScanRows(page.rows) : null;\n const response: PackedIndexScanPage = { rows: packed ?? page.rows, cursor: page.cursor };\n const transfer = packed ? [packed.bytes.buffer] : collectTransferablesForValue(page.rows);\n const cursorBuffer = directBinaryTransferable(page.cursor);\n return {\n result: response,\n transfer: cursorBuffer === null ? transfer : [...transfer, cursorBuffer]\n };\n }\n }\n\n if (command === 'getMany') {\n const values = result as WorkerCommandResult<'getMany'>;\n if (Array.isArray(values) && values.length > 0) {\n const packed = packNullableBinaryList(values);\n if (packed) {\n return {\n result: packed,\n transfer: [packed.bytes.buffer]\n };\n }\n }\n return {\n result,\n transfer: collectTransferablesForValue(result)\n };\n }\n\n if (command === 'scan' || command === 'scanByIndex') {\n const rows = result as WorkerCommandResult<'scan'>;\n if (Array.isArray(rows) && rows.length > 0) {\n const packed = packScanRows(rows);\n if (packed) {\n return {\n result: packed,\n transfer: [packed.bytes.buffer]\n };\n }\n }\n return {\n result,\n transfer: collectTransferablesForValue(result)\n };\n }\n\n if (command === 'get' || command === 'getByIndex' || command === 'exportSnapshot') {\n return {\n result,\n transfer: collectDirectBinaryTransferable(result)\n };\n }\n\n if (command === 'changesSince') {\n return {\n result,\n transfer: collectChangeFeedTransferables(result)\n };\n }\n\n // Remaining result types contain no binary payloads, so they need no buffer walk.\n return {\n result,\n transfer: []\n };\n}\n\nexport function decodeWorkerResponsePayload<M extends WorkerCommand>(\n command: M,\n result: unknown\n): WorkerCommandResult<M> {\n if (command === 'scanPage') {\n if (\n !isRecord(result) ||\n typeof result.done !== 'boolean' ||\n typeof result.bytes !== 'number' ||\n !Number.isSafeInteger(result.bytes) ||\n result.bytes < 4 ||\n (result.cursorId !== undefined &&\n (typeof result.cursorId !== 'number' ||\n !Number.isSafeInteger(result.cursorId) ||\n result.cursorId <= 0)) ||\n (result.done ? result.cursorId !== undefined : result.cursorId === undefined)\n ) {\n throw workerProtocolError('WorkerProtocolError', 'invalid scan page response');\n }\n const rows = isPackedEngineScanRows(result.rows)\n ? unpackPackedScanRows(result.rows.bytes)\n : isPackedPayload(result.rows, PACKED_SCAN_ROWS_V1)\n ? unpackScanRows(result.rows)\n : result.rows;\n if (!Array.isArray(rows)) throw workerProtocolError('WorkerProtocolError', 'invalid scan page rows');\n let bytes = 4;\n for (const row of rows) {\n if (!isRecord(row) || !(row.key instanceof Uint8Array) || !(row.value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'invalid scan page row');\n }\n bytes += 8 + row.key.byteLength + row.value.byteLength;\n }\n if (bytes !== result.bytes) throw workerProtocolError('WorkerProtocolError', 'scan page byte count mismatch');\n return { rows, cursorId: result.cursorId, done: result.done, bytes: result.bytes } as WorkerCommandResult<M>;\n }\n if ((command === 'scan' || command === 'scanByIndex') && isPackedEngineScanRows(result)) {\n return unpackPackedScanRows(result.bytes) as WorkerCommandResult<M>;\n }\n if (command === 'getMany' && isPackedPayload(result, PACKED_NULLABLE_BINARY_LIST_V1)) {\n return unpackNullableBinaryList(result);\n }\n\n if (command === 'getMany' && isPackedPayload(result, PACKED_OPTIONAL_VALUES_V1)) {\n return unpackPackedOptionalValues(result.bytes) as WorkerCommandResult<M>;\n }\n\n if (command === 'getMany' && !Array.isArray(result)) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed getMany response');\n }\n\n if (command === 'scanByIndexPage') {\n if (\n !isRecord(result) ||\n (!Array.isArray(result.rows) && !isPackedPayload(result.rows, PACKED_SCAN_ROWS_V1)) ||\n (result.cursor !== null && !(result.cursor instanceof Uint8Array))\n ) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed index scan page response');\n }\n const rows = isPackedPayload(result.rows, PACKED_SCAN_ROWS_V1) ? unpackScanRows(result.rows) : result.rows;\n return { rows, cursor: result.cursor } as WorkerCommandResult<M>;\n }\n\n if ((command === 'scan' || command === 'scanByIndex') && isPackedPayload(result, PACKED_SCAN_ROWS_V1)) {\n return unpackScanRows(result);\n }\n\n if ((command === 'scan' || command === 'scanByIndex') && !Array.isArray(result)) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed scan response');\n }\n\n return result;\n}\nexport function packedScanRows(bytes: Uint8Array): PackedEngineScanRowsV1 {\n return { __moyodbPacked: PACKED_ENGINE_SCAN_ROWS_V1, bytes };\n}\nfunction isPackedEngineScanRows(value: unknown): value is PackedEngineScanRowsV1 {\n return isRecord(value) && value.__moyodbPacked === PACKED_ENGINE_SCAN_ROWS_V1 && value.bytes instanceof Uint8Array;\n}\nexport function unpackPackedScanRows(bytes: Uint8Array): Array<{ key: Uint8Array; value: Uint8Array }> {\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid engine scan packet');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n if (count > (bytes.byteLength - 4) / 8) {\n throw workerProtocolError('WorkerProtocolError', 'engine scan row count exceeds packet length');\n }\n const rows = new Array<{ key: Uint8Array; value: Uint8Array }>(count);\n let offset = 4;\n for (let index = 0; index < count; index += 1) {\n if (offset + 8 > bytes.byteLength)\n throw workerProtocolError('WorkerProtocolError', 'truncated engine scan row');\n const keyLength = view.getUint32(offset, true);\n const valueLength = view.getUint32(offset + 4, true);\n const keyStart = offset + 8;\n const valueStart = keyStart + keyLength;\n const end = valueStart + valueLength;\n if (end > bytes.byteLength)\n throw workerProtocolError('WorkerProtocolError', 'engine scan row exceeds packet length');\n rows[index] = { key: bytes.subarray(keyStart, valueStart), value: bytes.subarray(valueStart, end) };\n offset = end;\n }\n if (offset !== bytes.byteLength)\n throw workerProtocolError('WorkerProtocolError', 'engine scan packet has trailing bytes');\n return rows;\n}\n\nexport function collectTransferablesForValue(value: unknown): Transferable[] {\n const direct = directBinaryTransferable(value);\n if (direct !== null) {\n return [direct];\n }\n if (value === null || value === undefined || typeof value !== 'object') {\n return EMPTY_TRANSFERABLES;\n }\n\n const buffers = new Set<ArrayBuffer>();\n const seen = new WeakSet<object>();\n collectTransferableBuffers(value, buffers, seen);\n return buffers.size === 0 ? EMPTY_TRANSFERABLES : Array.from(buffers);\n}\n\n/**\n * Capture the message before batching can observe later mutations. Listed\n * transferables move into the snapshot; other ArrayBuffers are cloned.\n * SharedArrayBuffers remain shared. byteLength is a batch-size estimate.\n */\nexport function captureWorkerPayload<T>(\n value: T,\n transfer: Transferable[]\n): { value: T; transfer: Transferable[]; byteLength: number } {\n const captured =\n transfer.length > 0\n ? structuredClone(value, { transfer: transfer.length === 1 ? transfer : Array.from(new Set(transfer)) })\n : structuredClone(value);\n const buffers = new Set<ArrayBuffer>();\n const seen = new WeakSet<object>();\n let byteLength = 0;\n const visit = (item: unknown): void => {\n if (typeof item === 'string') {\n byteLength += 8 + item.length * 2;\n return;\n }\n if (item === null || typeof item !== 'object') {\n byteLength += 8;\n return;\n }\n if (seen.has(item)) return;\n seen.add(item);\n byteLength += 8;\n if (item instanceof ArrayBuffer) {\n buffers.add(item);\n byteLength += item.byteLength;\n } else if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n byteLength += item.byteLength;\n } else if (ArrayBuffer.isView(item)) {\n visit(item.buffer);\n } else if (Array.isArray(item)) {\n for (const child of item) visit(child);\n } else if (item instanceof Map) {\n for (const [key, child] of item) {\n visit(key);\n visit(child);\n }\n } else if (item instanceof Set) {\n for (const child of item) visit(child);\n } else {\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n byteLength += 8 + key.length * 2;\n visit(record[key]);\n }\n }\n }\n };\n visit(captured);\n return {\n value: captured,\n transfer: buffers.size === 0 ? EMPTY_TRANSFERABLES : Array.from(buffers),\n byteLength\n };\n}\n\nfunction collectDirectBinaryTransferable(value: unknown): Transferable[] {\n const direct = directBinaryTransferable(value);\n return direct === null ? EMPTY_TRANSFERABLES : [direct];\n}\n\nfunction directBinaryTransferable(value: unknown): ArrayBuffer | null {\n if (value instanceof ArrayBuffer) {\n return value;\n }\n if (ArrayBuffer.isView(value)) {\n const buffer = value.buffer;\n if (buffer instanceof ArrayBuffer && value.byteOffset === 0 && value.byteLength === buffer.byteLength) {\n return buffer;\n }\n }\n return null;\n}\n\nfunction collectChangeFeedTransferables(value: unknown): Transferable[] {\n if (!isRecord(value) || !Array.isArray(value.changes) || value.changes.length === 0) {\n return EMPTY_TRANSFERABLES;\n }\n\n let buffers: Set<ArrayBuffer> | null = null;\n for (const change of value.changes) {\n if (!isRecord(change)) {\n continue;\n }\n const key = directBinaryTransferable(change.key);\n if (key !== null) {\n buffers ??= new Set<ArrayBuffer>();\n buffers.add(key);\n }\n const changedValue = directBinaryTransferable(change.value);\n if (changedValue !== null) {\n buffers ??= new Set<ArrayBuffer>();\n buffers.add(changedValue);\n }\n }\n return buffers === null || buffers.size === 0 ? EMPTY_TRANSFERABLES : Array.from(buffers);\n}\n\nfunction collectTransferableBuffers(value: unknown, buffers: Set<ArrayBuffer>, seen: WeakSet<object>): void {\n if (value === null || value === undefined) {\n return;\n }\n if (value instanceof ArrayBuffer) {\n buffers.add(value);\n return;\n }\n if (ArrayBuffer.isView(value)) {\n const buffer = value.buffer;\n if (buffer instanceof ArrayBuffer && value.byteOffset === 0 && value.byteLength === buffer.byteLength) {\n buffers.add(buffer);\n }\n return;\n }\n if (typeof value !== 'object') {\n return;\n }\n const object = value;\n if (seen.has(object)) {\n return;\n }\n seen.add(object);\n if (Array.isArray(value)) {\n for (const item of value) {\n collectTransferableBuffers(item, buffers, seen);\n }\n return;\n }\n const record = value as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n collectTransferableBuffers(record[key], buffers, seen);\n }\n }\n}\n\nfunction packBinaryPairs(entries: Array<[Uint8Array, Uint8Array]>): PackedBinaryListV1 {\n const entryCount = entries.length;\n const count = checkedU32(entryCount * 2, 'packed putMany item count');\n const metadataBytes = checkedByteCount(count, 4, 'packed putMany metadata');\n let payloadBytes = 0;\n for (let index = 0; index < entryCount; index += 1) {\n const entry = entries[index];\n const key = entry[0];\n const value = entry[1];\n if (!(key instanceof Uint8Array) || !(value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'putMany entry key/value is not a Uint8Array');\n }\n const keyLength = checkedU32(key.byteLength, 'putMany key length');\n const valueLength = checkedU32(value.byteLength, 'putMany value length');\n payloadBytes += keyLength + valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed putMany header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed putMany total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < entryCount; index += 1) {\n const entry = entries[index];\n const key = entry[0];\n const value = entry[1];\n const keyLength = key.byteLength;\n const valueLength = value.byteLength;\n view.setUint32(metadataOffset, keyLength, true);\n metadataOffset += 4;\n view.setUint32(metadataOffset, valueLength, true);\n metadataOffset += 4;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n bytes.set(value, writeOffset);\n writeOffset += valueLength;\n }\n return {\n __moyodbPacked: PACKED_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction packBinaryList(items: Uint8Array[]): PackedBinaryListV1 {\n const count = items.length;\n const metadataBytes = checkedByteCount(count, 4, 'packed binary-list metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n if (!(item instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'binary-list payload item is not a Uint8Array');\n }\n const itemLength = checkedU32(item.byteLength, 'binary-list item length');\n payloadBytes += itemLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed binary-list header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed binary-list total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n const itemLength = item.byteLength;\n view.setUint32(metadataOffset, itemLength, true);\n metadataOffset += 4;\n bytes.set(item, writeOffset);\n writeOffset += itemLength;\n }\n return {\n __moyodbPacked: PACKED_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction unpackBinaryList(payload: PackedBytes): Uint8Array[] {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed binary-list payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 4, 'packed binary-list metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed binary-list header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list metadata exceeds payload length');\n }\n\n const items = new Array<Uint8Array>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const byteLength = view.getUint32(metadataOffset, true);\n metadataOffset += 4;\n const end = readOffset + byteLength;\n if (end > U32_MAX || end > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list item exceeds payload length');\n }\n items[index] = bytes.subarray(readOffset, end);\n readOffset = end;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed binary-list payload has trailing bytes');\n }\n return items;\n}\n\nfunction unpackPutManyPayload(payload: PackedBytes, keysOnly: true): Uint8Array[];\nfunction unpackPutManyPayload(payload: PackedBytes, keysOnly: false): Array<[Uint8Array, Uint8Array]>;\nfunction unpackPutManyPayload(payload: PackedBytes, keysOnly: boolean): Uint8Array[] | Array<[Uint8Array, Uint8Array]> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed putMany payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const itemCount = view.getUint32(0, true);\n if (itemCount % 2 !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has an odd item count');\n }\n const metadataBytes = checkedByteCount(itemCount, 4, 'packed putMany metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed putMany header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany metadata exceeds payload length');\n }\n\n const entryCount = itemCount / 2;\n const entries = new Array<Uint8Array | [Uint8Array, Uint8Array]>(entryCount);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < entryCount; index += 1) {\n const keyLength = view.getUint32(metadataOffset, true);\n const valueLength = view.getUint32(metadataOffset + 4, true);\n metadataOffset += 8;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany key exceeds payload length');\n }\n const valueEnd = keyEnd + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany value exceeds payload length');\n }\n if (keysOnly) {\n entries[index] = bytes.subarray(readOffset, keyEnd);\n } else {\n entries[index] = [bytes.subarray(readOffset, keyEnd), bytes.subarray(keyEnd, valueEnd)];\n }\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed putMany payload has trailing bytes');\n }\n return entries as Uint8Array[] | Array<[Uint8Array, Uint8Array]>;\n}\n\nfunction packNullableBinaryList(items: Array<Uint8Array | null>): PackedNullableBinaryListV1 | null {\n const count = items.length;\n const metadataBytes = checkedByteCount(count, 5, 'packed nullable binary-list metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n if (item === null) {\n continue;\n }\n if (!(item instanceof Uint8Array)) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'nullable binary-list payload item is not a Uint8Array or null'\n );\n }\n const itemLength = checkedU32(item.byteLength, 'nullable binary-list item length');\n payloadBytes += itemLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'packed nullable binary-list payload exceeds 32-bit payload limit'\n );\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed nullable binary-list header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed nullable binary-list total');\n if (totalBytes > MAX_PACKED_RESPONSE_BYTES) {\n return null;\n }\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const item = items[index];\n if (item === null) {\n view.setUint8(metadataOffset, 0);\n view.setUint32(metadataOffset + 1, 0, true);\n metadataOffset += 5;\n continue;\n }\n const itemLength = item.byteLength;\n view.setUint8(metadataOffset, 1);\n view.setUint32(metadataOffset + 1, itemLength, true);\n metadataOffset += 5;\n bytes.set(item, writeOffset);\n writeOffset += itemLength;\n }\n return {\n __moyodbPacked: PACKED_NULLABLE_BINARY_LIST_V1,\n bytes\n };\n}\n\nfunction unpackNullableBinaryList(payload: PackedBytes): Array<Uint8Array | null> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed nullable binary-list payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 5, 'packed nullable binary-list metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed nullable binary-list header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list metadata exceeds payload length');\n }\n\n const items = new Array<Uint8Array | null>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const present = view.getUint8(metadataOffset);\n const byteLength = view.getUint32(metadataOffset + 1, true);\n metadataOffset += 5;\n if (present === 0) {\n if (byteLength !== 0) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n 'packed nullable binary-list null item has a payload length'\n );\n }\n items[index] = null;\n continue;\n }\n if (present !== 1) {\n throw workerProtocolError(\n 'WorkerProtocolError',\n `packed nullable binary-list item has invalid presence byte: ${present}`\n );\n }\n const end = readOffset + byteLength;\n if (end > U32_MAX || end > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list item exceeds payload length');\n }\n items[index] = bytes.subarray(readOffset, end);\n readOffset = end;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed nullable binary-list payload has trailing bytes');\n }\n return items;\n}\n\nfunction packScanRows(rows: Array<{ key: Uint8Array; value: Uint8Array }>): PackedScanRowsV1 | null {\n const count = rows.length;\n const metadataBytes = checkedByteCount(count, 8, 'packed scan row metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const row = rows[index];\n if (!isRecord(row) || !(row.key instanceof Uint8Array) || !(row.value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'scan row payload key/value is not a Uint8Array');\n }\n const keyLength = checkedU32(row.key.byteLength, 'scan row key length');\n const valueLength = checkedU32(row.value.byteLength, 'scan row value length');\n payloadBytes += keyLength + valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row payload exceeds 32-bit payload limit');\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed scan row header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed scan row total');\n if (totalBytes > MAX_PACKED_RESPONSE_BYTES) {\n return null;\n }\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const row = rows[index];\n const key = row.key;\n const value = row.value;\n const keyLength = key.byteLength;\n const valueLength = value.byteLength;\n view.setUint32(metadataOffset, keyLength, true);\n view.setUint32(metadataOffset + 4, valueLength, true);\n metadataOffset += 8;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n bytes.set(value, writeOffset);\n writeOffset += valueLength;\n }\n return {\n __moyodbPacked: PACKED_SCAN_ROWS_V1,\n bytes\n };\n}\n\nfunction unpackScanRows(payload: PackedBytes): Array<{ key: Uint8Array; value: Uint8Array }> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed scan row payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 8, 'packed scan row metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed scan row header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row metadata exceeds payload length');\n }\n\n const rows = new Array<{ key: Uint8Array; value: Uint8Array }>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const keyLength = view.getUint32(metadataOffset, true);\n const valueLength = view.getUint32(metadataOffset + 4, true);\n metadataOffset += 8;\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row key exceeds payload length');\n }\n const valueEnd = keyEnd + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row value exceeds payload length');\n }\n rows[index] = {\n key: bytes.subarray(readOffset, keyEnd),\n value: bytes.subarray(keyEnd, valueEnd)\n };\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed scan row payload has trailing bytes');\n }\n return rows;\n}\n\nfunction packBatchOps(ops: Array<BatchOp>): PackedBatchOpsV1 {\n const count = ops.length;\n const metadataBytes = checkedByteCount(count, 9, 'packed batch metadata');\n let payloadBytes = 0;\n for (let index = 0; index < count; index += 1) {\n const op: unknown = ops[index];\n if (!isRecord(op) || (op.kind !== 'put' && op.kind !== 'delete')) {\n throw workerProtocolError('WorkerProtocolError', 'batch operation kind is not put or delete');\n }\n if (!(op.key instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'batch operation key is not a Uint8Array');\n }\n const keyLength = checkedU32(op.key.byteLength, 'batch operation key length');\n payloadBytes += keyLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload exceeds 32-bit payload limit');\n }\n if (op.kind === 'put') {\n if (!(op.value instanceof Uint8Array)) {\n throw workerProtocolError('WorkerProtocolError', 'batch put value is not a Uint8Array');\n }\n const valueLength = checkedU32(op.value.byteLength, 'batch put value length');\n payloadBytes += valueLength;\n if (payloadBytes > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload exceeds 32-bit payload limit');\n }\n }\n }\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed batch header');\n const totalBytes = checkedAdd(payloadOffset, payloadBytes, 'packed batch total');\n const bytes = new Uint8Array(totalBytes);\n const view = new DataView(bytes.buffer);\n view.setUint32(0, count, true);\n let metadataOffset = 4;\n let writeOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const op = ops[index];\n const key = op.key;\n const keyLength = key.byteLength;\n const valueLength = op.kind === 'put' ? op.value.byteLength : 0;\n view.setUint8(metadataOffset, op.kind === 'put' ? BATCH_OP_PUT : BATCH_OP_DELETE);\n view.setUint32(metadataOffset + 1, keyLength, true);\n view.setUint32(metadataOffset + 5, valueLength, true);\n metadataOffset += 9;\n bytes.set(key, writeOffset);\n writeOffset += keyLength;\n if (op.kind === 'put') {\n bytes.set(op.value, writeOffset);\n writeOffset += valueLength;\n }\n }\n return {\n __moyodbPacked: PACKED_BATCH_OPS_V1,\n bytes\n };\n}\n\nfunction unpackBatchPayload(payload: PackedBytes, keysOnly: true): PackedBatchOpKey[];\nfunction unpackBatchPayload(payload: PackedBytes, keysOnly: false): Array<BatchOp>;\nfunction unpackBatchPayload(payload: PackedBytes, keysOnly: boolean): PackedBatchOpKey[] | Array<BatchOp> {\n const bytes = payload.bytes;\n if (!(bytes instanceof Uint8Array) || bytes.byteLength < 4) {\n throw workerProtocolError('WorkerProtocolError', 'invalid packed batch payload');\n }\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const count = view.getUint32(0, true);\n const metadataBytes = checkedByteCount(count, 9, 'packed batch metadata');\n const payloadOffset = checkedAdd(4, metadataBytes, 'packed batch header');\n if (payloadOffset > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch metadata exceeds payload length');\n }\n\n const ops = new Array<BatchOp | PackedBatchOpKey>(count);\n let metadataOffset = 4;\n let readOffset = payloadOffset;\n for (let index = 0; index < count; index += 1) {\n const kind = view.getUint8(metadataOffset);\n const keyLength = view.getUint32(metadataOffset + 1, true);\n const valueLength = view.getUint32(metadataOffset + 5, true);\n metadataOffset += 9;\n\n const keyEnd = readOffset + keyLength;\n if (keyEnd > U32_MAX || keyEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch key exceeds payload length');\n }\n const key = bytes.subarray(readOffset, keyEnd);\n readOffset = keyEnd;\n\n if (kind === BATCH_OP_DELETE) {\n if (valueLength !== 0) {\n throw workerProtocolError('WorkerProtocolError', 'packed delete operation has a value payload');\n }\n ops[index] = { kind: 'delete', key };\n continue;\n }\n\n if (kind !== BATCH_OP_PUT) {\n throw workerProtocolError('WorkerProtocolError', `packed batch operation has invalid kind byte: ${kind}`);\n }\n const valueEnd = readOffset + valueLength;\n if (valueEnd > U32_MAX || valueEnd > bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch value exceeds payload length');\n }\n if (keysOnly) {\n ops[index] = { kind: 'put', key };\n } else {\n ops[index] = { kind: 'put', key, value: bytes.subarray(readOffset, valueEnd) };\n }\n readOffset = valueEnd;\n }\n if (readOffset !== bytes.byteLength) {\n throw workerProtocolError('WorkerProtocolError', 'packed batch payload has trailing bytes');\n }\n return ops as PackedBatchOpKey[] | Array<BatchOp>;\n}\n\nfunction isPackedPayload(value: unknown, tag: string): value is PackedBytes {\n return isRecord(value) && value.__moyodbPacked === tag && value.bytes instanceof Uint8Array;\n}\n\nfunction checkedByteCount(count: number, itemBytes: number, what: string): number {\n if (!Number.isSafeInteger(count) || count < 0) {\n throw workerProtocolError('WorkerProtocolError', `${what} count is invalid: ${count}`);\n }\n return checkedU32(count * itemBytes, what);\n}\n\nfunction checkedAdd(left: number, right: number, what: string): number {\n const total = left + right;\n return checkedU32(total, what);\n}\n\nfunction checkedU32(value: number, what: string): number {\n if (!Number.isSafeInteger(value) || value < 0 || value > U32_MAX) {\n throw workerProtocolError('WorkerProtocolError', `${what} exceeds 32-bit payload limit`);\n }\n return value;\n}\n\nfunction copyToOwnedUint8Array(value: Uint8Array): Uint8Array {\n const owned = new Uint8Array(value.byteLength);\n owned.set(value);\n return owned;\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import type {\n AutocommitCommand,\n IndexScanPage,\n WorkerApi,\n WorkerOpenRequest,\n WorkerScanPage,\n WorkerScanPageRequest\n} from './worker-api';\nimport type {\n BatchOp,\n ChangeFeed,\n ChangeFeedOptions,\n CompactionResult,\n CreateStoreOptions,\n DebugFailpoint,\n DbStats,\n ExportSnapshotOptions,\n IndexDef,\n PutOptions,\n Range,\n ScanItem,\n StorageInfo,\n TxMode\n} from './types';\nimport {\n MAX_WORKER_BATCH_BYTES,\n MAX_WORKER_BATCH_MESSAGES,\n WORKER_PROTOCOL_REQUEST,\n WORKER_PROTOCOL_REQUEST_BATCH,\n WORKER_PROTOCOL_RESPONSE,\n WORKER_PROTOCOL_RESPONSE_BATCH,\n WORKER_PROTOCOL_VERSION,\n captureWorkerPayload,\n deserializeWorkerError,\n decodeWorkerResponsePayload,\n isWorkerProtocolReadyMessage,\n isWorkerProtocolReadyEnvelope,\n isWorkerProtocolResponseBatchMessage,\n isWorkerProtocolResponseMessage,\n prepareWorkerCommandPayload,\n workerProtocolError,\n type AutocommitArgs,\n type WorkerCommand,\n type WorkerCommandArgs,\n type WorkerCommandResult,\n type WorkerProtocolRequestBatchMessage,\n type WorkerProtocolRequestMessage\n} from './worker-protocol';\nimport { clampTimerDelayMs, isRecord } from './internal';\n\ninterface PendingRequest {\n /** Response command; autocommit replies use the inner command's format. */\n command: WorkerCommand;\n resolve: (value: unknown) => void;\n reject: (error: Error) => void;\n timeout: ReturnType<typeof setTimeout> | null;\n}\n\ninterface QueuedRequest {\n message: WorkerProtocolRequestMessage;\n transfer: Transferable[];\n byteLength: number;\n}\n\nfunction clearPendingTimeout(pending: PendingRequest): void {\n if (pending.timeout) {\n clearTimeout(pending.timeout);\n pending.timeout = null;\n }\n}\n\nexport interface WorkerProtocolClientOptions {\n requestTimeoutMs?: number;\n readyTimeoutMs?: number;\n /** Keeps scan packets packed when relaying through SharedWorker. */\n forwardScanPackets?: boolean;\n}\n\nexport interface WorkerTransport {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: string, listener: EventListenerOrEventListenerObject): void;\n removeEventListener(type: string, listener: EventListenerOrEventListenerObject): void;\n}\n\nexport interface WorkerClient extends WorkerApi {\n autocommit<M extends AutocommitCommand>(\n mode: TxMode,\n command: M,\n args: AutocommitArgs<M>\n ): Promise<WorkerCommandResult<M>>;\n request<M extends WorkerCommand>(command: M, args: WorkerCommandArgs<M>): Promise<WorkerCommandResult<M>>;\n setFatalHandler(handler: ((error: Error) => void) | null): void;\n whenReady(): Promise<void>;\n dispose(reason?: Error): void;\n acquireMigration?(): Promise<void>;\n releaseMigration?(): Promise<void>;\n setTransactionsInvalidatedHandler?(handler: (() => void) | null): void;\n crash?(): void;\n}\n\nexport class WorkerProtocolClient implements WorkerApi {\n private nextRequestId = 1;\n private pending = new Map<number, PendingRequest>();\n private closed = false;\n private readyResolved = false;\n private readyResolve: (() => void) | null = null;\n private readyReject: ((error: Error) => void) | null = null;\n private ready: Promise<void>;\n private requestTimeoutMs: number;\n private fatalHandler: ((error: Error) => void) | null = null;\n private closeReason: Error | null = null;\n private batching = false;\n private queuedRequests: QueuedRequest[] = [];\n private queuedBytes = 0;\n private flushScheduled = false;\n private awaitingReady = 0;\n private readyTimeout: ReturnType<typeof setTimeout> | null = null;\n private forwardScanPackets: boolean;\n\n constructor(\n private readonly worker: WorkerTransport,\n options: WorkerProtocolClientOptions = {}\n ) {\n this.forwardScanPackets = options.forwardScanPackets === true;\n this.requestTimeoutMs = clampTimerDelayMs(options.requestTimeoutMs ?? 0);\n this.ready = new Promise<void>((resolve, reject) => {\n this.readyResolve = resolve;\n this.readyReject = reject;\n });\n const readyTimeoutMs = clampTimerDelayMs(options.readyTimeoutMs ?? 0);\n if (readyTimeoutMs > 0) {\n this.readyTimeout = setTimeout(() => {\n this.fail(workerProtocolError('WorkerReadyTimeoutError', 'worker did not become ready'));\n }, readyTimeoutMs);\n }\n void this.ready.catch(() => undefined);\n this.worker.addEventListener('message', this.handleMessage as EventListener);\n this.worker.addEventListener('messageerror', this.handleMessageError);\n this.worker.addEventListener('error', this.handleError as EventListener);\n }\n\n setFatalHandler(handler: ((error: Error) => void) | null): void {\n this.fatalHandler = handler;\n }\n\n whenReady(): Promise<void> {\n return this.ready;\n }\n\n dispose(reason: Error = workerProtocolError('WorkerTerminatedError', 'worker transport was closed')): void {\n this.disposeInternal(reason, false);\n }\n\n protected fail(reason: Error): void {\n this.disposeInternal(reason, true);\n }\n\n open(request: WorkerOpenRequest): Promise<void> {\n return this.request('open', [request]);\n }\n\n close(): Promise<void> {\n return this.request('close', []);\n }\n\n destroy(): Promise<void> {\n return this.request('destroy', []);\n }\n\n deleteDB(dbName: string): Promise<void> {\n return this.request('deleteDB', [dbName]);\n }\n\n begin(mode: TxMode): Promise<number> {\n return this.request('begin', [mode]);\n }\n\n commit(txId: number): Promise<number> {\n return this.request('commit', [txId]);\n }\n\n rollback(txId: number): Promise<void> {\n return this.request('rollback', [txId]);\n }\n\n autocommit<M extends AutocommitCommand>(\n mode: TxMode,\n command: M,\n args: AutocommitArgs<M>\n ): Promise<WorkerCommandResult<M>> {\n return this.send('autocommit', [mode, command, args as unknown[]], command) as Promise<WorkerCommandResult<M>>;\n }\n\n createStore(txId: number, name: string, options?: CreateStoreOptions): Promise<void> {\n return this.request('createStore', [txId, name, options]);\n }\n\n dropStore(txId: number, name: string): Promise<void> {\n return this.request('dropStore', [txId, name]);\n }\n\n clearStore(txId: number, name: string): Promise<void> {\n return this.request('clearStore', [txId, name]);\n }\n\n get(txId: number, store: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.request('get', [txId, store, key]);\n }\n\n getMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<Array<Uint8Array | null>> {\n return this.request('getMany', [txId, store, keys]);\n }\n\n has(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return this.request('has', [txId, store, key]);\n }\n\n put(txId: number, store: string, key: Uint8Array, value: Uint8Array, options?: PutOptions): Promise<void> {\n return this.request('put', [txId, store, key, value, options]);\n }\n\n putMany(\n txId: number,\n store: string,\n entries: Array<[Uint8Array, Uint8Array]>,\n options?: PutOptions\n ): Promise<void> {\n return this.request('putMany', [txId, store, entries, options]);\n }\n\n delete(txId: number, store: string, key: Uint8Array): Promise<boolean> {\n return this.request('delete', [txId, store, key]);\n }\n\n deleteMany(txId: number, store: string, keys: Array<Uint8Array>): Promise<void> {\n return this.request('deleteMany', [txId, store, keys]);\n }\n\n applyBatch(txId: number, store: string, ops: Array<BatchOp>): Promise<void> {\n return this.request('applyBatch', [txId, store, ops]);\n }\n\n scan(txId: number, store: string, range: Range): Promise<ScanItem[]> {\n return this.request('scan', [txId, store, range]);\n }\n\n scanPage(request: WorkerScanPageRequest): Promise<WorkerScanPage> {\n return this.request('scanPage', [request]);\n }\n\n closeCursor(cursorId: number): Promise<void> {\n return this.request('closeCursor', [cursorId]);\n }\n\n getByIndex(txId: number, store: string, indexName: string, key: Uint8Array): Promise<Uint8Array | null> {\n return this.request('getByIndex', [txId, store, indexName, key]);\n }\n\n scanByIndex(txId: number, store: string, indexName: string, range: Range): Promise<ScanItem[]> {\n return this.request('scanByIndex', [txId, store, indexName, range]);\n }\n\n scanByIndexPage(\n txId: number,\n store: string,\n indexName: string,\n range: Range,\n cursor: Uint8Array | null,\n limit: number,\n maxBytes?: number\n ): Promise<IndexScanPage> {\n return this.request('scanByIndexPage', [txId, store, indexName, range, cursor, limit, maxBytes]);\n }\n\n getIndexes(txId?: number): Promise<IndexDef[]> {\n return this.request('getIndexes', txId === undefined ? [] : [txId]);\n }\n\n reconcileIndexes(txId: number, indexes: IndexDef[]): Promise<void> {\n return this.request('reconcileIndexes', [txId, indexes]);\n }\n\n listStores(): Promise<string[]> {\n return this.request('listStores', []);\n }\n\n getVersion(): Promise<number> {\n return this.request('getVersion', []);\n }\n\n changesSince(txId: number, options: ChangeFeedOptions): Promise<ChangeFeed> {\n return this.request('changesSince', [txId, options]);\n }\n\n setSchemaVersion(txId: number, version: number): Promise<void> {\n return this.request('setSchemaVersion', [txId, version]);\n }\n\n exportSnapshot(options?: ExportSnapshotOptions): Promise<Uint8Array> {\n return this.request('exportSnapshot', [options]);\n }\n\n importSnapshot(data: Uint8Array): Promise<void> {\n return this.request('importSnapshot', [data]);\n }\n\n reset(): Promise<void> {\n return this.request('reset', []);\n }\n\n compact(): Promise<CompactionResult> {\n return this.request('compact', []);\n }\n\n rebuild(): Promise<CompactionResult> {\n return this.request('rebuild', []);\n }\n\n stats(): Promise<DbStats> {\n return this.request('stats', []);\n }\n\n storageInfo(): Promise<StorageInfo> {\n return this.request('storageInfo', []);\n }\n\n requestPersistence(): Promise<boolean> {\n return this.request('requestPersistence', []);\n }\n\n setFailpoint(failpoint: DebugFailpoint): Promise<void> {\n return this.request('setFailpoint', [failpoint]);\n }\n\n async request<M extends WorkerCommand>(command: M, args: WorkerCommandArgs<M>): Promise<WorkerCommandResult<M>> {\n return (await this.send(command, args, command)) as WorkerCommandResult<M>;\n }\n\n private async send<M extends WorkerCommand>(\n command: M,\n args: WorkerCommandArgs<M>,\n responseCommand: WorkerCommand\n ): Promise<unknown> {\n this.ensureOpen();\n this.awaitingReady += 1;\n try {\n await this.ready;\n } finally {\n this.awaitingReady -= 1;\n }\n this.ensureOpen();\n // Calls awaiting readiness together can share a batch. A lone call posts immediately.\n const shouldQueue = this.batching && (this.awaitingReady > 0 || this.queuedRequests.length > 0);\n const id = this.nextRequestId;\n this.nextRequestId += 1;\n const prepared = prepareWorkerCommandPayload(command, args);\n const message: WorkerProtocolRequestMessage = {\n type: WORKER_PROTOCOL_REQUEST,\n version: WORKER_PROTOCOL_VERSION,\n id,\n command,\n args: prepared.args\n } as WorkerProtocolRequestMessage;\n return await new Promise<unknown>((resolve, reject) => {\n const timeout =\n this.requestTimeoutMs > 0\n ? setTimeout(() => {\n const current = this.pending.get(id);\n if (!current || current.timeout === null) {\n return;\n }\n this.pending.delete(id);\n current.timeout = null;\n reject(\n workerProtocolError(\n 'WorkerRequestTimeoutError',\n `worker command ${command} timed out after ${this.requestTimeoutMs}ms`\n )\n );\n }, this.requestTimeoutMs)\n : null;\n this.pending.set(id, {\n command: responseCommand,\n resolve,\n reject,\n timeout\n });\n try {\n if (shouldQueue) {\n this.queueRequest(message, prepared.transfer);\n } else if (prepared.transfer.length > 0) {\n this.worker.postMessage(message, prepared.transfer);\n } else {\n this.worker.postMessage(message);\n }\n } catch (error) {\n this.rejectPending(id, error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n private queueRequest(message: WorkerProtocolRequestMessage, transfer: Transferable[]): void {\n if (!this.pending.has(message.id)) return;\n const byteLength = payloadBytes(message);\n if (this.queuedRequests.length > 0 && this.queuedBytes + byteLength > MAX_WORKER_BATCH_BYTES) {\n this.flushRequests();\n }\n // A full batch posts in this turn, so postMessage is the snapshot.\n const releaseNow =\n this.queuedRequests.length + 1 >= MAX_WORKER_BATCH_MESSAGES ||\n this.queuedBytes + byteLength >= MAX_WORKER_BATCH_BYTES;\n if (releaseNow) {\n this.queuedRequests.push({ message, transfer, byteLength });\n this.queuedBytes += byteLength;\n this.flushRequests();\n return;\n }\n const captured = snapshotQueuedPayload(message, transfer);\n if (!this.pending.has(message.id)) return;\n this.queuedRequests.push({\n message: captured.value,\n transfer: captured.transfer,\n byteLength: captured.byteLength\n });\n this.queuedBytes += captured.byteLength;\n if (!this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n this.flushScheduled = false;\n this.flushRequests();\n });\n }\n }\n\n private flushRequests(): void {\n const queued = this.queuedRequests;\n this.queuedRequests = [];\n this.queuedBytes = 0;\n if (this.closed) return;\n const active = queued.filter((entry) => this.pending.has(entry.message.id));\n if (active.length === 0) return;\n const message: WorkerProtocolRequestMessage | WorkerProtocolRequestBatchMessage =\n active.length === 1\n ? active[0].message\n : {\n type: WORKER_PROTOCOL_REQUEST_BATCH,\n version: WORKER_PROTOCOL_VERSION,\n requests: active.map((entry) => entry.message)\n };\n const transfer: Transferable[] = [];\n for (const entry of active) {\n for (const buffer of entry.transfer) transfer.push(buffer);\n }\n try {\n if (transfer.length > 0) {\n this.worker.postMessage(message, transfer);\n } else {\n this.worker.postMessage(message);\n }\n } catch (error) {\n const reason = error instanceof Error ? error : new Error(String(error));\n for (const entry of active) this.rejectPending(entry.message.id, reason);\n }\n }\n\n private ensureOpen(): void {\n if (this.closed) {\n throw this.closeReason ?? workerProtocolError('WorkerTerminatedError', 'worker transport is closed');\n }\n }\n\n private handleMessage = (event: MessageEvent<unknown>): void => {\n const data = event.data;\n if (isWorkerProtocolReadyMessage(data)) {\n if (this.readyResolved) return;\n this.batching = data.batching === 1;\n this.readyResolved = true;\n if (this.readyTimeout) clearTimeout(this.readyTimeout);\n this.readyTimeout = null;\n this.readyResolve?.();\n this.readyResolve = null;\n this.readyReject = null;\n return;\n }\n if (isWorkerProtocolReadyEnvelope(data)) {\n this.fail(workerProtocolError('WorkerProtocolError', 'incompatible worker protocol ready message'));\n return;\n }\n if (\n isRecord(data) &&\n (data.type === WORKER_PROTOCOL_RESPONSE || data.type === WORKER_PROTOCOL_RESPONSE_BATCH) &&\n data.version !== WORKER_PROTOCOL_VERSION\n ) {\n this.fail(workerProtocolError('WorkerProtocolError', 'incompatible worker protocol response'));\n return;\n }\n if (isWorkerProtocolResponseBatchMessage(data)) {\n for (const response of data.responses) this.handleResponse(response);\n return;\n }\n if (\n isRecord(data) &&\n data.type === WORKER_PROTOCOL_RESPONSE_BATCH &&\n data.version === WORKER_PROTOCOL_VERSION\n ) {\n this.fail(workerProtocolError('WorkerProtocolError', 'invalid worker response batch'));\n return;\n }\n this.handleResponse(data);\n };\n\n private handleResponse(data: unknown): void {\n if (!isWorkerProtocolResponseMessage(data)) {\n if (\n isRecord(data) &&\n data.type === WORKER_PROTOCOL_RESPONSE &&\n data.version === WORKER_PROTOCOL_VERSION &&\n typeof data.id === 'number' &&\n Number.isSafeInteger(data.id)\n ) {\n this.rejectPending(data.id, workerProtocolError('WorkerProtocolError', 'invalid worker response'));\n }\n return;\n }\n const pending = this.pending.get(data.id);\n if (!pending) {\n return;\n }\n this.pending.delete(data.id);\n clearPendingTimeout(pending);\n try {\n if (data.ok) {\n pending.resolve(\n this.forwardScanPackets &&\n (pending.command === 'scanPage' ||\n pending.command === 'scan' ||\n pending.command === 'scanByIndex' ||\n pending.command === 'scanByIndexPage')\n ? data.result\n : decodeWorkerResponsePayload(pending.command, data.result)\n );\n } else {\n pending.reject(deserializeWorkerError(data.error));\n }\n } catch (error) {\n pending.reject(\n error instanceof Error && error.name === 'WorkerProtocolError'\n ? error\n : workerProtocolError('WorkerProtocolError', 'worker response could not be decoded')\n );\n }\n }\n\n private handleMessageError = (): void => {\n this.fail(workerProtocolError('WorkerMessageError', 'worker message could not be deserialized'));\n };\n\n private handleError = (event: ErrorEvent): void => {\n const error =\n event.error instanceof Error\n ? event.error\n : workerProtocolError('WorkerError', event.message || 'worker runtime failed');\n this.fail(error);\n };\n\n private rejectPending(id: number, error: Error): void {\n const pending = this.pending.get(id);\n if (!pending) {\n return;\n }\n this.pending.delete(id);\n clearPendingTimeout(pending);\n pending.reject(error);\n }\n\n private disposeInternal(reason: Error, notifyFatal: boolean): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.closeReason = reason;\n this.worker.removeEventListener('message', this.handleMessage as EventListener);\n this.worker.removeEventListener('messageerror', this.handleMessageError);\n this.worker.removeEventListener('error', this.handleError as EventListener);\n if (this.readyTimeout) clearTimeout(this.readyTimeout);\n this.readyTimeout = null;\n if (!this.readyResolved) {\n this.readyReject?.(reason);\n }\n this.readyResolve = null;\n this.readyReject = null;\n this.queuedRequests = [];\n this.queuedBytes = 0;\n for (const pending of this.pending.values()) {\n clearPendingTimeout(pending);\n pending.reject(reason);\n }\n this.pending.clear();\n if (notifyFatal) {\n this.fatalHandler?.(reason);\n }\n }\n}\n\ninterface ViewGeometry {\n offset: number;\n length: number;\n dataView: boolean;\n}\n\nconst STANDARD_VIEW_CONSTRUCTORS = new Set<object>([\n DataView,\n Uint8Array,\n Uint8ClampedArray,\n Uint16Array,\n Uint32Array,\n Int8Array,\n Int16Array,\n Int32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array\n]);\n\n/**\n * Freeze a queued payload so the later postMessage is its only structured clone.\n * Listed buffers move now. Other ArrayBuffers are copied. SharedArrayBuffers stay shared.\n */\nfunction snapshotQueuedPayload<T>(\n value: T,\n transfer: readonly Transferable[]\n): { value: T; transfer: Transferable[]; byteLength: number } {\n const moving = new Set<ArrayBuffer>();\n for (const item of transfer) {\n if (!(item instanceof ArrayBuffer) || isResizableBuffer(item)) {\n return captureWorkerPayload(value, transfer as Transferable[]);\n }\n moving.add(item);\n }\n const geometries = new Map<ArrayBufferView, ViewGeometry>();\n if (!isPlainPayload(value, geometries, new WeakSet<object>())) {\n return captureWorkerPayload(value, transfer as Transferable[]);\n }\n const relocated = new Map<ArrayBuffer, ArrayBuffer>();\n for (const buffer of moving) {\n relocated.set(buffer, moveArrayBuffer(buffer));\n }\n const owned: ArrayBuffer[] = [];\n const seen = new WeakMap<object, unknown>();\n const cloneValue = (item: unknown): unknown => {\n if (item === null || typeof item !== 'object') {\n return item;\n }\n const existing = seen.get(item);\n if (existing !== undefined) {\n return existing;\n }\n if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n seen.set(item, item);\n return item;\n }\n if (item instanceof ArrayBuffer) {\n const next = relocated.get(item) ?? item.slice(0);\n seen.set(item, next);\n owned.push(next);\n return next;\n }\n if (ArrayBuffer.isView(item)) {\n const geometry = geometries.get(item);\n if (!geometry) {\n throw workerProtocolError('WorkerProtocolError', 'worker payload could not be queued');\n }\n const buffer = item.buffer;\n const nextBuffer =\n typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer\n ? buffer\n : (cloneValue(buffer) as ArrayBuffer);\n const out = retargetView(item, nextBuffer, geometry);\n seen.set(item, out);\n return out;\n }\n if (Array.isArray(item)) {\n const out = new Array<unknown>(item.length);\n seen.set(item, out);\n for (let index = 0; index < item.length; index += 1) {\n if (index in item) {\n out[index] = cloneValue(item[index]);\n }\n }\n return out;\n }\n const out: Record<string, unknown> = Object.getPrototypeOf(item) === null ? Object.create(null) : {};\n seen.set(item, out);\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n out[key] = cloneValue(record[key]);\n }\n }\n return out;\n };\n const cloned = cloneValue(value) as T;\n return { value: cloned, transfer: owned, byteLength: payloadBytes(cloned) };\n}\n\nfunction payloadBytes(value: unknown): number {\n let byteLength = 0;\n const seen = new WeakSet<object>();\n const visit = (item: unknown): void => {\n if (!Number.isFinite(byteLength)) return;\n if (typeof item === 'string') {\n byteLength += 8 + item.length * 2;\n return;\n }\n if (item === null || typeof item !== 'object') {\n byteLength += 8;\n return;\n }\n if (seen.has(item)) {\n return;\n }\n seen.add(item);\n byteLength += 8;\n if (item instanceof ArrayBuffer) {\n byteLength += item.byteLength;\n } else if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n byteLength += item.byteLength;\n } else if (ArrayBuffer.isView(item)) {\n visit(item.buffer);\n } else if (Array.isArray(item)) {\n if (Object.getPrototypeOf(item) !== Array.prototype || hasExtraKeys(item)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n for (let index = 0; index < item.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(item, String(index));\n if (descriptor && !('value' in descriptor)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n visit(descriptor?.value);\n }\n } else if (item instanceof Map) {\n for (const [key, child] of item) {\n visit(key);\n visit(child);\n }\n } else if (item instanceof Set) {\n for (const child of item) {\n visit(child);\n }\n } else {\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n const descriptor = Object.getOwnPropertyDescriptor(record, key);\n // Let postMessage evaluate accessors and preserve special data keys.\n if (key === '__proto__' || !descriptor || !('value' in descriptor)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n byteLength += 8 + key.length * 2;\n visit(descriptor.value);\n }\n }\n }\n };\n visit(value);\n return byteLength;\n}\n\nfunction isPlainPayload(\n value: unknown,\n geometries: Map<ArrayBufferView, ViewGeometry>,\n seen: WeakSet<object>\n): boolean {\n if (typeof value === 'function' || typeof value === 'symbol') {\n return false;\n }\n if (value === null || typeof value !== 'object') {\n return true;\n }\n if (seen.has(value)) {\n return true;\n }\n seen.add(value);\n if (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer) {\n return !isResizableBuffer(value);\n }\n if (value instanceof ArrayBuffer) {\n return !isResizableBuffer(value);\n }\n if (ArrayBuffer.isView(value)) {\n if (!isStandardView(value)) {\n return false;\n }\n const buffer = value.buffer;\n if (typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer) {\n if (isResizableBuffer(buffer)) {\n return false;\n }\n geometries.set(value, viewGeometry(value));\n return true;\n }\n if (!(buffer instanceof ArrayBuffer) || isResizableBuffer(buffer)) {\n return false;\n }\n geometries.set(value, viewGeometry(value));\n return true;\n }\n if (value instanceof Map || value instanceof Set || value instanceof Date || value instanceof RegExp) {\n return false;\n }\n if (Array.isArray(value)) {\n if (hasExtraKeys(value) || hasEnumerableSymbols(value)) {\n return false;\n }\n for (const child of value) {\n if (!isPlainPayload(child, geometries, seen)) {\n return false;\n }\n }\n return true;\n }\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) {\n return false;\n }\n if (hasEnumerableSymbols(value)) {\n return false;\n }\n const record = value as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key) && !isPlainPayload(record[key], geometries, seen)) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasExtraKeys(value: readonly unknown[]): boolean {\n const record: object = value;\n for (const key in record) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n continue;\n }\n const index = Number(key);\n if (!Number.isInteger(index) || index < 0 || index >= value.length || String(index) !== key) {\n return true;\n }\n }\n return false;\n}\n\nfunction hasEnumerableSymbols(value: object): boolean {\n for (const symbol of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, symbol)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isStandardView(view: ArrayBufferView): boolean {\n return STANDARD_VIEW_CONSTRUCTORS.has(view.constructor);\n}\n\nfunction viewGeometry(view: ArrayBufferView): ViewGeometry {\n if (view instanceof DataView) {\n return { offset: view.byteOffset, length: view.byteLength, dataView: true };\n }\n return { offset: view.byteOffset, length: (view as Uint8Array).length, dataView: false };\n}\n\nfunction retargetView(view: ArrayBufferView, buffer: ArrayBufferLike, geometry: ViewGeometry): ArrayBufferView {\n if (geometry.dataView) {\n return new DataView(buffer, geometry.offset, geometry.length);\n }\n const Typed = view.constructor as new (\n buffer: ArrayBufferLike,\n byteOffset: number,\n length: number\n ) => ArrayBufferView;\n return new Typed(buffer, geometry.offset, geometry.length);\n}\n\nfunction moveArrayBuffer(buffer: ArrayBuffer): ArrayBuffer {\n const movable = buffer as ArrayBuffer & { transfer?: () => ArrayBuffer };\n if (typeof movable.transfer === 'function') {\n return movable.transfer();\n }\n return structuredClone(buffer, { transfer: [buffer] });\n}\n\nfunction isResizableBuffer(buffer: ArrayBuffer | SharedArrayBuffer): boolean {\n return (buffer as { resizable?: boolean }).resizable === true;\n}\n","import type { AutocommitCommand, WorkerApi } from './worker-api';\nimport {\n MAX_WORKER_BATCH_BYTES,\n MAX_WORKER_BATCH_MESSAGES,\n WORKER_PROTOCOL_READY,\n WORKER_PROTOCOL_RESPONSE,\n WORKER_PROTOCOL_RESPONSE_BATCH,\n WORKER_PROTOCOL_VERSION,\n captureWorkerPayload,\n decodeWorkerCommandPayload,\n isAutocommitCommand,\n packedBatchOpsBytes,\n packedBinaryListBytes,\n prepareWorkerResponsePayload,\n isWorkerCommand,\n isWorkerProtocolEnvelope,\n isWorkerProtocolRequestBatchMessage,\n isWorkerProtocolRequestMessage,\n serializeWorkerError,\n workerProtocolError,\n type WorkerProtocolErrorMessage,\n type WorkerProtocolResponseMessage,\n type WorkerProtocolResponseBatchMessage,\n type WorkerProtocolSuccessMessage,\n type WorkerCommand\n} from './worker-protocol';\nimport { isRecord } from './internal';\n\ntype PackedWorkerApi = WorkerApi & {\n getManyPacked?: (txId: number, store: string, packedKeys: Uint8Array) => Promise<unknown>;\n putManyPacked?: (txId: number, store: string, packedEntries: Uint8Array, options?: unknown) => Promise<unknown>;\n deleteManyPacked?: (txId: number, store: string, packedKeys: Uint8Array) => Promise<unknown>;\n applyBatchPacked?: (txId: number, store: string, packedOps: Uint8Array) => Promise<unknown>;\n};\n\nexport interface WorkerServerHandle {\n close(): void;\n}\n\nexport interface WorkerServerScope {\n postMessage(message: unknown, transfer?: Transferable[]): void;\n addEventListener(type: 'message', listener: (event: MessageEvent<unknown>) => void): void;\n removeEventListener(type: 'message', listener: (event: MessageEvent<unknown>) => void): void;\n readonly location: { readonly origin: string };\n}\n\n/** The first argument identifies the transaction lane. */\nconst TRANSACTION_COMMANDS = new Set<WorkerCommand>([\n 'commit',\n 'rollback',\n 'createStore',\n 'dropStore',\n 'clearStore',\n 'get',\n 'getMany',\n 'has',\n 'put',\n 'putMany',\n 'delete',\n 'deleteMany',\n 'applyBatch',\n 'scan',\n 'getByIndex',\n 'scanByIndex',\n 'scanByIndexPage',\n 'getIndexes',\n 'reconcileIndexes',\n 'setSchemaVersion'\n]);\n\n/** These commands require exclusive access to the open engine. */\nconst EXCLUSIVE_COMMANDS = new Set<WorkerCommand>([\n 'open',\n 'close',\n 'destroy',\n 'importSnapshot',\n 'reset',\n 'compact',\n 'rebuild'\n]);\n\n/**\n * These commands do not use the open engine, so browser storage calls\n * can run without delaying its close.\n */\nconst UNSCHEDULED_COMMANDS = new Set<WorkerCommand>(['deleteDB', 'storageInfo', 'requestPersistence']);\n\nconst noop = () => {};\n\n/**\n * Serializes each transaction lane, including awaited work. Readwrite\n * autocommits share one writer lane. Exclusive commands wait for scheduled\n * work and block later scheduled work until they finish.\n */\nclass RequestScheduler {\n #lanes = new Map<number | string, Promise<void>>();\n #inFlight = new Set<Promise<void>>();\n #barrier: Promise<void> = Promise.resolve();\n #cursorLanes = new Map<number, number | string>();\n\n schedule<T>(command: WorkerCommand, args: unknown[], task: () => Promise<T>): Promise<T> {\n if (UNSCHEDULED_COMMANDS.has(command)) {\n return task();\n }\n if (EXCLUSIVE_COMMANDS.has(command)) {\n if (this.#cursorLanes.size === 0) return this.#runExclusive(task);\n return this.#runExclusive(async () => {\n const result = await task();\n this.#cursorLanes.clear();\n return result;\n });\n }\n if (\n command !== 'scanPage' &&\n command !== 'closeCursor' &&\n !((command === 'commit' || command === 'rollback') && this.#cursorLanes.size > 0)\n ) {\n return this.#runShared(laneFor(command, args), task);\n }\n const request = command === 'scanPage' && isRecord(args[0]) ? args[0] : null;\n const cursorId = request?.cursorId ?? (command === 'closeCursor' ? args[0] : undefined);\n const cursorLane = typeof cursorId === 'number' ? this.#cursorLanes.get(cursorId) : undefined;\n // Explicit cursors share their transaction lane. Implicit cursors own a separate read snapshot.\n const lane =\n cursorLane ??\n (request && typeof request.txId === 'number'\n ? request.txId\n : typeof cursorId === 'number'\n ? `cursor:${cursorId}`\n : laneFor(command, args));\n return this.#runShared(lane, async () => {\n try {\n const result = await task();\n if (request && isRecord(result)) {\n if (typeof cursorId === 'number') this.#cursorLanes.delete(cursorId);\n if (typeof result.cursorId === 'number') {\n this.#cursorLanes.set(result.cursorId, lane ?? `cursor:${result.cursorId}`);\n }\n }\n return result;\n } finally {\n if (command === 'closeCursor' && typeof cursorId === 'number') this.#cursorLanes.delete(cursorId);\n if (command === 'commit' || command === 'rollback') {\n for (const [cursor, ownerLane] of this.#cursorLanes) {\n if (ownerLane === args[0]) this.#cursorLanes.delete(cursor);\n }\n }\n }\n });\n }\n\n #runShared<T>(lane: number | string | null, task: () => Promise<T>): Promise<T> {\n const barrier = this.#barrier;\n const previous = lane === null ? undefined : this.#lanes.get(lane);\n const result = (async () => {\n await barrier;\n if (previous) {\n await previous;\n }\n return task();\n })();\n const settled = result.then(noop, noop);\n this.#inFlight.add(settled);\n if (lane !== null) {\n this.#lanes.set(lane, settled);\n }\n void settled.then(() => {\n this.#inFlight.delete(settled);\n if (lane !== null && this.#lanes.get(lane) === settled) {\n this.#lanes.delete(lane);\n }\n });\n return result;\n }\n\n #runExclusive<T>(task: () => Promise<T>): Promise<T> {\n const previousBarrier = this.#barrier;\n const pending = Array.from(this.#inFlight);\n const result = (async () => {\n await previousBarrier;\n await Promise.all(pending);\n return task();\n })();\n this.#barrier = result.then(noop, noop);\n return result;\n }\n}\n\nconst AUTOCOMMIT_WRITER_LANE = 'autocommit:readwrite';\n\nfunction laneFor(command: WorkerCommand, args: unknown[]): number | string | null {\n if (TRANSACTION_COMMANDS.has(command) && typeof args[0] === 'number') {\n return args[0];\n }\n if (command === 'autocommit' && args[0] === 'readwrite') {\n return AUTOCOMMIT_WRITER_LANE;\n }\n return null;\n}\n\ntype SendResponse = (response: WorkerProtocolResponseMessage, transfer?: Transferable[]) => void;\n\nclass ResponseQueue {\n private queued: Array<{ response: WorkerProtocolResponseMessage; transfer: Transferable[] }> = [];\n private queuedBytes = 0;\n private flushScheduled = false;\n private flushChannel: MessageChannel | null = null;\n private closed = false;\n\n constructor(private readonly scope: WorkerServerScope) {}\n\n enqueue(response: WorkerProtocolResponseMessage, transfer: Transferable[] = [], flushNow = false): void {\n if (this.closed) return;\n const byteLength = payloadBytes(response);\n if (this.queued.length > 0 && this.queuedBytes + byteLength > MAX_WORKER_BATCH_BYTES) {\n this.flush();\n }\n // Posting before the next turn is the snapshot. Deferred replies are frozen first.\n const releaseNow =\n flushNow ||\n this.queued.length + 1 >= MAX_WORKER_BATCH_MESSAGES ||\n this.queuedBytes + byteLength >= MAX_WORKER_BATCH_BYTES;\n if (releaseNow) {\n this.queued.push({ response, transfer });\n this.queuedBytes += byteLength;\n this.flush();\n return;\n }\n const captured = snapshotQueuedPayload(response, transfer);\n this.queued.push({ response: captured.value, transfer: captured.transfer });\n this.queuedBytes += captured.byteLength;\n if (!this.flushScheduled) {\n this.flushScheduled = true;\n queueMicrotask(() => {\n if (this.closed || this.queued.length === 0) {\n this.flushScheduled = false;\n return;\n }\n // A task boundary groups replies from successive transaction-lane\n // microtasks and releases ready replies while other requests remain pending.\n this.flushChannel ??= this.createFlushChannel();\n this.flushChannel.port2.postMessage(null);\n });\n }\n }\n\n close(): void {\n this.closed = true;\n this.queued = [];\n this.queuedBytes = 0;\n this.flushChannel?.port1.close();\n this.flushChannel?.port2.close();\n this.flushChannel = null;\n }\n\n private createFlushChannel(): MessageChannel {\n const channel = new MessageChannel();\n channel.port1.addEventListener('message', () => {\n this.flushScheduled = false;\n this.flush();\n });\n channel.port1.start();\n return channel;\n }\n\n flush(): void {\n const queued = this.queued;\n this.queued = [];\n this.queuedBytes = 0;\n if (this.closed || queued.length === 0) return;\n const response: WorkerProtocolResponseMessage | WorkerProtocolResponseBatchMessage =\n queued.length === 1\n ? queued[0].response\n : {\n type: WORKER_PROTOCOL_RESPONSE_BATCH,\n version: WORKER_PROTOCOL_VERSION,\n responses: queued.map((entry) => entry.response)\n };\n const transfer: Transferable[] = [];\n for (const entry of queued) {\n for (const buffer of entry.transfer) transfer.push(buffer);\n }\n postWorkerResponse(this.scope, response, transfer);\n }\n}\n\nexport function exposeWorkerApi(api: WorkerApi, scope: WorkerServerScope = self): WorkerServerHandle {\n const scheduler = new RequestScheduler();\n const responses = new ResponseQueue(scope);\n const handleMessage = (event: MessageEvent<unknown>) => {\n if (event.origin !== '' && event.origin !== scope.location.origin) {\n return;\n }\n if (isWorkerProtocolRequestBatchMessage(event.data)) {\n let remaining = event.data.requests.length;\n const respond: SendResponse = (response, transfer) => {\n remaining -= 1;\n // Flush fully settled batches in this task. The fallback releases partial replies.\n responses.enqueue(response, transfer, remaining === 0);\n };\n for (const request of event.data.requests) {\n void dispatchWorkerRequest(scope, api, scheduler, request, respond);\n }\n return;\n }\n void dispatchWorkerRequest(scope, api, scheduler, event.data);\n };\n scope.addEventListener('message', handleMessage);\n scope.postMessage({\n type: WORKER_PROTOCOL_READY,\n version: WORKER_PROTOCOL_VERSION,\n batching: 1\n });\n return {\n close() {\n scope.removeEventListener('message', handleMessage);\n responses.close();\n }\n };\n}\n\nasync function dispatchWorkerRequest(\n scope: WorkerServerScope,\n api: WorkerApi,\n scheduler: RequestScheduler,\n data: unknown,\n respond: SendResponse = (response, transfer) => postWorkerResponse(scope, response, transfer)\n): Promise<void> {\n if (!isWorkerProtocolEnvelope(data)) {\n return;\n }\n const id = typeof data.id === 'number' && Number.isSafeInteger(data.id) ? data.id : 0;\n if (!isWorkerProtocolRequestMessage(data)) {\n respond(errorResponse(id, workerProtocolError('WorkerProtocolError', 'invalid worker protocol request')));\n return;\n }\n if (!isWorkerCommand(data.command)) {\n respond(\n errorResponse(\n data.id,\n workerProtocolError('WorkerProtocolError', `unsupported worker command: ${String(data.command)}`)\n )\n );\n return;\n }\n const command = data.command;\n const args = data.args as unknown[];\n try {\n let responseCommand: WorkerCommand = command;\n let invoke: () => Promise<unknown>;\n if (command === 'autocommit') {\n const [mode, inner, innerArgs] = args;\n if (\n (mode !== 'readonly' && mode !== 'readwrite') ||\n !isAutocommitCommand(inner) ||\n !Array.isArray(innerArgs)\n ) {\n throw workerProtocolError('WorkerProtocolError', 'invalid autocommit request');\n }\n assertImplemented(api, inner);\n responseCommand = inner;\n invoke = () => runAutocommit(api, mode, inner, innerArgs);\n } else {\n assertImplemented(api, command);\n invoke = () => invokeCommand(api, command, args);\n }\n const result = await scheduler.schedule(command, args, invoke);\n const responsePayload = prepareWorkerResponsePayload(responseCommand, result as never);\n respond(successResponse(data.id, responsePayload.result), responsePayload.transfer);\n } catch (error) {\n respond(errorResponse(data.id, error));\n }\n}\n\nfunction assertImplemented(api: WorkerApi, command: WorkerCommand): void {\n if (typeof (api[command] as unknown) !== 'function') {\n throw workerProtocolError('WorkerProtocolError', `worker command is not implemented: ${command}`);\n }\n}\n\nfunction invokeCommand(api: WorkerApi, command: WorkerCommand, args: unknown[]): Promise<unknown> {\n const packedResult = dispatchPackedCommand(api, command, args);\n if (packedResult !== null) {\n return packedResult;\n }\n return (api[command] as unknown as (...methodArgs: unknown[]) => Promise<unknown>).apply(\n api,\n decodeWorkerCommandPayload(command, args as never) as unknown[]\n );\n}\n\nasync function runAutocommit(\n api: WorkerApi,\n mode: 'readonly' | 'readwrite',\n command: AutocommitCommand,\n args: unknown[]\n): Promise<unknown> {\n const txId = await api.begin(mode);\n let result: unknown;\n try {\n result = await invokeCommand(api, command, [txId, ...args]);\n } catch (error) {\n try {\n await api.rollback(txId);\n } catch {}\n throw error;\n }\n if (mode === 'readwrite') {\n await api.commit(txId);\n } else {\n await api.rollback(txId);\n }\n return result;\n}\n\nfunction dispatchPackedCommand(api: WorkerApi, command: WorkerCommand, args: unknown[]): Promise<unknown> | null {\n const packedApi = api as PackedWorkerApi;\n if (command === 'getMany' || command === 'deleteMany') {\n const [txId, store, keys] = args;\n if (typeof txId !== 'number' || typeof store !== 'string') {\n return null;\n }\n const packedKeys = packedBinaryListBytes(keys);\n if (packedKeys === null) {\n return null;\n }\n if (command === 'getMany' && typeof packedApi.getManyPacked === 'function') {\n return packedApi.getManyPacked(txId, store, packedKeys);\n }\n if (command === 'deleteMany' && typeof packedApi.deleteManyPacked === 'function') {\n return packedApi.deleteManyPacked(txId, store, packedKeys);\n }\n return null;\n }\n\n if (command === 'putMany') {\n const [txId, store, entries, options] = args;\n if (typeof txId !== 'number' || typeof store !== 'string' || typeof packedApi.putManyPacked !== 'function') {\n return null;\n }\n const packedEntries = packedBinaryListBytes(entries);\n return packedEntries === null ? null : packedApi.putManyPacked(txId, store, packedEntries, options);\n }\n\n if (command === 'applyBatch') {\n const [txId, store, ops] = args;\n if (typeof txId !== 'number' || typeof store !== 'string' || typeof packedApi.applyBatchPacked !== 'function') {\n return null;\n }\n const packedOps = packedBatchOpsBytes(ops);\n return packedOps === null ? null : packedApi.applyBatchPacked(txId, store, packedOps);\n }\n\n return null;\n}\n\nfunction successResponse(id: number, result: unknown): WorkerProtocolSuccessMessage {\n return {\n type: WORKER_PROTOCOL_RESPONSE,\n version: WORKER_PROTOCOL_VERSION,\n id,\n ok: true,\n result\n };\n}\n\nfunction errorResponse(id: number, error: unknown): WorkerProtocolErrorMessage {\n return {\n type: WORKER_PROTOCOL_RESPONSE,\n version: WORKER_PROTOCOL_VERSION,\n id,\n ok: false,\n error: serializeWorkerError(error)\n };\n}\n\nfunction postWorkerResponse(\n scope: WorkerServerScope,\n response: WorkerProtocolResponseMessage | WorkerProtocolResponseBatchMessage,\n transfer: Transferable[] = []\n): void {\n if (transfer.length > 0) {\n try {\n scope.postMessage(response, transfer);\n return;\n } catch {}\n }\n scope.postMessage(response);\n}\n\ninterface ViewGeometry {\n offset: number;\n length: number;\n dataView: boolean;\n}\n\nconst STANDARD_VIEW_CONSTRUCTORS = new Set<object>([\n DataView,\n Uint8Array,\n Uint8ClampedArray,\n Uint16Array,\n Uint32Array,\n Int8Array,\n Int16Array,\n Int32Array,\n Float32Array,\n Float64Array,\n BigInt64Array,\n BigUint64Array\n]);\n\n/**\n * Freeze a queued payload so the later postMessage is its only structured clone.\n * Listed buffers move now. Other ArrayBuffers are copied. SharedArrayBuffers stay shared.\n */\nfunction snapshotQueuedPayload<T>(\n value: T,\n transfer: readonly Transferable[]\n): { value: T; transfer: Transferable[]; byteLength: number } {\n const moving = new Set<ArrayBuffer>();\n for (const item of transfer) {\n if (!(item instanceof ArrayBuffer) || isResizableBuffer(item)) {\n return captureWorkerPayload(value, transfer as Transferable[]);\n }\n moving.add(item);\n }\n const geometries = new Map<ArrayBufferView, ViewGeometry>();\n if (!isPlainPayload(value, geometries, new WeakSet<object>())) {\n return captureWorkerPayload(value, transfer as Transferable[]);\n }\n const relocated = new Map<ArrayBuffer, ArrayBuffer>();\n for (const buffer of moving) {\n relocated.set(buffer, moveArrayBuffer(buffer));\n }\n const owned: ArrayBuffer[] = [];\n const seen = new WeakMap<object, unknown>();\n const cloneValue = (item: unknown): unknown => {\n if (item === null || typeof item !== 'object') {\n return item;\n }\n const existing = seen.get(item);\n if (existing !== undefined) {\n return existing;\n }\n if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n seen.set(item, item);\n return item;\n }\n if (item instanceof ArrayBuffer) {\n const next = relocated.get(item) ?? item.slice(0);\n seen.set(item, next);\n owned.push(next);\n return next;\n }\n if (ArrayBuffer.isView(item)) {\n const geometry = geometries.get(item);\n if (!geometry) {\n throw workerProtocolError('WorkerProtocolError', 'worker payload could not be queued');\n }\n const buffer = item.buffer;\n const nextBuffer =\n typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer\n ? buffer\n : (cloneValue(buffer) as ArrayBuffer);\n const out = retargetView(item, nextBuffer, geometry);\n seen.set(item, out);\n return out;\n }\n if (Array.isArray(item)) {\n const out = new Array<unknown>(item.length);\n seen.set(item, out);\n for (let index = 0; index < item.length; index += 1) {\n if (index in item) {\n out[index] = cloneValue(item[index]);\n }\n }\n return out;\n }\n const out: Record<string, unknown> = Object.getPrototypeOf(item) === null ? Object.create(null) : {};\n seen.set(item, out);\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n out[key] = cloneValue(record[key]);\n }\n }\n return out;\n };\n const cloned = cloneValue(value) as T;\n return { value: cloned, transfer: owned, byteLength: payloadBytes(cloned) };\n}\n\nfunction payloadBytes(value: unknown): number {\n let byteLength = 0;\n const seen = new WeakSet<object>();\n const visit = (item: unknown): void => {\n if (!Number.isFinite(byteLength)) return;\n if (typeof item === 'string') {\n byteLength += 8 + item.length * 2;\n return;\n }\n if (item === null || typeof item !== 'object') {\n byteLength += 8;\n return;\n }\n if (seen.has(item)) {\n return;\n }\n seen.add(item);\n byteLength += 8;\n if (item instanceof ArrayBuffer) {\n byteLength += item.byteLength;\n } else if (typeof SharedArrayBuffer !== 'undefined' && item instanceof SharedArrayBuffer) {\n byteLength += item.byteLength;\n } else if (ArrayBuffer.isView(item)) {\n visit(item.buffer);\n } else if (Array.isArray(item)) {\n if (Object.getPrototypeOf(item) !== Array.prototype || hasExtraKeys(item)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n for (let index = 0; index < item.length; index += 1) {\n const descriptor = Object.getOwnPropertyDescriptor(item, String(index));\n if (descriptor && !('value' in descriptor)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n visit(descriptor?.value);\n }\n } else if (item instanceof Map) {\n for (const [key, child] of item) {\n visit(key);\n visit(child);\n }\n } else if (item instanceof Set) {\n for (const child of item) {\n visit(child);\n }\n } else {\n const record = item as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key)) {\n const descriptor = Object.getOwnPropertyDescriptor(record, key);\n // Let postMessage evaluate accessors and preserve special data keys.\n if (key === '__proto__' || !descriptor || !('value' in descriptor)) {\n byteLength = Number.POSITIVE_INFINITY;\n return;\n }\n byteLength += 8 + key.length * 2;\n visit(descriptor.value);\n }\n }\n }\n };\n visit(value);\n return byteLength;\n}\n\nfunction isPlainPayload(\n value: unknown,\n geometries: Map<ArrayBufferView, ViewGeometry>,\n seen: WeakSet<object>\n): boolean {\n if (typeof value === 'function' || typeof value === 'symbol') {\n return false;\n }\n if (value === null || typeof value !== 'object') {\n return true;\n }\n if (seen.has(value)) {\n return true;\n }\n seen.add(value);\n if (typeof SharedArrayBuffer !== 'undefined' && value instanceof SharedArrayBuffer) {\n return !isResizableBuffer(value);\n }\n if (value instanceof ArrayBuffer) {\n return !isResizableBuffer(value);\n }\n if (ArrayBuffer.isView(value)) {\n if (!isStandardView(value)) {\n return false;\n }\n const buffer = value.buffer;\n if (typeof SharedArrayBuffer !== 'undefined' && buffer instanceof SharedArrayBuffer) {\n if (isResizableBuffer(buffer)) {\n return false;\n }\n geometries.set(value, viewGeometry(value));\n return true;\n }\n if (!(buffer instanceof ArrayBuffer) || isResizableBuffer(buffer)) {\n return false;\n }\n geometries.set(value, viewGeometry(value));\n return true;\n }\n if (value instanceof Map || value instanceof Set || value instanceof Date || value instanceof RegExp) {\n return false;\n }\n if (Array.isArray(value)) {\n if (hasExtraKeys(value) || hasEnumerableSymbols(value)) {\n return false;\n }\n for (const child of value) {\n if (!isPlainPayload(child, geometries, seen)) {\n return false;\n }\n }\n return true;\n }\n const proto = Object.getPrototypeOf(value);\n if (proto !== Object.prototype && proto !== null) {\n return false;\n }\n if (hasEnumerableSymbols(value)) {\n return false;\n }\n const record = value as Record<string, unknown>;\n for (const key in record) {\n if (Object.prototype.hasOwnProperty.call(record, key) && !isPlainPayload(record[key], geometries, seen)) {\n return false;\n }\n }\n return true;\n}\n\nfunction hasExtraKeys(value: readonly unknown[]): boolean {\n const record: object = value;\n for (const key in record) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) {\n continue;\n }\n const index = Number(key);\n if (!Number.isInteger(index) || index < 0 || index >= value.length || String(index) !== key) {\n return true;\n }\n }\n return false;\n}\n\nfunction hasEnumerableSymbols(value: object): boolean {\n for (const symbol of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, symbol)) {\n return true;\n }\n }\n return false;\n}\n\nfunction isStandardView(view: ArrayBufferView): boolean {\n return STANDARD_VIEW_CONSTRUCTORS.has(view.constructor);\n}\n\nfunction viewGeometry(view: ArrayBufferView): ViewGeometry {\n if (view instanceof DataView) {\n return { offset: view.byteOffset, length: view.byteLength, dataView: true };\n }\n return { offset: view.byteOffset, length: (view as Uint8Array).length, dataView: false };\n}\n\nfunction retargetView(view: ArrayBufferView, buffer: ArrayBufferLike, geometry: ViewGeometry): ArrayBufferView {\n if (geometry.dataView) {\n return new DataView(buffer, geometry.offset, geometry.length);\n }\n const Typed = view.constructor as new (\n buffer: ArrayBufferLike,\n byteOffset: number,\n length: number\n ) => ArrayBufferView;\n return new Typed(buffer, geometry.offset, geometry.length);\n}\n\nfunction moveArrayBuffer(buffer: ArrayBuffer): ArrayBuffer {\n const movable = buffer as ArrayBuffer & { transfer?: () => ArrayBuffer };\n if (typeof movable.transfer === 'function') {\n return movable.transfer();\n }\n return structuredClone(buffer, { transfer: [buffer] });\n}\n\nfunction isResizableBuffer(buffer: ArrayBuffer | SharedArrayBuffer): boolean {\n return (buffer as { resizable?: boolean }).resizable === true;\n}\n","export const SHARED_WORKER_CONTROL = 'moyodb:shared-worker:control';\nexport const SHARED_WORKER_CONTROL_RESULT = 'moyodb:shared-worker:control-result';\nexport const SHARED_WORKER_FATAL = 'moyodb:shared-worker:fatal';\nexport const SHARED_WORKER_INVALIDATE_TRANSACTIONS = 'moyodb:shared-worker:invalidate-transactions';\nexport const SHARED_WORKER_OWNER_REQUEST = 'moyodb:shared-worker:owner-request';\nexport const SHARED_WORKER_OWNER_RESPONSE = 'moyodb:shared-worker:owner-response';\nexport const SHARED_WORKER_OWNER_HOST_MESSAGE = 'moyodb:shared-worker:owner-host-message';\nexport const SHARED_WORKER_HEARTBEAT_MS = 5_000;\nexport const SHARED_WORKER_LEASE_MS = 120_000;\n\nexport type SharedWorkerControlOperation = 'ping' | 'detach' | 'acquireMigration' | 'releaseMigration' | 'crash';\n\nexport interface SharedWorkerControlRequest {\n type: typeof SHARED_WORKER_CONTROL;\n id: number;\n op: SharedWorkerControlOperation;\n}\n","import type { WorkerApi, WorkerOpenRequest, WorkerScanPageRequest } from './worker-api';\nimport { WorkerProtocolClient } from './worker-client';\nimport { exposeWorkerApi, type WorkerServerHandle, type WorkerServerScope } from './worker-server';\nimport {\n WORKER_COMMANDS,\n deserializeWorkerError,\n serializeWorkerError,\n workerProtocolError,\n type WorkerCommand\n} from './worker-protocol';\nimport { isRecord } from './internal';\nimport {\n SHARED_WORKER_CONTROL,\n SHARED_WORKER_CONTROL_RESULT,\n SHARED_WORKER_FATAL,\n SHARED_WORKER_HEARTBEAT_MS,\n SHARED_WORKER_INVALIDATE_TRANSACTIONS,\n SHARED_WORKER_LEASE_MS,\n SHARED_WORKER_OWNER_REQUEST,\n SHARED_WORKER_OWNER_RESPONSE,\n SHARED_WORKER_OWNER_HOST_MESSAGE\n} from './shared-worker-protocol';\n\nconst TRANSACTION_COMMANDS = new Set<WorkerCommand>([\n 'commit',\n 'rollback',\n 'createStore',\n 'dropStore',\n 'clearStore',\n 'get',\n 'getMany',\n 'has',\n 'put',\n 'putMany',\n 'delete',\n 'deleteMany',\n 'applyBatch',\n 'scan',\n 'getByIndex',\n 'scanByIndex',\n 'scanByIndexPage',\n 'reconcileIndexes',\n 'setSchemaVersion'\n]);\nconst MAINTENANCE_COMMANDS = new Set<WorkerCommand>(['importSnapshot', 'reset', 'compact', 'rebuild']);\n\ninterface Session {\n port: MessagePort;\n server: WorkerServerHandle | null;\n opened: boolean;\n closing: boolean;\n nextTxId: number;\n transactions: Map<number, number>;\n nextCursorId: number;\n cursors: Map<number, { ownerId: number; localTxId?: number }>;\n cursorGeneration: number;\n pending: Set<Promise<unknown>>;\n lastSeen: number;\n closingPromise: Promise<void> | null;\n}\n\ninterface Owner {\n port: MessagePort;\n hostPort: MessagePort;\n proxy: WorkerProtocolClient;\n request: WorkerOpenRequest;\n session: Session;\n lastSeen: number;\n}\n\ninterface PendingOwner {\n session: Session;\n resolve: (ports: [MessagePort, MessagePort]) => void;\n reject: (reason: Error) => void;\n timeout: ReturnType<typeof setTimeout>;\n}\n\nexport class SharedWorkerCoordinator {\n private sessions = new Set<Session>();\n private owner: Owner | null = null;\n private dbName: string | null = null;\n private ownerId = 1;\n private pendingOwners = new Map<number, PendingOwner>();\n private storageReady: Promise<void> = Promise.resolve();\n private lifecycle: Promise<void> = Promise.resolve();\n private migrationOwner: Session | null = null;\n private migrationReleased: (() => void) | null = null;\n private migrationQueue: Promise<void> = Promise.resolve();\n private timer: ReturnType<typeof setInterval> | null = null;\n\n constructor(private readonly origin: string) {}\n\n connect(port: MessagePort): void {\n const session: Session = {\n port,\n server: null,\n opened: false,\n closing: false,\n nextTxId: 1,\n transactions: new Map(),\n nextCursorId: 1,\n cursors: new Map(),\n cursorGeneration: 0,\n pending: new Set(),\n lastSeen: Date.now(),\n closingPromise: null\n };\n this.sessions.add(session);\n this.timer ??= setInterval(() => this.expireSessions(), SHARED_WORKER_HEARTBEAT_MS);\n const handleControl = (event: MessageEvent<unknown>) => {\n if (event.origin !== '' && event.origin !== this.origin) return;\n const data = event.data;\n if (!isRecord(data)) return;\n session.lastSeen = Date.now();\n if (data.type === SHARED_WORKER_OWNER_RESPONSE && typeof data.id === 'number') {\n const pending = this.pendingOwners.get(data.id);\n if (!pending || pending.session !== session) {\n event.ports[1]?.postMessage({ type: SHARED_WORKER_OWNER_HOST_MESSAGE, op: 'stop' });\n for (const transferredPort of event.ports) transferredPort.close();\n return;\n }\n this.pendingOwners.delete(data.id);\n clearTimeout(pending.timeout);\n if (data.ok === true && event.ports.length === 2) pending.resolve([event.ports[0], event.ports[1]]);\n else pending.reject(this.controlError(data.error));\n return;\n }\n if (data.type !== SHARED_WORKER_CONTROL || typeof data.id !== 'number') return;\n const reply = (error?: unknown) => {\n port.postMessage({\n type: SHARED_WORKER_CONTROL_RESULT,\n id: data.id,\n ok: error === undefined,\n ...(error === undefined ? {} : { error: serializeWorkerError(error) })\n });\n };\n if (data.op === 'ping') {\n reply();\n } else if (data.op === 'detach') {\n void this.closeSession(session).then(\n () => reply(),\n (error) => {\n reply(error);\n this.failAll(error);\n }\n );\n } else if (data.op === 'crash') {\n this.failAll(\n workerProtocolError(\n 'WorkerTerminatedError',\n 'storage worker was terminated by unsafeDebugCrashWorker'\n )\n );\n } else if (data.op === 'acquireMigration') {\n void this.acquireMigration(session).then(() => reply(), reply);\n } else if (data.op === 'releaseMigration') {\n this.releaseMigration(session);\n reply();\n } else {\n reply(workerProtocolError('WorkerProtocolError', 'unsupported shared worker control'));\n }\n };\n port.addEventListener('message', handleControl);\n port.addEventListener('messageerror', () => {\n void this.closeSession(session).catch((error) => this.failAll(error));\n });\n const scope: WorkerServerScope = {\n location: { origin: this.origin },\n postMessage: (message, transfer) => port.postMessage(message, transfer ?? []),\n addEventListener: (type, listener) => port.addEventListener(type, listener),\n removeEventListener: (type, listener) => port.removeEventListener(type, listener)\n };\n session.server = exposeWorkerApi(this.sessionApi(session), scope);\n port.start();\n }\n\n private sessionApi(session: Session): WorkerApi {\n const methods: Record<string, (...args: unknown[]) => Promise<unknown>> = {};\n for (const command of WORKER_COMMANDS) {\n methods[command] = (...args) => this.invoke(session, command, args);\n }\n return methods as unknown as WorkerApi;\n }\n\n private invoke(session: Session, command: WorkerCommand, args: unknown[]): Promise<unknown> {\n if (command === 'open')\n return this.queueLifecycle(() => this.openSession(session, args[0] as WorkerOpenRequest));\n if (command === 'close') return this.closeSession(session);\n if (command === 'destroy') return this.queueLifecycle(() => this.destroySession(session));\n if (command === 'deleteDB') {\n return Promise.reject(\n workerProtocolError('DatabaseBusyError', 'delete shared databases through an exclusive open handle')\n );\n }\n const operation = (async () => {\n await this.storageReady;\n // Existing transactions must be able to finish during another client's schema lease.\n this.requireSession(\n session,\n command !== 'begin' && command !== 'setFailpoint' && !MAINTENANCE_COMMANDS.has(command)\n );\n const owner = this.owner!;\n if (command === 'begin') {\n if (\n args[0] === 'readwrite' &&\n this.migrationOwner === session &&\n Array.from(this.sessions).some(\n (client) => client !== session && (client.transactions.size > 0 || client.cursors.size > 0)\n )\n ) {\n throw workerProtocolError(\n 'DatabaseBusyError',\n 'close active shared transactions before schema migration'\n );\n }\n const ownerTxId = await owner.proxy.begin(args[0] as 'readonly' | 'readwrite');\n const localTxId = session.nextTxId++;\n session.transactions.set(localTxId, ownerTxId);\n return localTxId;\n }\n if (command === 'scanPage') {\n if (!isRecord(args[0])) throw workerProtocolError('WorkerProtocolError', 'invalid scan page request');\n const request = args[0] as unknown as WorkerScanPageRequest;\n const localCursorId = request.cursorId;\n const cursor = localCursorId === undefined ? undefined : session.cursors.get(localCursorId);\n if (localCursorId !== undefined && !cursor) {\n throw workerProtocolError(\n 'TransactionClosedError',\n 'scan cursor does not belong to this shared client'\n );\n }\n if (cursor && cursor.localTxId !== request.txId) {\n throw workerProtocolError(\n 'TransactionClosedError',\n 'scan cursor does not belong to this transaction'\n );\n }\n const ownerTxId = request.txId === undefined ? undefined : session.transactions.get(request.txId);\n if (request.txId !== undefined && ownerTxId === undefined) {\n throw workerProtocolError(\n 'TransactionClosedError',\n 'transaction does not belong to this shared client'\n );\n }\n const generation = session.cursorGeneration;\n const page = await owner.proxy.scanPage({ ...request, txId: ownerTxId, cursorId: cursor?.ownerId });\n if (generation !== session.cursorGeneration || this.owner !== owner) {\n if (page.cursorId !== undefined && this.owner === owner)\n await owner.proxy.closeCursor(page.cursorId);\n throw workerProtocolError('TransactionClosedError', 'scan snapshot was invalidated');\n }\n if (localCursorId !== undefined) session.cursors.delete(localCursorId);\n if (page.cursorId === undefined) return page;\n const nextCursorId = localCursorId ?? session.nextCursorId++;\n session.cursors.set(nextCursorId, { ownerId: page.cursorId, localTxId: request.txId });\n return { ...page, cursorId: nextCursorId };\n }\n if (command === 'closeCursor') {\n const cursor = session.cursors.get(args[0] as number);\n if (!cursor) {\n throw workerProtocolError(\n 'TransactionClosedError',\n 'scan cursor does not belong to this shared client'\n );\n }\n try {\n await owner.proxy.closeCursor(cursor.ownerId);\n } finally {\n session.cursors.delete(args[0] as number);\n }\n return;\n }\n if (TRANSACTION_COMMANDS.has(command) || (command === 'getIndexes' && args[0] !== undefined)) {\n const localTxId = args[0] as number;\n const ownerTxId = session.transactions.get(localTxId);\n if (ownerTxId === undefined) {\n throw workerProtocolError(\n 'TransactionClosedError',\n 'transaction does not belong to this shared client'\n );\n }\n try {\n return await owner.proxy.request(command, [ownerTxId, ...args.slice(1)] as never);\n } finally {\n if (command === 'commit' || command === 'rollback') {\n session.transactions.delete(localTxId);\n for (const [cursorId, cursor] of session.cursors) {\n if (cursor.localTxId === localTxId) session.cursors.delete(cursorId);\n }\n }\n }\n }\n if (MAINTENANCE_COMMANDS.has(command)) {\n this.invalidateTransactions();\n }\n return owner.proxy.request(command, args as never);\n })();\n session.pending.add(operation);\n void operation.then(\n () => session.pending.delete(operation),\n () => session.pending.delete(operation)\n );\n return operation;\n }\n\n private requireSession(session: Session, allowDuringMigration = false): void {\n if (!session.opened || session.closing || !this.owner) {\n throw workerProtocolError('DatabaseClosedError', 'shared client is closed');\n }\n if (!allowDuringMigration && this.migrationOwner !== null && this.migrationOwner !== session) {\n throw workerProtocolError(\n 'DatabaseBusyError',\n 'database schema migration is owned by another shared client'\n );\n }\n }\n\n private queueLifecycle<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.lifecycle.then(operation);\n this.lifecycle = result.then(\n () => undefined,\n () => undefined\n );\n return result;\n }\n\n private async openSession(session: Session, request: WorkerOpenRequest): Promise<void> {\n if (session.closing || !this.sessions.has(session))\n throw workerProtocolError('DatabaseClosedError', 'shared client is closed');\n if (session.opened) throw workerProtocolError('InvalidOpenOptionsError', 'shared client is already open');\n if (!isRecord(request) || typeof request.dbName !== 'string' || !isRecord(request.options)) {\n throw workerProtocolError('InvalidOpenOptionsError', 'invalid shared worker open request');\n }\n if (this.dbName !== null && this.dbName !== request.dbName) {\n throw workerProtocolError('InvalidOpenOptionsError', 'shared worker database name does not match');\n }\n this.dbName = request.dbName;\n if (this.owner) {\n const current = this.owner.request;\n if (request.dbName !== current.dbName)\n throw workerProtocolError('InvalidOpenOptionsError', 'shared worker database name does not match');\n if (request.options.cachePages !== current.options.cachePages) {\n throw workerProtocolError(\n 'InvalidOpenOptionsError',\n 'shared database cachePages policy does not match its owner'\n );\n }\n const feed = request.options.changeFeed;\n if (\n feed !== null &&\n (feed.enabled !== current.options.changeFeed?.enabled ||\n feed.retainTxids !== current.options.changeFeed?.retainTxids)\n ) {\n throw workerProtocolError(\n 'InvalidOpenOptionsError',\n 'shared database changeFeed policy does not match its owner'\n );\n }\n if (request.options.debugFailpoint !== null) {\n if (this.migrationOwner !== null && this.migrationOwner !== session) {\n throw workerProtocolError(\n 'DatabaseBusyError',\n 'cannot change failpoints during another client schema migration'\n );\n }\n await this.owner.proxy.setFailpoint(request.options.debugFailpoint);\n }\n session.opened = true;\n return;\n }\n const owner = await this.createOwner(session, request);\n this.owner = owner;\n session.opened = true;\n try {\n await owner.proxy.open(request);\n } catch (error) {\n session.opened = false;\n this.disposeOwner(owner);\n throw error;\n }\n }\n\n private async createOwner(session: Session, request: WorkerOpenRequest): Promise<Owner> {\n const id = this.ownerId++;\n const [port, hostPort] = await new Promise<[MessagePort, MessagePort]>((resolve, reject) => {\n const timeout = setTimeout(() => {\n this.pendingOwners.delete(id);\n reject(\n workerProtocolError('WorkerReadyTimeoutError', 'shared storage owner did not provide a worker port')\n );\n }, 10_000);\n this.pendingOwners.set(id, { session, resolve, reject, timeout });\n session.port.postMessage({ type: SHARED_WORKER_OWNER_REQUEST, id });\n });\n const proxy = new WorkerProtocolClient(port, { readyTimeoutMs: 10_000, forwardScanPackets: true });\n const owner: Owner = { port, hostPort, proxy, request, session, lastSeen: Date.now() };\n proxy.setFatalHandler((error) => this.failAll(error));\n hostPort.addEventListener('message', (event: MessageEvent<unknown>) => {\n const data = event.data;\n if (!isRecord(data) || data.type !== SHARED_WORKER_OWNER_HOST_MESSAGE || this.owner !== owner) return;\n owner.lastSeen = Date.now();\n if (data.op === 'gone') this.recoverOwner(owner);\n else if (data.op === 'error') this.failAll(this.controlError(data.error));\n });\n hostPort.start();\n port.start();\n return owner;\n }\n\n private closeSession(session: Session): Promise<void> {\n if (session.closingPromise) return session.closingPromise;\n session.closing = true;\n session.closingPromise = this.queueLifecycle(async () => {\n await Promise.allSettled(Array.from(session.pending));\n const owner = this.owner;\n if (owner && session.opened) {\n const results = await Promise.allSettled([\n ...Array.from(session.cursors.values(), (cursor) => owner.proxy.closeCursor(cursor.ownerId)),\n ...Array.from(session.transactions.values(), (id) => owner.proxy.rollback(id))\n ]);\n const failure = results.find(\n (result) => result.status === 'rejected' && result.reason?.name !== 'TransactionClosedError'\n );\n if (failure?.status === 'rejected') {\n this.failAll(failure.reason);\n throw failure.reason;\n }\n }\n session.transactions.clear();\n session.cursors.clear();\n session.cursorGeneration += 1;\n session.opened = false;\n this.releaseMigration(session);\n session.server?.close();\n this.sessions.delete(session);\n if (owner && !Array.from(this.sessions).some((client) => client.opened)) {\n try {\n await owner.proxy.close();\n } finally {\n this.disposeOwner(owner);\n }\n }\n if (this.sessions.size === 0 && this.timer !== null) {\n clearInterval(this.timer);\n this.timer = null;\n }\n });\n return session.closingPromise;\n }\n\n private async destroySession(session: Session): Promise<void> {\n await this.storageReady;\n this.requireSession(session);\n if (Array.from(this.sessions).some((client) => client !== session && client.opened)) {\n throw workerProtocolError('DatabaseBusyError', 'cannot destroy a database with other live shared clients');\n }\n const owner = this.owner!;\n await owner.proxy.destroy();\n this.invalidateTransactions();\n session.opened = false;\n this.releaseMigration(session);\n this.disposeOwner(owner);\n }\n\n private acquireMigration(session: Session): Promise<void> {\n const previous = this.migrationQueue;\n let release!: () => void;\n const released = new Promise<void>((resolve) => {\n release = resolve;\n });\n this.migrationQueue = previous.then(() => released);\n return previous.then(async () => {\n try {\n await this.storageReady;\n this.requireSession(session);\n this.migrationOwner = session;\n this.migrationReleased = release;\n await Promise.allSettled(Array.from(this.sessions).flatMap((client) => Array.from(client.pending)));\n this.requireSession(session);\n } catch (error) {\n if (this.migrationOwner === session) this.releaseMigration(session);\n else release();\n throw error;\n }\n });\n }\n\n private releaseMigration(session: Session): void {\n if (this.migrationOwner !== session) return;\n this.migrationOwner = null;\n const release = this.migrationReleased;\n this.migrationReleased = null;\n release?.();\n }\n\n private invalidateTransactions(): void {\n for (const session of this.sessions) {\n session.transactions.clear();\n session.cursors.clear();\n session.cursorGeneration += 1;\n if (session.opened) session.port.postMessage({ type: SHARED_WORKER_INVALIDATE_TRANSACTIONS });\n }\n }\n\n private recoverOwner(owner: Owner): void {\n // A dedicated worker ends with its hosting page. Its transaction snapshots cannot survive.\n this.disposeOwner(owner);\n this.invalidateTransactions();\n const recovering = this.queueLifecycle(async () => {\n if (this.owner) return;\n const next = Array.from(this.sessions).find(\n (session) =>\n session !== owner.session &&\n session.opened &&\n !session.closing &&\n Date.now() - session.lastSeen <= SHARED_WORKER_LEASE_MS\n );\n if (!next) return;\n const request: WorkerOpenRequest = {\n dbName: owner.request.dbName,\n options: {\n ...owner.request.options,\n createIfMissing: false,\n ownerWaitMs: Math.max(owner.request.options.ownerWaitMs, 2000),\n debugFailpoint: null\n }\n };\n const replacement = await this.createOwner(next, request);\n this.owner = replacement;\n await replacement.proxy.open(request);\n });\n this.storageReady = recovering;\n void recovering.catch((error) => this.failAll(error));\n }\n\n private expireSessions(): void {\n if (this.owner && Date.now() - this.owner.lastSeen > SHARED_WORKER_LEASE_MS) {\n this.recoverOwner(this.owner);\n }\n for (const session of this.sessions) {\n if (Date.now() - session.lastSeen > SHARED_WORKER_LEASE_MS) {\n session.port.postMessage({\n type: SHARED_WORKER_FATAL,\n error: serializeWorkerError(\n workerProtocolError('WorkerTerminatedError', 'shared client heartbeat expired')\n )\n });\n void this.closeSession(session).catch((error) => this.failAll(error));\n }\n }\n }\n\n private disposeOwner(owner: Owner): void {\n if (this.owner === owner) this.owner = null;\n owner.proxy.dispose();\n owner.hostPort.postMessage({ type: SHARED_WORKER_OWNER_HOST_MESSAGE, op: 'stop' });\n owner.hostPort.close();\n owner.port.close();\n }\n\n private controlError(error: unknown): Error {\n try {\n return deserializeWorkerError(error);\n } catch {\n return workerProtocolError('WorkerProtocolError', 'invalid shared worker owner response');\n }\n }\n\n private failAll(error: unknown): void {\n if (this.owner) this.disposeOwner(this.owner);\n for (const pending of this.pendingOwners.values()) {\n clearTimeout(pending.timeout);\n pending.reject(error instanceof Error ? error : new Error(String(error)));\n }\n this.pendingOwners.clear();\n for (const session of this.sessions) {\n session.port.postMessage({ type: SHARED_WORKER_FATAL, error: serializeWorkerError(error) });\n session.opened = false;\n session.closing = true;\n session.transactions.clear();\n session.cursors.clear();\n session.cursorGeneration += 1;\n session.server?.close();\n this.releaseMigration(session);\n }\n this.sessions.clear();\n this.storageReady = Promise.resolve();\n if (this.timer !== null) clearInterval(this.timer);\n this.timer = null;\n }\n}\n\nif (typeof self !== 'undefined' && 'onconnect' in self) {\n const scope = self as SharedWorkerGlobalScope;\n const coordinator = new SharedWorkerCoordinator(scope.location.origin);\n scope.addEventListener('connect', (event: MessageEvent) => {\n for (const port of event.ports) coordinator.connect(port);\n });\n}\n"],"mappings":"AAAA,SAAgB,EAAS,EAAkD,CACvE,OAAyB,OAAO,GAAU,YAAnC,CACX,CAeA,SAAgB,EAAkB,EAAyB,CAIvD,MAHI,CAAC,OAAO,SAAS,CAAO,GAAK,GAAW,EACjC,EAEJ,EAAA,WAA+B,WAAqB,CAC/D,CCjBA,MAEa,EAA2B,kCAC3B,EAAgC,uCAKhC,EAAkB,yaAyC/B,EAqCM,kBAAyB,IAAI,IAAY,CAtB3C,MACA,UACA,MACA,MACA,UACA,SACA,aACA,aACA,OACA,aACA,cACA,cACA,YACA,YAS2C,CAAmB,EAElE,SAAgB,EAAoB,EAA4C,CAC5E,OAAO,OAAO,GAAU,UAAY,EAAuB,IAAI,CAAK,CACxE,CASA,MAAM,EAAwB,+BACxB,EAAiC,wCACjC,EAAsB,6BAEtB,EAAsB,6BAGtB,EAA4B,mCAG5B,EAAU,WACV,EAA4B,SAC5B,EAAsC,CAAC,EAiGvC,GAAqB,IAAI,IAAY,CAAe,EAE1D,SAAgB,GAAgB,EAAwC,CACpE,OAAO,OAAO,GAAU,UAAY,GAAmB,IAAI,CAAK,CACpE,CAEA,SAAgB,GAA6B,EAAqD,CAC9F,OACI,EAA8B,CAAK,GACnC,EAAM,UAAA,IACL,EAAM,WAAa,IAAA,IAAa,EAAM,WAAa,EAE5D,CAEA,SAAgB,EACZ,EACsF,CACtF,OAAO,EAAS,CAAK,GAAK,EAAM,OAAA,8BACpC,CAEA,SAAgB,EAAgC,EAAwD,CACpG,OACI,EAAS,CAAK,GACd,EAAM,OAAA,mCACN,EAAM,UAAA,GACN,OAAO,EAAM,IAAO,UACpB,OAAO,cAAc,EAAM,EAAE,GAC7B,OAAO,EAAM,IAAO,SAE5B,CAEA,SAAgB,GAA+B,EAAuD,CAClG,OACI,EAAS,CAAK,GACd,EAAM,OAAA,kCACN,EAAM,UAAA,GACN,OAAO,EAAM,IAAO,UACpB,OAAO,cAAc,EAAM,EAAE,GAC7B,OAAO,EAAM,SAAY,UACzB,MAAM,QAAQ,EAAM,IAAI,CAEhC,CAEA,SAAgB,GAAoC,EAA4D,CAC5G,OAAO,EAAsB,EAAO,EAA+B,UAAU,CACjF,CAEA,SAAgB,GAAqC,EAA6D,CAC9G,GAAI,CAAC,EAAsB,EAAA,wCAAuC,WAAW,EACzE,MAAO,GAEX,IAAK,IAAM,KAAa,EAA6C,UACjE,GAAI,CAAC,EAAgC,CAAQ,EAAG,MAAO,GAE3D,MAAO,EACX,CAEA,SAAS,EAAsB,EAAgB,EAAc,EAAwB,CACjF,OACI,EAAS,CAAK,GACd,EAAM,OAAS,GACf,EAAM,UAAA,GACN,MAAM,QAAQ,EAAM,EAAM,GAC1B,EAAM,EAAM,CAAC,OAAS,GACtB,EAAM,EAAM,CAAC,QAAA,GAErB,CAEA,SAAgB,GAAyB,EAAyD,CAC9F,OACI,EAAS,CAAK,IACb,EAAM,OAAA,kCACH,EAAM,OAAA,mCACN,EAAM,OAAA,wCACN,EAAM,OAAA,yCACN,EAAM,OAAA,+BAElB,CAEA,SAAgB,EAAqB,EAAuC,CACxE,GAAI,EAAS,CAAK,EAAG,CACjB,IAAM,EAAO,EAAkB,EAAM,IAAI,EAEzC,MAAO,CACH,KAFS,EAAkB,EAAM,IAAI,GAAK,GAAQ,QAGlD,OACA,QAAS,EAAkB,EAAM,OAAO,GAAK,gBAC7C,MAAO,EAAkB,EAAM,KAAK,CACxC,CACJ,CACA,MAAO,CACH,KAAM,QACN,QAAS,OAAO,CAAK,CACzB,CACJ,CAEA,SAAgB,GAAuB,EAAuB,CAC1D,GACI,CAAC,EAAS,CAAK,GACf,OAAO,EAAM,MAAS,UACtB,OAAO,EAAM,SAAY,UACxB,EAAM,OAAS,IAAA,IAAa,OAAO,EAAM,MAAS,UAClD,EAAM,QAAU,IAAA,IAAa,OAAO,EAAM,OAAU,SAErD,MAAM,EAAoB,sBAAuB,iCAAiC,EAEtF,IAAM,EAAmB,MAAM,EAAM,OAAO,EAQ5C,MAPA,GAAa,KAAO,EAAM,MAAQ,EAAM,MAAQ,QAC5C,EAAM,QACN,EAAa,MAAQ,EAAM,OAE3B,EAAM,MACN,EAAgB,EAAc,EAAM,IAAI,EAErC,CACX,CAEA,SAAgB,EAAoB,EAAc,EAAiB,EAAO,EAAa,CACnF,IAAM,EAAY,MAAM,CAAO,EAG/B,MAFA,GAAM,KAAO,EACb,EAAgB,EAAO,CAAI,EACpB,CACX,CAEA,SAAS,EAAgB,EAAc,EAAoB,CACvD,OAAO,eAAe,EAAO,OAAQ,CACjC,MAAO,EACP,WAAY,GACZ,aAAc,EAClB,CAAC,CACL,CAEA,SAAgB,EACZ,EACA,EACgE,CAChE,GAAI,IAAY,aAAc,CAC1B,GAAM,CAAC,EAAM,EAAO,GAAa,EACjC,GAAI,EAAoB,CAAK,GAAK,MAAM,QAAQ,CAAS,EAAG,CAExD,IAAM,EAAW,EAA4B,EAAO,CAAC,EAAG,GAAG,CAAS,CAAU,EAC9E,MAAO,CACH,KAAM,CAAC,EAAM,EAAQ,EAAS,KAAmB,MAAM,CAAC,CAAC,EACzD,SAAU,EAAS,QACvB,CACJ,CACJ,CAEA,GACI,IAAY,OACZ,IAAY,OACZ,IAAY,UACZ,IAAY,cACZ,IAAY,MACd,CACE,IAAM,EAAW,IAAY,aAAe,EAAI,EAC5C,EAA+B,KAC/B,EAAkC,KACtC,IAAK,IAAI,EAAQ,EAAU,IAAU,IAAY,MAAQ,EAAI,GAAW,GAAS,EAAG,CAChF,IAAM,EAAQ,EAAK,GACnB,GACI,aAAiB,YACjB,EAAM,kBAAkB,cACvB,EAAM,aAAe,GAAK,EAAM,aAAe,EAAM,OAAO,YAC/D,CACE,IAAM,EAAQ,EAAsB,CAAK,EACzC,IAAe,CAAC,GAAG,CAAI,EACvB,EAAW,GAAS,GACnB,IAAa,CAAC,EAAA,CAAG,KAAK,EAAM,MAAM,CACvC,CACJ,CACA,GAAI,IAAe,KACf,MAAO,CAAE,KAAM,EAAY,SAAU,GAAY,CAAoB,CAE7E,CAEA,GAAI,IAAY,iBAAkB,CAC9B,IAAM,EAAO,EAAK,GAClB,GAAI,aAAgB,WAAY,CAC5B,IAAM,EAAQ,EAAsB,CAAI,EACxC,MAAO,CACH,KAAM,CAAC,CAAK,EACZ,SAAU,CAAC,EAAM,MAAM,CAC3B,CACJ,CACJ,CAEA,GAAI,IAAY,WAAa,IAAY,aAAc,CACnD,GAAM,CAAC,EAAM,EAAO,GAAQ,EAC5B,GAAI,MAAM,QAAQ,CAAI,GAAK,EAAK,OAAS,EAAG,CACxC,IAAM,EAAS,GAAe,CAAI,EAClC,MAAO,CACH,KAAM,CAAC,EAAM,EAAO,CAAM,EAC1B,SAAU,CAAC,EAAO,MAAM,MAAM,CAClC,CACJ,CACJ,CAEA,GAAI,IAAY,UAAW,CACvB,GAAM,CAAC,EAAM,EAAO,EAAS,GAAW,EACxC,GAAI,MAAM,QAAQ,CAAO,GAAK,EAAQ,OAAS,EAAG,CAC9C,IAAM,EAAS,GAAgB,CAAO,EACtC,MAAO,CACH,KAAM,CAAC,EAAM,EAAO,EAAQ,CAAO,EACnC,SAAU,CAAC,EAAO,MAAM,MAAM,CAClC,CACJ,CACJ,CAEA,GAAI,IAAY,aAAc,CAC1B,GAAM,CAAC,EAAM,EAAO,GAAO,EAC3B,GAAI,MAAM,QAAQ,CAAG,GAAK,EAAI,OAAS,EAAG,CACtC,IAAM,EAAS,GAAa,CAAG,EAC/B,MAAO,CACH,KAAM,CAAC,EAAM,EAAO,CAAM,EAC1B,SAAU,CAAC,EAAO,MAAM,MAAM,CAClC,CACJ,CACJ,CAEA,MAAO,CAAE,OAAM,SAAU,CAAoB,CACjD,CAEA,SAAgB,EACZ,EACA,EACoB,CACpB,GAAI,IAAY,aAAc,CAC1B,GAAM,CAAC,EAAM,EAAO,GAAa,EACjC,GAAI,EAAoB,CAAK,GAAK,MAAM,QAAQ,CAAS,EAErD,MAAO,CAAC,EAAM,EADE,EAA2B,EAAO,CAAC,EAAG,GAAG,CAAS,CAC7C,CAAA,CAAQ,MAAM,CAAC,CAAC,CAE7C,CAEA,GAAI,IAAY,WAAa,IAAY,aAAc,CACnD,GAAM,CAAC,EAAM,EAAO,GAAQ,EAC5B,GAAI,CAAC,MAAM,QAAQ,CAAI,EAAG,CACtB,GAAI,CAAC,EAAgB,EAAM,CAAqB,EAC5C,MAAM,EAAoB,sBAAuB,qCAAqC,EAE1F,MAAO,CAAC,EAAM,EAAO,GAAiB,CAAI,CAAC,CAC/C,CACJ,CAEA,GAAI,IAAY,UAAW,CACvB,GAAM,CAAC,EAAM,EAAO,EAAS,GAAW,EACxC,GAAI,CAAC,MAAM,QAAQ,CAAO,EAAG,CACzB,GAAI,CAAC,EAAgB,EAAS,CAAqB,EAC/C,MAAM,EAAoB,sBAAuB,iCAAiC,EAEtF,MAAO,CAAC,EAAM,EAAO,GAAqB,EAAS,EAAK,EAAG,CAAO,CACtE,CACJ,CAEA,GAAI,IAAY,aAAc,CAC1B,GAAM,CAAC,EAAM,EAAO,GAAO,EAC3B,GAAI,CAAC,MAAM,QAAQ,CAAG,EAAG,CACrB,GAAI,CAAC,EAAgB,EAAK,CAAmB,EACzC,MAAM,EAAoB,sBAAuB,+BAA+B,EAEpF,MAAO,CAAC,EAAM,EAAO,GAAmB,EAAK,EAAK,CAAC,CACvD,CACJ,CAEA,OAAO,CACX,CAEA,SAAgB,EAAsB,EAAmC,CACrE,OAAO,EAAgB,EAAO,CAAqB,EAAI,EAAM,MAAQ,IACzE,CAEA,SAAgB,GAAoB,EAAmC,CACnE,OAAO,EAAgB,EAAO,CAAmB,EAAI,EAAM,MAAQ,IACvE,CA0BA,SAAgB,GAA2B,EAA6C,CACpF,GAAI,EAAE,aAAiB,aAAe,EAAM,WAAa,EACrD,MAAM,EAAoB,sBAAuB,wCAAwC,EAE7F,IAAM,EAAO,IAAI,SAAS,EAAM,OAAQ,EAAM,WAAY,EAAM,UAAU,EACpE,EAAQ,EAAK,UAAU,EAAG,EAAI,EAE9B,EAAgB,EAAW,EADX,EAAiB,EAAO,EAAG,iCACb,EAAe,+BAA+B,EAClF,GAAI,EAAgB,EAAM,WACtB,MAAM,EAAoB,sBAAuB,wDAAwD,EAE7G,IAAM,EAAY,MAAyB,CAAK,EAC5C,EAAa,EACjB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAa,EAAK,UAAU,EAAI,EAAQ,EAAG,EAAI,EACrD,GAAI,IAAe,EAAS,CACxB,EAAM,GAAS,KACf,QACJ,CACA,IAAM,EAAM,EAAa,EACzB,GAAI,EAAM,EAAM,WACZ,MAAM,EAAoB,sBAAuB,oDAAoD,EAEzG,EAAM,GAAS,EAAM,SAAS,EAAY,CAAG,EAC7C,EAAa,CACjB,CACA,GAAI,IAAe,EAAM,WACrB,MAAM,EAAoB,sBAAuB,mDAAmD,EAExG,OAAO,CACX,CAEA,SAAgB,GACZ,EACA,EAC6C,CAC7C,IACK,IAAY,QAAU,IAAY,iBAClC,EAAuB,CAAM,GAAK,EAAgB,EAAQ,CAAmB,GAE9E,MAAO,CAAE,SAAQ,SAAU,EAAgC,EAAO,KAAK,CAAE,EAE7E,GAAI,IAAY,WAAY,CACxB,IAAM,EAAO,EACb,GAAI,EAAS,CAAI,IAAM,EAAuB,EAAK,IAAI,GAAK,EAAgB,EAAK,KAAM,CAAmB,GACtG,MAAO,CAAE,OAAQ,EAAM,SAAU,EAAgC,EAAK,KAAK,KAAK,CAAE,EAEtF,GAAI,EAAS,CAAI,GAAK,MAAM,QAAQ,EAAK,IAAI,EAAG,CAC5C,IAAM,EAAS,EAAa,EAAK,IAAI,EACrC,MAAO,CACH,OAAQ,CAAE,GAAG,EAAM,KAAM,GAAU,EAAK,IAAK,EAC7C,SAAU,EAAS,CAAC,EAAO,MAAM,MAAM,EAAI,EAA6B,EAAK,IAAI,CACrF,CACJ,CACJ,CACA,GAAI,IAAY,WAAa,EAAgB,EAAQ,CAAyB,EAC1E,MAAO,CACH,SACA,SAAU,EAAgC,EAAO,KAAK,CAC1D,EAGJ,GAAI,IAAY,kBAAmB,CAC/B,IAAM,EAAO,EACb,GAAI,EAAS,CAAI,GAAK,EAAgB,EAAK,KAAM,CAAmB,EAChE,MAAO,CAAE,OAAQ,EAAM,SAAU,EAA6B,CAAI,CAAE,EAExE,GAAI,EAAS,CAAI,GAAK,MAAM,QAAQ,EAAK,IAAI,EAAG,CAC5C,IAAM,EAAS,EAAK,KAAK,OAAS,EAAI,EAAa,EAAK,IAAI,EAAI,KAC1D,EAAgC,CAAE,KAAM,GAAU,EAAK,KAAM,OAAQ,EAAK,MAAO,EACjF,EAAW,EAAS,CAAC,EAAO,MAAM,MAAM,EAAI,EAA6B,EAAK,IAAI,EAClF,EAAe,EAAyB,EAAK,MAAM,EACzD,MAAO,CACH,OAAQ,EACR,SAAU,IAAiB,KAAO,EAAW,CAAC,GAAG,EAAU,CAAY,CAC3E,CACJ,CACJ,CAEA,GAAI,IAAY,UAAW,CACvB,IAAM,EAAS,EACf,GAAI,MAAM,QAAQ,CAAM,GAAK,EAAO,OAAS,EAAG,CAC5C,IAAM,EAAS,GAAuB,CAAM,EAC5C,GAAI,EACA,MAAO,CACH,OAAQ,EACR,SAAU,CAAC,EAAO,MAAM,MAAM,CAClC,CAER,CACA,MAAO,CACH,SACA,SAAU,EAA6B,CAAM,CACjD,CACJ,CAEA,GAAI,IAAY,QAAU,IAAY,cAAe,CACjD,IAAM,EAAO,EACb,GAAI,MAAM,QAAQ,CAAI,GAAK,EAAK,OAAS,EAAG,CACxC,IAAM,EAAS,EAAa,CAAI,EAChC,GAAI,EACA,MAAO,CACH,OAAQ,EACR,SAAU,CAAC,EAAO,MAAM,MAAM,CAClC,CAER,CACA,MAAO,CACH,SACA,SAAU,EAA6B,CAAM,CACjD,CACJ,CAiBA,OAfI,IAAY,OAAS,IAAY,cAAgB,IAAY,iBACtD,CACH,SACA,SAAU,EAAgC,CAAM,CACpD,EAGA,IAAY,eACL,CACH,SACA,SAAU,GAA+B,CAAM,CACnD,EAIG,CACH,SACA,SAAU,CAAC,CACf,CACJ,CAEA,SAAgB,GACZ,EACA,EACsB,CACtB,GAAI,IAAY,WAAY,CACxB,GACI,CAAC,EAAS,CAAM,GAChB,OAAO,EAAO,MAAS,WACvB,OAAO,EAAO,OAAU,UACxB,CAAC,OAAO,cAAc,EAAO,KAAK,GAClC,EAAO,MAAQ,GACd,EAAO,WAAa,IAAA,KAChB,OAAO,EAAO,UAAa,UACxB,CAAC,OAAO,cAAc,EAAO,QAAQ,GACrC,EAAO,UAAY,KAC1B,EAAO,KAAO,EAAO,WAAa,IAAA,GAAY,EAAO,WAAa,IAAA,IAEnE,MAAM,EAAoB,sBAAuB,4BAA4B,EAEjF,IAAM,EAAO,EAAuB,EAAO,IAAI,EACzC,GAAqB,EAAO,KAAK,KAAK,EACtC,EAAgB,EAAO,KAAM,CAAmB,EAC9C,EAAe,EAAO,IAAI,EAC1B,EAAO,KACf,GAAI,CAAC,MAAM,QAAQ,CAAI,EAAG,MAAM,EAAoB,sBAAuB,wBAAwB,EACnG,IAAI,EAAQ,EACZ,IAAK,IAAM,KAAO,EAAM,CACpB,GAAI,CAAC,EAAS,CAAG,GAAK,EAAE,EAAI,eAAe,aAAe,EAAE,EAAI,iBAAiB,YAC7E,MAAM,EAAoB,sBAAuB,uBAAuB,EAE5E,GAAS,EAAI,EAAI,IAAI,WAAa,EAAI,MAAM,UAChD,CACA,GAAI,IAAU,EAAO,MAAO,MAAM,EAAoB,sBAAuB,+BAA+B,EAC5G,MAAO,CAAE,OAAM,SAAU,EAAO,SAAU,KAAM,EAAO,KAAM,MAAO,EAAO,KAAM,CACrF,CACA,IAAK,IAAY,QAAU,IAAY,gBAAkB,EAAuB,CAAM,EAClF,OAAO,GAAqB,EAAO,KAAK,EAE5C,GAAI,IAAY,WAAa,EAAgB,EAAQ,CAA8B,EAC/E,OAAO,GAAyB,CAAM,EAG1C,GAAI,IAAY,WAAa,EAAgB,EAAQ,CAAyB,EAC1E,OAAO,GAA2B,EAAO,KAAK,EAGlD,GAAI,IAAY,WAAa,CAAC,MAAM,QAAQ,CAAM,EAC9C,MAAM,EAAoB,sBAAuB,iCAAiC,EAGtF,GAAI,IAAY,kBAAmB,CAC/B,GACI,CAAC,EAAS,CAAM,GACf,CAAC,MAAM,QAAQ,EAAO,IAAI,GAAK,CAAC,EAAgB,EAAO,KAAM,CAAmB,GAChF,EAAO,SAAW,MAAQ,EAAE,EAAO,kBAAkB,YAEtD,MAAM,EAAoB,sBAAuB,yCAAyC,EAG9F,MAAO,CAAE,KADI,EAAgB,EAAO,KAAM,CAAmB,EAAI,EAAe,EAAO,IAAI,EAAI,EAAO,KACvF,OAAQ,EAAO,MAAO,CACzC,CAEA,IAAK,IAAY,QAAU,IAAY,gBAAkB,EAAgB,EAAQ,CAAmB,EAChG,OAAO,EAAe,CAAM,EAGhC,IAAK,IAAY,QAAU,IAAY,gBAAkB,CAAC,MAAM,QAAQ,CAAM,EAC1E,MAAM,EAAoB,sBAAuB,8BAA8B,EAGnF,OAAO,CACX,CAIA,SAAS,EAAuB,EAAiD,CAC7E,OAAO,EAAS,CAAK,GAAK,EAAM,iBAAmB,qCAA8B,EAAM,iBAAiB,UAC5G,CACA,SAAgB,GAAqB,EAAkE,CACnG,GAAI,EAAE,aAAiB,aAAe,EAAM,WAAa,EACrD,MAAM,EAAoB,sBAAuB,4BAA4B,EAEjF,IAAM,EAAO,IAAI,SAAS,EAAM,OAAQ,EAAM,WAAY,EAAM,UAAU,EACpE,EAAQ,EAAK,UAAU,EAAG,EAAI,EACpC,GAAI,GAAS,EAAM,WAAa,GAAK,EACjC,MAAM,EAAoB,sBAAuB,6CAA6C,EAElG,IAAM,EAAW,MAA8C,CAAK,EAChE,EAAS,EACb,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,GAAI,EAAS,EAAI,EAAM,WACnB,MAAM,EAAoB,sBAAuB,2BAA2B,EAChF,IAAM,EAAY,EAAK,UAAU,EAAQ,EAAI,EACvC,EAAc,EAAK,UAAU,EAAS,EAAG,EAAI,EAC7C,EAAW,EAAS,EACpB,EAAa,EAAW,EACxB,EAAM,EAAa,EACzB,GAAI,EAAM,EAAM,WACZ,MAAM,EAAoB,sBAAuB,uCAAuC,EAC5F,EAAK,GAAS,CAAE,IAAK,EAAM,SAAS,EAAU,CAAU,EAAG,MAAO,EAAM,SAAS,EAAY,CAAG,CAAE,EAClG,EAAS,CACb,CACA,GAAI,IAAW,EAAM,WACjB,MAAM,EAAoB,sBAAuB,uCAAuC,EAC5F,OAAO,CACX,CAEA,SAAgB,EAA6B,EAAgC,CACzE,IAAM,EAAS,EAAyB,CAAK,EAC7C,GAAI,IAAW,KACX,MAAO,CAAC,CAAM,EAElB,GAA6C,OAAO,GAAU,WAA1D,EACA,OAAO,EAGX,IAAM,kBAAU,IAAI,IAGpB,OADA,EAA2B,EAAO,kBAAS,IAD1B,OAC8B,EACxC,EAAQ,OAAS,EAAI,EAAsB,MAAM,KAAK,CAAO,CACxE,CAOA,SAAgB,EACZ,EACA,EAC0D,CAC1D,IAAM,EACF,EAAS,OAAS,EACZ,gBAAgB,EAAO,CAAE,SAAU,EAAS,SAAW,EAAI,EAAW,MAAM,KAAK,IAAI,IAAI,CAAQ,CAAC,CAAE,CAAC,EACrG,gBAAgB,CAAK,EACzB,kBAAU,IAAI,IACd,kBAAO,IAAI,QACb,EAAa,EACX,EAAS,GAAwB,CACnC,GAAI,OAAO,GAAS,SAAU,CAC1B,GAAc,EAAI,EAAK,OAAS,EAChC,MACJ,CACA,GAAqB,OAAO,GAAS,WAAjC,EAA2C,CAC3C,GAAc,EACd,MACJ,CACI,MAAK,IAAI,CAAI,EAGjB,IAFA,EAAK,IAAI,CAAI,EACb,GAAc,EACV,aAAgB,YAChB,EAAQ,IAAI,CAAI,EAChB,GAAc,EAAK,gBAChB,GAAI,OAAO,kBAAsB,KAAe,aAAgB,kBACnE,GAAc,EAAK,gBAChB,GAAI,YAAY,OAAO,CAAI,EAC9B,EAAM,EAAK,MAAM,OACd,GAAI,MAAM,QAAQ,CAAI,EACzB,IAAK,IAAM,KAAS,EAAM,EAAM,CAAK,OAClC,GAAI,aAAgB,IACvB,IAAK,GAAM,CAAC,EAAK,KAAU,EACvB,EAAM,CAAG,EACT,EAAM,CAAK,OAEZ,GAAI,aAAgB,IACvB,IAAK,IAAM,KAAS,EAAM,EAAM,CAAK,MAClC,CACH,IAAM,EAAS,EACf,IAAK,IAAM,KAAO,EACV,OAAO,UAAU,eAAe,KAAK,EAAQ,CAAG,IAChD,GAAc,EAAI,EAAI,OAAS,EAC/B,EAAM,EAAO,EAAI,EAG7B,EACJ,EAEA,OADA,EAAM,CAAQ,EACP,CACH,MAAO,EACP,SAAU,EAAQ,OAAS,EAAI,EAAsB,MAAM,KAAK,CAAO,EACvE,YACJ,CACJ,CAEA,SAAS,EAAgC,EAAgC,CACrE,IAAM,EAAS,EAAyB,CAAK,EAC7C,OAAO,IAAW,KAAO,EAAsB,CAAC,CAAM,CAC1D,CAEA,SAAS,EAAyB,EAAoC,CAClE,GAAI,aAAiB,YACjB,OAAO,EAEX,GAAI,YAAY,OAAO,CAAK,EAAG,CAC3B,IAAM,EAAS,EAAM,OACrB,GAAI,aAAkB,aAAe,EAAM,aAAe,GAAK,EAAM,aAAe,EAAO,WACvF,OAAO,CAEf,CACA,OAAO,IACX,CAEA,SAAS,GAA+B,EAAgC,CACpE,GAAI,CAAC,EAAS,CAAK,GAAK,CAAC,MAAM,QAAQ,EAAM,OAAO,GAAK,EAAM,QAAQ,SAAW,EAC9E,OAAO,EAGX,IAAI,EAAmC,KACvC,IAAK,IAAM,KAAU,EAAM,QAAS,CAChC,GAAI,CAAC,EAAS,CAAM,EAChB,SAEJ,IAAM,EAAM,EAAyB,EAAO,GAAG,EAC3C,IAAQ,OACR,oBAAY,IAAI,IAChB,EAAQ,IAAI,CAAG,GAEnB,IAAM,EAAe,EAAyB,EAAO,KAAK,EACtD,IAAiB,OACjB,oBAAY,IAAI,IAChB,EAAQ,IAAI,CAAY,EAEhC,CACA,OAAO,IAAY,MAAQ,EAAQ,OAAS,EAAI,EAAsB,MAAM,KAAK,CAAO,CAC5F,CAEA,SAAS,EAA2B,EAAgB,EAA2B,EAA6B,CACxG,GAAI,GAAU,KACV,OAEJ,GAAI,aAAiB,YAAa,CAC9B,EAAQ,IAAI,CAAK,EACjB,MACJ,CACA,GAAI,YAAY,OAAO,CAAK,EAAG,CAC3B,IAAM,EAAS,EAAM,OACjB,aAAkB,aAAe,EAAM,aAAe,GAAK,EAAM,aAAe,EAAO,YACvF,EAAQ,IAAI,CAAM,EAEtB,MACJ,CACA,GAAI,OAAO,GAAU,SACjB,OAEJ,IAAM,EAAS,EACf,GAAI,EAAK,IAAI,CAAM,EACf,OAGJ,GADA,EAAK,IAAI,CAAM,EACX,MAAM,QAAQ,CAAK,EAAG,CACtB,IAAK,IAAM,KAAQ,EACf,EAA2B,EAAM,EAAS,CAAI,EAElD,MACJ,CACA,IAAM,EAAS,EACf,IAAK,IAAM,KAAO,EACV,OAAO,UAAU,eAAe,KAAK,EAAQ,CAAG,GAChD,EAA2B,EAAO,GAAM,EAAS,CAAI,CAGjE,CAEA,SAAS,GAAgB,EAA8D,CACnF,IAAM,EAAa,EAAQ,OACrB,EAAQ,EAAW,EAAa,EAAG,2BAA2B,EAC9D,EAAgB,EAAiB,EAAO,EAAG,yBAAyB,EACtE,EAAe,EACnB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAY,GAAS,EAAG,CAChD,IAAM,EAAQ,EAAQ,GAChB,EAAM,EAAM,GACZ,EAAQ,EAAM,GACpB,GAAI,EAAE,aAAe,aAAe,EAAE,aAAiB,YACnD,MAAM,EAAoB,sBAAuB,6CAA6C,EAElG,IAAM,EAAY,EAAW,EAAI,WAAY,oBAAoB,EAC3D,EAAc,EAAW,EAAM,WAAY,sBAAsB,EAEvE,GADA,GAAgB,EAAY,EACxB,EAAe,EACf,MAAM,EAAoB,sBAAuB,qDAAqD,CAE9G,CACA,IAAM,EAAgB,EAAW,EAAG,EAAe,uBAAuB,EACpE,EAAa,EAAW,EAAe,EAAc,sBAAsB,EAC3E,EAAQ,IAAI,WAAW,CAAU,EACjC,EAAO,IAAI,SAAS,EAAM,MAAM,EACtC,EAAK,UAAU,EAAG,EAAO,EAAI,EAC7B,IAAI,EAAiB,EACjB,EAAc,EAClB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAY,GAAS,EAAG,CAChD,IAAM,EAAQ,EAAQ,GAChB,EAAM,EAAM,GACZ,EAAQ,EAAM,GACd,EAAY,EAAI,WAChB,EAAc,EAAM,WAC1B,EAAK,UAAU,EAAgB,EAAW,EAAI,EAC9C,GAAkB,EAClB,EAAK,UAAU,EAAgB,EAAa,EAAI,EAChD,GAAkB,EAClB,EAAM,IAAI,EAAK,CAAW,EAC1B,GAAe,EACf,EAAM,IAAI,EAAO,CAAW,EAC5B,GAAe,CACnB,CACA,MAAO,CACH,eAAgB,EAChB,OACJ,CACJ,CAEA,SAAS,GAAe,EAAyC,CAC7D,IAAM,EAAQ,EAAM,OACd,EAAgB,EAAiB,EAAO,EAAG,6BAA6B,EAC1E,EAAe,EACnB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAO,EAAM,GACnB,GAAI,EAAE,aAAgB,YAClB,MAAM,EAAoB,sBAAuB,8CAA8C,EAEnG,IAAM,EAAa,EAAW,EAAK,WAAY,yBAAyB,EAExE,GADA,GAAgB,EACZ,EAAe,EACf,MAAM,EAAoB,sBAAuB,yDAAyD,CAElH,CACA,IAAM,EAAgB,EAAW,EAAG,EAAe,2BAA2B,EACxE,EAAa,EAAW,EAAe,EAAc,0BAA0B,EAC/E,EAAQ,IAAI,WAAW,CAAU,EACjC,EAAO,IAAI,SAAS,EAAM,MAAM,EACtC,EAAK,UAAU,EAAG,EAAO,EAAI,EAC7B,IAAI,EAAiB,EACjB,EAAc,EAClB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAO,EAAM,GACb,EAAa,EAAK,WACxB,EAAK,UAAU,EAAgB,EAAY,EAAI,EAC/C,GAAkB,EAClB,EAAM,IAAI,EAAM,CAAW,EAC3B,GAAe,CACnB,CACA,MAAO,CACH,eAAgB,EAChB,OACJ,CACJ,CAEA,SAAS,GAAiB,EAAoC,CAC1D,IAAM,EAAQ,EAAQ,MACtB,GAAI,EAAE,aAAiB,aAAe,EAAM,WAAa,EACrD,MAAM,EAAoB,sBAAuB,oCAAoC,EAEzF,IAAM,EAAO,IAAI,SAAS,EAAM,OAAQ,EAAM,WAAY,EAAM,UAAU,EACpE,EAAQ,EAAK,UAAU,EAAG,EAAI,EAE9B,EAAgB,EAAW,EADX,EAAiB,EAAO,EAAG,6BACb,EAAe,2BAA2B,EAC9E,GAAI,EAAgB,EAAM,WACtB,MAAM,EAAoB,sBAAuB,oDAAoD,EAGzG,IAAM,EAAY,MAAkB,CAAK,EACrC,EAAiB,EACjB,EAAa,EACjB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAa,EAAK,UAAU,EAAgB,EAAI,EACtD,GAAkB,EAClB,IAAM,EAAM,EAAa,EACzB,GAAI,EAAM,GAAW,EAAM,EAAM,WAC7B,MAAM,EAAoB,sBAAuB,gDAAgD,EAErG,EAAM,GAAS,EAAM,SAAS,EAAY,CAAG,EAC7C,EAAa,CACjB,CACA,GAAI,IAAe,EAAM,WACrB,MAAM,EAAoB,sBAAuB,+CAA+C,EAEpG,OAAO,CACX,CAIA,SAAS,GAAqB,EAAsB,EAAmE,CACnH,IAAM,EAAQ,EAAQ,MACtB,GAAI,EAAE,aAAiB,aAAe,EAAM,WAAa,EACrD,MAAM,EAAoB,sBAAuB,gCAAgC,EAErF,IAAM,EAAO,IAAI,SAAS,EAAM,OAAQ,EAAM,WAAY,EAAM,UAAU,EACpE,EAAY,EAAK,UAAU,EAAG,EAAI,EACxC,GAAI,EAAY,GAAM,EAClB,MAAM,EAAoB,sBAAuB,8CAA8C,EAGnG,IAAM,EAAgB,EAAW,EADX,EAAiB,EAAW,EAAG,yBACjB,EAAe,uBAAuB,EAC1E,GAAI,EAAgB,EAAM,WACtB,MAAM,EAAoB,sBAAuB,gDAAgD,EAGrG,IAAM,EAAa,EAAY,EACzB,EAAc,MAA6C,CAAU,EACvE,EAAiB,EACjB,EAAa,EACjB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAY,GAAS,EAAG,CAChD,IAAM,EAAY,EAAK,UAAU,EAAgB,EAAI,EAC/C,EAAc,EAAK,UAAU,EAAiB,EAAG,EAAI,EAC3D,GAAkB,EAElB,IAAM,EAAS,EAAa,EAC5B,GAAI,EAAS,GAAW,EAAS,EAAM,WACnC,MAAM,EAAoB,sBAAuB,2CAA2C,EAEhG,IAAM,EAAW,EAAS,EAC1B,GAAI,EAAW,GAAW,EAAW,EAAM,WACvC,MAAM,EAAoB,sBAAuB,6CAA6C,EAE9F,EACA,EAAQ,GAAS,EAAM,SAAS,EAAY,CAAM,EAElD,EAAQ,GAAS,CAAC,EAAM,SAAS,EAAY,CAAM,EAAG,EAAM,SAAS,EAAQ,CAAQ,CAAC,EAE1F,EAAa,CACjB,CACA,GAAI,IAAe,EAAM,WACrB,MAAM,EAAoB,sBAAuB,2CAA2C,EAEhG,OAAO,CACX,CAEA,SAAS,GAAuB,EAAoE,CAChG,IAAM,EAAQ,EAAM,OACd,EAAgB,EAAiB,EAAO,EAAG,sCAAsC,EACnF,EAAe,EACnB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAO,EAAM,GACnB,GAAI,IAAS,KACT,SAEJ,GAAI,EAAE,aAAgB,YAClB,MAAM,EACF,sBACA,+DACJ,EAEJ,IAAM,EAAa,EAAW,EAAK,WAAY,kCAAkC,EAEjF,GADA,GAAgB,EACZ,EAAe,EACf,MAAM,EACF,sBACA,kEACJ,CAER,CACA,IAAM,EAAgB,EAAW,EAAG,EAAe,oCAAoC,EACjF,EAAa,EAAW,EAAe,EAAc,mCAAmC,EAC9F,GAAI,EAAa,EACb,OAAO,KAEX,IAAM,EAAQ,IAAI,WAAW,CAAU,EACjC,EAAO,IAAI,SAAS,EAAM,MAAM,EACtC,EAAK,UAAU,EAAG,EAAO,EAAI,EAC7B,IAAI,EAAiB,EACjB,EAAc,EAClB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAO,EAAM,GACnB,GAAI,IAAS,KAAM,CACf,EAAK,SAAS,EAAgB,CAAC,EAC/B,EAAK,UAAU,EAAiB,EAAG,EAAG,EAAI,EAC1C,GAAkB,EAClB,QACJ,CACA,IAAM,EAAa,EAAK,WACxB,EAAK,SAAS,EAAgB,CAAC,EAC/B,EAAK,UAAU,EAAiB,EAAG,EAAY,EAAI,EACnD,GAAkB,EAClB,EAAM,IAAI,EAAM,CAAW,EAC3B,GAAe,CACnB,CACA,MAAO,CACH,eAAgB,EAChB,OACJ,CACJ,CAEA,SAAS,GAAyB,EAAgD,CAC9E,IAAM,EAAQ,EAAQ,MACtB,GAAI,EAAE,aAAiB,aAAe,EAAM,WAAa,EACrD,MAAM,EAAoB,sBAAuB,6CAA6C,EAElG,IAAM,EAAO,IAAI,SAAS,EAAM,OAAQ,EAAM,WAAY,EAAM,UAAU,EACpE,EAAQ,EAAK,UAAU,EAAG,EAAI,EAE9B,EAAgB,EAAW,EADX,EAAiB,EAAO,EAAG,sCACb,EAAe,oCAAoC,EACvF,GAAI,EAAgB,EAAM,WACtB,MAAM,EAAoB,sBAAuB,6DAA6D,EAGlH,IAAM,EAAY,MAAyB,CAAK,EAC5C,EAAiB,EACjB,EAAa,EACjB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAU,EAAK,SAAS,CAAc,EACtC,EAAa,EAAK,UAAU,EAAiB,EAAG,EAAI,EAE1D,GADA,GAAkB,EACd,IAAY,EAAG,CACf,GAAI,IAAe,EACf,MAAM,EACF,sBACA,4DACJ,EAEJ,EAAM,GAAS,KACf,QACJ,CACA,GAAI,IAAY,EACZ,MAAM,EACF,sBACA,+DAA+D,GACnE,EAEJ,IAAM,EAAM,EAAa,EACzB,GAAI,EAAM,GAAW,EAAM,EAAM,WAC7B,MAAM,EAAoB,sBAAuB,yDAAyD,EAE9G,EAAM,GAAS,EAAM,SAAS,EAAY,CAAG,EAC7C,EAAa,CACjB,CACA,GAAI,IAAe,EAAM,WACrB,MAAM,EAAoB,sBAAuB,wDAAwD,EAE7G,OAAO,CACX,CAEA,SAAS,EAAa,EAA8E,CAChG,IAAM,EAAQ,EAAK,OACb,EAAgB,EAAiB,EAAO,EAAG,0BAA0B,EACvE,EAAe,EACnB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAM,EAAK,GACjB,GAAI,CAAC,EAAS,CAAG,GAAK,EAAE,EAAI,eAAe,aAAe,EAAE,EAAI,iBAAiB,YAC7E,MAAM,EAAoB,sBAAuB,gDAAgD,EAErG,IAAM,EAAY,EAAW,EAAI,IAAI,WAAY,qBAAqB,EAChE,EAAc,EAAW,EAAI,MAAM,WAAY,uBAAuB,EAE5E,GADA,GAAgB,EAAY,EACxB,EAAe,EACf,MAAM,EAAoB,sBAAuB,sDAAsD,CAE/G,CACA,IAAM,EAAgB,EAAW,EAAG,EAAe,wBAAwB,EACrE,EAAa,EAAW,EAAe,EAAc,uBAAuB,EAClF,GAAI,EAAa,EACb,OAAO,KAEX,IAAM,EAAQ,IAAI,WAAW,CAAU,EACjC,EAAO,IAAI,SAAS,EAAM,MAAM,EACtC,EAAK,UAAU,EAAG,EAAO,EAAI,EAC7B,IAAI,EAAiB,EACjB,EAAc,EAClB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAM,EAAK,GACX,EAAM,EAAI,IACV,EAAQ,EAAI,MACZ,EAAY,EAAI,WAChB,EAAc,EAAM,WAC1B,EAAK,UAAU,EAAgB,EAAW,EAAI,EAC9C,EAAK,UAAU,EAAiB,EAAG,EAAa,EAAI,EACpD,GAAkB,EAClB,EAAM,IAAI,EAAK,CAAW,EAC1B,GAAe,EACf,EAAM,IAAI,EAAO,CAAW,EAC5B,GAAe,CACnB,CACA,MAAO,CACH,eAAgB,EAChB,OACJ,CACJ,CAEA,SAAS,EAAe,EAAqE,CACzF,IAAM,EAAQ,EAAQ,MACtB,GAAI,EAAE,aAAiB,aAAe,EAAM,WAAa,EACrD,MAAM,EAAoB,sBAAuB,iCAAiC,EAEtF,IAAM,EAAO,IAAI,SAAS,EAAM,OAAQ,EAAM,WAAY,EAAM,UAAU,EACpE,EAAQ,EAAK,UAAU,EAAG,EAAI,EAE9B,EAAgB,EAAW,EADX,EAAiB,EAAO,EAAG,0BACb,EAAe,wBAAwB,EAC3E,GAAI,EAAgB,EAAM,WACtB,MAAM,EAAoB,sBAAuB,iDAAiD,EAGtG,IAAM,EAAW,MAA8C,CAAK,EAChE,EAAiB,EACjB,EAAa,EACjB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAY,EAAK,UAAU,EAAgB,EAAI,EAC/C,EAAc,EAAK,UAAU,EAAiB,EAAG,EAAI,EAC3D,GAAkB,EAClB,IAAM,EAAS,EAAa,EAC5B,GAAI,EAAS,GAAW,EAAS,EAAM,WACnC,MAAM,EAAoB,sBAAuB,4CAA4C,EAEjG,IAAM,EAAW,EAAS,EAC1B,GAAI,EAAW,GAAW,EAAW,EAAM,WACvC,MAAM,EAAoB,sBAAuB,8CAA8C,EAEnG,EAAK,GAAS,CACV,IAAK,EAAM,SAAS,EAAY,CAAM,EACtC,MAAO,EAAM,SAAS,EAAQ,CAAQ,CAC1C,EACA,EAAa,CACjB,CACA,GAAI,IAAe,EAAM,WACrB,MAAM,EAAoB,sBAAuB,4CAA4C,EAEjG,OAAO,CACX,CAEA,SAAS,GAAa,EAAuC,CACzD,IAAM,EAAQ,EAAI,OACZ,EAAgB,EAAiB,EAAO,EAAG,uBAAuB,EACpE,EAAe,EACnB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAc,EAAI,GACxB,GAAI,CAAC,EAAS,CAAE,GAAM,EAAG,OAAS,OAAS,EAAG,OAAS,SACnD,MAAM,EAAoB,sBAAuB,2CAA2C,EAEhG,GAAI,EAAE,EAAG,eAAe,YACpB,MAAM,EAAoB,sBAAuB,yCAAyC,EAE9F,IAAM,EAAY,EAAW,EAAG,IAAI,WAAY,4BAA4B,EAE5E,GADA,GAAgB,EACZ,EAAe,EACf,MAAM,EAAoB,sBAAuB,mDAAmD,EAExG,GAAI,EAAG,OAAS,MAAO,CACnB,GAAI,EAAE,EAAG,iBAAiB,YACtB,MAAM,EAAoB,sBAAuB,qCAAqC,EAE1F,IAAM,EAAc,EAAW,EAAG,MAAM,WAAY,wBAAwB,EAE5E,GADA,GAAgB,EACZ,EAAe,EACf,MAAM,EAAoB,sBAAuB,mDAAmD,CAE5G,CACJ,CACA,IAAM,EAAgB,EAAW,EAAG,EAAe,qBAAqB,EAClE,EAAa,EAAW,EAAe,EAAc,oBAAoB,EACzE,EAAQ,IAAI,WAAW,CAAU,EACjC,EAAO,IAAI,SAAS,EAAM,MAAM,EACtC,EAAK,UAAU,EAAG,EAAO,EAAI,EAC7B,IAAI,EAAiB,EACjB,EAAc,EAClB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAK,EAAI,GACT,EAAM,EAAG,IACT,EAAY,EAAI,WAChB,EAAc,EAAG,OAAS,MAAQ,EAAG,MAAM,WAAa,EAC9D,EAAK,SAAS,EAAgB,IAAG,OAAS,MAAsC,EAChF,EAAK,UAAU,EAAiB,EAAG,EAAW,EAAI,EAClD,EAAK,UAAU,EAAiB,EAAG,EAAa,EAAI,EACpD,GAAkB,EAClB,EAAM,IAAI,EAAK,CAAW,EAC1B,GAAe,EACX,EAAG,OAAS,QACZ,EAAM,IAAI,EAAG,MAAO,CAAW,EAC/B,GAAe,EAEvB,CACA,MAAO,CACH,eAAgB,EAChB,OACJ,CACJ,CAIA,SAAS,GAAmB,EAAsB,EAAwD,CACtG,IAAM,EAAQ,EAAQ,MACtB,GAAI,EAAE,aAAiB,aAAe,EAAM,WAAa,EACrD,MAAM,EAAoB,sBAAuB,8BAA8B,EAEnF,IAAM,EAAO,IAAI,SAAS,EAAM,OAAQ,EAAM,WAAY,EAAM,UAAU,EACpE,EAAQ,EAAK,UAAU,EAAG,EAAI,EAE9B,EAAgB,EAAW,EADX,EAAiB,EAAO,EAAG,uBACb,EAAe,qBAAqB,EACxE,GAAI,EAAgB,EAAM,WACtB,MAAM,EAAoB,sBAAuB,8CAA8C,EAGnG,IAAM,EAAU,MAAkC,CAAK,EACnD,EAAiB,EACjB,EAAa,EACjB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAO,GAAS,EAAG,CAC3C,IAAM,EAAO,EAAK,SAAS,CAAc,EACnC,EAAY,EAAK,UAAU,EAAiB,EAAG,EAAI,EACnD,EAAc,EAAK,UAAU,EAAiB,EAAG,EAAI,EAC3D,GAAkB,EAElB,IAAM,EAAS,EAAa,EAC5B,GAAI,EAAS,GAAW,EAAS,EAAM,WACnC,MAAM,EAAoB,sBAAuB,yCAAyC,EAE9F,IAAM,EAAM,EAAM,SAAS,EAAY,CAAM,EAG7C,GAFA,EAAa,EAET,IAAS,EAAiB,CAC1B,GAAI,IAAgB,EAChB,MAAM,EAAoB,sBAAuB,6CAA6C,EAElG,EAAI,GAAS,CAAE,KAAM,SAAU,KAAI,EACnC,QACJ,CAEA,GAAI,IAAS,EACT,MAAM,EAAoB,sBAAuB,iDAAiD,GAAM,EAE5G,IAAM,EAAW,EAAa,EAC9B,GAAI,EAAW,GAAW,EAAW,EAAM,WACvC,MAAM,EAAoB,sBAAuB,2CAA2C,EAE5F,EACA,EAAI,GAAS,CAAE,KAAM,MAAO,KAAI,EAEhC,EAAI,GAAS,CAAE,KAAM,MAAO,MAAK,MAAO,EAAM,SAAS,EAAY,CAAQ,CAAE,EAEjF,EAAa,CACjB,CACA,GAAI,IAAe,EAAM,WACrB,MAAM,EAAoB,sBAAuB,yCAAyC,EAE9F,OAAO,CACX,CAEA,SAAS,EAAgB,EAAgB,EAAmC,CACxE,OAAO,EAAS,CAAK,GAAK,EAAM,iBAAmB,GAAO,EAAM,iBAAiB,UACrF,CAEA,SAAS,EAAiB,EAAe,EAAmB,EAAsB,CAC9E,GAAI,CAAC,OAAO,cAAc,CAAK,GAAK,EAAQ,EACxC,MAAM,EAAoB,sBAAuB,GAAG,EAAK,qBAAqB,GAAO,EAEzF,OAAO,EAAW,EAAQ,EAAW,CAAI,CAC7C,CAEA,SAAS,EAAW,EAAc,EAAe,EAAsB,CAEnE,OAAO,EADO,EAAO,EACI,CAAI,CACjC,CAEA,SAAS,EAAW,EAAe,EAAsB,CACrD,GAAI,CAAC,OAAO,cAAc,CAAK,GAAK,EAAQ,GAAK,EAAQ,EACrD,MAAM,EAAoB,sBAAuB,GAAG,EAAK,8BAA8B,EAE3F,OAAO,CACX,CAEA,SAAS,EAAsB,EAA+B,CAC1D,IAAM,EAAQ,IAAI,WAAW,EAAM,UAAU,EAE7C,OADA,EAAM,IAAI,CAAK,EACR,CACX,CAEA,SAAS,EAAkB,EAAoC,CAC3D,OAAO,OAAO,GAAU,SAAW,EAAQ,IAAA,EAC/C,CCl0CA,SAAS,EAAoB,EAA+B,CACxD,AAEI,EAAQ,WADR,aAAa,EAAQ,OAAO,EACV,KAE1B,CA+BA,IAAa,GAAb,KAAuD,CAoB9B,OAnBrB,cAAwB,EACxB,wBAAkB,IAAI,IACtB,OAAiB,GACjB,cAAwB,GACxB,aAA4C,KAC5C,YAAuD,KACvD,MACA,iBACA,aAAwD,KACxD,YAAoC,KACpC,SAAmB,GACnB,eAA0C,CAAC,EAC3C,YAAsB,EACtB,eAAyB,GACzB,cAAwB,EACxB,aAA6D,KAC7D,mBAEA,YACI,EACA,EAAuC,CAAC,EAC1C,CAFmB,KAAA,OAAA,EAGjB,KAAK,mBAAqB,EAAQ,qBAAuB,GACzD,KAAK,iBAAmB,EAAkB,EAAQ,kBAAoB,CAAC,EACvE,KAAK,MAAQ,IAAI,SAAe,EAAS,IAAW,CAChD,KAAK,aAAe,EACpB,KAAK,YAAc,CACvB,CAAC,EACD,IAAM,EAAiB,EAAkB,EAAQ,gBAAkB,CAAC,EAChE,EAAiB,IACjB,KAAK,aAAe,eAAiB,CACjC,KAAK,KAAK,EAAoB,0BAA2B,6BAA6B,CAAC,CAC3F,EAAG,CAAc,GAErB,KAAU,MAAM,UAAY,IAAA,EAAS,EACrC,KAAK,OAAO,iBAAiB,UAAW,KAAK,aAA8B,EAC3E,KAAK,OAAO,iBAAiB,eAAgB,KAAK,kBAAkB,EACpE,KAAK,OAAO,iBAAiB,QAAS,KAAK,WAA4B,CAC3E,CAEA,gBAAgB,EAAgD,CAC5D,KAAK,aAAe,CACxB,CAEA,WAA2B,CACvB,OAAO,KAAK,KAChB,CAEA,QAAQ,EAAgB,EAAoB,wBAAyB,6BAA6B,EAAS,CACvG,KAAK,gBAAgB,EAAQ,EAAK,CACtC,CAEA,KAAe,EAAqB,CAChC,KAAK,gBAAgB,EAAQ,EAAI,CACrC,CAEA,KAAK,EAA2C,CAC5C,OAAO,KAAK,QAAQ,OAAQ,CAAC,CAAO,CAAC,CACzC,CAEA,OAAuB,CACnB,OAAO,KAAK,QAAQ,QAAS,CAAC,CAAC,CACnC,CAEA,SAAyB,CACrB,OAAO,KAAK,QAAQ,UAAW,CAAC,CAAC,CACrC,CAEA,SAAS,EAA+B,CACpC,OAAO,KAAK,QAAQ,WAAY,CAAC,CAAM,CAAC,CAC5C,CAEA,MAAM,EAA+B,CACjC,OAAO,KAAK,QAAQ,QAAS,CAAC,CAAI,CAAC,CACvC,CAEA,OAAO,EAA+B,CAClC,OAAO,KAAK,QAAQ,SAAU,CAAC,CAAI,CAAC,CACxC,CAEA,SAAS,EAA6B,CAClC,OAAO,KAAK,QAAQ,WAAY,CAAC,CAAI,CAAC,CAC1C,CAEA,WACI,EACA,EACA,EAC+B,CAC/B,OAAO,KAAK,KAAK,aAAc,CAAC,EAAM,EAAS,CAAiB,EAAG,CAAO,CAC9E,CAEA,YAAY,EAAc,EAAc,EAA6C,CACjF,OAAO,KAAK,QAAQ,cAAe,CAAC,EAAM,EAAM,CAAO,CAAC,CAC5D,CAEA,UAAU,EAAc,EAA6B,CACjD,OAAO,KAAK,QAAQ,YAAa,CAAC,EAAM,CAAI,CAAC,CACjD,CAEA,WAAW,EAAc,EAA6B,CAClD,OAAO,KAAK,QAAQ,aAAc,CAAC,EAAM,CAAI,CAAC,CAClD,CAEA,IAAI,EAAc,EAAe,EAA6C,CAC1E,OAAO,KAAK,QAAQ,MAAO,CAAC,EAAM,EAAO,CAAG,CAAC,CACjD,CAEA,QAAQ,EAAc,EAAe,EAA4D,CAC7F,OAAO,KAAK,QAAQ,UAAW,CAAC,EAAM,EAAO,CAAI,CAAC,CACtD,CAEA,IAAI,EAAc,EAAe,EAAmC,CAChE,OAAO,KAAK,QAAQ,MAAO,CAAC,EAAM,EAAO,CAAG,CAAC,CACjD,CAEA,IAAI,EAAc,EAAe,EAAiB,EAAmB,EAAqC,CACtG,OAAO,KAAK,QAAQ,MAAO,CAAC,EAAM,EAAO,EAAK,EAAO,CAAO,CAAC,CACjE,CAEA,QACI,EACA,EACA,EACA,EACa,CACb,OAAO,KAAK,QAAQ,UAAW,CAAC,EAAM,EAAO,EAAS,CAAO,CAAC,CAClE,CAEA,OAAO,EAAc,EAAe,EAAmC,CACnE,OAAO,KAAK,QAAQ,SAAU,CAAC,EAAM,EAAO,CAAG,CAAC,CACpD,CAEA,WAAW,EAAc,EAAe,EAAwC,CAC5E,OAAO,KAAK,QAAQ,aAAc,CAAC,EAAM,EAAO,CAAI,CAAC,CACzD,CAEA,WAAW,EAAc,EAAe,EAAoC,CACxE,OAAO,KAAK,QAAQ,aAAc,CAAC,EAAM,EAAO,CAAG,CAAC,CACxD,CAEA,KAAK,EAAc,EAAe,EAAmC,CACjE,OAAO,KAAK,QAAQ,OAAQ,CAAC,EAAM,EAAO,CAAK,CAAC,CACpD,CAEA,SAAS,EAAyD,CAC9D,OAAO,KAAK,QAAQ,WAAY,CAAC,CAAO,CAAC,CAC7C,CAEA,YAAY,EAAiC,CACzC,OAAO,KAAK,QAAQ,cAAe,CAAC,CAAQ,CAAC,CACjD,CAEA,WAAW,EAAc,EAAe,EAAmB,EAA6C,CACpG,OAAO,KAAK,QAAQ,aAAc,CAAC,EAAM,EAAO,EAAW,CAAG,CAAC,CACnE,CAEA,YAAY,EAAc,EAAe,EAAmB,EAAmC,CAC3F,OAAO,KAAK,QAAQ,cAAe,CAAC,EAAM,EAAO,EAAW,CAAK,CAAC,CACtE,CAEA,gBACI,EACA,EACA,EACA,EACA,EACA,EACA,EACsB,CACtB,OAAO,KAAK,QAAQ,kBAAmB,CAAC,EAAM,EAAO,EAAW,EAAO,EAAQ,EAAO,CAAQ,CAAC,CACnG,CAEA,WAAW,EAAoC,CAC3C,OAAO,KAAK,QAAQ,aAAc,IAAS,IAAA,GAAY,CAAC,EAAI,CAAC,CAAI,CAAC,CACtE,CAEA,iBAAiB,EAAc,EAAoC,CAC/D,OAAO,KAAK,QAAQ,mBAAoB,CAAC,EAAM,CAAO,CAAC,CAC3D,CAEA,YAAgC,CAC5B,OAAO,KAAK,QAAQ,aAAc,CAAC,CAAC,CACxC,CAEA,YAA8B,CAC1B,OAAO,KAAK,QAAQ,aAAc,CAAC,CAAC,CACxC,CAEA,aAAa,EAAc,EAAiD,CACxE,OAAO,KAAK,QAAQ,eAAgB,CAAC,EAAM,CAAO,CAAC,CACvD,CAEA,iBAAiB,EAAc,EAAgC,CAC3D,OAAO,KAAK,QAAQ,mBAAoB,CAAC,EAAM,CAAO,CAAC,CAC3D,CAEA,eAAe,EAAsD,CACjE,OAAO,KAAK,QAAQ,iBAAkB,CAAC,CAAO,CAAC,CACnD,CAEA,eAAe,EAAiC,CAC5C,OAAO,KAAK,QAAQ,iBAAkB,CAAC,CAAI,CAAC,CAChD,CAEA,OAAuB,CACnB,OAAO,KAAK,QAAQ,QAAS,CAAC,CAAC,CACnC,CAEA,SAAqC,CACjC,OAAO,KAAK,QAAQ,UAAW,CAAC,CAAC,CACrC,CAEA,SAAqC,CACjC,OAAO,KAAK,QAAQ,UAAW,CAAC,CAAC,CACrC,CAEA,OAA0B,CACtB,OAAO,KAAK,QAAQ,QAAS,CAAC,CAAC,CACnC,CAEA,aAAoC,CAChC,OAAO,KAAK,QAAQ,cAAe,CAAC,CAAC,CACzC,CAEA,oBAAuC,CACnC,OAAO,KAAK,QAAQ,qBAAsB,CAAC,CAAC,CAChD,CAEA,aAAa,EAA0C,CACnD,OAAO,KAAK,QAAQ,eAAgB,CAAC,CAAS,CAAC,CACnD,CAEA,MAAM,QAAiC,EAAY,EAA6D,CAC5G,OAAQ,MAAM,KAAK,KAAK,EAAS,EAAM,CAAO,CAClD,CAEA,MAAc,KACV,EACA,EACA,EACgB,CAChB,KAAK,WAAW,EAChB,KAAK,eAAiB,EACtB,GAAI,CACA,MAAM,KAAK,KACf,QAAU,CACN,OAAK,aACT,CACA,KAAK,WAAW,EAEhB,IAAM,EAAc,KAAK,WAAa,KAAK,cAAgB,GAAK,KAAK,eAAe,OAAS,GACvF,EAAK,KAAK,cAChB,KAAK,eAAiB,EACtB,IAAM,EAAW,EAA4B,EAAS,CAAI,EACpD,EAAwC,CAC1C,KAAM,iCACN,QAAA,EACA,KACA,UACA,KAAM,EAAS,IACnB,EACA,OAAO,MAAM,IAAI,SAAkB,EAAS,IAAW,CACnD,IAAM,EACF,KAAK,iBAAmB,EAClB,eAAiB,CACb,IAAM,EAAU,KAAK,QAAQ,IAAI,CAAE,EAC9B,GAAW,EAAQ,UAAY,OAGpC,KAAK,QAAQ,OAAO,CAAE,EACtB,EAAQ,QAAU,KAClB,EACI,EACI,4BACA,kBAAkB,EAAQ,mBAAmB,KAAK,iBAAiB,GACvE,CACJ,EACJ,EAAG,KAAK,gBAAgB,EACxB,KACV,KAAK,QAAQ,IAAI,EAAI,CACjB,QAAS,EACT,UACA,SACA,SACJ,CAAC,EACD,GAAI,CACI,EACA,KAAK,aAAa,EAAS,EAAS,QAAQ,EACrC,EAAS,SAAS,OAAS,EAClC,KAAK,OAAO,YAAY,EAAS,EAAS,QAAQ,EAElD,KAAK,OAAO,YAAY,CAAO,CAEvC,OAAS,EAAO,CACZ,KAAK,cAAc,EAAI,aAAiB,MAAQ,EAAY,MAAM,OAAO,CAAK,CAAC,CAAC,CACpF,CACJ,CAAC,CACL,CAEA,aAAqB,EAAuC,EAAgC,CACxF,GAAI,CAAC,KAAK,QAAQ,IAAI,EAAQ,EAAE,EAAG,OACnC,IAAM,EAAa,EAAa,CAAO,EAQvC,GAPI,KAAK,eAAe,OAAS,GAAK,KAAK,YAAc,EAAA,SACrD,KAAK,cAAc,EAInB,KAAK,eAAe,OAAS,GAAA,KAC7B,KAAK,YAAc,GAAA,QACP,CACZ,KAAK,eAAe,KAAK,CAAE,UAAS,WAAU,YAAW,CAAC,EAC1D,KAAK,aAAe,EACpB,KAAK,cAAc,EACnB,MACJ,CACA,IAAM,EAAW,GAAsB,EAAS,CAAQ,EACnD,KAAK,QAAQ,IAAI,EAAQ,EAAE,IAChC,KAAK,eAAe,KAAK,CACrB,QAAS,EAAS,MAClB,SAAU,EAAS,SACnB,WAAY,EAAS,UACzB,CAAC,EACD,KAAK,aAAe,EAAS,WACxB,KAAK,iBACN,KAAK,eAAiB,GACtB,mBAAqB,CACjB,KAAK,eAAiB,GACtB,KAAK,cAAc,CACvB,CAAC,GAET,CAEA,eAA8B,CAC1B,IAAM,EAAS,KAAK,eAGpB,GAFA,KAAK,eAAiB,CAAC,EACvB,KAAK,YAAc,EACf,KAAK,OAAQ,OACjB,IAAM,EAAS,EAAO,OAAQ,GAAU,KAAK,QAAQ,IAAI,EAAM,QAAQ,EAAE,CAAC,EAC1E,GAAI,EAAO,SAAW,EAAG,OACzB,IAAM,EACF,EAAO,SAAW,EACZ,EAAO,EAAE,CAAC,QACV,CACI,KAAM,EACN,QAAA,EACA,SAAU,EAAO,IAAK,GAAU,EAAM,OAAO,CACjD,EACJ,EAA2B,CAAC,EAClC,IAAK,IAAM,KAAS,EAChB,IAAK,IAAM,KAAU,EAAM,SAAU,EAAS,KAAK,CAAM,EAE7D,GAAI,CACI,EAAS,OAAS,EAClB,KAAK,OAAO,YAAY,EAAS,CAAQ,EAEzC,KAAK,OAAO,YAAY,CAAO,CAEvC,OAAS,EAAO,CACZ,IAAM,EAAS,aAAiB,MAAQ,EAAY,MAAM,OAAO,CAAK,CAAC,EACvE,IAAK,IAAM,KAAS,EAAQ,KAAK,cAAc,EAAM,QAAQ,GAAI,CAAM,CAC3E,CACJ,CAEA,YAA2B,CACvB,GAAI,KAAK,OACL,MAAM,KAAK,aAAe,EAAoB,wBAAyB,4BAA4B,CAE3G,CAEA,cAAyB,GAAuC,CAC5D,IAAM,EAAO,EAAM,KACnB,GAAI,GAA6B,CAAI,EAAG,CACpC,GAAI,KAAK,cAAe,OACxB,KAAK,SAAW,EAAK,WAAa,EAClC,KAAK,cAAgB,GACjB,KAAK,cAAc,aAAa,KAAK,YAAY,EACrD,KAAK,aAAe,KACpB,KAAK,eAAe,EACpB,KAAK,aAAe,KACpB,KAAK,YAAc,KACnB,MACJ,CACA,GAAI,EAA8B,CAAI,EAAG,CACrC,KAAK,KAAK,EAAoB,sBAAuB,4CAA4C,CAAC,EAClG,MACJ,CACA,GACI,EAAS,CAAI,IACZ,EAAK,OAAA,mCAAqC,EAAK,OAAA,0CAChD,EAAK,UAAA,EACP,CACE,KAAK,KAAK,EAAoB,sBAAuB,uCAAuC,CAAC,EAC7F,MACJ,CACA,GAAI,GAAqC,CAAI,EAAG,CAC5C,IAAK,IAAM,KAAY,EAAK,UAAW,KAAK,eAAe,CAAQ,EACnE,MACJ,CACA,GACI,EAAS,CAAI,GACb,EAAK,OAAA,yCACL,EAAK,UAAA,EACP,CACE,KAAK,KAAK,EAAoB,sBAAuB,+BAA+B,CAAC,EACrF,MACJ,CACA,KAAK,eAAe,CAAI,CAC5B,EAEA,eAAuB,EAAqB,CACxC,GAAI,CAAC,EAAgC,CAAI,EAAG,CAEpC,EAAS,CAAI,GACb,EAAK,OAAA,mCACL,EAAK,UAAA,GACL,OAAO,EAAK,IAAO,UACnB,OAAO,cAAc,EAAK,EAAE,GAE5B,KAAK,cAAc,EAAK,GAAI,EAAoB,sBAAuB,yBAAyB,CAAC,EAErG,MACJ,CACA,IAAM,EAAU,KAAK,QAAQ,IAAI,EAAK,EAAE,EACnC,KAIL,CADA,KAAK,QAAQ,OAAO,EAAK,EAAE,EAC3B,EAAoB,CAAO,EAC3B,GAAI,CACI,EAAK,GACL,EAAQ,QACJ,KAAK,qBACA,EAAQ,UAAY,YACjB,EAAQ,UAAY,QACpB,EAAQ,UAAY,eACpB,EAAQ,UAAY,mBACtB,EAAK,OACL,GAA4B,EAAQ,QAAS,EAAK,MAAM,CAClE,EAEA,EAAQ,OAAO,GAAuB,EAAK,KAAK,CAAC,CAEzD,OAAS,EAAO,CACZ,EAAQ,OACJ,aAAiB,OAAS,EAAM,OAAS,sBACnC,EACA,EAAoB,sBAAuB,sCAAsC,CAC3F,CACJ,CArB2B,CAsB/B,CAEA,uBAAyC,CACrC,KAAK,KAAK,EAAoB,qBAAsB,0CAA0C,CAAC,CACnG,EAEA,YAAuB,GAA4B,CAC/C,IAAM,EACF,EAAM,iBAAiB,MACjB,EAAM,MACN,EAAoB,cAAe,EAAM,SAAW,uBAAuB,EACrF,KAAK,KAAK,CAAK,CACnB,EAEA,cAAsB,EAAY,EAAoB,CAClD,IAAM,EAAU,KAAK,QAAQ,IAAI,CAAE,EAC9B,IAGL,KAAK,QAAQ,OAAO,CAAE,EACtB,EAAoB,CAAO,EAC3B,EAAQ,OAAO,CAAK,EACxB,CAEA,gBAAwB,EAAe,EAA4B,CAC3D,SAAK,OAgBT,CAbA,KAAK,OAAS,GACd,KAAK,YAAc,EACnB,KAAK,OAAO,oBAAoB,UAAW,KAAK,aAA8B,EAC9E,KAAK,OAAO,oBAAoB,eAAgB,KAAK,kBAAkB,EACvE,KAAK,OAAO,oBAAoB,QAAS,KAAK,WAA4B,EACtE,KAAK,cAAc,aAAa,KAAK,YAAY,EACrD,KAAK,aAAe,KACf,KAAK,eACN,KAAK,cAAc,CAAM,EAE7B,KAAK,aAAe,KACpB,KAAK,YAAc,KACnB,KAAK,eAAiB,CAAC,EACvB,KAAK,YAAc,EACnB,IAAK,IAAM,KAAW,KAAK,QAAQ,OAAO,EACtC,EAAoB,CAAO,EAC3B,EAAQ,OAAO,CAAM,EAEzB,KAAK,QAAQ,MAAM,EACf,GACA,KAAK,eAAe,CAAM,CAPX,CASvB,CACJ,EAQA,MAAM,mBAA6B,IAAI,IAAY,CAC/C,SACA,WACA,kBACA,YACA,YACA,UACA,WACA,WACA,aACA,aACA,cACA,cACJ,CAAC,EAMD,SAAS,GACL,EACA,EAC0D,CAC1D,IAAM,kBAAS,IAAI,IACnB,IAAK,IAAM,KAAQ,EAAU,CACzB,GAAI,EAAE,aAAgB,cAAgB,EAAkB,CAAI,EACxD,OAAO,EAAqB,EAAO,CAA0B,EAEjE,EAAO,IAAI,CAAI,CACnB,CACA,IAAM,kBAAa,IAAI,IACvB,GAAI,CAAC,EAAe,EAAO,kBAAY,IAAI,OAAiB,EACxD,OAAO,EAAqB,EAAO,CAA0B,EAEjE,IAAM,kBAAY,IAAI,IACtB,IAAK,IAAM,KAAU,EACjB,EAAU,IAAI,EAAQ,GAAgB,CAAM,CAAC,EAEjD,IAAM,EAAuB,CAAC,EACxB,kBAAO,IAAI,QACX,EAAc,GAA2B,CAC3C,GAAqB,OAAO,GAAS,WAAjC,EACA,OAAO,EAEX,IAAM,EAAW,EAAK,IAAI,CAAI,EAC9B,GAAI,IAAa,IAAA,GACb,OAAO,EAEX,GAAI,OAAO,kBAAsB,KAAe,aAAgB,kBAE5D,OADA,EAAK,IAAI,EAAM,CAAI,EACZ,EAEX,GAAI,aAAgB,YAAa,CAC7B,IAAM,EAAO,EAAU,IAAI,CAAI,GAAK,EAAK,MAAM,CAAC,EAGhD,OAFA,EAAK,IAAI,EAAM,CAAI,EACnB,EAAM,KAAK,CAAI,EACR,CACX,CACA,GAAI,YAAY,OAAO,CAAI,EAAG,CAC1B,IAAM,EAAW,EAAW,IAAI,CAAI,EACpC,GAAI,CAAC,EACD,MAAM,EAAoB,sBAAuB,oCAAoC,EAEzF,IAAM,EAAS,EAAK,OAKd,EAAM,GAAa,EAHrB,OAAO,kBAAsB,KAAe,aAAkB,kBACxD,EACC,EAAW,CAAM,EACe,CAAQ,EAEnD,OADA,EAAK,IAAI,EAAM,CAAG,EACX,CACX,CACA,GAAI,MAAM,QAAQ,CAAI,EAAG,CACrB,IAAM,EAAU,MAAe,EAAK,MAAM,EAC1C,EAAK,IAAI,EAAM,CAAG,EAClB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAK,OAAQ,GAAS,EAC1C,KAAS,IACT,EAAI,GAAS,EAAW,EAAK,EAAM,GAG3C,OAAO,CACX,CACA,IAAM,EAA+B,OAAO,eAAe,CAAI,IAAM,KAAO,OAAO,OAAO,IAAI,EAAI,CAAC,EACnG,EAAK,IAAI,EAAM,CAAG,EAClB,IAAM,EAAS,EACf,IAAK,IAAM,KAAO,EACV,OAAO,UAAU,eAAe,KAAK,EAAQ,CAAG,IAChD,EAAI,GAAO,EAAW,EAAO,EAAI,GAGzC,OAAO,CACX,EACM,EAAS,EAAW,CAAK,EAC/B,MAAO,CAAE,MAAO,EAAQ,SAAU,EAAO,WAAY,EAAa,CAAM,CAAE,CAC9E,CAEA,SAAS,EAAa,EAAwB,CAC1C,IAAI,EAAa,EACX,kBAAO,IAAI,QACX,EAAS,GAAwB,CAC9B,UAAO,SAAS,CAAU,EAC/B,IAAI,OAAO,GAAS,SAAU,CAC1B,GAAc,EAAI,EAAK,OAAS,EAChC,MACJ,CACA,GAAqB,OAAO,GAAS,WAAjC,EAA2C,CAC3C,GAAc,EACd,MACJ,CACI,MAAK,IAAI,CAAI,EAKjB,IAFA,EAAK,IAAI,CAAI,EACb,GAAc,EACV,aAAgB,YAChB,GAAc,EAAK,gBAChB,GAAI,OAAO,kBAAsB,KAAe,aAAgB,kBACnE,GAAc,EAAK,gBAChB,GAAI,YAAY,OAAO,CAAI,EAC9B,EAAM,EAAK,MAAM,OACd,GAAI,MAAM,QAAQ,CAAI,EAAG,CAC5B,GAAI,OAAO,eAAe,CAAI,IAAM,MAAM,WAAa,EAAa,CAAI,EAAG,CACvE,EAAa,IACb,MACJ,CACA,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAK,OAAQ,GAAS,EAAG,CACjD,IAAM,EAAa,OAAO,yBAAyB,EAAM,OAAO,CAAK,CAAC,EACtE,GAAI,GAAc,EAAE,UAAW,GAAa,CACxC,EAAa,IACb,MACJ,CACA,EAAM,GAAY,KAAK,CAC3B,CACJ,MAAO,GAAI,aAAgB,IACvB,IAAK,GAAM,CAAC,EAAK,KAAU,EACvB,EAAM,CAAG,EACT,EAAM,CAAK,OAEZ,GAAI,aAAgB,IACvB,IAAK,IAAM,KAAS,EAChB,EAAM,CAAK,MAEZ,CACH,IAAM,EAAS,EACf,IAAK,IAAM,KAAO,EACd,GAAI,OAAO,UAAU,eAAe,KAAK,EAAQ,CAAG,EAAG,CACnD,IAAM,EAAa,OAAO,yBAAyB,EAAQ,CAAG,EAE9D,GAAI,IAAQ,aAAe,CAAC,GAAc,EAAE,UAAW,GAAa,CAChE,EAAa,IACb,MACJ,CACA,GAAc,EAAI,EAAI,OAAS,EAC/B,EAAM,EAAW,KAAK,CAC1B,CAER,EApDA,CAqDJ,EAEA,OADA,EAAM,CAAK,EACJ,CACX,CAEA,SAAS,EACL,EACA,EACA,EACO,CACP,GAAI,OAAO,GAAU,YAAc,OAAO,GAAU,SAChD,MAAO,GAKX,GAHsB,OAAO,GAAU,WAAnC,GAGA,EAAK,IAAI,CAAK,EACd,MAAO,GAMX,GAJA,EAAK,IAAI,CAAK,EACV,OAAO,kBAAsB,KAAe,aAAiB,mBAG7D,aAAiB,YACjB,MAAO,CAAC,EAAkB,CAAK,EAEnC,GAAI,YAAY,OAAO,CAAK,EAAG,CAC3B,GAAI,CAAC,GAAe,CAAK,EACrB,MAAO,GAEX,IAAM,EAAS,EAAM,OAYrB,OAXI,OAAO,kBAAsB,KAAe,aAAkB,kBAC9D,CAAI,EAAkB,CAAM,IAG5B,EAAW,IAAI,EAAO,EAAa,CAAK,CAAC,EAClC,IAEP,EAAE,aAAkB,cAAgB,EAAkB,CAAM,EACrD,IAEX,EAAW,IAAI,EAAO,EAAa,CAAK,CAAC,EAClC,GACX,CACA,GAAI,aAAiB,KAAO,aAAiB,KAAO,aAAiB,MAAQ,aAAiB,OAC1F,MAAO,GAEX,GAAI,MAAM,QAAQ,CAAK,EAAG,CACtB,GAAI,EAAa,CAAK,GAAK,EAAqB,CAAK,EACjD,MAAO,GAEX,IAAK,IAAM,KAAS,EAChB,GAAI,CAAC,EAAe,EAAO,EAAY,CAAI,EACvC,MAAO,GAGf,MAAO,EACX,CACA,IAAM,EAAQ,OAAO,eAAe,CAAK,EAIzC,GAHI,IAAU,OAAO,WAAa,IAAU,MAGxC,EAAqB,CAAK,EAC1B,MAAO,GAEX,IAAM,EAAS,EACf,IAAK,IAAM,KAAO,EACd,GAAI,OAAO,UAAU,eAAe,KAAK,EAAQ,CAAG,GAAK,CAAC,EAAe,EAAO,GAAM,EAAY,CAAI,EAClG,MAAO,GAGf,MAAO,EACX,CAEA,SAAS,EAAa,EAAoC,CACtD,IAAM,EAAiB,EACvB,IAAK,IAAM,KAAO,EAAQ,CACtB,GAAI,CAAC,OAAO,UAAU,eAAe,KAAK,EAAO,CAAG,EAChD,SAEJ,IAAM,EAAQ,OAAO,CAAG,EACxB,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,GAAK,GAAS,EAAM,QAAU,OAAO,CAAK,IAAM,EACpF,MAAO,EAEf,CACA,MAAO,EACX,CAEA,SAAS,EAAqB,EAAwB,CAClD,IAAK,IAAM,KAAU,OAAO,sBAAsB,CAAK,EACnD,GAAI,OAAO,UAAU,qBAAqB,KAAK,EAAO,CAAM,EACxD,MAAO,GAGf,MAAO,EACX,CAEA,SAAS,GAAe,EAAgC,CACpD,OAAO,GAA2B,IAAI,EAAK,WAAW,CAC1D,CAEA,SAAS,EAAa,EAAqC,CAIvD,OAHI,aAAgB,SACT,CAAE,OAAQ,EAAK,WAAY,OAAQ,EAAK,WAAY,SAAU,EAAK,EAEvE,CAAE,OAAQ,EAAK,WAAY,OAAS,EAAoB,OAAQ,SAAU,EAAM,CAC3F,CAEA,SAAS,GAAa,EAAuB,EAAyB,EAAyC,CAC3G,GAAI,EAAS,SACT,OAAO,IAAI,SAAS,EAAQ,EAAS,OAAQ,EAAS,MAAM,EAEhE,IAAM,EAAQ,EAAK,YAKnB,OAAO,IAAI,EAAM,EAAQ,EAAS,OAAQ,EAAS,MAAM,CAC7D,CAEA,SAAS,GAAgB,EAAkC,CACvD,IAAM,EAAU,EAIhB,OAHI,OAAO,EAAQ,UAAa,WACrB,EAAQ,SAAS,EAErB,gBAAgB,EAAQ,CAAE,SAAU,CAAC,CAAM,CAAE,CAAC,CACzD,CAEA,SAAS,EAAkB,EAAkD,CACzE,OAAQ,EAAmC,YAAc,EAC7D,CCl1BA,MAAM,mBAAuB,IAAI,IAAmB,CAChD,SACA,WACA,cACA,YACA,aACA,MACA,UACA,MACA,MACA,UACA,SACA,aACA,aACA,OACA,aACA,cACA,kBACA,aACA,mBACA,kBACJ,CAAC,EAGK,mBAAqB,IAAI,IAAmB,CAC9C,OACA,QACA,UACA,iBACA,QACA,UACA,SACJ,CAAC,EAMK,mBAAuB,IAAI,IAAmB,CAAC,WAAY,cAAe,oBAAoB,CAAC,EAE/F,MAAa,CAAC,EAOpB,IAAM,GAAN,KAAuB,CACnB,mBAAS,IAAI,IACb,mBAAY,IAAI,IAChB,GAA0B,QAAQ,QAAQ,EAC1C,mBAAe,IAAI,IAEnB,SAAY,EAAwB,EAAiB,EAAoC,CACrF,GAAI,GAAqB,IAAI,CAAO,EAChC,OAAO,EAAK,EAEhB,GAAI,GAAmB,IAAI,CAAO,EAE9B,OADI,KAAK,GAAa,OAAS,EAAU,KAAK,GAAc,CAAI,EACzD,KAAK,GAAc,SAAY,CAClC,IAAM,EAAS,MAAM,EAAK,EAE1B,OADA,KAAK,GAAa,MAAM,EACjB,CACX,CAAC,EAEL,GACI,IAAY,YACZ,IAAY,eACZ,GAAG,IAAY,UAAY,IAAY,aAAe,KAAK,GAAa,KAAO,GAE/E,OAAO,KAAK,GAAW,EAAQ,EAAS,CAAI,EAAG,CAAI,EAEvD,IAAM,EAAU,IAAY,YAAc,EAAS,EAAK,EAAE,EAAI,EAAK,GAAK,KAClE,EAAW,GAAS,WAAa,IAAY,cAAgB,EAAK,GAAK,IAAA,IAGvE,GAFa,OAAO,GAAa,SAAW,KAAK,GAAa,IAAI,CAAQ,EAAI,IAAA,MAI/E,GAAW,OAAO,EAAQ,MAAS,SAC9B,EAAQ,KACR,OAAO,GAAa,SAClB,UAAU,IACV,EAAQ,EAAS,CAAI,GACjC,OAAO,KAAK,GAAW,EAAM,SAAY,CACrC,GAAI,CACA,IAAM,EAAS,MAAM,EAAK,EAO1B,OANI,GAAW,EAAS,CAAM,IACtB,OAAO,GAAa,UAAU,KAAK,GAAa,OAAO,CAAQ,EAC/D,OAAO,EAAO,UAAa,UAC3B,KAAK,GAAa,IAAI,EAAO,SAAU,GAAQ,UAAU,EAAO,UAAU,GAG3E,CACX,QAAU,CAEN,GADI,IAAY,eAAiB,OAAO,GAAa,UAAU,KAAK,GAAa,OAAO,CAAQ,EAC5F,IAAY,UAAY,IAAY,WAC/B,IAAA,GAAM,CAAC,EAAQ,KAAc,KAAK,GAC/B,IAAc,EAAK,IAAI,KAAK,GAAa,OAAO,CAAM,CAGtE,CACJ,CAAC,CACL,CAEA,GAAc,EAA8B,EAAoC,CAC5E,IAAM,EAAU,KAAK,GACf,EAAW,IAAS,KAAO,IAAA,GAAY,KAAK,GAAO,IAAI,CAAI,EAC3D,GAAU,UACZ,MAAM,EACF,GACA,MAAM,EAEH,EAAK,GAChB,CAAG,EACG,EAAU,EAAO,KAAK,EAAM,CAAI,EAWtC,OAVA,KAAK,GAAU,IAAI,CAAO,EACtB,IAAS,MACT,KAAK,GAAO,IAAI,EAAM,CAAO,EAEjC,EAAa,SAAW,CACpB,KAAK,GAAU,OAAO,CAAO,EACzB,IAAS,MAAQ,KAAK,GAAO,IAAI,CAAI,IAAM,GAC3C,KAAK,GAAO,OAAO,CAAI,CAE/B,CAAC,EACM,CACX,CAEA,GAAiB,EAAoC,CACjD,IAAM,EAAkB,KAAK,GACvB,EAAU,MAAM,KAAK,KAAK,EAAS,EACnC,GAAU,UACZ,MAAM,EACN,MAAM,QAAQ,IAAI,CAAO,EAClB,EAAK,GAChB,CAAG,EAEH,MADA,MAAK,GAAW,EAAO,KAAK,EAAM,CAAI,EAC/B,CACX,CACJ,EAIA,SAAS,EAAQ,EAAwB,EAAyC,CAO9E,OANI,GAAqB,IAAI,CAAO,GAAK,OAAO,EAAK,IAAO,SACjD,EAAK,GAEZ,IAAY,cAAgB,EAAK,KAAO,YACjC,uBAEJ,IACX,CAIA,IAAM,GAAN,KAAoB,CAOa,MAN7B,OAA+F,CAAC,EAChG,YAAsB,EACtB,eAAyB,GACzB,aAA8C,KAC9C,OAAiB,GAEjB,YAAY,EAA2C,CAA1B,KAAA,MAAA,CAA2B,CAExD,QAAQ,EAAyC,EAA2B,CAAC,EAAG,EAAW,GAAa,CACpG,GAAI,KAAK,OAAQ,OACjB,IAAM,EAAa,GAAa,CAAQ,EASxC,GARI,KAAK,OAAO,OAAS,GAAK,KAAK,YAAc,EAAA,SAC7C,KAAK,MAAM,EAIX,GACA,KAAK,OAAO,OAAS,GAAA,KACrB,KAAK,YAAc,GAAA,QACP,CACZ,KAAK,OAAO,KAAK,CAAE,WAAU,UAAS,CAAC,EACvC,KAAK,aAAe,EACpB,KAAK,MAAM,EACX,MACJ,CACA,IAAM,EAAW,GAAsB,EAAU,CAAQ,EACzD,KAAK,OAAO,KAAK,CAAE,SAAU,EAAS,MAAO,SAAU,EAAS,QAAS,CAAC,EAC1E,KAAK,aAAe,EAAS,WACxB,KAAK,iBACN,KAAK,eAAiB,GACtB,mBAAqB,CACjB,GAAI,KAAK,QAAU,KAAK,OAAO,SAAW,EAAG,CACzC,KAAK,eAAiB,GACtB,MACJ,CAGA,KAAK,eAAiB,KAAK,mBAAmB,EAC9C,KAAK,aAAa,MAAM,YAAY,IAAI,CAC5C,CAAC,EAET,CAEA,OAAc,CACV,KAAK,OAAS,GACd,KAAK,OAAS,CAAC,EACf,KAAK,YAAc,EACnB,KAAK,cAAc,MAAM,MAAM,EAC/B,KAAK,cAAc,MAAM,MAAM,EAC/B,KAAK,aAAe,IACxB,CAEA,oBAA6C,CACzC,IAAM,EAAU,IAAI,eAMpB,OALA,EAAQ,MAAM,iBAAiB,cAAiB,CAC5C,KAAK,eAAiB,GACtB,KAAK,MAAM,CACf,CAAC,EACD,EAAQ,MAAM,MAAM,EACb,CACX,CAEA,OAAc,CACV,IAAM,EAAS,KAAK,OAGpB,GAFA,KAAK,OAAS,CAAC,EACf,KAAK,YAAc,EACf,KAAK,QAAU,EAAO,SAAW,EAAG,OACxC,IAAM,EACF,EAAO,SAAW,EACZ,EAAO,EAAE,CAAC,SACV,CACI,KAAM,wCACN,QAAA,EACA,UAAW,EAAO,IAAK,GAAU,EAAM,QAAQ,CACnD,EACJ,EAA2B,CAAC,EAClC,IAAK,IAAM,KAAS,EAChB,IAAK,IAAM,KAAU,EAAM,SAAU,EAAS,KAAK,CAAM,EAE7D,GAAmB,KAAK,MAAO,EAAU,CAAQ,CACrD,CACJ,EAEA,SAAgB,GAAgB,EAAgB,EAA2B,KAA0B,CACjG,IAAM,EAAY,IAAI,GAChB,EAAY,IAAI,GAAc,CAAK,EACnC,EAAiB,GAAiC,CAChD,KAAM,SAAW,IAAM,EAAM,SAAW,EAAM,SAAS,OAG3D,IAAI,GAAoC,EAAM,IAAI,EAAG,CACjD,IAAI,EAAY,EAAM,KAAK,SAAS,OAC9B,GAAyB,EAAU,IAAa,CAClD,IAEA,EAAU,QAAQ,EAAU,EAAU,IAAc,CAAC,CACzD,EACA,IAAK,IAAM,KAAW,EAAM,KAAK,SAC7B,EAA2B,EAAO,EAAK,EAAW,EAAS,CAAO,EAEtE,MACJ,CACA,EAA2B,EAAO,EAAK,EAAW,EAAM,IAAI,CAD5D,CAEJ,EAOA,OANA,EAAM,iBAAiB,UAAW,CAAa,EAC/C,EAAM,YAAY,CACd,KAAM,+BACN,QAAA,EACA,SAAU,CACd,CAAC,EACM,CACH,OAAQ,CACJ,EAAM,oBAAoB,UAAW,CAAa,EAClD,EAAU,MAAM,CACpB,CACJ,CACJ,CAEA,eAAe,EACX,EACA,EACA,EACA,EACA,GAAyB,EAAU,IAAa,GAAmB,EAAO,EAAU,CAAQ,EAC/E,CACb,GAAI,CAAC,GAAyB,CAAI,EAC9B,OAEJ,IAAM,EAAK,OAAO,EAAK,IAAO,UAAY,OAAO,cAAc,EAAK,EAAE,EAAI,EAAK,GAAK,EACpF,GAAI,CAAC,GAA+B,CAAI,EAAG,CACvC,EAAQ,EAAc,EAAI,EAAoB,sBAAuB,iCAAiC,CAAC,CAAC,EACxG,MACJ,CACA,GAAI,CAAC,GAAgB,EAAK,OAAO,EAAG,CAChC,EACI,EACI,EAAK,GACL,EAAoB,sBAAuB,+BAA+B,OAAO,EAAK,OAAO,GAAG,CACpG,CACJ,EACA,MACJ,CACA,IAAM,EAAU,EAAK,QACf,EAAO,EAAK,KAClB,GAAI,CACA,IAAI,EAAiC,EACjC,EACJ,GAAI,IAAY,aAAc,CAC1B,GAAM,CAAC,EAAM,EAAO,GAAa,EACjC,GACK,IAAS,YAAc,IAAS,aACjC,CAAC,EAAoB,CAAK,GAC1B,CAAC,MAAM,QAAQ,CAAS,EAExB,MAAM,EAAoB,sBAAuB,4BAA4B,EAEjF,EAAkB,EAAK,CAAK,EAC5B,EAAkB,EAClB,MAAe,GAAc,EAAK,EAAM,EAAO,CAAS,CAC5D,MACI,EAAkB,EAAK,CAAO,EAC9B,MAAe,EAAc,EAAK,EAAS,CAAI,EAEnD,IAAM,EAAS,MAAM,EAAU,SAAS,EAAS,EAAM,CAAM,EACvD,EAAkB,GAA6B,EAAiB,CAAe,EACrF,EAAQ,GAAgB,EAAK,GAAI,EAAgB,MAAM,EAAG,EAAgB,QAAQ,CACtF,OAAS,EAAO,CACZ,EAAQ,EAAc,EAAK,GAAI,CAAK,CAAC,CACzC,CACJ,CAEA,SAAS,EAAkB,EAAgB,EAA8B,CACrE,GAAI,OAAQ,EAAI,IAAyB,WACrC,MAAM,EAAoB,sBAAuB,sCAAsC,GAAS,CAExG,CAEA,SAAS,EAAc,EAAgB,EAAwB,EAAmC,CAC9F,IAAM,EAAe,GAAsB,EAAK,EAAS,CAAI,EAI7D,OAHI,IAAiB,KAGb,EAAI,EAAQ,CAA+D,MAC/E,EACA,EAA2B,EAAS,CAAa,CACrD,EALW,CAMf,CAEA,eAAe,GACX,EACA,EACA,EACA,EACgB,CAChB,IAAM,EAAO,MAAM,EAAI,MAAM,CAAI,EAC7B,EACJ,GAAI,CACA,EAAS,MAAM,EAAc,EAAK,EAAS,CAAC,EAAM,GAAG,CAAI,CAAC,CAC9D,OAAS,EAAO,CACZ,GAAI,CACA,MAAM,EAAI,SAAS,CAAI,CAC3B,MAAQ,CAAC,CACT,MAAM,CACV,CAMA,OALI,IAAS,YACT,MAAM,EAAI,OAAO,CAAI,EAErB,MAAM,EAAI,SAAS,CAAI,EAEpB,CACX,CAEA,SAAS,GAAsB,EAAgB,EAAwB,EAA0C,CAC7G,IAAM,EAAY,EAClB,GAAI,IAAY,WAAa,IAAY,aAAc,CACnD,GAAM,CAAC,EAAM,EAAO,GAAQ,EAC5B,GAAI,OAAO,GAAS,UAAY,OAAO,GAAU,SAC7C,OAAO,KAEX,IAAM,EAAa,EAAsB,CAAI,EAU7C,OATI,IAAe,KACR,KAEP,IAAY,WAAa,OAAO,EAAU,eAAkB,WACrD,EAAU,cAAc,EAAM,EAAO,CAAU,EAEtD,IAAY,cAAgB,OAAO,EAAU,kBAAqB,WAC3D,EAAU,iBAAiB,EAAM,EAAO,CAAU,EAEtD,IACX,CAEA,GAAI,IAAY,UAAW,CACvB,GAAM,CAAC,EAAM,EAAO,EAAS,GAAW,EACxC,GAAI,OAAO,GAAS,UAAY,OAAO,GAAU,UAAY,OAAO,EAAU,eAAkB,WAC5F,OAAO,KAEX,IAAM,EAAgB,EAAsB,CAAO,EACnD,OAAO,IAAkB,KAAO,KAAO,EAAU,cAAc,EAAM,EAAO,EAAe,CAAO,CACtG,CAEA,GAAI,IAAY,aAAc,CAC1B,GAAM,CAAC,EAAM,EAAO,GAAO,EAC3B,GAAI,OAAO,GAAS,UAAY,OAAO,GAAU,UAAY,OAAO,EAAU,kBAAqB,WAC/F,OAAO,KAEX,IAAM,EAAY,GAAoB,CAAG,EACzC,OAAO,IAAc,KAAO,KAAO,EAAU,iBAAiB,EAAM,EAAO,CAAS,CACxF,CAEA,OAAO,IACX,CAEA,SAAS,GAAgB,EAAY,EAA+C,CAChF,MAAO,CACH,KAAM,EACN,QAAA,EACA,KACA,GAAI,GACJ,QACJ,CACJ,CAEA,SAAS,EAAc,EAAY,EAA4C,CAC3E,MAAO,CACH,KAAM,EACN,QAAA,EACA,KACA,GAAI,GACJ,MAAO,EAAqB,CAAK,CACrC,CACJ,CAEA,SAAS,GACL,EACA,EACA,EAA2B,CAAC,EACxB,CACJ,GAAI,EAAS,OAAS,EAClB,GAAI,CACA,EAAM,YAAY,EAAU,CAAQ,EACpC,MACJ,MAAQ,CAAC,CAEb,EAAM,YAAY,CAAQ,CAC9B,CAQA,MAAM,mBAA6B,IAAI,IAAY,CAC/C,SACA,WACA,kBACA,YACA,YACA,UACA,WACA,WACA,aACA,aACA,cACA,cACJ,CAAC,EAMD,SAAS,GACL,EACA,EAC0D,CAC1D,IAAM,kBAAS,IAAI,IACnB,IAAK,IAAM,KAAQ,EAAU,CACzB,GAAI,EAAE,aAAgB,cAAgB,EAAkB,CAAI,EACxD,OAAO,EAAqB,EAAO,CAA0B,EAEjE,EAAO,IAAI,CAAI,CACnB,CACA,IAAM,kBAAa,IAAI,IACvB,GAAI,CAAC,EAAe,EAAO,kBAAY,IAAI,OAAiB,EACxD,OAAO,EAAqB,EAAO,CAA0B,EAEjE,IAAM,kBAAY,IAAI,IACtB,IAAK,IAAM,KAAU,EACjB,EAAU,IAAI,EAAQ,GAAgB,CAAM,CAAC,EAEjD,IAAM,EAAuB,CAAC,EACxB,kBAAO,IAAI,QACX,EAAc,GAA2B,CAC3C,GAAqB,OAAO,GAAS,WAAjC,EACA,OAAO,EAEX,IAAM,EAAW,EAAK,IAAI,CAAI,EAC9B,GAAI,IAAa,IAAA,GACb,OAAO,EAEX,GAAI,OAAO,kBAAsB,KAAe,aAAgB,kBAE5D,OADA,EAAK,IAAI,EAAM,CAAI,EACZ,EAEX,GAAI,aAAgB,YAAa,CAC7B,IAAM,EAAO,EAAU,IAAI,CAAI,GAAK,EAAK,MAAM,CAAC,EAGhD,OAFA,EAAK,IAAI,EAAM,CAAI,EACnB,EAAM,KAAK,CAAI,EACR,CACX,CACA,GAAI,YAAY,OAAO,CAAI,EAAG,CAC1B,IAAM,EAAW,EAAW,IAAI,CAAI,EACpC,GAAI,CAAC,EACD,MAAM,EAAoB,sBAAuB,oCAAoC,EAEzF,IAAM,EAAS,EAAK,OAKd,EAAM,GAAa,EAHrB,OAAO,kBAAsB,KAAe,aAAkB,kBACxD,EACC,EAAW,CAAM,EACe,CAAQ,EAEnD,OADA,EAAK,IAAI,EAAM,CAAG,EACX,CACX,CACA,GAAI,MAAM,QAAQ,CAAI,EAAG,CACrB,IAAM,EAAU,MAAe,EAAK,MAAM,EAC1C,EAAK,IAAI,EAAM,CAAG,EAClB,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAK,OAAQ,GAAS,EAC1C,KAAS,IACT,EAAI,GAAS,EAAW,EAAK,EAAM,GAG3C,OAAO,CACX,CACA,IAAM,EAA+B,OAAO,eAAe,CAAI,IAAM,KAAO,OAAO,OAAO,IAAI,EAAI,CAAC,EACnG,EAAK,IAAI,EAAM,CAAG,EAClB,IAAM,EAAS,EACf,IAAK,IAAM,KAAO,EACV,OAAO,UAAU,eAAe,KAAK,EAAQ,CAAG,IAChD,EAAI,GAAO,EAAW,EAAO,EAAI,GAGzC,OAAO,CACX,EACM,EAAS,EAAW,CAAK,EAC/B,MAAO,CAAE,MAAO,EAAQ,SAAU,EAAO,WAAY,GAAa,CAAM,CAAE,CAC9E,CAEA,SAAS,GAAa,EAAwB,CAC1C,IAAI,EAAa,EACX,kBAAO,IAAI,QACX,EAAS,GAAwB,CAC9B,UAAO,SAAS,CAAU,EAC/B,IAAI,OAAO,GAAS,SAAU,CAC1B,GAAc,EAAI,EAAK,OAAS,EAChC,MACJ,CACA,GAAqB,OAAO,GAAS,WAAjC,EAA2C,CAC3C,GAAc,EACd,MACJ,CACI,MAAK,IAAI,CAAI,EAKjB,IAFA,EAAK,IAAI,CAAI,EACb,GAAc,EACV,aAAgB,YAChB,GAAc,EAAK,gBAChB,GAAI,OAAO,kBAAsB,KAAe,aAAgB,kBACnE,GAAc,EAAK,gBAChB,GAAI,YAAY,OAAO,CAAI,EAC9B,EAAM,EAAK,MAAM,OACd,GAAI,MAAM,QAAQ,CAAI,EAAG,CAC5B,GAAI,OAAO,eAAe,CAAI,IAAM,MAAM,WAAa,GAAa,CAAI,EAAG,CACvE,EAAa,IACb,MACJ,CACA,IAAK,IAAI,EAAQ,EAAG,EAAQ,EAAK,OAAQ,GAAS,EAAG,CACjD,IAAM,EAAa,OAAO,yBAAyB,EAAM,OAAO,CAAK,CAAC,EACtE,GAAI,GAAc,EAAE,UAAW,GAAa,CACxC,EAAa,IACb,MACJ,CACA,EAAM,GAAY,KAAK,CAC3B,CACJ,MAAO,GAAI,aAAgB,IACvB,IAAK,GAAM,CAAC,EAAK,KAAU,EACvB,EAAM,CAAG,EACT,EAAM,CAAK,OAEZ,GAAI,aAAgB,IACvB,IAAK,IAAM,KAAS,EAChB,EAAM,CAAK,MAEZ,CACH,IAAM,EAAS,EACf,IAAK,IAAM,KAAO,EACd,GAAI,OAAO,UAAU,eAAe,KAAK,EAAQ,CAAG,EAAG,CACnD,IAAM,EAAa,OAAO,yBAAyB,EAAQ,CAAG,EAE9D,GAAI,IAAQ,aAAe,CAAC,GAAc,EAAE,UAAW,GAAa,CAChE,EAAa,IACb,MACJ,CACA,GAAc,EAAI,EAAI,OAAS,EAC/B,EAAM,EAAW,KAAK,CAC1B,CAER,EApDA,CAqDJ,EAEA,OADA,EAAM,CAAK,EACJ,CACX,CAEA,SAAS,EACL,EACA,EACA,EACO,CACP,GAAI,OAAO,GAAU,YAAc,OAAO,GAAU,SAChD,MAAO,GAKX,GAHsB,OAAO,GAAU,WAAnC,GAGA,EAAK,IAAI,CAAK,EACd,MAAO,GAMX,GAJA,EAAK,IAAI,CAAK,EACV,OAAO,kBAAsB,KAAe,aAAiB,mBAG7D,aAAiB,YACjB,MAAO,CAAC,EAAkB,CAAK,EAEnC,GAAI,YAAY,OAAO,CAAK,EAAG,CAC3B,GAAI,CAAC,GAAe,CAAK,EACrB,MAAO,GAEX,IAAM,EAAS,EAAM,OAYrB,OAXI,OAAO,kBAAsB,KAAe,aAAkB,kBAC9D,CAAI,EAAkB,CAAM,IAG5B,EAAW,IAAI,EAAO,GAAa,CAAK,CAAC,EAClC,IAEP,EAAE,aAAkB,cAAgB,EAAkB,CAAM,EACrD,IAEX,EAAW,IAAI,EAAO,GAAa,CAAK,CAAC,EAClC,GACX,CACA,GAAI,aAAiB,KAAO,aAAiB,KAAO,aAAiB,MAAQ,aAAiB,OAC1F,MAAO,GAEX,GAAI,MAAM,QAAQ,CAAK,EAAG,CACtB,GAAI,GAAa,CAAK,GAAK,GAAqB,CAAK,EACjD,MAAO,GAEX,IAAK,IAAM,KAAS,EAChB,GAAI,CAAC,EAAe,EAAO,EAAY,CAAI,EACvC,MAAO,GAGf,MAAO,EACX,CACA,IAAM,EAAQ,OAAO,eAAe,CAAK,EAIzC,GAHI,IAAU,OAAO,WAAa,IAAU,MAGxC,GAAqB,CAAK,EAC1B,MAAO,GAEX,IAAM,EAAS,EACf,IAAK,IAAM,KAAO,EACd,GAAI,OAAO,UAAU,eAAe,KAAK,EAAQ,CAAG,GAAK,CAAC,EAAe,EAAO,GAAM,EAAY,CAAI,EAClG,MAAO,GAGf,MAAO,EACX,CAEA,SAAS,GAAa,EAAoC,CACtD,IAAM,EAAiB,EACvB,IAAK,IAAM,KAAO,EAAQ,CACtB,GAAI,CAAC,OAAO,UAAU,eAAe,KAAK,EAAO,CAAG,EAChD,SAEJ,IAAM,EAAQ,OAAO,CAAG,EACxB,GAAI,CAAC,OAAO,UAAU,CAAK,GAAK,EAAQ,GAAK,GAAS,EAAM,QAAU,OAAO,CAAK,IAAM,EACpF,MAAO,EAEf,CACA,MAAO,EACX,CAEA,SAAS,GAAqB,EAAwB,CAClD,IAAK,IAAM,KAAU,OAAO,sBAAsB,CAAK,EACnD,GAAI,OAAO,UAAU,qBAAqB,KAAK,EAAO,CAAM,EACxD,MAAO,GAGf,MAAO,EACX,CAEA,SAAS,GAAe,EAAgC,CACpD,OAAO,GAA2B,IAAI,EAAK,WAAW,CAC1D,CAEA,SAAS,GAAa,EAAqC,CAIvD,OAHI,aAAgB,SACT,CAAE,OAAQ,EAAK,WAAY,OAAQ,EAAK,WAAY,SAAU,EAAK,EAEvE,CAAE,OAAQ,EAAK,WAAY,OAAS,EAAoB,OAAQ,SAAU,EAAM,CAC3F,CAEA,SAAS,GAAa,EAAuB,EAAyB,EAAyC,CAC3G,GAAI,EAAS,SACT,OAAO,IAAI,SAAS,EAAQ,EAAS,OAAQ,EAAS,MAAM,EAEhE,IAAM,EAAQ,EAAK,YAKnB,OAAO,IAAI,EAAM,EAAQ,EAAS,OAAQ,EAAS,MAAM,CAC7D,CAEA,SAAS,GAAgB,EAAkC,CACvD,IAAM,EAAU,EAIhB,OAHI,OAAO,EAAQ,UAAa,WACrB,EAAQ,SAAS,EAErB,gBAAgB,EAAQ,CAAE,SAAU,CAAC,CAAM,CAAE,CAAC,CACzD,CAEA,SAAS,EAAkB,EAAkD,CACzE,OAAQ,EAAmC,YAAc,EAC7D,CC9wBA,MACa,GAAsB,6BAItB,GAAmC,0CCiB1C,mBAAuB,IAAI,IAAmB,CAChD,SACA,WACA,cACA,YACA,aACA,MACA,UACA,MACA,MACA,UACA,SACA,aACA,aACA,OACA,aACA,cACA,kBACA,mBACA,kBACJ,CAAC,EACK,kBAAuB,IAAI,IAAmB,CAAC,iBAAkB,QAAS,UAAW,SAAS,CAAC,EAiCrG,IAAa,GAAb,KAAqC,CAaJ,OAZ7B,yBAAmB,IAAI,IACvB,MAA8B,KAC9B,OAAgC,KAChC,QAAkB,EAClB,8BAAwB,IAAI,IAC5B,aAAsC,QAAQ,QAAQ,EACtD,UAAmC,QAAQ,QAAQ,EACnD,eAAyC,KACzC,kBAAiD,KACjD,eAAwC,QAAQ,QAAQ,EACxD,MAAuD,KAEvD,YAAY,EAAiC,CAAhB,KAAA,OAAA,CAAiB,CAE9C,QAAQ,EAAyB,CAC7B,IAAM,EAAmB,CACrB,OACA,OAAQ,KACR,OAAQ,GACR,QAAS,GACT,SAAU,EACV,6BAAc,IAAI,IAClB,aAAc,EACd,wBAAS,IAAI,IACb,iBAAkB,EAClB,wBAAS,IAAI,IACb,SAAU,KAAK,IAAI,EACnB,eAAgB,IACpB,EACA,KAAK,SAAS,IAAI,CAAO,EACzB,KAAK,QAAU,gBAAkB,KAAK,eAAe,EAAG,GAA0B,EAsDlF,EAAK,iBAAiB,UArDC,GAAiC,CACpD,GAAI,EAAM,SAAW,IAAM,EAAM,SAAW,KAAK,OAAQ,OACzD,IAAM,EAAO,EAAM,KACnB,GAAI,CAAC,EAAS,CAAI,EAAG,OAErB,GADA,EAAQ,SAAW,KAAK,IAAI,EACxB,EAAK,OAAA,uCAAyC,OAAO,EAAK,IAAO,SAAU,CAC3E,IAAM,EAAU,KAAK,cAAc,IAAI,EAAK,EAAE,EAC9C,GAAI,CAAC,GAAW,EAAQ,UAAY,EAAS,CACzC,EAAM,MAAM,EAAE,EAAE,YAAY,CAAE,KAAM,GAAkC,GAAI,MAAO,CAAC,EAClF,IAAK,IAAM,KAAmB,EAAM,MAAO,EAAgB,MAAM,EACjE,MACJ,CACA,KAAK,cAAc,OAAO,EAAK,EAAE,EACjC,aAAa,EAAQ,OAAO,EACxB,EAAK,KAAO,IAAQ,EAAM,MAAM,SAAW,EAAG,EAAQ,QAAQ,CAAC,EAAM,MAAM,GAAI,EAAM,MAAM,EAAE,CAAC,EAC7F,EAAQ,OAAO,KAAK,aAAa,EAAK,KAAK,CAAC,EACjD,MACJ,CACA,GAAI,EAAK,OAAA,gCAAkC,OAAO,EAAK,IAAO,SAAU,OACxE,IAAM,EAAS,GAAoB,CAC/B,EAAK,YAAY,CACb,KAAM,sCACN,GAAI,EAAK,GACT,GAAI,IAAU,IAAA,GACd,GAAI,IAAU,IAAA,GAAY,CAAC,EAAI,CAAE,MAAO,EAAqB,CAAK,CAAE,CACxE,CAAC,CACL,EACI,EAAK,KAAO,OACZ,EAAM,EACC,EAAK,KAAO,SACnB,KAAU,aAAa,CAAO,CAAC,CAAC,SACtB,EAAM,EACX,GAAU,CACP,EAAM,CAAK,EACX,KAAK,QAAQ,CAAK,CACtB,CACJ,EACO,EAAK,KAAO,QACnB,KAAK,QACD,EACI,wBACA,yDACJ,CACJ,EACO,EAAK,KAAO,mBACnB,KAAU,iBAAiB,CAAO,CAAC,CAAC,SAAW,EAAM,EAAG,CAAK,EACtD,EAAK,KAAO,oBACnB,KAAK,iBAAiB,CAAO,EAC7B,EAAM,GAEN,EAAM,EAAoB,sBAAuB,mCAAmC,CAAC,CAE7F,CAC8C,EAC9C,EAAK,iBAAiB,mBAAsB,CACxC,KAAU,aAAa,CAAO,CAAC,CAAC,MAAO,GAAU,KAAK,QAAQ,CAAK,CAAC,CACxE,CAAC,EACD,IAAM,EAA2B,CAC7B,SAAU,CAAE,OAAQ,KAAK,MAAO,EAChC,aAAc,EAAS,IAAa,EAAK,YAAY,EAAS,GAAY,CAAC,CAAC,EAC5E,kBAAmB,EAAM,IAAa,EAAK,iBAAiB,EAAM,CAAQ,EAC1E,qBAAsB,EAAM,IAAa,EAAK,oBAAoB,EAAM,CAAQ,CACpF,EACA,EAAQ,OAAS,GAAgB,KAAK,WAAW,CAAO,EAAG,CAAK,EAChE,EAAK,MAAM,CACf,CAEA,WAAmB,EAA6B,CAC5C,IAAM,EAAoE,CAAC,EAC3E,IAAK,IAAM,KAAW,EAClB,EAAQ,IAAY,GAAG,IAAS,KAAK,OAAO,EAAS,EAAS,CAAI,EAEtE,OAAO,CACX,CAEA,OAAe,EAAkB,EAAwB,EAAmC,CACxF,GAAI,IAAY,OACZ,OAAO,KAAK,mBAAqB,KAAK,YAAY,EAAS,EAAK,EAAuB,CAAC,EAC5F,GAAI,IAAY,QAAS,OAAO,KAAK,aAAa,CAAO,EACzD,GAAI,IAAY,UAAW,OAAO,KAAK,mBAAqB,KAAK,eAAe,CAAO,CAAC,EACxF,GAAI,IAAY,WACZ,OAAO,QAAQ,OACX,EAAoB,oBAAqB,0DAA0D,CACvG,EAEJ,IAAM,GAAa,SAAY,CAC3B,MAAM,KAAK,aAEX,KAAK,eACD,EACA,IAAY,SAAW,IAAY,gBAAkB,CAAC,EAAqB,IAAI,CAAO,CAC1F,EACA,IAAM,EAAQ,KAAK,MACnB,GAAI,IAAY,QAAS,CACrB,GACI,EAAK,KAAO,aACZ,KAAK,iBAAmB,GACxB,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,KACrB,GAAW,IAAW,IAAY,EAAO,aAAa,KAAO,GAAK,EAAO,QAAQ,KAAO,EAC7F,EAEA,MAAM,EACF,oBACA,0DACJ,EAEJ,IAAM,EAAY,MAAM,EAAM,MAAM,MAAM,EAAK,EAA8B,EACvE,EAAY,EAAQ,WAE1B,OADA,EAAQ,aAAa,IAAI,EAAW,CAAS,EACtC,CACX,CACA,GAAI,IAAY,WAAY,CACxB,GAAI,CAAC,EAAS,EAAK,EAAE,EAAG,MAAM,EAAoB,sBAAuB,2BAA2B,EACpG,IAAM,EAAU,EAAK,GACf,EAAgB,EAAQ,SACxB,EAAS,IAAkB,IAAA,GAAY,IAAA,GAAY,EAAQ,QAAQ,IAAI,CAAa,EAC1F,GAAI,IAAkB,IAAA,IAAa,CAAC,EAChC,MAAM,EACF,yBACA,mDACJ,EAEJ,GAAI,GAAU,EAAO,YAAc,EAAQ,KACvC,MAAM,EACF,yBACA,iDACJ,EAEJ,IAAM,EAAY,EAAQ,OAAS,IAAA,GAAY,IAAA,GAAY,EAAQ,aAAa,IAAI,EAAQ,IAAI,EAChG,GAAI,EAAQ,OAAS,IAAA,IAAa,IAAc,IAAA,GAC5C,MAAM,EACF,yBACA,mDACJ,EAEJ,IAAM,EAAa,EAAQ,iBACrB,EAAO,MAAM,EAAM,MAAM,SAAS,CAAE,GAAG,EAAS,KAAM,EAAW,SAAU,GAAQ,OAAQ,CAAC,EAClG,GAAI,IAAe,EAAQ,kBAAoB,KAAK,QAAU,EAG1D,MAFI,EAAK,WAAa,IAAA,IAAa,KAAK,QAAU,GAC9C,MAAM,EAAM,MAAM,YAAY,EAAK,QAAQ,EACzC,EAAoB,yBAA0B,+BAA+B,EAGvF,GADI,IAAkB,IAAA,IAAW,EAAQ,QAAQ,OAAO,CAAa,EACjE,EAAK,WAAa,IAAA,GAAW,OAAO,EACxC,IAAM,EAAe,GAAiB,EAAQ,eAE9C,OADA,EAAQ,QAAQ,IAAI,EAAc,CAAE,QAAS,EAAK,SAAU,UAAW,EAAQ,IAAK,CAAC,EAC9E,CAAE,GAAG,EAAM,SAAU,CAAa,CAC7C,CACA,GAAI,IAAY,cAAe,CAC3B,IAAM,EAAS,EAAQ,QAAQ,IAAI,EAAK,EAAY,EACpD,GAAI,CAAC,EACD,MAAM,EACF,yBACA,mDACJ,EAEJ,GAAI,CACA,MAAM,EAAM,MAAM,YAAY,EAAO,OAAO,CAChD,QAAU,CACN,EAAQ,QAAQ,OAAO,EAAK,EAAY,CAC5C,CACA,MACJ,CACA,GAAI,GAAqB,IAAI,CAAO,GAAM,IAAY,cAAgB,EAAK,KAAO,IAAA,GAAY,CAC1F,IAAM,EAAY,EAAK,GACjB,EAAY,EAAQ,aAAa,IAAI,CAAS,EACpD,GAAI,IAAc,IAAA,GACd,MAAM,EACF,yBACA,mDACJ,EAEJ,GAAI,CACA,OAAO,MAAM,EAAM,MAAM,QAAQ,EAAS,CAAC,EAAW,GAAG,EAAK,MAAM,CAAC,CAAC,CAAU,CACpF,QAAU,CACN,GAAI,IAAY,UAAY,IAAY,WAAY,CAChD,EAAQ,aAAa,OAAO,CAAS,EACrC,IAAK,GAAM,CAAC,EAAU,KAAW,EAAQ,QACjC,EAAO,YAAc,GAAW,EAAQ,QAAQ,OAAO,CAAQ,CAE3E,CACJ,CACJ,CAIA,OAHI,EAAqB,IAAI,CAAO,GAChC,KAAK,uBAAuB,EAEzB,EAAM,MAAM,QAAQ,EAAS,CAAa,CACrD,EAAA,CAAG,EAMH,OALA,EAAQ,QAAQ,IAAI,CAAS,EAC7B,EAAe,SACL,EAAQ,QAAQ,OAAO,CAAS,MAChC,EAAQ,QAAQ,OAAO,CAAS,CAC1C,EACO,CACX,CAEA,eAAuB,EAAkB,EAAuB,GAAa,CACzE,GAAI,CAAC,EAAQ,QAAU,EAAQ,SAAW,CAAC,KAAK,MAC5C,MAAM,EAAoB,sBAAuB,yBAAyB,EAE9E,GAAI,CAAC,GAAwB,KAAK,iBAAmB,MAAQ,KAAK,iBAAmB,EACjF,MAAM,EACF,oBACA,6DACJ,CAER,CAEA,eAA0B,EAAyC,CAC/D,IAAM,EAAS,KAAK,UAAU,KAAK,CAAS,EAK5C,MAJA,MAAK,UAAY,EAAO,SACd,IAAA,OACA,IAAA,EACV,EACO,CACX,CAEA,MAAc,YAAY,EAAkB,EAA2C,CACnF,GAAI,EAAQ,SAAW,CAAC,KAAK,SAAS,IAAI,CAAO,EAC7C,MAAM,EAAoB,sBAAuB,yBAAyB,EAC9E,GAAI,EAAQ,OAAQ,MAAM,EAAoB,0BAA2B,+BAA+B,EACxG,GAAI,CAAC,EAAS,CAAO,GAAK,OAAO,EAAQ,QAAW,UAAY,CAAC,EAAS,EAAQ,OAAO,EACrF,MAAM,EAAoB,0BAA2B,oCAAoC,EAE7F,GAAI,KAAK,SAAW,MAAQ,KAAK,SAAW,EAAQ,OAChD,MAAM,EAAoB,0BAA2B,4CAA4C,EAGrG,GADA,KAAK,OAAS,EAAQ,OAClB,KAAK,MAAO,CACZ,IAAM,EAAU,KAAK,MAAM,QAC3B,GAAI,EAAQ,SAAW,EAAQ,OAC3B,MAAM,EAAoB,0BAA2B,4CAA4C,EACrG,GAAI,EAAQ,QAAQ,aAAe,EAAQ,QAAQ,WAC/C,MAAM,EACF,0BACA,4DACJ,EAEJ,IAAM,EAAO,EAAQ,QAAQ,WAC7B,GACI,IAAS,OACR,EAAK,UAAY,EAAQ,QAAQ,YAAY,SAC1C,EAAK,cAAgB,EAAQ,QAAQ,YAAY,aAErD,MAAM,EACF,0BACA,4DACJ,EAEJ,GAAI,EAAQ,QAAQ,iBAAmB,KAAM,CACzC,GAAI,KAAK,iBAAmB,MAAQ,KAAK,iBAAmB,EACxD,MAAM,EACF,oBACA,iEACJ,EAEJ,MAAM,KAAK,MAAM,MAAM,aAAa,EAAQ,QAAQ,cAAc,CACtE,CACA,EAAQ,OAAS,GACjB,MACJ,CACA,IAAM,EAAQ,MAAM,KAAK,YAAY,EAAS,CAAO,EACrD,KAAK,MAAQ,EACb,EAAQ,OAAS,GACjB,GAAI,CACA,MAAM,EAAM,MAAM,KAAK,CAAO,CAClC,OAAS,EAAO,CAGZ,KAFA,GAAQ,OAAS,GACjB,KAAK,aAAa,CAAK,EACjB,CACV,CACJ,CAEA,MAAc,YAAY,EAAkB,EAA4C,CACpF,IAAM,EAAK,KAAK,UACV,CAAC,EAAM,GAAY,MAAM,IAAI,SAAqC,EAAS,IAAW,CACxF,IAAM,EAAU,eAAiB,CAC7B,KAAK,cAAc,OAAO,CAAE,EAC5B,EACI,EAAoB,0BAA2B,oDAAoD,CACvG,CACJ,EAAG,GAAM,EACT,KAAK,cAAc,IAAI,EAAI,CAAE,UAAS,UAAS,SAAQ,SAAQ,CAAC,EAChE,EAAQ,KAAK,YAAY,CAAE,KAAM,qCAA6B,IAAG,CAAC,CACtE,CAAC,EACK,EAAQ,IAAI,GAAqB,EAAM,CAAE,eAAgB,IAAQ,mBAAoB,EAAK,CAAC,EAC3F,EAAe,CAAE,OAAM,WAAU,QAAO,UAAS,UAAS,SAAU,KAAK,IAAI,CAAE,EAWrF,OAVA,EAAM,gBAAiB,GAAU,KAAK,QAAQ,CAAK,CAAC,EACpD,EAAS,iBAAiB,UAAY,GAAiC,CACnE,IAAM,EAAO,EAAM,KACd,EAAS,CAAI,GAAK,EAAK,OAAA,2CAA6C,KAAK,QAAU,IACxF,EAAM,SAAW,KAAK,IAAI,EACtB,EAAK,KAAO,OAAQ,KAAK,aAAa,CAAK,EACtC,EAAK,KAAO,SAAS,KAAK,QAAQ,KAAK,aAAa,EAAK,KAAK,CAAC,EAC5E,CAAC,EACD,EAAS,MAAM,EACf,EAAK,MAAM,EACJ,CACX,CAEA,aAAqB,EAAiC,CAsClD,OArCI,EAAQ,eAAuB,EAAQ,gBAC3C,EAAQ,QAAU,GAClB,EAAQ,eAAiB,KAAK,eAAe,SAAY,CACrD,MAAM,QAAQ,WAAW,MAAM,KAAK,EAAQ,OAAO,CAAC,EACpD,IAAM,EAAQ,KAAK,MACnB,GAAI,GAAS,EAAQ,OAAQ,CAKzB,IAAM,GAAU,MAJM,QAAQ,WAAW,CACrC,GAAG,MAAM,KAAK,EAAQ,QAAQ,OAAO,EAAI,GAAW,EAAM,MAAM,YAAY,EAAO,OAAO,CAAC,EAC3F,GAAG,MAAM,KAAK,EAAQ,aAAa,OAAO,EAAI,GAAO,EAAM,MAAM,SAAS,CAAE,CAAC,CACjF,CAAC,EAAA,CACuB,KACnB,GAAW,EAAO,SAAW,YAAc,EAAO,QAAQ,OAAS,wBACxE,EACA,GAAI,GAAS,SAAW,WAEpB,MADA,KAAK,QAAQ,EAAQ,MAAM,EACrB,EAAQ,MAEtB,CAQA,GAPA,EAAQ,aAAa,MAAM,EAC3B,EAAQ,QAAQ,MAAM,EACtB,EAAQ,kBAAoB,EAC5B,EAAQ,OAAS,GACjB,KAAK,iBAAiB,CAAO,EAC7B,EAAQ,QAAQ,MAAM,EACtB,KAAK,SAAS,OAAO,CAAO,EACxB,GAAS,CAAC,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,KAAM,GAAW,EAAO,MAAM,EAClE,GAAI,CACA,MAAM,EAAM,MAAM,MAAM,CAC5B,QAAU,CACN,KAAK,aAAa,CAAK,CAC3B,CAEA,KAAK,SAAS,OAAS,GAAK,KAAK,QAAU,OAC3C,cAAc,KAAK,KAAK,EACxB,KAAK,MAAQ,KAErB,CAAC,EACM,EAAQ,eACnB,CAEA,MAAc,eAAe,EAAiC,CAG1D,GAFA,MAAM,KAAK,aACX,KAAK,eAAe,CAAO,EACvB,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,KAAM,GAAW,IAAW,GAAW,EAAO,MAAM,EAC9E,MAAM,EAAoB,oBAAqB,0DAA0D,EAE7G,IAAM,EAAQ,KAAK,MACnB,MAAM,EAAM,MAAM,QAAQ,EAC1B,KAAK,uBAAuB,EAC5B,EAAQ,OAAS,GACjB,KAAK,iBAAiB,CAAO,EAC7B,KAAK,aAAa,CAAK,CAC3B,CAEA,iBAAyB,EAAiC,CACtD,IAAM,EAAW,KAAK,eAClB,EACE,EAAW,IAAI,QAAe,GAAY,CAC5C,EAAU,CACd,CAAC,EAED,MADA,MAAK,eAAiB,EAAS,SAAW,CAAQ,EAC3C,EAAS,KAAK,SAAY,CAC7B,GAAI,CACA,MAAM,KAAK,aACX,KAAK,eAAe,CAAO,EAC3B,KAAK,eAAiB,EACtB,KAAK,kBAAoB,EACzB,MAAM,QAAQ,WAAW,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,QAAS,GAAW,MAAM,KAAK,EAAO,OAAO,CAAC,CAAC,EAClG,KAAK,eAAe,CAAO,CAC/B,OAAS,EAAO,CAGZ,MAFI,KAAK,iBAAmB,EAAS,KAAK,iBAAiB,CAAO,EAC7D,EAAQ,EACP,CACV,CACJ,CAAC,CACL,CAEA,iBAAyB,EAAwB,CAC7C,GAAI,KAAK,iBAAmB,EAAS,OACrC,KAAK,eAAiB,KACtB,IAAM,EAAU,KAAK,kBACrB,KAAK,kBAAoB,KACzB,IAAU,CACd,CAEA,wBAAuC,CACnC,IAAK,IAAM,KAAW,KAAK,SACvB,EAAQ,aAAa,MAAM,EAC3B,EAAQ,QAAQ,MAAM,EACtB,EAAQ,kBAAoB,EACxB,EAAQ,QAAQ,EAAQ,KAAK,YAAY,CAAE,KAAM,8CAAsC,CAAC,CAEpG,CAEA,aAAqB,EAAoB,CAErC,KAAK,aAAa,CAAK,EACvB,KAAK,uBAAuB,EAC5B,IAAM,EAAa,KAAK,eAAe,SAAY,CAC/C,GAAI,KAAK,MAAO,OAChB,IAAM,EAAO,MAAM,KAAK,KAAK,QAAQ,CAAC,CAAC,KAClC,GACG,IAAY,EAAM,SAClB,EAAQ,QACR,CAAC,EAAQ,SACT,KAAK,IAAI,EAAI,EAAQ,UAAA,IAC7B,EACA,GAAI,CAAC,EAAM,OACX,IAAM,EAA6B,CAC/B,OAAQ,EAAM,QAAQ,OACtB,QAAS,CACL,GAAG,EAAM,QAAQ,QACjB,gBAAiB,GACjB,YAAa,KAAK,IAAI,EAAM,QAAQ,QAAQ,YAAa,GAAI,EAC7D,eAAgB,IACpB,CACJ,EACM,EAAc,MAAM,KAAK,YAAY,EAAM,CAAO,EACxD,KAAK,MAAQ,EACb,MAAM,EAAY,MAAM,KAAK,CAAO,CACxC,CAAC,EACD,KAAK,aAAe,EACpB,EAAgB,MAAO,GAAU,KAAK,QAAQ,CAAK,CAAC,CACxD,CAEA,gBAA+B,CACvB,KAAK,OAAS,KAAK,IAAI,EAAI,KAAK,MAAM,SAAA,MACtC,KAAK,aAAa,KAAK,KAAK,EAEhC,IAAK,IAAM,KAAW,KAAK,SACnB,KAAK,IAAI,EAAI,EAAQ,SAAA,OACrB,EAAQ,KAAK,YAAY,CACrB,KAAM,GACN,MAAO,EACH,EAAoB,wBAAyB,iCAAiC,CAClF,CACJ,CAAC,EACD,KAAU,aAAa,CAAO,CAAC,CAAC,MAAO,GAAU,KAAK,QAAQ,CAAK,CAAC,EAGhF,CAEA,aAAqB,EAAoB,CACjC,KAAK,QAAU,IAAO,KAAK,MAAQ,MACvC,EAAM,MAAM,QAAQ,EACpB,EAAM,SAAS,YAAY,CAAE,KAAM,GAAkC,GAAI,MAAO,CAAC,EACjF,EAAM,SAAS,MAAM,EACrB,EAAM,KAAK,MAAM,CACrB,CAEA,aAAqB,EAAuB,CACxC,GAAI,CACA,OAAO,GAAuB,CAAK,CACvC,MAAQ,CACJ,OAAO,EAAoB,sBAAuB,sCAAsC,CAC5F,CACJ,CAEA,QAAgB,EAAsB,CAC9B,KAAK,OAAO,KAAK,aAAa,KAAK,KAAK,EAC5C,IAAK,IAAM,KAAW,KAAK,cAAc,OAAO,EAC5C,aAAa,EAAQ,OAAO,EAC5B,EAAQ,OAAO,aAAiB,MAAQ,EAAY,MAAM,OAAO,CAAK,CAAC,CAAC,EAE5E,KAAK,cAAc,MAAM,EACzB,IAAK,IAAM,KAAW,KAAK,SACvB,EAAQ,KAAK,YAAY,CAAE,KAAM,GAAqB,MAAO,EAAqB,CAAK,CAAE,CAAC,EAC1F,EAAQ,OAAS,GACjB,EAAQ,QAAU,GAClB,EAAQ,aAAa,MAAM,EAC3B,EAAQ,QAAQ,MAAM,EACtB,EAAQ,kBAAoB,EAC5B,EAAQ,QAAQ,MAAM,EACtB,KAAK,iBAAiB,CAAO,EAEjC,KAAK,SAAS,MAAM,EACpB,KAAK,aAAe,QAAQ,QAAQ,EAChC,KAAK,QAAU,MAAM,cAAc,KAAK,KAAK,EACjD,KAAK,MAAQ,IACjB,CACJ,EAEA,GAAI,OAAO,KAAS,KAAe,cAAe,KAAM,CACpD,IAAM,EAAQ,KACR,EAAc,IAAI,GAAwB,EAAM,SAAS,MAAM,EACrE,EAAM,iBAAiB,UAAY,GAAwB,CACvD,IAAK,IAAM,KAAQ,EAAM,MAAO,EAAY,QAAQ,CAAI,CAC5D,CAAC,CACL"}