@g9tm/syncdata 1.3.1 → 1.4.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.
- package/PARITY.md +3 -2
- package/dist/client/engine.d.ts +6 -1
- package/dist/client/engine.js +10 -1
- package/dist/client/engine.js.map +1 -1
- package/dist/client/storeTypes.d.ts +18 -0
- package/dist/client/storeTypes.js +17 -0
- package/dist/client/storeTypes.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/sqlite/query.d.ts +3 -1
- package/dist/sqlite/query.js +16 -0
- package/dist/sqlite/query.js.map +1 -1
- package/dist/sqlite/snapshotFiles.js +27 -7
- package/dist/sqlite/snapshotFiles.js.map +1 -1
- package/dist/sqlite/store.d.ts +2 -1
- package/dist/sqlite/store.js +3 -0
- package/dist/sqlite/store.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/client/engine.ts"],"names":[],"mappings":"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","sourcesContent":["// Twin of G9SyncData.Client/G9CSyncEngine.cs, .Execution.cs and .Reconcile.cs: one engine per local database, with a\n// prioritised run queue (status queries never wait for a running sync) and background runs that yield to user runs.\nimport { G9EMoveOutPolicy, G9ESyncDirection } from '../abstractions/enums.js';\nimport { G9SyncErrorCodes, G9SyncException, isSyncException } from '../abstractions/errors.js';\nimport { guidToN, newGuid } from '../abstractions/guid.js';\nimport { G9SyncParameters, compareOrdinal } from '../abstractions/parameters.js';\nimport type { G9Long } from '../abstractions/long.js';\nimport { delay, linkSignals, onAbort } from '../internal/abort.js';\nimport { sha256, toHex } from '../internal/sha256.js';\nimport { utf8Encode } from '../internal/utf8.js';\nimport {\n G9EPullPartKind,\n G9ESubscriptionAction,\n type G9DtChangesAvailable,\n type G9DtHelloResult,\n type G9DtNegotiatedTable,\n type G9DtPullPlan,\n type G9DtPushRequest,\n type G9DtPushResult,\n type G9DtReconcileRequest,\n type G9DtReconcileSummary,\n type G9DtSubscriptionDefinition,\n type G9DtSubscriptionState,\n type G9DtSyncChunk,\n syncErrorToException,\n} from '../protocol/dtos.js';\nimport { openRowBatch } from '../protocol/rowBatch/reader.js';\nimport type { G9SyncClientModel } from './model.js';\nimport { G9ESyncPhase, G9SyncProgressTracker, phaseName } from './progress.js';\nimport {\n G9ESyncOutcome,\n G9ESyncPriority,\n G9SyncRun,\n canCoalesce,\n describeModelProblem,\n isTransientError,\n makeRunResult,\n normalizeError,\n outcomeName,\n priorityName,\n requestSignature,\n resolveEngineOptions,\n resolveRequest,\n type G9ResolvedEngineOptions,\n type G9ResolvedSyncRequest,\n type G9RowsAppliedEvent,\n type G9SubscriptionOptions,\n type G9SyncEngineOptions,\n type G9SyncHealth,\n type G9SyncLogLevel,\n type G9SyncModelProblem,\n type G9SyncRequest,\n type G9SyncRunResult,\n} from './runs.js';\nimport {\n G9ApplyReport,\n G9ESubscriptionState,\n toSubscriptionRef,\n type G9ApplySlice,\n type G9ChangeFeedEntry,\n type G9LocalCommand,\n type G9LocalCommandWriter,\n type G9ELocalCommandState,\n type G9LocalRowEntry,\n type G9PendingSummary,\n type G9PushBatch,\n type G9QuarantinedRow,\n type G9RetainedRow,\n type G9SyncClientStore,\n type G9SyncRejection,\n type G9SyncRunReport,\n type G9SyncSubscriptionRecord,\n} from './storeTypes.js';\nimport type { G9SyncTransport } from './transport.js';\n\nconst STAT_CONNECTING = 'Connecting';\nconst STAT_PLANNING = 'Planning';\nconst STAT_PUSH_PER_K_ROW = 'PushPerKRow';\nconst STAT_DOWNLOAD_PER_K_ROW = 'DownloadPerKRow';\nconst STAT_APPLY_PER_K_ROW = 'ApplyPerKRow';\nconst STAT_RECONCILE_PER_SUBSCRIPTION = 'ReconcilePerSubscription';\n\ninterface QueuedRun {\n run: G9SyncRun;\n priority: number;\n order: number;\n}\n\n/**\n * The client sync engine (`G9CSyncEngine`): one per local database. Owns a prioritised run queue, so status queries\n * never wait for a running sync and background runs yield to user runs.\n */\nexport class G9SyncEngine {\n readonly model: G9SyncClientModel;\n private readonly _store: G9SyncClientStore;\n private readonly _transport: G9SyncTransport;\n private readonly _options: G9ResolvedEngineOptions;\n private readonly _lifetime = linkSignals();\n private readonly _queue: QueuedRun[] = [];\n private readonly _pokedTables: { [lower: string]: string } = {};\n private readonly _rowsAppliedListeners: ((event: G9RowsAppliedEvent) => void)[] = [];\n private readonly _runCompletedListeners: ((result: G9SyncRunResult) => void)[] = [];\n private readonly _unsubscribePokes: () => void;\n\n private _initialized = false;\n private _initializing: Promise<void> | null = null;\n private _clientId = '';\n private _order = 0;\n private _current: G9SyncRun | null = null;\n private _suppressions = 0;\n private _autoTimer: ReturnType<typeof setInterval> | null = null;\n private _pokeTimer: ReturnType<typeof setTimeout> | null = null;\n private _wake: (() => void) | null = null;\n private _worker: Promise<void> | null = null;\n private _disposed = false;\n /** The model problems last logged, so the warning is said once per distinct set (ADR-0061). */\n private _reportedModelProblems: string | null = null;\n\n constructor(store: G9SyncClientStore, transport: G9SyncTransport, model: G9SyncClientModel, options?: G9SyncEngineOptions) {\n if (!store) throw new TypeError('A store is required.');\n if (!transport) throw new TypeError('A transport is required.');\n if (!model) throw new TypeError('A model is required.');\n this._store = store;\n this._transport = transport;\n this.model = model;\n this._options = resolveEngineOptions(options);\n this._unsubscribePokes = transport.onChangesAvailable((changes) => this._onChangesAvailable(changes));\n }\n\n get clientId(): string {\n if (!this._initialized) throw new Error('Call initialize first.');\n return this._clientId;\n }\n\n get isRunning(): boolean {\n return this._current !== null;\n }\n\n get queuedRuns(): number {\n return this._queue.length;\n }\n\n get isBackgroundSuppressed(): boolean {\n return this._suppressions > 0;\n }\n\n /** Raised after rows were written locally (download, reconciliation or canonical push results). Returns the unsubscribe function. */\n onRowsApplied(listener: (event: G9RowsAppliedEvent) => void): () => void {\n this._rowsAppliedListeners.push(listener);\n return () => remove(this._rowsAppliedListeners, listener);\n }\n\n onRunCompleted(listener: (result: G9SyncRunResult) => void): () => void {\n this._runCompletedListeners.push(listener);\n return () => remove(this._runCompletedListeners, listener);\n }\n\n /** Provisions local tables and capture, and starts the run worker. Idempotent. */\n initialize(signal?: AbortSignal): Promise<void> {\n if (this._initialized) return Promise.resolve();\n if (!this._initializing) {\n this._initializing = (async () => {\n try {\n await this._store.initialize(this.model, signal);\n this._clientId = await this._store.getClientId(signal);\n this._initialized = true;\n this._worker = this._workerLoop();\n } finally {\n if (!this._initialized) this._initializing = null;\n }\n })();\n }\n return this._initializing;\n }\n\n // ================================================================ subscriptions\n\n /** Adds (or returns) a subscription. Its rows arrive on the next run that includes it. */\n async subscribe(name: string, parameters?: G9SyncParameters | null, options?: G9SubscriptionOptions | null, signal?: AbortSignal): Promise<G9SyncSubscriptionRecord> {\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A subscription name is required.');\n await this.initialize(signal);\n const state = await this._store.getServerState(signal);\n const definition = state.definitions.find((d) => d.name === name) ?? null;\n const ephemeral = options?.ephemeral ?? definition?.ephemeral ?? false;\n const ttlMs = options?.ttlMs ?? (definition && definition.ephemeral && definition.ttlSeconds > 0 ? definition.ttlSeconds * 1000 : null);\n const record = await this._store.ensureSubscription(name, parameters ?? new G9SyncParameters(), ephemeral, ttlMs, options?.adoptExistingRows ?? false, signal);\n await this._store.updateSubscription(record.key, { accessed: true }, signal);\n return record;\n }\n\n /** Removes a subscription; rows no other subscription holds follow the server's move-out policy. */\n async unsubscribe(name: string, parameters?: G9SyncParameters | null, signal?: AbortSignal): Promise<void> {\n await this.initialize(signal);\n const state = await this._store.getServerState(signal);\n const policy = state.definitions.find((d) => d.name === name)?.moveOutPolicy ?? G9EMoveOutPolicy.Delete;\n await this._store.removeSubscription(G9SyncParameters.buildSubscriptionKey(name, parameters ?? null), policy, signal);\n }\n\n async getSubscriptions(signal?: AbortSignal): Promise<G9SyncSubscriptionRecord[]> {\n await this.initialize(signal);\n return this._store.getSubscriptions(signal);\n }\n\n // ================================================================ runs\n\n /** Queues a run. Identical plain requests already waiting are coalesced into one run. */\n run(request?: G9SyncRequest | null): G9SyncRun {\n if (!this._initialized) throw new Error('Call initialize first.');\n const resolved = resolveRequest(request);\n if (canCoalesce(resolved)) {\n const signature = requestSignature(resolved);\n for (const queued of this._queue) {\n const r = queued.run;\n if (!r.isStarted && canCoalesce(r.request) && r.request.priority === resolved.priority && requestSignature(r.request) === signature) return r;\n }\n }\n const run = new G9SyncRun(resolved);\n this._queue.push({ run, priority: resolved.priority, order: this._order++ });\n const current = this._current;\n let preempted: G9SyncRun | null = null;\n if (current !== null && current.request.priority === G9ESyncPriority.Background && resolved.priority > G9ESyncPriority.Background) {\n current.preempted = true;\n preempted = current;\n }\n this._signal();\n if (preempted) {\n preempted.cancel();\n this._log('information', 20001, `Background run ${preempted.runId} pre-empted by run ${run.runId}`);\n }\n return run;\n }\n\n /** Queues a run and awaits its result. */\n sync(request?: G9SyncRequest | null): Promise<G9SyncRunResult> {\n return this.run(request).completion;\n }\n\n /** While the returned scope is alive, background runs are skipped. Call the returned function to end it. */\n suppressBackground(): () => void {\n this._suppressions++;\n let done = false;\n return () => {\n if (done) return;\n done = true;\n this._suppressions--;\n };\n }\n\n /** Queues a background push+pull of every non-heavy subscription on a fixed interval. */\n startAutomaticSync(intervalMs: number): void {\n if (!(intervalMs > 0)) throw new RangeError('The interval must be positive.');\n this.stopAutomaticSync();\n this._autoTimer = setInterval(() => this._tryQueueBackground(null), intervalMs);\n }\n\n stopAutomaticSync(): void {\n if (this._autoTimer !== null) {\n clearInterval(this._autoTimer);\n this._autoTimer = null;\n }\n }\n\n // ================================================================ queries\n\n /**\n * Records a command (ADR-0025): the server executes the handler registered for `name` on the next push, once, in\n * device order. `applyLocally` writes its local effects immediately, in the same transaction.\n */\n async executeCommand(\n name: string,\n payloadJson: string,\n applyLocally?: ((writer: G9LocalCommandWriter, signal?: AbortSignal) => Promise<void>) | null,\n version = 1,\n signal?: AbortSignal,\n ): Promise<G9LocalCommand> {\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A command name is required.');\n if (typeof payloadJson !== 'string') throw new TypeError('The payload JSON is required.');\n await this.initialize(signal);\n return this._store.enqueueCommand({ name, version, payload: payloadJson }, applyLocally ?? null, signal);\n }\n\n /** Frees space taken by an UPLOAD-ONLY table: removes uploaded rows without uploading a delete. */\n async forgetUploadedRows(localTable: string, keys?: readonly string[] | null, signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.forgetUploadedRows(localTable, keys ?? null, signal);\n }\n\n async getCommands(state?: G9ELocalCommandState | null, limit = 200, signal?: AbortSignal): Promise<G9LocalCommand[]> {\n await this.initialize(signal);\n return this._store.getCommands(state ?? null, limit, signal);\n }\n\n async getPendingSummary(signal?: AbortSignal): Promise<G9PendingSummary> {\n await this.initialize(signal);\n return this._store.getPendingSummary(signal);\n }\n\n async getRejections(signal?: AbortSignal): Promise<G9SyncRejection[]> {\n await this.initialize(signal);\n return this._store.getRejections(signal);\n }\n\n async getQuarantined(signal?: AbortSignal): Promise<G9QuarantinedRow[]> {\n await this.initialize(signal);\n return this._store.getQuarantined(signal);\n }\n\n async restoreQuarantined(localTable: string, key: string, signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.restoreQuarantined(localTable, key, signal);\n }\n\n /** Throws away every staged pull, so the next run plans afresh. Returns whether there was one. */\n async discardStagedPull(signal?: AbortSignal): Promise<boolean> {\n await this.initialize(signal);\n return (await this._store.discardAllStagedPulls(signal)) > 0;\n }\n\n async discardQuarantined(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.discardQuarantined(localTable ?? null, key ?? null, signal);\n }\n\n async getRetained(signal?: AbortSignal): Promise<G9RetainedRow[]> {\n await this.initialize(signal);\n return this._store.getRetained(signal);\n }\n\n async retryRejected(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.retryRejected(localTable ?? null, key ?? null, signal);\n }\n\n async readChangeFeed(localTable: string, afterSequence: number, limit = 1000, signal?: AbortSignal): Promise<G9ChangeFeedEntry[]> {\n await this.initialize(signal);\n return this._store.readChangeFeed(localTable, afterSequence, limit, signal);\n }\n\n /** The highest sequence readChangeFeed can return today (a watermark above it belongs to a store that no longer exists). */\n async getChangeSequence(signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.getChangeSequence(signal);\n }\n\n /** The highest sequence ever purged from the change feed; 0 when nothing was (ADR-0059). */\n async getChangeFeedFloor(signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.getChangeFeedFloor(signal);\n }\n\n async adoptExistingRows(signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.adoptExistingRows(signal);\n }\n\n async markDirty(localTable: string, keys: readonly string[], signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.markDirty(localTable, keys, signal);\n }\n\n async getHealth(signal?: AbortSignal): Promise<G9SyncHealth> {\n await this.initialize(signal);\n const state = await this._store.getServerState(signal);\n return {\n clientId: this._clientId,\n isConnected: this._transport.isConnected,\n isRunning: this.isRunning,\n queuedRuns: this.queuedRuns,\n serverEpoch: state.epoch,\n lastHelloUtcMs: state.lastHelloUtcMs,\n pending: await this._store.getPendingSummary(signal),\n subscriptions: await this._store.getSubscriptions(signal),\n recentRuns: await this._store.getRecentRunReports(10, signal),\n };\n }\n\n async dispose(): Promise<void> {\n if (this._disposed) return;\n this._disposed = true;\n this.stopAutomaticSync();\n this._unsubscribePokes();\n this._lifetime.abort();\n const abandoned = this._queue.splice(0, this._queue.length);\n for (const { run } of abandoned) {\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Canceled, error: new G9SyncException(G9SyncErrorCodes.Canceled, 'The sync engine was disposed.') }));\n }\n this._current?.cancel();\n this._signal();\n if (this._worker) {\n try {\n await this._worker;\n } catch {\n // shutting down\n }\n }\n if (this._pokeTimer !== null) {\n clearTimeout(this._pokeTimer);\n this._pokeTimer = null;\n }\n }\n\n // ================================================================ worker\n\n private _signal(): void {\n const wake = this._wake;\n this._wake = null;\n if (wake) wake();\n }\n\n private _dequeue(): G9SyncRun | null {\n if (this._queue.length === 0) return null;\n let best = 0;\n for (let i = 1; i < this._queue.length; i++) {\n const a = this._queue[i] as QueuedRun;\n const b = this._queue[best] as QueuedRun;\n if (a.priority > b.priority || (a.priority === b.priority && a.order < b.order)) best = i;\n }\n return (this._queue.splice(best, 1)[0] as QueuedRun).run;\n }\n\n private async _workerLoop(): Promise<void> {\n while (!this._lifetime.signal.aborted) {\n const run = this._dequeue();\n if (!run) {\n await new Promise<void>((resolve) => {\n this._wake = resolve;\n });\n continue;\n }\n run.isStarted = true;\n this._current = run;\n try {\n await this._executeRun(run);\n } catch (exception) {\n this._log('error', 20002, `Unexpected failure executing run ${run.runId}`, exception);\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Failed, error: normalizeError(exception) }));\n } finally {\n this._current = null;\n }\n // A pre-empted background run still owes its work: queue it again behind the run that pre-empted it.\n if (run.preempted && run.request.priority === G9ESyncPriority.Background) this._tryQueueBackground(run.request.subscriptions);\n }\n }\n\n private _tryQueueBackground(subscriptions: readonly string[] | null): void {\n if (!this._initialized || this.isBackgroundSuppressed || (this._options.hooks && !this._options.hooks.isNetworkAvailable) || this._lifetime.signal.aborted) {\n return;\n }\n this.run({ priority: G9ESyncPriority.Background, subscriptions });\n }\n\n private _onChangesAvailable(payload: G9DtChangesAvailable): void {\n if (!this._options.pullOnChangesAvailable || payload.tables.length === 0) return;\n for (const table of payload.tables) this._pokedTables[table.toLowerCase()] = table;\n if (this._pokeTimer === null) this._pokeTimer = setTimeout(() => this._flushPokes(), this._options.changesDebounceMs);\n }\n\n private _flushPokes(): void {\n const tables = Object.keys(this._pokedTables);\n for (const key of tables) delete this._pokedTables[key];\n this._pokeTimer = null;\n if (tables.length === 0 || !this._initialized) return;\n const signal = this._lifetime.signal;\n void (async () => {\n try {\n const state = await this._store.getServerState(signal);\n const names: { [name: string]: true } = {};\n let any = false;\n for (const d of state.definitions) {\n if (!d.heavy && d.tables.some((t) => tables.indexOf(t.toLowerCase()) >= 0)) {\n names[d.name] = true;\n any = true;\n }\n }\n if (!any) return;\n const keys = (await this._store.getSubscriptions(signal)).filter((s) => names[s.name] === true).map((s) => s.key);\n if (keys.length > 0) this._tryQueueBackground(keys);\n } catch (exception) {\n if (!signal.aborted) this._log('warning', 20003, 'Handling a server change notification failed', exception);\n }\n })();\n }\n\n private _raiseRowsApplied(report: G9ApplyReport, source: G9ESyncPhase, slice: G9ApplySlice | null = null): void {\n for (const listener of this._rowsAppliedListeners.slice()) {\n try {\n listener({ report, source, slice });\n } catch (exception) {\n this._log('warning', 20004, 'A RowsApplied handler threw', exception);\n }\n }\n }\n\n private _log(level: G9SyncLogLevel, eventId: number, message: string, error?: unknown): void {\n const logger = this._options.logger;\n if (!logger) return;\n try {\n logger.log(level, eventId, message, error);\n } catch {\n // A logger must never break the sync.\n }\n }\n\n // ================================================================ execution\n\n private async _executeRun(run: G9SyncRun): Promise<void> {\n const request = run.request;\n const startedUtcMs = Date.now();\n const changes = new G9ApplyReport();\n const problems: G9DtSubscriptionState[] = [];\n let modelProblems: G9SyncModelProblem[] = [];\n const synced: string[] = [];\n let pushed = 0;\n let rejected = 0;\n let conflicts = 0;\n let downloaded = 0;\n let downloadedBytes = 0;\n let reconciled = 0;\n let error: G9SyncException | null = null;\n let outcome: G9ESyncOutcome = G9ESyncOutcome.Succeeded;\n\n const tracker = new G9SyncProgressTracker(run.runId, (p) => run.publish(p), () => this.queuedRuns, this._options.progressMaxHz);\n try {\n if (request.priority === G9ESyncPriority.Background && this.isBackgroundSuppressed) {\n tracker.complete(G9ESyncPhase.Canceled);\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Canceled, error: new G9SyncException(G9SyncErrorCodes.Canceled, 'Background sync is suppressed.') }));\n return;\n }\n\n const linked = linkSignals(run.cancellation.signal, this._lifetime.signal);\n const ct = linked.signal;\n const cancelRegistration = onAbort(ct, () => tracker.setCancelPending());\n let hostScope: { dispose(): void | Promise<void> } | null = null;\n\n try {\n const history = await this._store.getPhaseStatistics(ct);\n const pending = request.push ? await this._store.getPendingSummary(ct) : null;\n this._planPhases(tracker, history, request, pending ? pending.totalRows : 0);\n if (this._options.hooks) hostScope = await this._options.hooks.beginRun(run, ct);\n\n // ---------------------------------------------------------------- 1. connect + hello\n tracker.enter(G9ESyncPhase.Connecting);\n await this._ensureConnected(ct);\n await this._store.collectExpiredEphemeral(Date.now(), ct);\n const subscriptions = await this._store.getSubscriptions(ct);\n const hello = await this._withRetry(\n (token) =>\n this._transport.hello(\n {\n clientId: this._clientId,\n appVersion: this._options.appVersion,\n protocolVersion: 1,\n tables: this.model.tables.map((t) => t.toWire()),\n subscriptions: subscriptions.map(toSubscriptionRef),\n },\n token,\n ),\n ct,\n );\n if (hello.error) throw syncErrorToException(hello.error);\n await this._store.saveHello(hello, ct);\n if (hello.unknownTables.length > 0) {\n this._log('warning', 20016, 'The server does not know these client tables (they will not sync): ' + hello.unknownTables.join(', '));\n }\n\n // A column declared with the wrong type syncs in NEITHER direction (ADR-0061): say it on every run's result, and once\n // per distinct set in the log.\n modelProblems = [];\n for (const table of hello.tables) {\n for (const column of table.typeMismatchColumns) {\n modelProblems.push({ code: G9SyncErrorCodes.ModelTypeMismatch, table: table.name, column: column.name, clientType: column.clientType, serverType: column.serverType });\n }\n }\n if (modelProblems.length > 0) {\n const described = modelProblems.map(describeModelProblem).join('; ');\n if (this._reportedModelProblems !== described) {\n this._reportedModelProblems = described;\n this._log(\n 'warning',\n 20022,\n `The client model declares ${modelProblems.length} column(s) with a type the server does not have; they sync in NEITHER direction until the model is fixed: ${described}`,\n );\n }\n if (this._options.failOnTypeMismatch) {\n throw new G9SyncException(G9SyncErrorCodes.ModelTypeMismatch, 'The client model declares column types the server does not have; those columns would not sync: ' + described);\n }\n }\n\n const negotiated = hello.tables;\n const definitions: { [name: string]: G9DtSubscriptionDefinition } = {};\n for (const d of hello.definitions) definitions[d.name] = d;\n const states: { [key: string]: G9DtSubscriptionState } = {};\n for (const state of hello.subscriptions) states[state.key] = state;\n\n // ---------------------------------------------------------------- 2. push\n // A FAILED PUSH MUST NOT COST THE PULL: the failure is rethrown after the pull, never swallowed.\n let pushFailure: { error: unknown } | null = null;\n if (request.push && pending && (pending.totalRows > 0 || pending.pendingCommands > 0)) {\n tracker.enter(G9ESyncPhase.Pushing, pending.totalRows + pending.pendingCommands);\n try {\n const totals = await this._pushAll(negotiated, subscriptions, hello.maxPushRows, hello.maxPushBytes, tracker, changes, ct);\n pushed = totals.pushed;\n rejected = totals.rejected;\n conflicts = totals.conflicts;\n } catch (exception) {\n if (ct.aborted) throw exception;\n this._log('warning', 20019, `Run ${run.runId}: the push failed; continuing to the pull so the device keeps receiving, then reporting the failure`, exception);\n pushFailure = { error: exception };\n }\n }\n\n if (request.pull) {\n // ------------------------------------------------------------ 3. select subscriptions (+ dependencies)\n const selected = await this._selectSubscriptions(request, subscriptions, definitions, problems, ct);\n const usable: G9SyncSubscriptionRecord[] = [];\n for (const subscription of selected) {\n const state = states[subscription.key];\n if (\n state &&\n (state.action === G9ESubscriptionAction.Unknown || state.action === G9ESubscriptionAction.InvalidParameters || state.action === G9ESubscriptionAction.Forbidden)\n ) {\n problems.push(state);\n await this._store.updateSubscription(subscription.key, { state: G9ESubscriptionState.Failed, errorCode: actionCode(state.action) }, ct);\n // Forbidden: these rows are no longer this caller's to hold (ADR-0048).\n if (state.action === G9ESubscriptionAction.Forbidden) {\n const released = await this._store.releaseSubscriptionRows(subscription.key, ct);\n changes.merge(released);\n if (released.total > 0) {\n this._log(\n 'warning',\n 20018,\n `Subscription ${subscription.key} is forbidden; released its rows (${released.revokedDeleted} deleted, ${released.revokedQuarantined} quarantined, ${released.revokedRetained} retained)`,\n );\n this._raiseRowsApplied(released, G9ESyncPhase.Reconciling);\n }\n }\n continue;\n }\n usable.push(subscription);\n }\n\n // ------------------------------------------------------------ 4. reconcile\n const now = Date.now();\n const toReconcile = usable.filter((s) => needsReconcile(s, request, states, definitions, now));\n tracker.expect(G9ESyncPhase.Reconciling, toReconcile.length * historyOf(history, STAT_RECONCILE_PER_SUBSCRIPTION, 2500));\n if (toReconcile.length > 0) {\n tracker.enter(G9ESyncPhase.Reconciling, toReconcile.length);\n let done = 0;\n for (const subscription of toReconcile) {\n try {\n const report = await this._reconcileSubscription(subscription, definitions[subscription.name] as G9DtSubscriptionDefinition, negotiated, ct);\n changes.merge(report);\n reconciled += report.total;\n if (report.total > 0) this._raiseRowsApplied(report, G9ESyncPhase.Reconciling);\n } catch (exception) {\n if (isSyncException(exception) && !exception.retryable && exception.code !== G9SyncErrorCodes.Canceled) {\n problems.push({ key: subscription.key, action: G9ESubscriptionAction.Reconcile, message: exception.message });\n await this._store.updateSubscription(subscription.key, { state: G9ESubscriptionState.Failed, errorCode: exception.code }, ct);\n } else {\n throw exception;\n }\n }\n tracker.report(++done, -1, null, subscription.key);\n }\n }\n\n // ------------------------------------------------------------ 5. plan (or resume a staged pull)\n tracker.enter(G9ESyncPhase.Planning);\n const failedKeys: { [key: string]: true } = {};\n for (const p of problems) failedKeys[p.key] = true;\n const current: { [key: string]: G9SyncSubscriptionRecord } = {};\n for (const s of await this._store.getSubscriptions(ct)) current[s.key] = s;\n const plannable = usable.filter((s) => !failedKeys[s.key] && current[s.key] !== undefined).map((s) => current[s.key] as G9SyncSubscriptionRecord);\n\n // A stage is kept PER GENERATION (ADR-0060); what makes one resumable is that the epoch, permissions, columns and\n // the cursors it was planned from are all still exactly what they were.\n const generation = stageGeneration(hello, plannable, states, negotiated);\n const pruned = await this._store.pruneStagedPulls(Date.now() - this._options.stagedPullMaxAgeMs, this._options.stagedPullsMaxBytes, generation, ct);\n if (pruned > 0) this._log('information', 20021, `Removed ${pruned} staged pull(s) past their age or the byte cap`);\n\n // Snapshot files are offered unless one already failed in this run (ADR-0072): a file is a faster way to the same rows,\n // never the only one, so a file the server cannot build or the device rejects costs one replan as rows - not the run.\n let allowFiles = this._options.acceptSnapshotFiles;\n for (let attempt = 0; ; attempt++) {\n const problemsBefore = problems.length;\n const syncedBefore = synced.length;\n let runId: string | null = null;\n try {\n const staged = await this._store.getStagedPullForGeneration(generation, ct);\n let plan: G9DtPullPlan;\n if (staged && staged.createdUtcMs > Date.now() - this._options.stagedPullMaxAgeMs) {\n plan = staged.plan;\n runId = staged.runId;\n this._log('information', 20012, `Resuming staged pull ${runId} (${plan.totalRows} rows planned)`);\n } else {\n const backfills = await this._store.getPendingBackfills(ct);\n const files = allowFiles && this._store.describeSnapshotFiles ? this._store.describeSnapshotFiles(negotiated) : null;\n plan = await this._withRetry(\n (token) =>\n this._transport.planPull(\n {\n clientId: this._clientId,\n subscriptions: plannable.map(toSubscriptionRef),\n tables: negotiated.map((t) => ({ tableId: t.tableId, columns: t.columns.map((c) => c.name) })),\n backfills: backfills.slice(),\n frameVersion: this._options.maxFrameVersion,\n ...(files ? { snapshotFiles: files } : {}),\n },\n token,\n ),\n ct,\n );\n if (plan.error) throw syncErrorToException(plan.error);\n runId = guidToN(newGuid());\n const plannedFromCursors: { [key: string]: string | null } = {};\n for (const s of plannable) plannedFromCursors[s.key] = s.cursor;\n await this._store.beginStagedPull(\n { runId, plan, createdUtcMs: Date.now(), backfills, generation, plannedFromCursors, stageSequence: 0 },\n ct,\n );\n }\n\n for (const skipped of plan.skipped) {\n problems.push(skipped);\n if (skipped.action === G9ESubscriptionAction.Reconcile || skipped.action === G9ESubscriptionAction.ResyncRequired) {\n await this._store.updateSubscription(skipped.key, { state: G9ESubscriptionState.NeedsReconcile }, ct);\n }\n }\n\n for (const c of plan.cursors) synced.push(c.key);\n const fileParts = plan.parts.filter((p) => p.kind === G9EPullPartKind.SnapshotFile);\n if (fileParts.length > 0) {\n this._log('information', 20025, `The pull carries ${fileParts.length} snapshot file(s) for ${fileParts.reduce((sum, p) => sum + p.rows, 0)} row(s)`);\n }\n tracker.expect(G9ESyncPhase.Downloading, Math.max(200, (plan.totalRows / 1000) * historyOf(history, STAT_DOWNLOAD_PER_K_ROW, 350)));\n tracker.expect(G9ESyncPhase.Applying, Math.max(100, (plan.totalRows / 1000) * historyOf(history, STAT_APPLY_PER_K_ROW, 250)));\n\n // ------------------------------------------------------------ 6. download (resumable)\n tracker.enter(G9ESyncPhase.Downloading, plan.totalRows, plan.estimatedBytes);\n const totals = await this._download(runId, plan, tracker, ct);\n downloaded = totals.rows;\n downloadedBytes = totals.bytes;\n\n // ------------------------------------------------------------ 7. apply (atomic, or in committed slices)\n tracker.enter(G9ESyncPhase.Applying, downloaded);\n const applied = await this._store.applyStagedPull(\n runId,\n (rows) => tracker.report(rows),\n (slice) => {\n if (slice.report.total > 0) this._raiseRowsApplied(slice.report, G9ESyncPhase.Applying, slice);\n },\n ct,\n );\n changes.merge(applied);\n break;\n } catch (exception) {\n if (\n attempt === 0 &&\n !ct.aborted &&\n isSyncException(exception) &&\n (exception.code === G9SyncErrorCodes.SnapshotFileUnavailable || exception.code === G9SyncErrorCodes.SnapshotFileCorrupt)\n ) {\n this._log('warning', 20026, `A snapshot file failed (${exception.code}); the staged download was discarded and the pull is planned again as rows`, exception);\n if (runId !== null) await this._store.discardStagedPull(runId);\n problems.length = problemsBefore;\n synced.length = syncedBefore;\n allowFiles = false;\n tracker.enter(G9ESyncPhase.Planning);\n continue;\n }\n throw exception;\n }\n }\n }\n\n // ---------------------------------------------------------------- 8. post steps\n for (const step of request.postSteps) {\n tracker.enter(G9ESyncPhase.PostStep, 0, 0, step.name);\n await step.action({ run, changes, progress: (fraction) => tracker.reportFraction(fraction) }, ct);\n }\n\n // Rows retained after revocation by a RetainWhile rule are re-checked once per run (ADR-0026).\n changes.revokedDeleted += await this._store.reevaluateRetained(ct);\n\n // The pull has been applied and its cursors committed; now the push failure decides the run's fate.\n if (pushFailure) throw pushFailure.error;\n\n outcome = rejected > 0 || problems.length > 0 ? G9ESyncOutcome.CompletedWithRejections : G9ESyncOutcome.Succeeded;\n tracker.complete(G9ESyncPhase.Completed);\n } catch (exception) {\n if (ct.aborted) {\n outcome = G9ESyncOutcome.Canceled;\n error = new G9SyncException(G9SyncErrorCodes.Canceled, run.preempted ? 'Pre-empted by a higher-priority sync.' : 'The sync was canceled.', { cause: exception });\n tracker.complete(G9ESyncPhase.Canceled);\n } else {\n error = normalizeError(exception);\n outcome = G9ESyncOutcome.Failed;\n tracker.complete(G9ESyncPhase.Failed);\n this._log('warning', 20011, `Run ${run.runId} failed with ${error.code}`, error);\n }\n } finally {\n cancelRegistration();\n linked.dispose();\n if (hostScope) {\n try {\n await hostScope.dispose();\n } catch (exception) {\n this._log('warning', 20004, 'A host scope handler threw', exception);\n }\n }\n }\n\n const durations = tracker.durations;\n const phaseMs: { [phase: string]: number } = {};\n for (const key of Object.keys(durations)) phaseMs[key] = Math.floor(durations[key] as number);\n const result = makeRunResult({\n runId: run.runId,\n outcome,\n error,\n pushed,\n rejected,\n conflicts,\n downloaded,\n applied: changes.total,\n durationMs: Date.now() - startedUtcMs,\n subscriptions: synced,\n problems,\n modelProblems,\n changes,\n phaseMs,\n });\n\n try {\n await this._persistRun(run, result, durations, startedUtcMs, downloadedBytes, reconciled);\n } catch (exception) {\n this._log('warning', 20004, 'A run report handler threw', exception);\n }\n\n this._log(\n 'information',\n 20010,\n `Run ${run.runId} finished ${outcomeName(outcome)}: pushed ${pushed}, downloaded ${downloaded}, applied ${changes.total} in ${result.durationMs} ms`,\n );\n run.complete(result);\n for (const listener of this._runCompletedListeners.slice()) {\n try {\n listener(result);\n } catch (exception) {\n this._log('warning', 20004, 'A RunCompleted handler threw', exception);\n }\n }\n } finally {\n tracker.dispose();\n }\n }\n\n private _planPhases(tracker: G9SyncProgressTracker, history: { [key: string]: number }, request: G9ResolvedSyncRequest, pendingRows: number): void {\n const connecting = historyOf(history, STAT_CONNECTING, 800);\n const pushing = request.push && pendingRows > 0 ? Math.max(300, (pendingRows / 1000) * historyOf(history, STAT_PUSH_PER_K_ROW, 1200)) : 0;\n const planning = request.pull ? historyOf(history, STAT_PLANNING, 700) : 0;\n const downloading = request.pull ? 2000 : 0;\n const applying = request.pull ? 1500 : 0;\n tracker.plan(G9ESyncPhase.Connecting, connecting);\n if (pushing > 0) tracker.plan(G9ESyncPhase.Pushing, pushing);\n if (request.pull) {\n tracker.plan(G9ESyncPhase.Reconciling, 0);\n tracker.plan(G9ESyncPhase.Planning, planning);\n tracker.plan(G9ESyncPhase.Downloading, downloading);\n tracker.plan(G9ESyncPhase.Applying, applying);\n }\n const core = connecting + pushing + planning + downloading + applying;\n for (const step of request.postSteps) {\n const hint = step.weightHint;\n tracker.plan(G9ESyncPhase.PostStep, historyOf(history, 'PostStep:' + step.name, hint >= 0.9 ? core * 9 : (core * hint) / (1 - hint)), step.name);\n }\n }\n\n private async _selectSubscriptions(\n request: G9ResolvedSyncRequest,\n all: G9SyncSubscriptionRecord[],\n definitions: { [name: string]: G9DtSubscriptionDefinition },\n problems: G9DtSubscriptionState[],\n ct: AbortSignal,\n ): Promise<G9SyncSubscriptionRecord[]> {\n const byKey: { [key: string]: G9SyncSubscriptionRecord } = {};\n for (const s of all) byKey[s.key] = s;\n const wanted = request.subscriptions;\n let roots = wanted === null ? all.slice() : all.filter((s) => wanted.indexOf(s.key) >= 0 || wanted.indexOf(s.name) >= 0);\n if (request.priority === G9ESyncPriority.Background && wanted === null) {\n roots = roots.filter((s) => !(definitions[s.name] && (definitions[s.name] as G9DtSubscriptionDefinition).heavy));\n }\n const ordered: G9SyncSubscriptionRecord[] = [];\n const visiting: { [key: string]: true } = {};\n const done: { [key: string]: true } = {};\n\n const visit = async (record: G9SyncSubscriptionRecord): Promise<void> => {\n if (done[record.key] || visiting[record.key]) return;\n visiting[record.key] = true;\n const definition = definitions[record.name];\n if (definition) {\n for (const dependency of definition.dependsOn) {\n const parentDefinition = definitions[dependency.name];\n if (!parentDefinition) {\n if (dependency.required) {\n problems.push({ key: record.key, action: G9ESubscriptionAction.Unknown, message: `Required dependency '${dependency.name}' is not available.` });\n }\n continue;\n }\n let parent = byKey[dependency.name];\n if (!parent) {\n parent = await this._store.ensureSubscription(\n dependency.name,\n new G9SyncParameters(),\n parentDefinition.ephemeral,\n parentDefinition.ephemeral ? parentDefinition.ttlSeconds * 1000 : null,\n false,\n ct,\n );\n byKey[parent.key] = parent;\n }\n await visit(parent);\n }\n }\n done[record.key] = true;\n ordered.push(record);\n };\n\n // Creation order. Two subscriptions created in the same millisecond keep it through their slots (handed out lowest\n // free first), then the key, ordinal (JS `<` compares UTF-16 units, like StringComparer.Ordinal) — never the order\n // the store happened to list them in (by key: a random GUID decided which site's rows came first, LES-0052).\n const sorted = roots\n .map((r, i) => ({ r, i }))\n .sort((a, b) => a.r.createdUtcMs - b.r.createdUtcMs || a.r.slot - b.r.slot || (a.r.key < b.r.key ? -1 : a.r.key > b.r.key ? 1 : 0) || a.i - b.i);\n for (const { r } of sorted) await visit(r);\n return ordered;\n }\n\n private async _pushAll(\n negotiated: G9DtNegotiatedTable[],\n subscriptions: G9SyncSubscriptionRecord[],\n serverMaxRows: number,\n serverMaxBytes: number,\n tracker: G9SyncProgressTracker,\n changes: G9ApplyReport,\n ct: AbortSignal,\n ): Promise<{ pushed: number; rejected: number; conflicts: number }> {\n let pushed = 0;\n let rejected = 0;\n let conflicts = 0;\n const references = subscriptions.map(toSubscriptionRef);\n // The server's limits win over the device's preference; bytes keep a margin for the header and compression variance.\n const targetRows = Math.max(1, serverMaxRows > 0 ? Math.min(this._options.pushBatchRows, serverMaxRows) : this._options.pushBatchRows);\n let batchRows = targetRows;\n const batchBytes = serverMaxBytes > 0 ? Math.floor(serverMaxBytes * 0.9) : Number.MAX_SAFE_INTEGER;\n for (;;) {\n const batch = await this._store.buildPushBatch(negotiated, batchRows, batchBytes, ct);\n if (!batch) break;\n rejected += batch.rejectedLocally;\n if (batch.rowCount === 0 && batch.commands.length === 0) break; // only rows that can never be uploaded were left\n\n const request: G9DtPushRequest = {\n clientId: this._clientId,\n batchId: batch.batchId,\n subscriptions: references,\n tables: batch.tables.slice(),\n commands: batch.commands.slice(),\n // Canonical rows come back in the columns the DEVICE holds (LES-0035).\n heldTables: negotiated\n .filter((t) => batch.commands.length > 0 || batch.tables.some((p) => p.tableId === t.tableId))\n .map((t) => ({ tableId: t.tableId, columns: t.columns.map((c) => c.name) })),\n frameVersion: this._options.maxFrameVersion,\n };\n let result: G9DtPushResult;\n try {\n result = await this._withRetry((token) => this._transport.push(request, toChunks(batch), token), ct);\n if (result.error) throw syncErrorToException(result.error);\n } catch (exception) {\n if (isSyncException(exception) && exception.code === G9SyncErrorCodes.RejectTooMany && batchRows > 1 && batch.rowCount > 1) {\n // The server rolled the WHOLE push back for too many rejections (ADR-0063): halve and resend the smaller prefix\n // under the same batch id, so the valid rows get through and the bad ones are parked one by one.\n batchRows = Math.max(1, Math.floor(Math.min(batchRows, batch.rowCount) / 2));\n this._log(\n 'warning',\n 20023,\n `Push batch ${batch.batchId} of ${batch.rowCount} rows was rolled back for too many rejections; sending it again as ${batchRows} rows so the valid rows get through`,\n );\n continue;\n }\n throw exception;\n }\n\n const report = await this._store.applyPushResult(batch, result, ct);\n changes.merge(report);\n if (report.upserts + report.deletes > 0) this._raiseRowsApplied(report, G9ESyncPhase.Pushing);\n pushed += batch.rowCount + batch.commands.length;\n rejected += result.rejections.length;\n conflicts += result.conflicts.length;\n tracker.report(pushed);\n this._log(\n 'debug',\n 20014,\n `Pushed batch ${batch.batchId}: ${batch.rowCount} rows, ${result.rejections.length} rejected, ${result.conflicts.length} conflicts, replayed ${result.alreadyApplied}`,\n );\n\n if (report.accepted + report.rejected + report.conflicts + report.commandsCompleted === 0 && !result.alreadyApplied) {\n this._log('warning', 20015, `Push batch ${batch.batchId} changed no row state; stopping the push loop for this run`);\n break;\n }\n if (batch.rowCount < batchRows && batch.commands.length < batchRows && !batch.truncated && !result.alreadyApplied) break;\n // After a split: grow back towards the normal size.\n if (batchRows < targetRows) batchRows = Math.min(targetRows, batchRows * 2);\n }\n return { pushed, rejected, conflicts };\n }\n\n private async _download(runId: string, plan: G9DtPullPlan, tracker: G9SyncProgressTracker, ct: AbortSignal): Promise<{ rows: number; bytes: number }> {\n // maxRetries counts failures in a row WITHOUT progress (the .NET twin, DownloadAsync): progress is the DURABLE resume point\n // moving, not a chunk arriving - segments after the last checkpoint are written again on resume.\n let failures = 0;\n let lastFailedAt: { stagedRows: number; stagedBytes: number } | null = null;\n for (;;) {\n const resume = await this._store.getResumePoint(runId, ct);\n let rows = resume.stagedRows;\n let bytes = resume.stagedBytes;\n if (resume.complete) return { rows, bytes };\n if (lastFailedAt !== null && (resume.stagedRows > lastFailedAt.stagedRows || resume.stagedBytes > lastFailedAt.stagedBytes)) failures = 0;\n tracker.report(rows, bytes);\n try {\n // Inside the try (the .NET twin, DownloadAsync): a reconnect that fails while the network is still down is one more\n // transient failure, not the end of the run.\n await this._ensureConnected(ct);\n for await (const chunk of this._transport.pull(plan.token, resume.continuation, ct)) {\n await this._store.stageChunk(runId, chunk, ct);\n if (chunk.isFinal) return { rows, bytes };\n rows += chunk.rowCount;\n bytes += chunk.payload ? chunk.payload.length : 0;\n tracker.report(rows, bytes, null, chunk.subscriptionKey ?? null);\n }\n throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, 'The pull stream ended before its final chunk.');\n } catch (exception) {\n if (\n isSyncException(exception) &&\n (exception.code === G9SyncErrorCodes.TokenExpired ||\n exception.code === G9SyncErrorCodes.TokenInvalid ||\n exception.code === G9SyncErrorCodes.ResyncEpoch ||\n exception.code === G9SyncErrorCodes.ResyncAuthChanged)\n ) {\n await this._store.discardStagedPull(runId);\n throw exception;\n }\n if (!ct.aborted && isTransientError(exception) && failures < this._options.maxRetries) {\n this._log('warning', 20013, `Transient pull failure, retry ${failures + 1}: ${messageOf(exception)}`);\n await delay(this._backoff(failures), ct);\n failures++;\n lastFailedAt = resume;\n continue;\n }\n throw exception;\n }\n }\n }\n\n private async _withRetry<T>(operation: (signal: AbortSignal) => Promise<T>, ct: AbortSignal): Promise<T> {\n for (let attempt = 0; ; attempt++) {\n try {\n await this._ensureConnected(ct);\n return await operation(ct);\n } catch (exception) {\n if (!ct.aborted && isTransientError(exception) && attempt < this._options.maxRetries) {\n this._log('warning', 20013, `Transient call failure, retry ${attempt + 1}: ${messageOf(exception)}`);\n await delay(this._backoff(attempt), ct);\n continue;\n }\n throw exception;\n }\n }\n }\n\n private _backoff(attempt: number): number {\n return Math.min(30000, this._options.retryBaseDelayMs * Math.pow(2, attempt)) * (0.85 + Math.random() * 0.3);\n }\n\n private async _ensureConnected(ct: AbortSignal): Promise<void> {\n if (!this._transport.isConnected) await this._transport.connect(ct);\n }\n\n private async _persistRun(\n run: G9SyncRun,\n result: G9SyncRunResult,\n durations: { [key: string]: number },\n startedUtcMs: number,\n downloadedBytes: number,\n reconciledRows: number,\n ): Promise<void> {\n const diagnostics = result.changes.diagnostics;\n const phaseMs: { [phase: string]: number } = {};\n for (const key of Object.keys(durations)) phaseMs[key] = Math.floor(durations[key] as number);\n const report: G9SyncRunReport = {\n runId: run.runId,\n startedUtcMs,\n durationMs: result.durationMs,\n outcome: outcomeName(result.outcome),\n priority: priorityName(run.request.priority),\n errorCode: result.error ? result.error.code : null,\n errorMessage: result.error ? result.error.message : null,\n pushed: result.pushed,\n rejected: result.rejected,\n conflicts: result.conflicts,\n downloaded: result.downloaded,\n applied: result.applied,\n downloadedBytes,\n subscriptions: result.subscriptions.slice(),\n phaseMs,\n triggersSkipped: diagnostics.triggersSkipped,\n foreignTriggers: diagnostics.foreignTriggers.slice(),\n applyTransactions: diagnostics.transactions,\n indexesDeferred: diagnostics.deferredIndexCount,\n indexRebuildMs: diagnostics.indexRebuildMs,\n liveIndexReasons: { ...diagnostics.liveIndexReasons },\n unchangedRows: result.changes.unchangedRows,\n };\n await this._store.saveRunReport(report, this._options.keepRunReports);\n\n if (!result.isSuccess) return;\n const samples: { [key: string]: number } = {};\n const connecting = durations[phaseName(G9ESyncPhase.Connecting)];\n if (connecting !== undefined) samples[STAT_CONNECTING] = connecting;\n const planning = durations[phaseName(G9ESyncPhase.Planning)];\n if (planning !== undefined) samples[STAT_PLANNING] = planning;\n const pushingMs = durations[phaseName(G9ESyncPhase.Pushing)];\n if (result.pushed >= 100 && pushingMs !== undefined) samples[STAT_PUSH_PER_K_ROW] = pushingMs / (result.pushed / 1000);\n const downloadingMs = durations[phaseName(G9ESyncPhase.Downloading)];\n if (result.downloaded >= 500 && downloadingMs !== undefined) samples[STAT_DOWNLOAD_PER_K_ROW] = downloadingMs / (result.downloaded / 1000);\n const applyingMs = durations[phaseName(G9ESyncPhase.Applying)];\n if (result.downloaded >= 500 && applyingMs !== undefined) samples[STAT_APPLY_PER_K_ROW] = applyingMs / (result.downloaded / 1000);\n const reconcilingMs = durations[phaseName(G9ESyncPhase.Reconciling)];\n if (reconcilingMs !== undefined && reconciledRows >= 0 && run.request.pull) {\n samples[STAT_RECONCILE_PER_SUBSCRIPTION] = reconcilingMs / Math.max(1, result.subscriptions.length);\n }\n for (const step of run.request.postSteps) {\n const stepMs = durations['PostStep:' + step.name];\n if (stepMs !== undefined) samples['PostStep:' + step.name] = stepMs;\n }\n if (Object.keys(samples).length > 0) await this._store.recordPhaseStatistics(samples);\n if (result.applied > 0) await this._store.purgeDeletedFeed(this._options.keepDeletedFeedEntries);\n }\n\n // ================================================================ reconciliation (D-07)\n\n private async _reconcileSubscription(\n subscription: G9SyncSubscriptionRecord,\n definition: G9DtSubscriptionDefinition,\n negotiated: G9DtNegotiatedTable[],\n ct: AbortSignal,\n ): Promise<G9ApplyReport> {\n const tables: G9DtNegotiatedTable[] = [];\n for (const name of definition.tables) {\n const table = negotiated.find((t) => t.name.toLowerCase() === name.toLowerCase());\n // UploadOnly: the device's own rows, nothing on the server to compare them with.\n if (table && table.direction !== G9ESyncDirection.UploadOnly) tables.push(table);\n }\n\n const request: G9DtReconcileRequest = { clientId: this._clientId, subscription: toSubscriptionRef(subscription), tables: [], frameVersion: this._options.maxFrameVersion };\n for (const table of tables) request.tables.push(await this._store.computeDigest(subscription.key, table, ct));\n\n const serverRows: { [tableId: number]: Map<string, { version: number; hash: G9Long }> } = {};\n let summary: G9DtReconcileSummary | null = null;\n for await (const chunk of this._transport.reconcile(request, ct)) {\n if (chunk.isFinal) {\n summary = chunk.reconcileSummary ?? null;\n break;\n }\n if (!chunk.payload) continue;\n const reader = await openRowBatch(chunk.payload, { maxBodyBytes: this._options.maxDecodedFrameBytes });\n while (reader.nextSection()) {\n let rows = serverRows[reader.tableId];\n if (!rows) serverRows[reader.tableId] = rows = new Map();\n while (reader.readRow()) rows.set(reader.key, { version: reader.version, hash: reader.rowHash });\n }\n }\n if (!summary) throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, 'The reconcile stream ended before its summary.');\n\n const report = new G9ApplyReport();\n let handedToSnapshot = false;\n for (const mismatch of summary.mismatched) {\n const table = tables.find((t) => t.tableId === mismatch.tableId);\n if (!table) continue;\n const server = serverRows[table.tableId] ?? new Map<string, { version: number; hash: G9Long }>();\n const buckets = new Set<number>(mismatch.buckets);\n const serverKeys = new Set<string>();\n server.forEach((_value, key) => serverKeys.add(key));\n const local = await this._store.readLocalEntries(subscription.key, table, buckets, serverKeys, ct);\n const localByKey = new Map<string, G9LocalRowEntry>();\n for (const entry of local) localByKey.set(entry.key, entry);\n\n const fetch: string[] = [];\n const addMembership: string[] = [];\n const moveOut: string[] = [];\n server.forEach(({ hash }, key) => {\n const entry = localByKey.get(key);\n if (!entry) fetch.push(key);\n else if (entry.dirty) {\n // A pending local change is never overwritten here; a row visible again still gets its membership back.\n if (!entry.member) addMembership.push(key);\n } else if (!entry.hash.equals(hash)) fetch.push(key);\n else if (!entry.member) addMembership.push(key);\n });\n for (const entry of local) {\n // Rows with pending changes are released too; the store's revocation policy decides (ADR-0026).\n if (entry.member && buckets.has(entry.bucket) && !server.has(entry.key)) moveOut.push(entry.key);\n }\n\n // A difference this large is a download, not a repair (ADR-0066).\n if (this._options.reconcileSnapshotThreshold > 0 && fetch.length >= this._options.reconcileSnapshotThreshold) {\n const released = await this._store.applyReconcile(subscription.key, table, [], addMembership, moveOut, definition.moveOutPolicy, ct);\n report.merge(released);\n handedToSnapshot = true;\n this._log(\n 'information',\n 20024,\n `Reconciling ${subscription.key} / ${table.name} would fetch ${fetch.length} rows (threshold ${this._options.reconcileSnapshotThreshold}): released what left, and leaving the rows to a staged snapshot pull`,\n );\n continue;\n }\n\n // Fetched and applied in groups (ADR-0066).\n const groupKeys = Math.max(Math.max(1, this._options.fetchKeysPerRequest), this._options.reconcileApplyRows);\n let pendingMembership = addMembership;\n let pendingMoveOut = moveOut;\n let fetched = 0;\n for (const group of chunked(fetch, groupKeys)) {\n const frames: Uint8Array[] = [];\n const returned = new Set<string>();\n for (const keys of chunked(group, Math.max(1, this._options.fetchKeysPerRequest))) {\n const fetchRequest = {\n clientId: this._clientId,\n subscription: toSubscriptionRef(subscription),\n tableId: table.tableId,\n keys,\n columns: table.columns.map((c) => c.name),\n frameVersion: this._options.maxFrameVersion,\n };\n for await (const chunk of this._transport.fetchRows(fetchRequest, ct)) {\n if (chunk.isFinal || !chunk.payload) continue;\n frames.push(chunk.payload);\n const reader = await openRowBatch(chunk.payload, { maxBodyBytes: this._options.maxDecodedFrameBytes });\n while (reader.nextSection()) {\n while (reader.readRow()) returned.add(reader.key);\n }\n }\n }\n // A key listed but not returned left the subscription between listing and fetch.\n const groupMoveOut = group.filter((k) => !returned.has(k) && (localByKey.get(k)?.member ?? false));\n for (const key of pendingMoveOut) groupMoveOut.push(key);\n const applied = await this._store.applyReconcile(subscription.key, table, frames, pendingMembership, groupMoveOut, definition.moveOutPolicy, ct);\n report.merge(applied);\n pendingMembership = [];\n pendingMoveOut = [];\n fetched += group.length;\n }\n if (fetched === 0 && (pendingMembership.length > 0 || pendingMoveOut.length > 0)) {\n report.merge(await this._store.applyReconcile(subscription.key, table, [], pendingMembership, pendingMoveOut, definition.moveOutPolicy, ct));\n }\n this._log(\n 'information',\n 20020,\n `Reconciled ${subscription.key} / ${table.name}: ${mismatch.buckets.length} buckets differed, fetched ${fetch.length}, adopted ${addMembership.length}, moved out ${moveOut.length}`,\n );\n }\n\n await this._store.updateSubscription(\n subscription.key,\n handedToSnapshot\n ? // No cursor: the plan step of this run sees an initial pull and stages a snapshot.\n { clearCursor: true, state: G9ESubscriptionState.Active, clearError: true, reconciled: true }\n : {\n cursor: summary.cursor,\n definitionHash: summary.definitionHash,\n authHash: summary.authHash,\n state: G9ESubscriptionState.Active,\n clearError: true,\n reconciled: true,\n },\n ct,\n );\n return report;\n }\n}\n\n// ---------------------------------------------------------------- helpers\n\nfunction remove<T>(list: T[], item: T): void {\n const index = list.indexOf(item);\n if (index >= 0) list.splice(index, 1);\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction historyOf(history: { [key: string]: number }, key: string, fallback: number): number {\n const value = history[key];\n return value !== undefined && value > 0 ? value : fallback;\n}\n\nfunction needsReconcile(\n subscription: G9SyncSubscriptionRecord,\n request: G9ResolvedSyncRequest,\n states: { [key: string]: G9DtSubscriptionState },\n definitions: { [name: string]: G9DtSubscriptionDefinition },\n nowMs: number,\n): boolean {\n if (subscription.state === G9ESubscriptionState.NeedsReconcile) return true;\n const state = states[subscription.key];\n if (state && (state.action === G9ESubscriptionAction.Reconcile || state.action === G9ESubscriptionAction.ResyncRequired)) return true;\n if (subscription.cursor === null) return false;\n if (request.forceReconcile) return true;\n const definition = definitions[subscription.name];\n return (\n definition !== undefined &&\n definition.reconcileIntervalMinutes > 0 &&\n (subscription.lastReconcileUtcMs ?? subscription.lastSuccessUtcMs ?? subscription.createdUtcMs) < nowMs - definition.reconcileIntervalMinutes * 60000\n );\n}\n\n/**\n * Everything a staged pull's rows depend on (ADR-0046): the server's epoch, the exact set of subscriptions with their\n * definition and authorisation hashes, and the negotiated columns. The cursor is deliberately NOT part of it (ADR-0060).\n */\nexport function stageGeneration(\n hello: G9DtHelloResult,\n plannable: readonly G9SyncSubscriptionRecord[],\n states: { [key: string]: G9DtSubscriptionState },\n negotiated: readonly G9DtNegotiatedTable[],\n): string {\n let text = guidToN(hello.epoch) + '\\n';\n for (const subscription of plannable.slice().sort((a, b) => compareOrdinal(a.key, b.key))) {\n const state = states[subscription.key];\n text += subscription.key + '\\u001F' + ((state ? state.definitionHash : null) ?? subscription.definitionHash ?? '') + '\\u001F' + ((state ? state.authHash : null) ?? subscription.authHash ?? '') + '\\n';\n }\n text += '\\n';\n const tables = negotiated.map((t, i) => ({ t, i })).sort((a, b) => a.t.tableId - b.t.tableId || a.i - b.i);\n for (const { t } of tables) text += String(t.tableId) + '\\u001F' + t.columns.map((c) => c.name).join(',') + '\\n';\n return toHex(sha256(utf8Encode(text)));\n}\n\nfunction actionCode(action: number): string {\n switch (action) {\n case G9ESubscriptionAction.Unknown:\n return G9SyncErrorCodes.UnknownSubscription;\n case G9ESubscriptionAction.Forbidden:\n return G9SyncErrorCodes.SubscriptionForbidden;\n default:\n return G9SyncErrorCodes.InvalidParameters;\n }\n}\n\nfunction chunked<T>(items: readonly T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\n return out;\n}\n\nasync function* toChunks(batch: G9PushBatch): AsyncGenerator<G9DtSyncChunk> {\n let sequence = 0;\n for (const frame of batch.frames) yield { sequence: sequence++, payload: frame, rowCount: 0, isFinal: false };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../src/client/engine.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,oHAAoH;AACpH,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEjF,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EACL,eAAe,EACf,qBAAqB,EAYrB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC/E,OAAO,EACL,cAAc,EACd,eAAe,EACf,SAAS,EACT,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,GAWf,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,aAAa,EACb,oBAAoB,EACpB,iBAAiB,EAIjB,2BAA2B,GAa5B,MAAM,iBAAiB,CAAC;AAGzB,MAAM,eAAe,GAAG,YAAY,CAAC;AACrC,MAAM,aAAa,GAAG,UAAU,CAAC;AACjC,MAAM,mBAAmB,GAAG,aAAa,CAAC;AAC1C,MAAM,uBAAuB,GAAG,iBAAiB,CAAC;AAClD,MAAM,oBAAoB,GAAG,cAAc,CAAC;AAC5C,MAAM,+BAA+B,GAAG,0BAA0B,CAAC;AAQnE;;;GAGG;AACH,MAAM,OAAO,YAAY;IA0BvB,YAAY,KAAwB,EAAE,SAA0B,EAAE,KAAwB,EAAE,OAA6B;QArBxG,cAAS,GAAG,WAAW,EAAE,CAAC;QAC1B,WAAM,GAAgB,EAAE,CAAC;QACzB,iBAAY,GAAgC,EAAE,CAAC;QAC/C,0BAAqB,GAA4C,EAAE,CAAC;QACpE,2BAAsB,GAA0C,EAAE,CAAC;QAG5E,iBAAY,GAAG,KAAK,CAAC;QACrB,kBAAa,GAAyB,IAAI,CAAC;QAC3C,cAAS,GAAG,EAAE,CAAC;QACf,WAAM,GAAG,CAAC,CAAC;QACX,aAAQ,GAAqB,IAAI,CAAC;QAClC,kBAAa,GAAG,CAAC,CAAC;QAClB,eAAU,GAA0C,IAAI,CAAC;QACzD,eAAU,GAAyC,IAAI,CAAC;QACxD,UAAK,GAAwB,IAAI,CAAC;QAClC,YAAO,GAAyB,IAAI,CAAC;QACrC,cAAS,GAAG,KAAK,CAAC;QAC1B,+FAA+F;QACvF,2BAAsB,GAAkB,IAAI,CAAC;QAGnD,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;QAChE,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,SAAS,CAAC,sBAAsB,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,QAAQ,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,kBAAkB,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,IAAI,QAAQ;QACV,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAClE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,IAAI,sBAAsB;QACxB,OAAO,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC;IAChC,CAAC;IAED,qIAAqI;IACrI,aAAa,CAAC,QAA6C;QACzD,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,cAAc,CAAC,QAA2C;QACxD,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAC7D,CAAC;IAED,kFAAkF;IAClF,UAAU,CAAC,MAAoB;QAC7B,IAAI,IAAI,CAAC,YAAY;YAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,IAAI,CAAC,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;gBAC/B,IAAI,CAAC;oBACH,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;oBACjD,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;oBACvD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;oBACzB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;gBACpC,CAAC;wBAAS,CAAC;oBACT,IAAI,CAAC,IAAI,CAAC,YAAY;wBAAE,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;gBACpD,CAAC;YACH,CAAC,CAAC,EAAE,CAAC;QACP,CAAC;QACD,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAED,iFAAiF;IAEjF,0FAA0F;IAC1F,KAAK,CAAC,SAAS,CAAC,IAAY,EAAE,UAAoC,EAAE,OAAsC,EAAE,MAAoB;;QAC9H,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC5G,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,MAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,mCAAI,IAAI,CAAC;QAC1E,MAAM,SAAS,GAAG,MAAA,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,mCAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,SAAS,mCAAI,KAAK,CAAC;QACvE,MAAM,KAAK,GAAG,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,mCAAI,CAAC,UAAU,IAAI,UAAU,CAAC,SAAS,IAAI,UAAU,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxI,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,IAAI,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,gBAAgB,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,iBAAiB,mCAAI,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/J,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7E,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,oGAAoG;IACpG,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,UAAoC,EAAE,MAAoB;;QACxF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,MAAA,MAAA,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,0CAAE,aAAa,mCAAI,gBAAgB,CAAC,MAAM,CAAC;QACxG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,oBAAoB,CAAC,IAAI,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACxH,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,MAAoB;QACzC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC9C,CAAC;IAED,wEAAwE;IAExE,yFAAyF;IACzF,GAAG,CAAC,OAA8B;QAChC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAClE,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YAC7C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC;gBACrB,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ,IAAI,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,SAAS;oBAAE,OAAO,CAAC,CAAC;YAChJ,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC7E,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,IAAI,SAAS,GAAqB,IAAI,CAAC;QACvC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,UAAU,IAAI,QAAQ,CAAC,QAAQ,GAAG,eAAe,CAAC,UAAU,EAAE,CAAC;YAClI,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;YACzB,SAAS,GAAG,OAAO,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,kBAAkB,SAAS,CAAC,KAAK,sBAAsB,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;QACtG,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,0CAA0C;IAC1C,IAAI,CAAC,OAA8B;QACjC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IACtC,CAAC;IAED,4GAA4G;IAC5G,kBAAkB;QAChB,IAAI,CAAC,aAAa,EAAE,CAAC;QACrB,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,EAAE;YACV,IAAI,IAAI;gBAAE,OAAO;YACjB,IAAI,GAAG,IAAI,CAAC;YACZ,IAAI,CAAC,aAAa,EAAE,CAAC;QACvB,CAAC,CAAC;IACJ,CAAC;IAED,yFAAyF;IACzF,kBAAkB,CAAC,UAAkB;QACnC,IAAI,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;YAAE,MAAM,IAAI,UAAU,CAAC,gCAAgC,CAAC,CAAC;QAC9E,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;IAClF,CAAC;IAED,iBAAiB;QACf,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,aAAa,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC/B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,2EAA2E;IAE3E;;;OAGG;IACH,KAAK,CAAC,cAAc,CAClB,IAAY,EACZ,WAAmB,EACnB,YAA6F,EAC7F,OAAO,GAAG,CAAC,EACX,MAAoB;QAEpB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,MAAM,IAAI,SAAS,CAAC,6BAA6B,CAAC,CAAC;QACvG,IAAI,OAAO,WAAW,KAAK,QAAQ;YAAE,MAAM,IAAI,SAAS,CAAC,+BAA+B,CAAC,CAAC;QAC1F,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAC3G,CAAC;IAED,mGAAmG;IACnG,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,IAA+B,EAAE,MAAoB;QAChG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAC1E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAmC,EAAE,KAAK,GAAG,GAAG,EAAE,MAAoB;QACtF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,aAAL,KAAK,cAAL,KAAK,GAAI,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,MAAoB;QACtC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAoB;QACvC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAAkB,EAAE,GAAW,EAAE,MAAoB;QAC5E,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;IACjE,CAAC;IAED,kGAAkG;IAClG,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,UAA0B,EAAE,GAAmB,EAAE,MAAoB;QAC5F,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,EAAE,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,MAAoB;QACpC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAA0B,EAAE,GAAmB,EAAE,MAAoB;QACvF,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,IAAI,EAAE,GAAG,aAAH,GAAG,cAAH,GAAG,GAAI,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAkB,EAAE,aAAqB,EAAE,KAAK,GAAG,IAAI,EAAE,MAAoB;QAChG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC9E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,sBAAsB,CAAC,UAAkB,EAAE,aAAqB,EAAE,KAAa,EAAE,SAAgC,EAAE,MAAoB;QAC3I,2BAA2B,CAAC,SAAS,CAAC,CAAC;QACvC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;IACjG,CAAC;IAED,4HAA4H;IAC5H,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,4FAA4F;IAC5F,KAAK,CAAC,kBAAkB,CAAC,MAAoB;QAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAkB,EAAE,IAAuB,EAAE,MAAoB;QAC/E,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAoB;QAClC,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO;YACL,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW;YACxC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,WAAW,EAAE,KAAK,CAAC,KAAK;YACxB,cAAc,EAAE,KAAK,CAAC,cAAc;YACpC,OAAO,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;YACpD,aAAa,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC;YACzD,UAAU,EAAE,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,MAAM,CAAC;SAC9D,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,OAAO;;QACX,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5D,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,SAAS,EAAE,CAAC;YAChC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,+BAA+B,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9K,CAAC;QACD,MAAA,IAAI,CAAC,QAAQ,0CAAE,MAAM,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,OAAO,CAAC;YACrB,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,EAAE,CAAC;YAC7B,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC;IACH,CAAC;IAED,0EAA0E;IAElE,OAAO;QACb,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,IAAI;YAAE,IAAI,EAAE,CAAC;IACnB,CAAC;IAEO,QAAQ;QACd,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAc,CAAC;YACtC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAc,CAAC;YACzC,IAAI,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;gBAAE,IAAI,GAAG,CAAC,CAAC;QAC5F,CAAC;QACD,OAAQ,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAe,CAAC,GAAG,CAAC;IAC3D,CAAC;IAEO,KAAK,CAAC,WAAW;QACvB,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YAC5B,IAAI,CAAC,GAAG,EAAE,CAAC;gBACT,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBAClC,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC;gBACvB,CAAC,CAAC,CAAC;gBACH,SAAS;YACX,CAAC;YACD,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC;YACrB,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC9B,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,oCAAoC,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;gBACtF,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,KAAK,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;YACtH,CAAC;oBAAS,CAAC;gBACT,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvB,CAAC;YACD,qGAAqG;YACrG,IAAI,GAAG,CAAC,SAAS,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,UAAU;gBAAE,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QAChI,CAAC;IACH,CAAC;IAEO,mBAAmB,CAAC,aAAuC;QACjE,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,sBAAsB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC3J,OAAO;QACT,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,UAAU,EAAE,aAAa,EAAE,CAAC,CAAC;IACpE,CAAC;IAEO,mBAAmB,CAAC,OAA6B;QACvD,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACjF,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM;YAAE,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;QACnF,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;YAAE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IACxH,CAAC;IAEO,WAAW;QACjB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,MAAM;YAAE,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO;QACtD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;QACrC,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;gBACvD,MAAM,KAAK,GAA6B,EAAE,CAAC;gBAC3C,IAAI,GAAG,GAAG,KAAK,CAAC;gBAChB,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;oBAClC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;wBAC3E,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;wBACrB,GAAG,GAAG,IAAI,CAAC;oBACb,CAAC;gBACH,CAAC;gBACD,IAAI,CAAC,GAAG;oBAAE,OAAO;gBACjB,MAAM,IAAI,GAAG,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;gBAClH,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACtD,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,MAAM,CAAC,OAAO;oBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,8CAA8C,EAAE,SAAS,CAAC,CAAC;YAC9G,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;IACP,CAAC;IAEO,iBAAiB,CAAC,MAAqB,EAAE,MAAoB,EAAE,QAA6B,IAAI;QACtG,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,EAAE,CAAC;YAC1D,IAAI,CAAC;gBACH,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;YACtC,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,6BAA6B,EAAE,SAAS,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;IACH,CAAC;IAEO,IAAI,CAAC,KAAqB,EAAE,OAAe,EAAE,OAAe,EAAE,KAAe;QACnF,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACpC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,sCAAsC;QACxC,CAAC;IACH,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,WAAW,CAAC,GAAc;QACtC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,IAAI,aAAa,EAAE,CAAC;QACpC,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,IAAI,aAAa,GAAyB,EAAE,CAAC;QAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,KAAK,GAA2B,IAAI,CAAC;QACzC,IAAI,OAAO,GAAmB,cAAc,CAAC,SAAS,CAAC;QAEvD,MAAM,OAAO,GAAG,IAAI,qBAAqB,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAChI,IAAI,CAAC;YACH,IAAI,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,UAAU,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBACnF,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACxC,GAAG,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,gCAAgC,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC7K,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YAC3E,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC;YACzB,MAAM,kBAAkB,GAAG,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;YACzE,IAAI,SAAS,GAA+C,IAAI,CAAC;YAEjE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC9E,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK;oBAAE,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gBAEjF,sFAAsF;gBACtF,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBACvC,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAChC,MAAM,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1D,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAC7D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CACjC,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,CAAC,UAAU,CAAC,KAAK,CACnB;oBACE,QAAQ,EAAE,IAAI,CAAC,SAAS;oBACxB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU;oBACpC,eAAe,EAAE,CAAC;oBAClB,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;oBAChD,aAAa,EAAE,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC;iBACpD,EACD,KAAK,CACN,EACH,EAAE,CACH,CAAC;gBACF,IAAI,KAAK,CAAC,KAAK;oBAAE,MAAM,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBACzD,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;gBACvC,IAAI,KAAK,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACnC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,qEAAqE,GAAG,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;gBACtI,CAAC;gBAED,sHAAsH;gBACtH,+BAA+B;gBAC/B,aAAa,GAAG,EAAE,CAAC;gBACnB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjC,KAAK,MAAM,MAAM,IAAI,KAAK,CAAC,mBAAmB,EAAE,CAAC;wBAC/C,aAAa,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,CAAC,iBAAiB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;oBACzK,CAAC;gBACH,CAAC;gBACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrE,IAAI,IAAI,CAAC,sBAAsB,KAAK,SAAS,EAAE,CAAC;wBAC9C,IAAI,CAAC,sBAAsB,GAAG,SAAS,CAAC;wBACxC,IAAI,CAAC,IAAI,CACP,SAAS,EACT,KAAK,EACL,6BAA6B,aAAa,CAAC,MAAM,6GAA6G,SAAS,EAAE,CAC1K,CAAC;oBACJ,CAAC;oBACD,IAAI,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;wBACrC,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,iGAAiG,GAAG,SAAS,CAAC,CAAC;oBAC/K,CAAC;gBACH,CAAC;gBAED,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;gBAChC,MAAM,WAAW,GAAmD,EAAE,CAAC;gBACvE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,WAAW;oBAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,MAAM,GAA6C,EAAE,CAAC;gBAC5D,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,aAAa;oBAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;gBAEnE,2EAA2E;gBAC3E,iGAAiG;gBACjG,IAAI,WAAW,GAA8B,IAAI,CAAC;gBAClD,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,IAAI,OAAO,CAAC,eAAe,GAAG,CAAC,CAAC,EAAE,CAAC;oBACtF,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;oBACjF,IAAI,CAAC;wBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,EAAE,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;wBAC3H,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;wBACvB,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;wBAC3B,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;oBAC/B,CAAC;oBAAC,OAAO,SAAS,EAAE,CAAC;wBACnB,IAAI,EAAE,CAAC,OAAO;4BAAE,MAAM,SAAS,CAAC;wBAChC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,qGAAqG,EAAE,SAAS,CAAC,CAAC;wBAC9J,WAAW,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;oBACrC,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;oBACjB,wGAAwG;oBACxG,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;oBACpG,MAAM,MAAM,GAA+B,EAAE,CAAC;oBAC9C,KAAK,MAAM,YAAY,IAAI,QAAQ,EAAE,CAAC;wBACpC,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;wBACvC,IACE,KAAK;4BACL,CAAC,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,OAAO,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,iBAAiB,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,CAAC,EAChK,CAAC;4BACD,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;4BACrB,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;4BACxI,wEAAwE;4BACxE,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,EAAE,CAAC;gCACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,uBAAuB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;gCACjF,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gCACxB,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;oCACvB,IAAI,CAAC,IAAI,CACP,SAAS,EACT,KAAK,EACL,gBAAgB,YAAY,CAAC,GAAG,qCAAqC,QAAQ,CAAC,cAAc,aAAa,QAAQ,CAAC,kBAAkB,iBAAiB,QAAQ,CAAC,eAAe,YAAY,CAC1L,CAAC;oCACF,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;gCAC7D,CAAC;4BACH,CAAC;4BACD,SAAS;wBACX,CAAC;wBACD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;oBAC5B,CAAC;oBAED,4EAA4E;oBAC5E,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;oBACvB,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC;oBAC/F,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,+BAA+B,EAAE,IAAI,CAAC,CAAC,CAAC;oBACzH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;wBAC3B,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;wBAC5D,IAAI,IAAI,GAAG,CAAC,CAAC;wBACb,KAAK,MAAM,YAAY,IAAI,WAAW,EAAE,CAAC;4BACvC,IAAI,CAAC;gCACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAA+B,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;gCAC7I,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gCACtB,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC;gCAC3B,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC;oCAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC,CAAC;4BACjF,CAAC;4BAAC,OAAO,SAAS,EAAE,CAAC;gCACnB,IAAI,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,QAAQ,EAAE,CAAC;oCACvG,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,qBAAqB,CAAC,SAAS,EAAE,OAAO,EAAE,SAAS,CAAC,OAAO,EAAE,CAAC,CAAC;oCAC9G,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,YAAY,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gCAChI,CAAC;qCAAM,CAAC;oCACN,MAAM,SAAS,CAAC;gCAClB,CAAC;4BACH,CAAC;4BACD,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;wBACrD,CAAC;oBACH,CAAC;oBAED,iGAAiG;oBACjG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;oBACrC,MAAM,UAAU,GAA4B,EAAE,CAAC;oBAC/C,KAAK,MAAM,CAAC,IAAI,QAAQ;wBAAE,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;oBACnD,MAAM,OAAO,GAAgD,EAAE,CAAC;oBAChE,KAAK,MAAM,CAAC,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC;wBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAC3E,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAA6B,CAAC,CAAC;oBAElJ,kHAAkH;oBAClH,wEAAwE;oBACxE,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;oBACzE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;oBACpJ,IAAI,MAAM,GAAG,CAAC;wBAAE,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,WAAW,MAAM,gDAAgD,CAAC,CAAC;oBAEnH,wHAAwH;oBACxH,sHAAsH;oBACtH,IAAI,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC;oBACnD,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;wBAClC,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC;wBACvC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;wBACnC,IAAI,KAAK,GAAkB,IAAI,CAAC;wBAChC,IAAI,CAAC;4BACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,0BAA0B,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;4BAC5E,IAAI,IAAkB,CAAC;4BACvB,IAAI,MAAM,IAAI,MAAM,CAAC,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;gCAClF,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;gCACnB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gCACrB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,wBAAwB,KAAK,KAAK,IAAI,CAAC,SAAS,gBAAgB,CAAC,CAAC;4BACpG,CAAC;iCAAM,CAAC;gCACN,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;gCAC5D,MAAM,KAAK,GAAG,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gCACrH,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAC1B,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,CAAC,UAAU,CAAC,QAAQ,CACtB;oCACE,QAAQ,EAAE,IAAI,CAAC,SAAS;oCACxB,aAAa,EAAE,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC;oCAC/C,MAAM,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oCAC9F,SAAS,EAAE,SAAS,CAAC,KAAK,EAAE;oCAC5B,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;oCAC3C,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iCAC3C,EACD,KAAK,CACN,EACH,EAAE,CACH,CAAC;gCACF,IAAI,IAAI,CAAC,KAAK;oCAAE,MAAM,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCACvD,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;gCAC3B,MAAM,kBAAkB,GAAqC,EAAE,CAAC;gCAChE,KAAK,MAAM,CAAC,IAAI,SAAS;oCAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;gCAChE,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAC/B,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,kBAAkB,EAAE,aAAa,EAAE,CAAC,EAAE,EACtG,EAAE,CACH,CAAC;4BACJ,CAAC;4BAED,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gCACnC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gCACvB,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,KAAK,qBAAqB,CAAC,cAAc,EAAE,CAAC;oCAClH,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,oBAAoB,CAAC,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;gCACxG,CAAC;4BACH,CAAC;4BAED,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO;gCAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;4BACjD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,YAAY,CAAC,CAAC;4BACpF,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gCACzB,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,KAAK,EAAE,oBAAoB,SAAS,CAAC,MAAM,yBAAyB,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC;4BACvJ,CAAC;4BACD,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,uBAAuB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;4BACpI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;4BAE9H,uFAAuF;4BACvF,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;4BAC7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;4BAC9D,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;4BACzB,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC;4BAE/B,yGAAyG;4BACzG,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;4BACjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAC/C,KAAK,EACL,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAC9B,CAAC,KAAK,EAAE,EAAE;gCACR,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC;oCAAE,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;4BACjG,CAAC,EACD,EAAE,CACH,CAAC;4BACF,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;4BACvB,MAAM;wBACR,CAAC;wBAAC,OAAO,SAAS,EAAE,CAAC;4BACnB,IACE,OAAO,KAAK,CAAC;gCACb,CAAC,EAAE,CAAC,OAAO;gCACX,eAAe,CAAC,SAAS,CAAC;gCAC1B,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,uBAAuB,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,mBAAmB,CAAC,EACxH,CAAC;gCACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,2BAA2B,SAAS,CAAC,IAAI,4EAA4E,EAAE,SAAS,CAAC,CAAC;gCAC9J,IAAI,KAAK,KAAK,IAAI;oCAAE,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;gCAC/D,QAAQ,CAAC,MAAM,GAAG,cAAc,CAAC;gCACjC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;gCAC7B,UAAU,GAAG,KAAK,CAAC;gCACnB,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gCACrC,SAAS;4BACX,CAAC;4BACD,MAAM,SAAS,CAAC;wBAClB,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,iFAAiF;gBACjF,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;oBACrC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;oBACtD,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpG,CAAC;gBAED,+FAA+F;gBAC/F,OAAO,CAAC,cAAc,IAAI,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC;gBAEnE,oGAAoG;gBACpG,IAAI,WAAW;oBAAE,MAAM,WAAW,CAAC,KAAK,CAAC;gBAEzC,OAAO,GAAG,QAAQ,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,uBAAuB,CAAC,CAAC,CAAC,cAAc,CAAC,SAAS,CAAC;gBAClH,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;oBACf,OAAO,GAAG,cAAc,CAAC,QAAQ,CAAC;oBAClC,KAAK,GAAG,IAAI,eAAe,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,wBAAwB,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBACjK,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAC1C,CAAC;qBAAM,CAAC;oBACN,KAAK,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;oBAClC,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC;oBAChC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;oBACtC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,gBAAgB,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,kBAAkB,EAAE,CAAC;gBACrB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,IAAI,SAAS,EAAE,CAAC;oBACd,IAAI,CAAC;wBACH,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC;oBAC5B,CAAC;oBAAC,OAAO,SAAS,EAAE,CAAC;wBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,4BAA4B,EAAE,SAAS,CAAC,CAAC;oBACvE,CAAC;gBACH,CAAC;YACH,CAAC;YAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;YACpC,MAAM,OAAO,GAAgC,EAAE,CAAC;YAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAW,CAAC,CAAC;YAC9F,MAAM,MAAM,GAAG,aAAa,CAAC;gBAC3B,KAAK,EAAE,GAAG,CAAC,KAAK;gBAChB,OAAO;gBACP,KAAK;gBACL,MAAM;gBACN,QAAQ;gBACR,SAAS;gBACT,UAAU;gBACV,OAAO,EAAE,OAAO,CAAC,KAAK;gBACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,YAAY;gBACrC,aAAa,EAAE,MAAM;gBACrB,QAAQ;gBACR,aAAa;gBACb,OAAO;gBACP,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,CAAC,CAAC;YAC5F,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,4BAA4B,EAAE,SAAS,CAAC,CAAC;YACvE,CAAC;YAED,IAAI,CAAC,IAAI,CACP,aAAa,EACb,KAAK,EACL,OAAO,GAAG,CAAC,KAAK,aAAa,WAAW,CAAC,OAAO,CAAC,YAAY,MAAM,gBAAgB,UAAU,aAAa,OAAO,CAAC,KAAK,OAAO,MAAM,CAAC,UAAU,KAAK,CACrJ,CAAC;YACF,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YACrB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,EAAE,CAAC;gBAC3D,IAAI,CAAC;oBACH,QAAQ,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,SAAS,EAAE,CAAC;oBACnB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,8BAA8B,EAAE,SAAS,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,WAAW,CAAC,OAA8B,EAAE,OAAkC,EAAE,OAA8B,EAAE,WAAmB;QACzI,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC;QAC5D,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1I,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClD,IAAI,OAAO,GAAG,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;YACpD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;QACtE,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7B,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACnJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,oBAAoB,CAChC,OAA8B,EAC9B,GAA+B,EAC/B,WAA2D,EAC3D,QAAiC,EACjC,EAAe;QAEf,MAAM,KAAK,GAAgD,EAAE,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,GAAG;YAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;QACrC,IAAI,KAAK,GAAG,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACzH,IAAI,OAAO,CAAC,QAAQ,KAAK,eAAe,CAAC,UAAU,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACvE,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,IAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAgC,CAAC,KAAK,CAAC,CAAC,CAAC;QACnH,CAAC;QACD,MAAM,OAAO,GAA+B,EAAE,CAAC;QAC/C,MAAM,QAAQ,GAA4B,EAAE,CAAC;QAC7C,MAAM,IAAI,GAA4B,EAAE,CAAC;QAEzC,MAAM,KAAK,GAAG,KAAK,EAAE,MAAgC,EAAiB,EAAE;YACtE,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;gBAAE,OAAO;YACrD,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YAC5B,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,MAAM,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,CAAC;oBAC9C,MAAM,gBAAgB,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACtD,IAAI,CAAC,gBAAgB,EAAE,CAAC;wBACtB,IAAI,UAAU,CAAC,QAAQ,EAAE,CAAC;4BACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,qBAAqB,CAAC,OAAO,EAAE,OAAO,EAAE,wBAAwB,UAAU,CAAC,IAAI,qBAAqB,EAAE,CAAC,CAAC;wBACnJ,CAAC;wBACD,SAAS;oBACX,CAAC;oBACD,IAAI,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBACpC,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAC3C,UAAU,CAAC,IAAI,EACf,IAAI,gBAAgB,EAAE,EACtB,gBAAgB,CAAC,SAAS,EAC1B,gBAAgB,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,EACtE,KAAK,EACL,EAAE,CACH,CAAC;wBACF,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;oBAC7B,CAAC;oBACD,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;YACxB,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,mHAAmH;QACnH,mHAAmH;QACnH,6GAA6G;QAC7G,MAAM,MAAM,GAAG,KAAK;aACjB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;aACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnJ,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,MAAM;YAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3C,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,KAAK,CAAC,QAAQ,CACpB,UAAiC,EACjC,aAAyC,EACzC,aAAqB,EACrB,cAAsB,EACtB,OAA8B,EAC9B,OAAsB,EACtB,EAAe;QAEf,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,SAAS,GAAG,CAAC,CAAC;QAClB,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACxD,qHAAqH;QACrH,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QACvI,IAAI,SAAS,GAAG,UAAU,CAAC;QAC3B,MAAM,UAAU,GAAG,cAAc,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC;QACnG,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACtF,IAAI,CAAC,KAAK;gBAAE,MAAM;YAClB,QAAQ,IAAI,KAAK,CAAC,eAAe,CAAC;YAClC,IAAI,KAAK,CAAC,QAAQ,KAAK,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;gBAAE,MAAM,CAAC,iDAAiD;YAEjH,MAAM,OAAO,GAAoB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,SAAS;gBACxB,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,aAAa,EAAE,UAAU;gBACzB,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE;gBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,EAAE;gBAChC,uEAAuE;gBACvE,UAAU,EAAE,UAAU;qBACnB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC;qBAC7F,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC9E,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;aAC5C,CAAC;YACF,IAAI,MAAsB,CAAC;YAC3B,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;gBACrG,IAAI,MAAM,CAAC,KAAK;oBAAE,MAAM,oBAAoB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YAC7D,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,eAAe,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,aAAa,IAAI,SAAS,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC;oBAC3H,gHAAgH;oBAChH,iGAAiG;oBACjG,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;oBAC7E,IAAI,CAAC,IAAI,CACP,SAAS,EACT,KAAK,EACL,cAAc,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,QAAQ,sEAAsE,SAAS,qCAAqC,CACrK,CAAC;oBACF,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,CAAC;YAClB,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACpE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACtB,IAAI,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,GAAG,CAAC;gBAAE,IAAI,CAAC,iBAAiB,CAAC,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;YAC9F,MAAM,IAAI,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC;YACrC,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACvB,IAAI,CAAC,IAAI,CACP,OAAO,EACP,KAAK,EACL,gBAAgB,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,QAAQ,UAAU,MAAM,CAAC,UAAU,CAAC,MAAM,cAAc,MAAM,CAAC,SAAS,CAAC,MAAM,wBAAwB,MAAM,CAAC,cAAc,EAAE,CACvK,CAAC;YAEF,IAAI,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC;gBACpH,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,cAAc,KAAK,CAAC,OAAO,4DAA4D,CAAC,CAAC;gBACrH,MAAM;YACR,CAAC;YACD,IAAI,KAAK,CAAC,QAAQ,GAAG,SAAS,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,SAAS,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,cAAc;gBAAE,MAAM;YACzH,oDAAoD;YACpD,IAAI,SAAS,GAAG,UAAU;gBAAE,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;QAC9E,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAa,EAAE,IAAkB,EAAE,OAA8B,EAAE,EAAe;;QACxG,4HAA4H;QAC5H,iGAAiG;QACjG,IAAI,QAAQ,GAAG,CAAC,CAAC;QACjB,IAAI,YAAY,GAAuD,IAAI,CAAC;QAC5E,SAAS,CAAC;YACR,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3D,IAAI,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;YAC7B,IAAI,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC;YAC/B,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC5C,IAAI,YAAY,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,GAAG,YAAY,CAAC,UAAU,IAAI,MAAM,CAAC,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC;gBAAE,QAAQ,GAAG,CAAC,CAAC;YAC1I,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAC5B,IAAI,CAAC;gBACH,oHAAoH;gBACpH,6CAA6C;gBAC7C,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAChC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC;oBACpF,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;oBAC/C,IAAI,KAAK,CAAC,OAAO;wBAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;oBAC1C,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC;oBACvB,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;oBAClD,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAA,KAAK,CAAC,eAAe,mCAAI,IAAI,CAAC,CAAC;gBACnE,CAAC;gBACD,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,+CAA+C,CAAC,CAAC;YAC9G,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IACE,eAAe,CAAC,SAAS,CAAC;oBAC1B,CAAC,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,YAAY;wBAC/C,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,YAAY;wBAChD,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,WAAW;wBAC/C,SAAS,CAAC,IAAI,KAAK,gBAAgB,CAAC,iBAAiB,CAAC,EACxD,CAAC;oBACD,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;oBAC3C,MAAM,SAAS,CAAC;gBAClB,CAAC;gBACD,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACtF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,iCAAiC,QAAQ,GAAG,CAAC,KAAK,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACtG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC;oBACzC,QAAQ,EAAE,CAAC;oBACX,YAAY,GAAG,MAAM,CAAC;oBACtB,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAI,SAA8C,EAAE,EAAe;QACzF,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC;gBAChC,OAAO,MAAM,SAAS,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC;YAAC,OAAO,SAAS,EAAE,CAAC;gBACnB,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,gBAAgB,CAAC,SAAS,CAAC,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;oBACrF,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,iCAAiC,OAAO,GAAG,CAAC,KAAK,SAAS,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;oBACrG,MAAM,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;oBACxC,SAAS;gBACX,CAAC;gBACD,MAAM,SAAS,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,OAAe;QAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IAC/G,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,EAAe;QAC5C,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW;YAAE,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;IAEO,KAAK,CAAC,WAAW,CACvB,GAAc,EACd,MAAuB,EACvB,SAAoC,EACpC,YAAoB,EACpB,eAAuB,EACvB,cAAsB;QAEtB,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC;QAC/C,MAAM,OAAO,GAAgC,EAAE,CAAC;QAChD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,CAAW,CAAC,CAAC;QAC9F,MAAM,MAAM,GAAoB;YAC9B,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,YAAY;YACZ,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC;YACpC,QAAQ,EAAE,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC5C,SAAS,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YAClD,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;YACxD,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,eAAe;YACf,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE;YAC3C,OAAO;YACP,eAAe,EAAE,WAAW,CAAC,eAAe;YAC5C,eAAe,EAAE,WAAW,CAAC,eAAe,CAAC,KAAK,EAAE;YACpD,iBAAiB,EAAE,WAAW,CAAC,YAAY;YAC3C,eAAe,EAAE,WAAW,CAAC,kBAAkB;YAC/C,cAAc,EAAE,WAAW,CAAC,cAAc;YAC1C,gBAAgB,EAAE,EAAE,GAAG,WAAW,CAAC,gBAAgB,EAAE;YACrD,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;SAC5C,CAAC;QACF,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;QAEtE,IAAI,CAAC,MAAM,CAAC,SAAS;YAAE,OAAO;QAC9B,MAAM,OAAO,GAA8B,EAAE,CAAC;QAC9C,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,CAAC;QACpE,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7D,IAAI,QAAQ,KAAK,SAAS;YAAE,OAAO,CAAC,aAAa,CAAC,GAAG,QAAQ,CAAC;QAC9D,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;QACvH,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QACrE,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,IAAI,aAAa,KAAK,SAAS;YAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,aAAa,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAC3I,MAAM,UAAU,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,UAAU,IAAI,GAAG,IAAI,UAAU,KAAK,SAAS;YAAE,OAAO,CAAC,oBAAoB,CAAC,GAAG,UAAU,GAAG,CAAC,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;QAClI,MAAM,aAAa,GAAG,SAAS,CAAC,SAAS,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC;QACrE,IAAI,aAAa,KAAK,SAAS,IAAI,cAAc,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAC3E,OAAO,CAAC,+BAA+B,CAAC,GAAG,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QACtG,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACzC,MAAM,MAAM,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,SAAS;gBAAE,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACtE,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;QACtF,IAAI,MAAM,CAAC,OAAO,GAAG,CAAC;YAAE,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC;IACnG,CAAC;IAED,yFAAyF;IAEjF,KAAK,CAAC,sBAAsB,CAClC,YAAsC,EACtC,UAAsC,EACtC,UAAiC,EACjC,EAAe;;QAEf,MAAM,MAAM,GAA0B,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YAClF,iFAAiF;YACjF,IAAI,KAAK,IAAI,KAAK,CAAC,SAAS,KAAK,gBAAgB,CAAC,UAAU;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,OAAO,GAAyB,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,YAAY,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE,CAAC;QAC3K,KAAK,MAAM,KAAK,IAAI,MAAM;YAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;QAE9G,MAAM,UAAU,GAA0E,EAAE,CAAC;QAC7F,IAAI,OAAO,GAAgC,IAAI,CAAC;QAChD,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC;YACjE,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;gBAClB,OAAO,GAAG,MAAA,KAAK,CAAC,gBAAgB,mCAAI,IAAI,CAAC;gBACzC,MAAM;YACR,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,OAAO;gBAAE,SAAS;YAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC;YACvG,OAAO,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;gBAC5B,IAAI,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;gBACtC,IAAI,CAAC,IAAI;oBAAE,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,IAAI,GAAG,EAAE,CAAC;gBACzD,OAAO,MAAM,CAAC,OAAO,EAAE;oBAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YACnG,CAAC;QACH,CAAC;QACD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,eAAe,CAAC,gBAAgB,CAAC,cAAc,EAAE,gDAAgD,CAAC,CAAC;QAE3H,MAAM,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;QACnC,IAAI,gBAAgB,GAAG,KAAK,CAAC;QAC7B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAO,CAAC,CAAC;YACjE,IAAI,CAAC,KAAK;gBAAE,SAAS;YACrB,MAAM,MAAM,GAAG,MAAA,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,mCAAI,IAAI,GAAG,EAA6C,CAAC;YACjG,MAAM,OAAO,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC,OAAO,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;YACrC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,gBAAgB,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;YACnG,MAAM,UAAU,GAAG,IAAI,GAAG,EAA2B,CAAC;YACtD,KAAK,MAAM,KAAK,IAAI,KAAK;gBAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YAE5D,MAAM,KAAK,GAAa,EAAE,CAAC;YAC3B,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,EAAE;gBAC/B,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAClC,IAAI,CAAC,KAAK;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBACvB,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBACrB,wGAAwG;oBACxG,IAAI,CAAC,KAAK,CAAC,MAAM;wBAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC7C,CAAC;qBAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;qBAChD,IAAI,CAAC,KAAK,CAAC,MAAM;oBAAE,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClD,CAAC,CAAC,CAAC;YACH,KAAK,MAAM,KAAK,IAAI,KAAK,EAAE,CAAC;gBAC1B,gGAAgG;gBAChG,IAAI,KAAK,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACnG,CAAC;YAED,kEAAkE;YAClE,IAAI,IAAI,CAAC,QAAQ,CAAC,0BAA0B,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,0BAA0B,EAAE,CAAC;gBAC7G,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,OAAO,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBACrI,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACvB,gBAAgB,GAAG,IAAI,CAAC;gBACxB,IAAI,CAAC,IAAI,CACP,aAAa,EACb,KAAK,EACL,eAAe,YAAY,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,gBAAgB,KAAK,CAAC,MAAM,oBAAoB,IAAI,CAAC,QAAQ,CAAC,0BAA0B,uEAAuE,CAC/M,CAAC;gBACF,SAAS;YACX,CAAC;YAED,4CAA4C;YAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;YAC7G,IAAI,iBAAiB,GAAG,aAAa,CAAC;YACtC,IAAI,cAAc,GAAG,OAAO,CAAC;YAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAC;gBAC9C,MAAM,MAAM,GAAiB,EAAE,CAAC;gBAChC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;gBACnC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,EAAE,CAAC;oBAClF,MAAM,YAAY,GAAG;wBACnB,QAAQ,EAAE,IAAI,CAAC,SAAS;wBACxB,YAAY,EAAE,iBAAiB,CAAC,YAAY,CAAC;wBAC7C,OAAO,EAAE,KAAK,CAAC,OAAO;wBACtB,IAAI;wBACJ,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;wBACzC,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe;qBAC5C,CAAC;oBACF,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,EAAE,CAAC;wBACtE,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO;4BAAE,SAAS;wBAC9C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;wBAC3B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE,CAAC,CAAC;wBACvG,OAAO,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;4BAC5B,OAAO,MAAM,CAAC,OAAO,EAAE;gCAAE,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBACpD,CAAC;oBACH,CAAC;gBACH,CAAC;gBACD,iFAAiF;gBACjF,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,eAAC,OAAA,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAA,MAAA,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,0CAAE,MAAM,mCAAI,KAAK,CAAC,CAAA,EAAA,CAAC,CAAC;gBACnG,KAAK,MAAM,GAAG,IAAI,cAAc;oBAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACzD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,YAAY,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBACjJ,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtB,iBAAiB,GAAG,EAAE,CAAC;gBACvB,cAAc,GAAG,EAAE,CAAC;gBACpB,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC;YAC1B,CAAC;YACD,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;gBACjF,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC;YAC/I,CAAC;YACD,IAAI,CAAC,IAAI,CACP,aAAa,EACb,KAAK,EACL,cAAc,YAAY,CAAC,GAAG,MAAM,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,OAAO,CAAC,MAAM,8BAA8B,KAAK,CAAC,MAAM,aAAa,aAAa,CAAC,MAAM,eAAe,OAAO,CAAC,MAAM,EAAE,CACrL,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAClC,YAAY,CAAC,GAAG,EAChB,gBAAgB;YACd,CAAC,CAAC,mFAAmF;gBACnF,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE;YAC/F,CAAC,CAAC;gBACE,MAAM,EAAE,OAAO,CAAC,MAAM;gBACtB,cAAc,EAAE,OAAO,CAAC,cAAc;gBACtC,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,KAAK,EAAE,oBAAoB,CAAC,MAAM;gBAClC,UAAU,EAAE,IAAI;gBAChB,UAAU,EAAE,IAAI;aACjB,EACL,EAAE,CACH,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,2EAA2E;AAE3E,SAAS,MAAM,CAAI,IAAS,EAAE,IAAO;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,KAAK,IAAI,CAAC;QAAE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,SAAS,CAAC,KAAc;IAC/B,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC;AAED,SAAS,SAAS,CAAC,OAAkC,EAAE,GAAW,EAAE,QAAgB;IAClF,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC7D,CAAC;AAED,SAAS,cAAc,CACrB,YAAsC,EACtC,OAA8B,EAC9B,MAAgD,EAChD,WAA2D,EAC3D,KAAa;;IAEb,IAAI,YAAY,CAAC,KAAK,KAAK,oBAAoB,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IAC5E,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IACvC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,qBAAqB,CAAC,cAAc,CAAC;QAAE,OAAO,IAAI,CAAC;IACtI,IAAI,YAAY,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,OAAO,CAAC,cAAc;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,UAAU,GAAG,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAClD,OAAO,CACL,UAAU,KAAK,SAAS;QACxB,UAAU,CAAC,wBAAwB,GAAG,CAAC;QACvC,CAAC,MAAA,MAAA,YAAY,CAAC,kBAAkB,mCAAI,YAAY,CAAC,gBAAgB,mCAAI,YAAY,CAAC,YAAY,CAAC,GAAG,KAAK,GAAG,UAAU,CAAC,wBAAwB,GAAG,KAAK,CACtJ,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,KAAsB,EACtB,SAA8C,EAC9C,MAAgD,EAChD,UAA0C;;IAE1C,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACvC,KAAK,MAAM,YAAY,IAAI,SAAS,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,IAAI,YAAY,CAAC,GAAG,GAAG,QAAQ,GAAG,CAAC,MAAA,MAAA,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAI,YAAY,CAAC,cAAc,mCAAI,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,MAAA,MAAA,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,mCAAI,YAAY,CAAC,QAAQ,mCAAI,EAAE,CAAC,GAAG,IAAI,CAAC;IAC1M,CAAC;IACD,IAAI,IAAI,IAAI,CAAC;IACb,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3G,KAAK,MAAM,EAAE,CAAC,EAAE,IAAI,MAAM;QAAE,IAAI,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACjH,OAAO,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,qBAAqB,CAAC,OAAO;YAChC,OAAO,gBAAgB,CAAC,mBAAmB,CAAC;QAC9C,KAAK,qBAAqB,CAAC,SAAS;YAClC,OAAO,gBAAgB,CAAC,qBAAqB,CAAC;QAChD;YACE,OAAO,gBAAgB,CAAC,iBAAiB,CAAC;IAC9C,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAI,KAAmB,EAAE,IAAY;IACnD,MAAM,GAAG,GAAU,EAAE,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IAChF,OAAO,GAAG,CAAC;AACb,CAAC;AAED,KAAK,SAAS,CAAC,CAAC,QAAQ,CAAC,KAAkB;IACzC,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM;QAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;AAChH,CAAC","sourcesContent":["// Twin of G9SyncData.Client/G9CSyncEngine.cs, .Execution.cs and .Reconcile.cs: one engine per local database, with a\n// prioritised run queue (status queries never wait for a running sync) and background runs that yield to user runs.\nimport { G9EMoveOutPolicy, G9ESyncDirection } from '../abstractions/enums.js';\nimport { G9SyncErrorCodes, G9SyncException, isSyncException } from '../abstractions/errors.js';\nimport { guidToN, newGuid } from '../abstractions/guid.js';\nimport { G9SyncParameters, compareOrdinal } from '../abstractions/parameters.js';\nimport type { G9Long } from '../abstractions/long.js';\nimport { delay, linkSignals, onAbort } from '../internal/abort.js';\nimport { sha256, toHex } from '../internal/sha256.js';\nimport { utf8Encode } from '../internal/utf8.js';\nimport {\n G9EPullPartKind,\n G9ESubscriptionAction,\n type G9DtChangesAvailable,\n type G9DtHelloResult,\n type G9DtNegotiatedTable,\n type G9DtPullPlan,\n type G9DtPushRequest,\n type G9DtPushResult,\n type G9DtReconcileRequest,\n type G9DtReconcileSummary,\n type G9DtSubscriptionDefinition,\n type G9DtSubscriptionState,\n type G9DtSyncChunk,\n syncErrorToException,\n} from '../protocol/dtos.js';\nimport { openRowBatch } from '../protocol/rowBatch/reader.js';\nimport type { G9SyncClientModel } from './model.js';\nimport { G9ESyncPhase, G9SyncProgressTracker, phaseName } from './progress.js';\nimport {\n G9ESyncOutcome,\n G9ESyncPriority,\n G9SyncRun,\n canCoalesce,\n describeModelProblem,\n isTransientError,\n makeRunResult,\n normalizeError,\n outcomeName,\n priorityName,\n requestSignature,\n resolveEngineOptions,\n resolveRequest,\n type G9ResolvedEngineOptions,\n type G9ResolvedSyncRequest,\n type G9RowsAppliedEvent,\n type G9SubscriptionOptions,\n type G9SyncEngineOptions,\n type G9SyncHealth,\n type G9SyncLogLevel,\n type G9SyncModelProblem,\n type G9SyncRequest,\n type G9SyncRunResult,\n} from './runs.js';\nimport {\n G9ApplyReport,\n G9ESubscriptionState,\n toSubscriptionRef,\n type G9ApplySlice,\n type G9ChangeFeedEntry,\n type G9ChangeFeedKeyFilter,\n validateChangeFeedKeyFilter,\n type G9LocalCommand,\n type G9LocalCommandWriter,\n type G9ELocalCommandState,\n type G9LocalRowEntry,\n type G9PendingSummary,\n type G9PushBatch,\n type G9QuarantinedRow,\n type G9RetainedRow,\n type G9SyncClientStore,\n type G9SyncRejection,\n type G9SyncRunReport,\n type G9SyncSubscriptionRecord,\n} from './storeTypes.js';\nimport type { G9SyncTransport } from './transport.js';\n\nconst STAT_CONNECTING = 'Connecting';\nconst STAT_PLANNING = 'Planning';\nconst STAT_PUSH_PER_K_ROW = 'PushPerKRow';\nconst STAT_DOWNLOAD_PER_K_ROW = 'DownloadPerKRow';\nconst STAT_APPLY_PER_K_ROW = 'ApplyPerKRow';\nconst STAT_RECONCILE_PER_SUBSCRIPTION = 'ReconcilePerSubscription';\n\ninterface QueuedRun {\n run: G9SyncRun;\n priority: number;\n order: number;\n}\n\n/**\n * The client sync engine (`G9CSyncEngine`): one per local database. Owns a prioritised run queue, so status queries\n * never wait for a running sync and background runs yield to user runs.\n */\nexport class G9SyncEngine {\n readonly model: G9SyncClientModel;\n private readonly _store: G9SyncClientStore;\n private readonly _transport: G9SyncTransport;\n private readonly _options: G9ResolvedEngineOptions;\n private readonly _lifetime = linkSignals();\n private readonly _queue: QueuedRun[] = [];\n private readonly _pokedTables: { [lower: string]: string } = {};\n private readonly _rowsAppliedListeners: ((event: G9RowsAppliedEvent) => void)[] = [];\n private readonly _runCompletedListeners: ((result: G9SyncRunResult) => void)[] = [];\n private readonly _unsubscribePokes: () => void;\n\n private _initialized = false;\n private _initializing: Promise<void> | null = null;\n private _clientId = '';\n private _order = 0;\n private _current: G9SyncRun | null = null;\n private _suppressions = 0;\n private _autoTimer: ReturnType<typeof setInterval> | null = null;\n private _pokeTimer: ReturnType<typeof setTimeout> | null = null;\n private _wake: (() => void) | null = null;\n private _worker: Promise<void> | null = null;\n private _disposed = false;\n /** The model problems last logged, so the warning is said once per distinct set (ADR-0061). */\n private _reportedModelProblems: string | null = null;\n\n constructor(store: G9SyncClientStore, transport: G9SyncTransport, model: G9SyncClientModel, options?: G9SyncEngineOptions) {\n if (!store) throw new TypeError('A store is required.');\n if (!transport) throw new TypeError('A transport is required.');\n if (!model) throw new TypeError('A model is required.');\n this._store = store;\n this._transport = transport;\n this.model = model;\n this._options = resolveEngineOptions(options);\n this._unsubscribePokes = transport.onChangesAvailable((changes) => this._onChangesAvailable(changes));\n }\n\n get clientId(): string {\n if (!this._initialized) throw new Error('Call initialize first.');\n return this._clientId;\n }\n\n get isRunning(): boolean {\n return this._current !== null;\n }\n\n get queuedRuns(): number {\n return this._queue.length;\n }\n\n get isBackgroundSuppressed(): boolean {\n return this._suppressions > 0;\n }\n\n /** Raised after rows were written locally (download, reconciliation or canonical push results). Returns the unsubscribe function. */\n onRowsApplied(listener: (event: G9RowsAppliedEvent) => void): () => void {\n this._rowsAppliedListeners.push(listener);\n return () => remove(this._rowsAppliedListeners, listener);\n }\n\n onRunCompleted(listener: (result: G9SyncRunResult) => void): () => void {\n this._runCompletedListeners.push(listener);\n return () => remove(this._runCompletedListeners, listener);\n }\n\n /** Provisions local tables and capture, and starts the run worker. Idempotent. */\n initialize(signal?: AbortSignal): Promise<void> {\n if (this._initialized) return Promise.resolve();\n if (!this._initializing) {\n this._initializing = (async () => {\n try {\n await this._store.initialize(this.model, signal);\n this._clientId = await this._store.getClientId(signal);\n this._initialized = true;\n this._worker = this._workerLoop();\n } finally {\n if (!this._initialized) this._initializing = null;\n }\n })();\n }\n return this._initializing;\n }\n\n // ================================================================ subscriptions\n\n /** Adds (or returns) a subscription. Its rows arrive on the next run that includes it. */\n async subscribe(name: string, parameters?: G9SyncParameters | null, options?: G9SubscriptionOptions | null, signal?: AbortSignal): Promise<G9SyncSubscriptionRecord> {\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A subscription name is required.');\n await this.initialize(signal);\n const state = await this._store.getServerState(signal);\n const definition = state.definitions.find((d) => d.name === name) ?? null;\n const ephemeral = options?.ephemeral ?? definition?.ephemeral ?? false;\n const ttlMs = options?.ttlMs ?? (definition && definition.ephemeral && definition.ttlSeconds > 0 ? definition.ttlSeconds * 1000 : null);\n const record = await this._store.ensureSubscription(name, parameters ?? new G9SyncParameters(), ephemeral, ttlMs, options?.adoptExistingRows ?? false, signal);\n await this._store.updateSubscription(record.key, { accessed: true }, signal);\n return record;\n }\n\n /** Removes a subscription; rows no other subscription holds follow the server's move-out policy. */\n async unsubscribe(name: string, parameters?: G9SyncParameters | null, signal?: AbortSignal): Promise<void> {\n await this.initialize(signal);\n const state = await this._store.getServerState(signal);\n const policy = state.definitions.find((d) => d.name === name)?.moveOutPolicy ?? G9EMoveOutPolicy.Delete;\n await this._store.removeSubscription(G9SyncParameters.buildSubscriptionKey(name, parameters ?? null), policy, signal);\n }\n\n async getSubscriptions(signal?: AbortSignal): Promise<G9SyncSubscriptionRecord[]> {\n await this.initialize(signal);\n return this._store.getSubscriptions(signal);\n }\n\n // ================================================================ runs\n\n /** Queues a run. Identical plain requests already waiting are coalesced into one run. */\n run(request?: G9SyncRequest | null): G9SyncRun {\n if (!this._initialized) throw new Error('Call initialize first.');\n const resolved = resolveRequest(request);\n if (canCoalesce(resolved)) {\n const signature = requestSignature(resolved);\n for (const queued of this._queue) {\n const r = queued.run;\n if (!r.isStarted && canCoalesce(r.request) && r.request.priority === resolved.priority && requestSignature(r.request) === signature) return r;\n }\n }\n const run = new G9SyncRun(resolved);\n this._queue.push({ run, priority: resolved.priority, order: this._order++ });\n const current = this._current;\n let preempted: G9SyncRun | null = null;\n if (current !== null && current.request.priority === G9ESyncPriority.Background && resolved.priority > G9ESyncPriority.Background) {\n current.preempted = true;\n preempted = current;\n }\n this._signal();\n if (preempted) {\n preempted.cancel();\n this._log('information', 20001, `Background run ${preempted.runId} pre-empted by run ${run.runId}`);\n }\n return run;\n }\n\n /** Queues a run and awaits its result. */\n sync(request?: G9SyncRequest | null): Promise<G9SyncRunResult> {\n return this.run(request).completion;\n }\n\n /** While the returned scope is alive, background runs are skipped. Call the returned function to end it. */\n suppressBackground(): () => void {\n this._suppressions++;\n let done = false;\n return () => {\n if (done) return;\n done = true;\n this._suppressions--;\n };\n }\n\n /** Queues a background push+pull of every non-heavy subscription on a fixed interval. */\n startAutomaticSync(intervalMs: number): void {\n if (!(intervalMs > 0)) throw new RangeError('The interval must be positive.');\n this.stopAutomaticSync();\n this._autoTimer = setInterval(() => this._tryQueueBackground(null), intervalMs);\n }\n\n stopAutomaticSync(): void {\n if (this._autoTimer !== null) {\n clearInterval(this._autoTimer);\n this._autoTimer = null;\n }\n }\n\n // ================================================================ queries\n\n /**\n * Records a command (ADR-0025): the server executes the handler registered for `name` on the next push, once, in\n * device order. `applyLocally` writes its local effects immediately, in the same transaction.\n */\n async executeCommand(\n name: string,\n payloadJson: string,\n applyLocally?: ((writer: G9LocalCommandWriter, signal?: AbortSignal) => Promise<void>) | null,\n version = 1,\n signal?: AbortSignal,\n ): Promise<G9LocalCommand> {\n if (typeof name !== 'string' || name.trim() === '') throw new TypeError('A command name is required.');\n if (typeof payloadJson !== 'string') throw new TypeError('The payload JSON is required.');\n await this.initialize(signal);\n return this._store.enqueueCommand({ name, version, payload: payloadJson }, applyLocally ?? null, signal);\n }\n\n /** Frees space taken by an UPLOAD-ONLY table: removes uploaded rows without uploading a delete. */\n async forgetUploadedRows(localTable: string, keys?: readonly string[] | null, signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.forgetUploadedRows(localTable, keys ?? null, signal);\n }\n\n async getCommands(state?: G9ELocalCommandState | null, limit = 200, signal?: AbortSignal): Promise<G9LocalCommand[]> {\n await this.initialize(signal);\n return this._store.getCommands(state ?? null, limit, signal);\n }\n\n async getPendingSummary(signal?: AbortSignal): Promise<G9PendingSummary> {\n await this.initialize(signal);\n return this._store.getPendingSummary(signal);\n }\n\n async getRejections(signal?: AbortSignal): Promise<G9SyncRejection[]> {\n await this.initialize(signal);\n return this._store.getRejections(signal);\n }\n\n async getQuarantined(signal?: AbortSignal): Promise<G9QuarantinedRow[]> {\n await this.initialize(signal);\n return this._store.getQuarantined(signal);\n }\n\n async restoreQuarantined(localTable: string, key: string, signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.restoreQuarantined(localTable, key, signal);\n }\n\n /** Throws away every staged pull, so the next run plans afresh. Returns whether there was one. */\n async discardStagedPull(signal?: AbortSignal): Promise<boolean> {\n await this.initialize(signal);\n return (await this._store.discardAllStagedPulls(signal)) > 0;\n }\n\n async discardQuarantined(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.discardQuarantined(localTable ?? null, key ?? null, signal);\n }\n\n async getRetained(signal?: AbortSignal): Promise<G9RetainedRow[]> {\n await this.initialize(signal);\n return this._store.getRetained(signal);\n }\n\n async retryRejected(localTable?: string | null, key?: string | null, signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.retryRejected(localTable ?? null, key ?? null, signal);\n }\n\n async readChangeFeed(localTable: string, afterSequence: number, limit = 1000, signal?: AbortSignal): Promise<G9ChangeFeedEntry[]> {\n await this.initialize(signal);\n return this._store.readChangeFeed(localTable, afterSequence, limit, signal);\n }\n\n /**\n * The change feed for one table narrowed to the keys `keyFilter` selects (plus every deletion), so a projection of one site does\n * not walk the entries of every other one (`ReadChangeFeedAsync(..., G9CChangeFeedKeyFilter, ...)`).\n */\n async readChangeFeedFiltered(localTable: string, afterSequence: number, limit: number, keyFilter: G9ChangeFeedKeyFilter, signal?: AbortSignal): Promise<G9ChangeFeedEntry[]> {\n validateChangeFeedKeyFilter(keyFilter);\n await this.initialize(signal);\n return this._store.readChangeFeedFiltered(localTable, afterSequence, limit, keyFilter, signal);\n }\n\n /** The highest sequence readChangeFeed can return today (a watermark above it belongs to a store that no longer exists). */\n async getChangeSequence(signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.getChangeSequence(signal);\n }\n\n /** The highest sequence ever purged from the change feed; 0 when nothing was (ADR-0059). */\n async getChangeFeedFloor(signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.getChangeFeedFloor(signal);\n }\n\n async adoptExistingRows(signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.adoptExistingRows(signal);\n }\n\n async markDirty(localTable: string, keys: readonly string[], signal?: AbortSignal): Promise<number> {\n await this.initialize(signal);\n return this._store.markDirty(localTable, keys, signal);\n }\n\n async getHealth(signal?: AbortSignal): Promise<G9SyncHealth> {\n await this.initialize(signal);\n const state = await this._store.getServerState(signal);\n return {\n clientId: this._clientId,\n isConnected: this._transport.isConnected,\n isRunning: this.isRunning,\n queuedRuns: this.queuedRuns,\n serverEpoch: state.epoch,\n lastHelloUtcMs: state.lastHelloUtcMs,\n pending: await this._store.getPendingSummary(signal),\n subscriptions: await this._store.getSubscriptions(signal),\n recentRuns: await this._store.getRecentRunReports(10, signal),\n };\n }\n\n async dispose(): Promise<void> {\n if (this._disposed) return;\n this._disposed = true;\n this.stopAutomaticSync();\n this._unsubscribePokes();\n this._lifetime.abort();\n const abandoned = this._queue.splice(0, this._queue.length);\n for (const { run } of abandoned) {\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Canceled, error: new G9SyncException(G9SyncErrorCodes.Canceled, 'The sync engine was disposed.') }));\n }\n this._current?.cancel();\n this._signal();\n if (this._worker) {\n try {\n await this._worker;\n } catch {\n // shutting down\n }\n }\n if (this._pokeTimer !== null) {\n clearTimeout(this._pokeTimer);\n this._pokeTimer = null;\n }\n }\n\n // ================================================================ worker\n\n private _signal(): void {\n const wake = this._wake;\n this._wake = null;\n if (wake) wake();\n }\n\n private _dequeue(): G9SyncRun | null {\n if (this._queue.length === 0) return null;\n let best = 0;\n for (let i = 1; i < this._queue.length; i++) {\n const a = this._queue[i] as QueuedRun;\n const b = this._queue[best] as QueuedRun;\n if (a.priority > b.priority || (a.priority === b.priority && a.order < b.order)) best = i;\n }\n return (this._queue.splice(best, 1)[0] as QueuedRun).run;\n }\n\n private async _workerLoop(): Promise<void> {\n while (!this._lifetime.signal.aborted) {\n const run = this._dequeue();\n if (!run) {\n await new Promise<void>((resolve) => {\n this._wake = resolve;\n });\n continue;\n }\n run.isStarted = true;\n this._current = run;\n try {\n await this._executeRun(run);\n } catch (exception) {\n this._log('error', 20002, `Unexpected failure executing run ${run.runId}`, exception);\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Failed, error: normalizeError(exception) }));\n } finally {\n this._current = null;\n }\n // A pre-empted background run still owes its work: queue it again behind the run that pre-empted it.\n if (run.preempted && run.request.priority === G9ESyncPriority.Background) this._tryQueueBackground(run.request.subscriptions);\n }\n }\n\n private _tryQueueBackground(subscriptions: readonly string[] | null): void {\n if (!this._initialized || this.isBackgroundSuppressed || (this._options.hooks && !this._options.hooks.isNetworkAvailable) || this._lifetime.signal.aborted) {\n return;\n }\n this.run({ priority: G9ESyncPriority.Background, subscriptions });\n }\n\n private _onChangesAvailable(payload: G9DtChangesAvailable): void {\n if (!this._options.pullOnChangesAvailable || payload.tables.length === 0) return;\n for (const table of payload.tables) this._pokedTables[table.toLowerCase()] = table;\n if (this._pokeTimer === null) this._pokeTimer = setTimeout(() => this._flushPokes(), this._options.changesDebounceMs);\n }\n\n private _flushPokes(): void {\n const tables = Object.keys(this._pokedTables);\n for (const key of tables) delete this._pokedTables[key];\n this._pokeTimer = null;\n if (tables.length === 0 || !this._initialized) return;\n const signal = this._lifetime.signal;\n void (async () => {\n try {\n const state = await this._store.getServerState(signal);\n const names: { [name: string]: true } = {};\n let any = false;\n for (const d of state.definitions) {\n if (!d.heavy && d.tables.some((t) => tables.indexOf(t.toLowerCase()) >= 0)) {\n names[d.name] = true;\n any = true;\n }\n }\n if (!any) return;\n const keys = (await this._store.getSubscriptions(signal)).filter((s) => names[s.name] === true).map((s) => s.key);\n if (keys.length > 0) this._tryQueueBackground(keys);\n } catch (exception) {\n if (!signal.aborted) this._log('warning', 20003, 'Handling a server change notification failed', exception);\n }\n })();\n }\n\n private _raiseRowsApplied(report: G9ApplyReport, source: G9ESyncPhase, slice: G9ApplySlice | null = null): void {\n for (const listener of this._rowsAppliedListeners.slice()) {\n try {\n listener({ report, source, slice });\n } catch (exception) {\n this._log('warning', 20004, 'A RowsApplied handler threw', exception);\n }\n }\n }\n\n private _log(level: G9SyncLogLevel, eventId: number, message: string, error?: unknown): void {\n const logger = this._options.logger;\n if (!logger) return;\n try {\n logger.log(level, eventId, message, error);\n } catch {\n // A logger must never break the sync.\n }\n }\n\n // ================================================================ execution\n\n private async _executeRun(run: G9SyncRun): Promise<void> {\n const request = run.request;\n const startedUtcMs = Date.now();\n const changes = new G9ApplyReport();\n const problems: G9DtSubscriptionState[] = [];\n let modelProblems: G9SyncModelProblem[] = [];\n const synced: string[] = [];\n let pushed = 0;\n let rejected = 0;\n let conflicts = 0;\n let downloaded = 0;\n let downloadedBytes = 0;\n let reconciled = 0;\n let error: G9SyncException | null = null;\n let outcome: G9ESyncOutcome = G9ESyncOutcome.Succeeded;\n\n const tracker = new G9SyncProgressTracker(run.runId, (p) => run.publish(p), () => this.queuedRuns, this._options.progressMaxHz);\n try {\n if (request.priority === G9ESyncPriority.Background && this.isBackgroundSuppressed) {\n tracker.complete(G9ESyncPhase.Canceled);\n run.complete(makeRunResult({ runId: run.runId, outcome: G9ESyncOutcome.Canceled, error: new G9SyncException(G9SyncErrorCodes.Canceled, 'Background sync is suppressed.') }));\n return;\n }\n\n const linked = linkSignals(run.cancellation.signal, this._lifetime.signal);\n const ct = linked.signal;\n const cancelRegistration = onAbort(ct, () => tracker.setCancelPending());\n let hostScope: { dispose(): void | Promise<void> } | null = null;\n\n try {\n const history = await this._store.getPhaseStatistics(ct);\n const pending = request.push ? await this._store.getPendingSummary(ct) : null;\n this._planPhases(tracker, history, request, pending ? pending.totalRows : 0);\n if (this._options.hooks) hostScope = await this._options.hooks.beginRun(run, ct);\n\n // ---------------------------------------------------------------- 1. connect + hello\n tracker.enter(G9ESyncPhase.Connecting);\n await this._ensureConnected(ct);\n await this._store.collectExpiredEphemeral(Date.now(), ct);\n const subscriptions = await this._store.getSubscriptions(ct);\n const hello = await this._withRetry(\n (token) =>\n this._transport.hello(\n {\n clientId: this._clientId,\n appVersion: this._options.appVersion,\n protocolVersion: 1,\n tables: this.model.tables.map((t) => t.toWire()),\n subscriptions: subscriptions.map(toSubscriptionRef),\n },\n token,\n ),\n ct,\n );\n if (hello.error) throw syncErrorToException(hello.error);\n await this._store.saveHello(hello, ct);\n if (hello.unknownTables.length > 0) {\n this._log('warning', 20016, 'The server does not know these client tables (they will not sync): ' + hello.unknownTables.join(', '));\n }\n\n // A column declared with the wrong type syncs in NEITHER direction (ADR-0061): say it on every run's result, and once\n // per distinct set in the log.\n modelProblems = [];\n for (const table of hello.tables) {\n for (const column of table.typeMismatchColumns) {\n modelProblems.push({ code: G9SyncErrorCodes.ModelTypeMismatch, table: table.name, column: column.name, clientType: column.clientType, serverType: column.serverType });\n }\n }\n if (modelProblems.length > 0) {\n const described = modelProblems.map(describeModelProblem).join('; ');\n if (this._reportedModelProblems !== described) {\n this._reportedModelProblems = described;\n this._log(\n 'warning',\n 20022,\n `The client model declares ${modelProblems.length} column(s) with a type the server does not have; they sync in NEITHER direction until the model is fixed: ${described}`,\n );\n }\n if (this._options.failOnTypeMismatch) {\n throw new G9SyncException(G9SyncErrorCodes.ModelTypeMismatch, 'The client model declares column types the server does not have; those columns would not sync: ' + described);\n }\n }\n\n const negotiated = hello.tables;\n const definitions: { [name: string]: G9DtSubscriptionDefinition } = {};\n for (const d of hello.definitions) definitions[d.name] = d;\n const states: { [key: string]: G9DtSubscriptionState } = {};\n for (const state of hello.subscriptions) states[state.key] = state;\n\n // ---------------------------------------------------------------- 2. push\n // A FAILED PUSH MUST NOT COST THE PULL: the failure is rethrown after the pull, never swallowed.\n let pushFailure: { error: unknown } | null = null;\n if (request.push && pending && (pending.totalRows > 0 || pending.pendingCommands > 0)) {\n tracker.enter(G9ESyncPhase.Pushing, pending.totalRows + pending.pendingCommands);\n try {\n const totals = await this._pushAll(negotiated, subscriptions, hello.maxPushRows, hello.maxPushBytes, tracker, changes, ct);\n pushed = totals.pushed;\n rejected = totals.rejected;\n conflicts = totals.conflicts;\n } catch (exception) {\n if (ct.aborted) throw exception;\n this._log('warning', 20019, `Run ${run.runId}: the push failed; continuing to the pull so the device keeps receiving, then reporting the failure`, exception);\n pushFailure = { error: exception };\n }\n }\n\n if (request.pull) {\n // ------------------------------------------------------------ 3. select subscriptions (+ dependencies)\n const selected = await this._selectSubscriptions(request, subscriptions, definitions, problems, ct);\n const usable: G9SyncSubscriptionRecord[] = [];\n for (const subscription of selected) {\n const state = states[subscription.key];\n if (\n state &&\n (state.action === G9ESubscriptionAction.Unknown || state.action === G9ESubscriptionAction.InvalidParameters || state.action === G9ESubscriptionAction.Forbidden)\n ) {\n problems.push(state);\n await this._store.updateSubscription(subscription.key, { state: G9ESubscriptionState.Failed, errorCode: actionCode(state.action) }, ct);\n // Forbidden: these rows are no longer this caller's to hold (ADR-0048).\n if (state.action === G9ESubscriptionAction.Forbidden) {\n const released = await this._store.releaseSubscriptionRows(subscription.key, ct);\n changes.merge(released);\n if (released.total > 0) {\n this._log(\n 'warning',\n 20018,\n `Subscription ${subscription.key} is forbidden; released its rows (${released.revokedDeleted} deleted, ${released.revokedQuarantined} quarantined, ${released.revokedRetained} retained)`,\n );\n this._raiseRowsApplied(released, G9ESyncPhase.Reconciling);\n }\n }\n continue;\n }\n usable.push(subscription);\n }\n\n // ------------------------------------------------------------ 4. reconcile\n const now = Date.now();\n const toReconcile = usable.filter((s) => needsReconcile(s, request, states, definitions, now));\n tracker.expect(G9ESyncPhase.Reconciling, toReconcile.length * historyOf(history, STAT_RECONCILE_PER_SUBSCRIPTION, 2500));\n if (toReconcile.length > 0) {\n tracker.enter(G9ESyncPhase.Reconciling, toReconcile.length);\n let done = 0;\n for (const subscription of toReconcile) {\n try {\n const report = await this._reconcileSubscription(subscription, definitions[subscription.name] as G9DtSubscriptionDefinition, negotiated, ct);\n changes.merge(report);\n reconciled += report.total;\n if (report.total > 0) this._raiseRowsApplied(report, G9ESyncPhase.Reconciling);\n } catch (exception) {\n if (isSyncException(exception) && !exception.retryable && exception.code !== G9SyncErrorCodes.Canceled) {\n problems.push({ key: subscription.key, action: G9ESubscriptionAction.Reconcile, message: exception.message });\n await this._store.updateSubscription(subscription.key, { state: G9ESubscriptionState.Failed, errorCode: exception.code }, ct);\n } else {\n throw exception;\n }\n }\n tracker.report(++done, -1, null, subscription.key);\n }\n }\n\n // ------------------------------------------------------------ 5. plan (or resume a staged pull)\n tracker.enter(G9ESyncPhase.Planning);\n const failedKeys: { [key: string]: true } = {};\n for (const p of problems) failedKeys[p.key] = true;\n const current: { [key: string]: G9SyncSubscriptionRecord } = {};\n for (const s of await this._store.getSubscriptions(ct)) current[s.key] = s;\n const plannable = usable.filter((s) => !failedKeys[s.key] && current[s.key] !== undefined).map((s) => current[s.key] as G9SyncSubscriptionRecord);\n\n // A stage is kept PER GENERATION (ADR-0060); what makes one resumable is that the epoch, permissions, columns and\n // the cursors it was planned from are all still exactly what they were.\n const generation = stageGeneration(hello, plannable, states, negotiated);\n const pruned = await this._store.pruneStagedPulls(Date.now() - this._options.stagedPullMaxAgeMs, this._options.stagedPullsMaxBytes, generation, ct);\n if (pruned > 0) this._log('information', 20021, `Removed ${pruned} staged pull(s) past their age or the byte cap`);\n\n // Snapshot files are offered unless one already failed in this run (ADR-0072): a file is a faster way to the same rows,\n // never the only one, so a file the server cannot build or the device rejects costs one replan as rows - not the run.\n let allowFiles = this._options.acceptSnapshotFiles;\n for (let attempt = 0; ; attempt++) {\n const problemsBefore = problems.length;\n const syncedBefore = synced.length;\n let runId: string | null = null;\n try {\n const staged = await this._store.getStagedPullForGeneration(generation, ct);\n let plan: G9DtPullPlan;\n if (staged && staged.createdUtcMs > Date.now() - this._options.stagedPullMaxAgeMs) {\n plan = staged.plan;\n runId = staged.runId;\n this._log('information', 20012, `Resuming staged pull ${runId} (${plan.totalRows} rows planned)`);\n } else {\n const backfills = await this._store.getPendingBackfills(ct);\n const files = allowFiles && this._store.describeSnapshotFiles ? this._store.describeSnapshotFiles(negotiated) : null;\n plan = await this._withRetry(\n (token) =>\n this._transport.planPull(\n {\n clientId: this._clientId,\n subscriptions: plannable.map(toSubscriptionRef),\n tables: negotiated.map((t) => ({ tableId: t.tableId, columns: t.columns.map((c) => c.name) })),\n backfills: backfills.slice(),\n frameVersion: this._options.maxFrameVersion,\n ...(files ? { snapshotFiles: files } : {}),\n },\n token,\n ),\n ct,\n );\n if (plan.error) throw syncErrorToException(plan.error);\n runId = guidToN(newGuid());\n const plannedFromCursors: { [key: string]: string | null } = {};\n for (const s of plannable) plannedFromCursors[s.key] = s.cursor;\n await this._store.beginStagedPull(\n { runId, plan, createdUtcMs: Date.now(), backfills, generation, plannedFromCursors, stageSequence: 0 },\n ct,\n );\n }\n\n for (const skipped of plan.skipped) {\n problems.push(skipped);\n if (skipped.action === G9ESubscriptionAction.Reconcile || skipped.action === G9ESubscriptionAction.ResyncRequired) {\n await this._store.updateSubscription(skipped.key, { state: G9ESubscriptionState.NeedsReconcile }, ct);\n }\n }\n\n for (const c of plan.cursors) synced.push(c.key);\n const fileParts = plan.parts.filter((p) => p.kind === G9EPullPartKind.SnapshotFile);\n if (fileParts.length > 0) {\n this._log('information', 20025, `The pull carries ${fileParts.length} snapshot file(s) for ${fileParts.reduce((sum, p) => sum + p.rows, 0)} row(s)`);\n }\n tracker.expect(G9ESyncPhase.Downloading, Math.max(200, (plan.totalRows / 1000) * historyOf(history, STAT_DOWNLOAD_PER_K_ROW, 350)));\n tracker.expect(G9ESyncPhase.Applying, Math.max(100, (plan.totalRows / 1000) * historyOf(history, STAT_APPLY_PER_K_ROW, 250)));\n\n // ------------------------------------------------------------ 6. download (resumable)\n tracker.enter(G9ESyncPhase.Downloading, plan.totalRows, plan.estimatedBytes);\n const totals = await this._download(runId, plan, tracker, ct);\n downloaded = totals.rows;\n downloadedBytes = totals.bytes;\n\n // ------------------------------------------------------------ 7. apply (atomic, or in committed slices)\n tracker.enter(G9ESyncPhase.Applying, downloaded);\n const applied = await this._store.applyStagedPull(\n runId,\n (rows) => tracker.report(rows),\n (slice) => {\n if (slice.report.total > 0) this._raiseRowsApplied(slice.report, G9ESyncPhase.Applying, slice);\n },\n ct,\n );\n changes.merge(applied);\n break;\n } catch (exception) {\n if (\n attempt === 0 &&\n !ct.aborted &&\n isSyncException(exception) &&\n (exception.code === G9SyncErrorCodes.SnapshotFileUnavailable || exception.code === G9SyncErrorCodes.SnapshotFileCorrupt)\n ) {\n this._log('warning', 20026, `A snapshot file failed (${exception.code}); the staged download was discarded and the pull is planned again as rows`, exception);\n if (runId !== null) await this._store.discardStagedPull(runId);\n problems.length = problemsBefore;\n synced.length = syncedBefore;\n allowFiles = false;\n tracker.enter(G9ESyncPhase.Planning);\n continue;\n }\n throw exception;\n }\n }\n }\n\n // ---------------------------------------------------------------- 8. post steps\n for (const step of request.postSteps) {\n tracker.enter(G9ESyncPhase.PostStep, 0, 0, step.name);\n await step.action({ run, changes, progress: (fraction) => tracker.reportFraction(fraction) }, ct);\n }\n\n // Rows retained after revocation by a RetainWhile rule are re-checked once per run (ADR-0026).\n changes.revokedDeleted += await this._store.reevaluateRetained(ct);\n\n // The pull has been applied and its cursors committed; now the push failure decides the run's fate.\n if (pushFailure) throw pushFailure.error;\n\n outcome = rejected > 0 || problems.length > 0 ? G9ESyncOutcome.CompletedWithRejections : G9ESyncOutcome.Succeeded;\n tracker.complete(G9ESyncPhase.Completed);\n } catch (exception) {\n if (ct.aborted) {\n outcome = G9ESyncOutcome.Canceled;\n error = new G9SyncException(G9SyncErrorCodes.Canceled, run.preempted ? 'Pre-empted by a higher-priority sync.' : 'The sync was canceled.', { cause: exception });\n tracker.complete(G9ESyncPhase.Canceled);\n } else {\n error = normalizeError(exception);\n outcome = G9ESyncOutcome.Failed;\n tracker.complete(G9ESyncPhase.Failed);\n this._log('warning', 20011, `Run ${run.runId} failed with ${error.code}`, error);\n }\n } finally {\n cancelRegistration();\n linked.dispose();\n if (hostScope) {\n try {\n await hostScope.dispose();\n } catch (exception) {\n this._log('warning', 20004, 'A host scope handler threw', exception);\n }\n }\n }\n\n const durations = tracker.durations;\n const phaseMs: { [phase: string]: number } = {};\n for (const key of Object.keys(durations)) phaseMs[key] = Math.floor(durations[key] as number);\n const result = makeRunResult({\n runId: run.runId,\n outcome,\n error,\n pushed,\n rejected,\n conflicts,\n downloaded,\n applied: changes.total,\n durationMs: Date.now() - startedUtcMs,\n subscriptions: synced,\n problems,\n modelProblems,\n changes,\n phaseMs,\n });\n\n try {\n await this._persistRun(run, result, durations, startedUtcMs, downloadedBytes, reconciled);\n } catch (exception) {\n this._log('warning', 20004, 'A run report handler threw', exception);\n }\n\n this._log(\n 'information',\n 20010,\n `Run ${run.runId} finished ${outcomeName(outcome)}: pushed ${pushed}, downloaded ${downloaded}, applied ${changes.total} in ${result.durationMs} ms`,\n );\n run.complete(result);\n for (const listener of this._runCompletedListeners.slice()) {\n try {\n listener(result);\n } catch (exception) {\n this._log('warning', 20004, 'A RunCompleted handler threw', exception);\n }\n }\n } finally {\n tracker.dispose();\n }\n }\n\n private _planPhases(tracker: G9SyncProgressTracker, history: { [key: string]: number }, request: G9ResolvedSyncRequest, pendingRows: number): void {\n const connecting = historyOf(history, STAT_CONNECTING, 800);\n const pushing = request.push && pendingRows > 0 ? Math.max(300, (pendingRows / 1000) * historyOf(history, STAT_PUSH_PER_K_ROW, 1200)) : 0;\n const planning = request.pull ? historyOf(history, STAT_PLANNING, 700) : 0;\n const downloading = request.pull ? 2000 : 0;\n const applying = request.pull ? 1500 : 0;\n tracker.plan(G9ESyncPhase.Connecting, connecting);\n if (pushing > 0) tracker.plan(G9ESyncPhase.Pushing, pushing);\n if (request.pull) {\n tracker.plan(G9ESyncPhase.Reconciling, 0);\n tracker.plan(G9ESyncPhase.Planning, planning);\n tracker.plan(G9ESyncPhase.Downloading, downloading);\n tracker.plan(G9ESyncPhase.Applying, applying);\n }\n const core = connecting + pushing + planning + downloading + applying;\n for (const step of request.postSteps) {\n const hint = step.weightHint;\n tracker.plan(G9ESyncPhase.PostStep, historyOf(history, 'PostStep:' + step.name, hint >= 0.9 ? core * 9 : (core * hint) / (1 - hint)), step.name);\n }\n }\n\n private async _selectSubscriptions(\n request: G9ResolvedSyncRequest,\n all: G9SyncSubscriptionRecord[],\n definitions: { [name: string]: G9DtSubscriptionDefinition },\n problems: G9DtSubscriptionState[],\n ct: AbortSignal,\n ): Promise<G9SyncSubscriptionRecord[]> {\n const byKey: { [key: string]: G9SyncSubscriptionRecord } = {};\n for (const s of all) byKey[s.key] = s;\n const wanted = request.subscriptions;\n let roots = wanted === null ? all.slice() : all.filter((s) => wanted.indexOf(s.key) >= 0 || wanted.indexOf(s.name) >= 0);\n if (request.priority === G9ESyncPriority.Background && wanted === null) {\n roots = roots.filter((s) => !(definitions[s.name] && (definitions[s.name] as G9DtSubscriptionDefinition).heavy));\n }\n const ordered: G9SyncSubscriptionRecord[] = [];\n const visiting: { [key: string]: true } = {};\n const done: { [key: string]: true } = {};\n\n const visit = async (record: G9SyncSubscriptionRecord): Promise<void> => {\n if (done[record.key] || visiting[record.key]) return;\n visiting[record.key] = true;\n const definition = definitions[record.name];\n if (definition) {\n for (const dependency of definition.dependsOn) {\n const parentDefinition = definitions[dependency.name];\n if (!parentDefinition) {\n if (dependency.required) {\n problems.push({ key: record.key, action: G9ESubscriptionAction.Unknown, message: `Required dependency '${dependency.name}' is not available.` });\n }\n continue;\n }\n let parent = byKey[dependency.name];\n if (!parent) {\n parent = await this._store.ensureSubscription(\n dependency.name,\n new G9SyncParameters(),\n parentDefinition.ephemeral,\n parentDefinition.ephemeral ? parentDefinition.ttlSeconds * 1000 : null,\n false,\n ct,\n );\n byKey[parent.key] = parent;\n }\n await visit(parent);\n }\n }\n done[record.key] = true;\n ordered.push(record);\n };\n\n // Creation order. Two subscriptions created in the same millisecond keep it through their slots (handed out lowest\n // free first), then the key, ordinal (JS `<` compares UTF-16 units, like StringComparer.Ordinal) — never the order\n // the store happened to list them in (by key: a random GUID decided which site's rows came first, LES-0052).\n const sorted = roots\n .map((r, i) => ({ r, i }))\n .sort((a, b) => a.r.createdUtcMs - b.r.createdUtcMs || a.r.slot - b.r.slot || (a.r.key < b.r.key ? -1 : a.r.key > b.r.key ? 1 : 0) || a.i - b.i);\n for (const { r } of sorted) await visit(r);\n return ordered;\n }\n\n private async _pushAll(\n negotiated: G9DtNegotiatedTable[],\n subscriptions: G9SyncSubscriptionRecord[],\n serverMaxRows: number,\n serverMaxBytes: number,\n tracker: G9SyncProgressTracker,\n changes: G9ApplyReport,\n ct: AbortSignal,\n ): Promise<{ pushed: number; rejected: number; conflicts: number }> {\n let pushed = 0;\n let rejected = 0;\n let conflicts = 0;\n const references = subscriptions.map(toSubscriptionRef);\n // The server's limits win over the device's preference; bytes keep a margin for the header and compression variance.\n const targetRows = Math.max(1, serverMaxRows > 0 ? Math.min(this._options.pushBatchRows, serverMaxRows) : this._options.pushBatchRows);\n let batchRows = targetRows;\n const batchBytes = serverMaxBytes > 0 ? Math.floor(serverMaxBytes * 0.9) : Number.MAX_SAFE_INTEGER;\n for (;;) {\n const batch = await this._store.buildPushBatch(negotiated, batchRows, batchBytes, ct);\n if (!batch) break;\n rejected += batch.rejectedLocally;\n if (batch.rowCount === 0 && batch.commands.length === 0) break; // only rows that can never be uploaded were left\n\n const request: G9DtPushRequest = {\n clientId: this._clientId,\n batchId: batch.batchId,\n subscriptions: references,\n tables: batch.tables.slice(),\n commands: batch.commands.slice(),\n // Canonical rows come back in the columns the DEVICE holds (LES-0035).\n heldTables: negotiated\n .filter((t) => batch.commands.length > 0 || batch.tables.some((p) => p.tableId === t.tableId))\n .map((t) => ({ tableId: t.tableId, columns: t.columns.map((c) => c.name) })),\n frameVersion: this._options.maxFrameVersion,\n };\n let result: G9DtPushResult;\n try {\n result = await this._withRetry((token) => this._transport.push(request, toChunks(batch), token), ct);\n if (result.error) throw syncErrorToException(result.error);\n } catch (exception) {\n if (isSyncException(exception) && exception.code === G9SyncErrorCodes.RejectTooMany && batchRows > 1 && batch.rowCount > 1) {\n // The server rolled the WHOLE push back for too many rejections (ADR-0063): halve and resend the smaller prefix\n // under the same batch id, so the valid rows get through and the bad ones are parked one by one.\n batchRows = Math.max(1, Math.floor(Math.min(batchRows, batch.rowCount) / 2));\n this._log(\n 'warning',\n 20023,\n `Push batch ${batch.batchId} of ${batch.rowCount} rows was rolled back for too many rejections; sending it again as ${batchRows} rows so the valid rows get through`,\n );\n continue;\n }\n throw exception;\n }\n\n const report = await this._store.applyPushResult(batch, result, ct);\n changes.merge(report);\n if (report.upserts + report.deletes > 0) this._raiseRowsApplied(report, G9ESyncPhase.Pushing);\n pushed += batch.rowCount + batch.commands.length;\n rejected += result.rejections.length;\n conflicts += result.conflicts.length;\n tracker.report(pushed);\n this._log(\n 'debug',\n 20014,\n `Pushed batch ${batch.batchId}: ${batch.rowCount} rows, ${result.rejections.length} rejected, ${result.conflicts.length} conflicts, replayed ${result.alreadyApplied}`,\n );\n\n if (report.accepted + report.rejected + report.conflicts + report.commandsCompleted === 0 && !result.alreadyApplied) {\n this._log('warning', 20015, `Push batch ${batch.batchId} changed no row state; stopping the push loop for this run`);\n break;\n }\n if (batch.rowCount < batchRows && batch.commands.length < batchRows && !batch.truncated && !result.alreadyApplied) break;\n // After a split: grow back towards the normal size.\n if (batchRows < targetRows) batchRows = Math.min(targetRows, batchRows * 2);\n }\n return { pushed, rejected, conflicts };\n }\n\n private async _download(runId: string, plan: G9DtPullPlan, tracker: G9SyncProgressTracker, ct: AbortSignal): Promise<{ rows: number; bytes: number }> {\n // maxRetries counts failures in a row WITHOUT progress (the .NET twin, DownloadAsync): progress is the DURABLE resume point\n // moving, not a chunk arriving - segments after the last checkpoint are written again on resume.\n let failures = 0;\n let lastFailedAt: { stagedRows: number; stagedBytes: number } | null = null;\n for (;;) {\n const resume = await this._store.getResumePoint(runId, ct);\n let rows = resume.stagedRows;\n let bytes = resume.stagedBytes;\n if (resume.complete) return { rows, bytes };\n if (lastFailedAt !== null && (resume.stagedRows > lastFailedAt.stagedRows || resume.stagedBytes > lastFailedAt.stagedBytes)) failures = 0;\n tracker.report(rows, bytes);\n try {\n // Inside the try (the .NET twin, DownloadAsync): a reconnect that fails while the network is still down is one more\n // transient failure, not the end of the run.\n await this._ensureConnected(ct);\n for await (const chunk of this._transport.pull(plan.token, resume.continuation, ct)) {\n await this._store.stageChunk(runId, chunk, ct);\n if (chunk.isFinal) return { rows, bytes };\n rows += chunk.rowCount;\n bytes += chunk.payload ? chunk.payload.length : 0;\n tracker.report(rows, bytes, null, chunk.subscriptionKey ?? null);\n }\n throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, 'The pull stream ended before its final chunk.');\n } catch (exception) {\n if (\n isSyncException(exception) &&\n (exception.code === G9SyncErrorCodes.TokenExpired ||\n exception.code === G9SyncErrorCodes.TokenInvalid ||\n exception.code === G9SyncErrorCodes.ResyncEpoch ||\n exception.code === G9SyncErrorCodes.ResyncAuthChanged)\n ) {\n await this._store.discardStagedPull(runId);\n throw exception;\n }\n if (!ct.aborted && isTransientError(exception) && failures < this._options.maxRetries) {\n this._log('warning', 20013, `Transient pull failure, retry ${failures + 1}: ${messageOf(exception)}`);\n await delay(this._backoff(failures), ct);\n failures++;\n lastFailedAt = resume;\n continue;\n }\n throw exception;\n }\n }\n }\n\n private async _withRetry<T>(operation: (signal: AbortSignal) => Promise<T>, ct: AbortSignal): Promise<T> {\n for (let attempt = 0; ; attempt++) {\n try {\n await this._ensureConnected(ct);\n return await operation(ct);\n } catch (exception) {\n if (!ct.aborted && isTransientError(exception) && attempt < this._options.maxRetries) {\n this._log('warning', 20013, `Transient call failure, retry ${attempt + 1}: ${messageOf(exception)}`);\n await delay(this._backoff(attempt), ct);\n continue;\n }\n throw exception;\n }\n }\n }\n\n private _backoff(attempt: number): number {\n return Math.min(30000, this._options.retryBaseDelayMs * Math.pow(2, attempt)) * (0.85 + Math.random() * 0.3);\n }\n\n private async _ensureConnected(ct: AbortSignal): Promise<void> {\n if (!this._transport.isConnected) await this._transport.connect(ct);\n }\n\n private async _persistRun(\n run: G9SyncRun,\n result: G9SyncRunResult,\n durations: { [key: string]: number },\n startedUtcMs: number,\n downloadedBytes: number,\n reconciledRows: number,\n ): Promise<void> {\n const diagnostics = result.changes.diagnostics;\n const phaseMs: { [phase: string]: number } = {};\n for (const key of Object.keys(durations)) phaseMs[key] = Math.floor(durations[key] as number);\n const report: G9SyncRunReport = {\n runId: run.runId,\n startedUtcMs,\n durationMs: result.durationMs,\n outcome: outcomeName(result.outcome),\n priority: priorityName(run.request.priority),\n errorCode: result.error ? result.error.code : null,\n errorMessage: result.error ? result.error.message : null,\n pushed: result.pushed,\n rejected: result.rejected,\n conflicts: result.conflicts,\n downloaded: result.downloaded,\n applied: result.applied,\n downloadedBytes,\n subscriptions: result.subscriptions.slice(),\n phaseMs,\n triggersSkipped: diagnostics.triggersSkipped,\n foreignTriggers: diagnostics.foreignTriggers.slice(),\n applyTransactions: diagnostics.transactions,\n indexesDeferred: diagnostics.deferredIndexCount,\n indexRebuildMs: diagnostics.indexRebuildMs,\n liveIndexReasons: { ...diagnostics.liveIndexReasons },\n unchangedRows: result.changes.unchangedRows,\n };\n await this._store.saveRunReport(report, this._options.keepRunReports);\n\n if (!result.isSuccess) return;\n const samples: { [key: string]: number } = {};\n const connecting = durations[phaseName(G9ESyncPhase.Connecting)];\n if (connecting !== undefined) samples[STAT_CONNECTING] = connecting;\n const planning = durations[phaseName(G9ESyncPhase.Planning)];\n if (planning !== undefined) samples[STAT_PLANNING] = planning;\n const pushingMs = durations[phaseName(G9ESyncPhase.Pushing)];\n if (result.pushed >= 100 && pushingMs !== undefined) samples[STAT_PUSH_PER_K_ROW] = pushingMs / (result.pushed / 1000);\n const downloadingMs = durations[phaseName(G9ESyncPhase.Downloading)];\n if (result.downloaded >= 500 && downloadingMs !== undefined) samples[STAT_DOWNLOAD_PER_K_ROW] = downloadingMs / (result.downloaded / 1000);\n const applyingMs = durations[phaseName(G9ESyncPhase.Applying)];\n if (result.downloaded >= 500 && applyingMs !== undefined) samples[STAT_APPLY_PER_K_ROW] = applyingMs / (result.downloaded / 1000);\n const reconcilingMs = durations[phaseName(G9ESyncPhase.Reconciling)];\n if (reconcilingMs !== undefined && reconciledRows >= 0 && run.request.pull) {\n samples[STAT_RECONCILE_PER_SUBSCRIPTION] = reconcilingMs / Math.max(1, result.subscriptions.length);\n }\n for (const step of run.request.postSteps) {\n const stepMs = durations['PostStep:' + step.name];\n if (stepMs !== undefined) samples['PostStep:' + step.name] = stepMs;\n }\n if (Object.keys(samples).length > 0) await this._store.recordPhaseStatistics(samples);\n if (result.applied > 0) await this._store.purgeDeletedFeed(this._options.keepDeletedFeedEntries);\n }\n\n // ================================================================ reconciliation (D-07)\n\n private async _reconcileSubscription(\n subscription: G9SyncSubscriptionRecord,\n definition: G9DtSubscriptionDefinition,\n negotiated: G9DtNegotiatedTable[],\n ct: AbortSignal,\n ): Promise<G9ApplyReport> {\n const tables: G9DtNegotiatedTable[] = [];\n for (const name of definition.tables) {\n const table = negotiated.find((t) => t.name.toLowerCase() === name.toLowerCase());\n // UploadOnly: the device's own rows, nothing on the server to compare them with.\n if (table && table.direction !== G9ESyncDirection.UploadOnly) tables.push(table);\n }\n\n const request: G9DtReconcileRequest = { clientId: this._clientId, subscription: toSubscriptionRef(subscription), tables: [], frameVersion: this._options.maxFrameVersion };\n for (const table of tables) request.tables.push(await this._store.computeDigest(subscription.key, table, ct));\n\n const serverRows: { [tableId: number]: Map<string, { version: number; hash: G9Long }> } = {};\n let summary: G9DtReconcileSummary | null = null;\n for await (const chunk of this._transport.reconcile(request, ct)) {\n if (chunk.isFinal) {\n summary = chunk.reconcileSummary ?? null;\n break;\n }\n if (!chunk.payload) continue;\n const reader = await openRowBatch(chunk.payload, { maxBodyBytes: this._options.maxDecodedFrameBytes });\n while (reader.nextSection()) {\n let rows = serverRows[reader.tableId];\n if (!rows) serverRows[reader.tableId] = rows = new Map();\n while (reader.readRow()) rows.set(reader.key, { version: reader.version, hash: reader.rowHash });\n }\n }\n if (!summary) throw new G9SyncException(G9SyncErrorCodes.NetworkFailure, 'The reconcile stream ended before its summary.');\n\n const report = new G9ApplyReport();\n let handedToSnapshot = false;\n for (const mismatch of summary.mismatched) {\n const table = tables.find((t) => t.tableId === mismatch.tableId);\n if (!table) continue;\n const server = serverRows[table.tableId] ?? new Map<string, { version: number; hash: G9Long }>();\n const buckets = new Set<number>(mismatch.buckets);\n const serverKeys = new Set<string>();\n server.forEach((_value, key) => serverKeys.add(key));\n const local = await this._store.readLocalEntries(subscription.key, table, buckets, serverKeys, ct);\n const localByKey = new Map<string, G9LocalRowEntry>();\n for (const entry of local) localByKey.set(entry.key, entry);\n\n const fetch: string[] = [];\n const addMembership: string[] = [];\n const moveOut: string[] = [];\n server.forEach(({ hash }, key) => {\n const entry = localByKey.get(key);\n if (!entry) fetch.push(key);\n else if (entry.dirty) {\n // A pending local change is never overwritten here; a row visible again still gets its membership back.\n if (!entry.member) addMembership.push(key);\n } else if (!entry.hash.equals(hash)) fetch.push(key);\n else if (!entry.member) addMembership.push(key);\n });\n for (const entry of local) {\n // Rows with pending changes are released too; the store's revocation policy decides (ADR-0026).\n if (entry.member && buckets.has(entry.bucket) && !server.has(entry.key)) moveOut.push(entry.key);\n }\n\n // A difference this large is a download, not a repair (ADR-0066).\n if (this._options.reconcileSnapshotThreshold > 0 && fetch.length >= this._options.reconcileSnapshotThreshold) {\n const released = await this._store.applyReconcile(subscription.key, table, [], addMembership, moveOut, definition.moveOutPolicy, ct);\n report.merge(released);\n handedToSnapshot = true;\n this._log(\n 'information',\n 20024,\n `Reconciling ${subscription.key} / ${table.name} would fetch ${fetch.length} rows (threshold ${this._options.reconcileSnapshotThreshold}): released what left, and leaving the rows to a staged snapshot pull`,\n );\n continue;\n }\n\n // Fetched and applied in groups (ADR-0066).\n const groupKeys = Math.max(Math.max(1, this._options.fetchKeysPerRequest), this._options.reconcileApplyRows);\n let pendingMembership = addMembership;\n let pendingMoveOut = moveOut;\n let fetched = 0;\n for (const group of chunked(fetch, groupKeys)) {\n const frames: Uint8Array[] = [];\n const returned = new Set<string>();\n for (const keys of chunked(group, Math.max(1, this._options.fetchKeysPerRequest))) {\n const fetchRequest = {\n clientId: this._clientId,\n subscription: toSubscriptionRef(subscription),\n tableId: table.tableId,\n keys,\n columns: table.columns.map((c) => c.name),\n frameVersion: this._options.maxFrameVersion,\n };\n for await (const chunk of this._transport.fetchRows(fetchRequest, ct)) {\n if (chunk.isFinal || !chunk.payload) continue;\n frames.push(chunk.payload);\n const reader = await openRowBatch(chunk.payload, { maxBodyBytes: this._options.maxDecodedFrameBytes });\n while (reader.nextSection()) {\n while (reader.readRow()) returned.add(reader.key);\n }\n }\n }\n // A key listed but not returned left the subscription between listing and fetch.\n const groupMoveOut = group.filter((k) => !returned.has(k) && (localByKey.get(k)?.member ?? false));\n for (const key of pendingMoveOut) groupMoveOut.push(key);\n const applied = await this._store.applyReconcile(subscription.key, table, frames, pendingMembership, groupMoveOut, definition.moveOutPolicy, ct);\n report.merge(applied);\n pendingMembership = [];\n pendingMoveOut = [];\n fetched += group.length;\n }\n if (fetched === 0 && (pendingMembership.length > 0 || pendingMoveOut.length > 0)) {\n report.merge(await this._store.applyReconcile(subscription.key, table, [], pendingMembership, pendingMoveOut, definition.moveOutPolicy, ct));\n }\n this._log(\n 'information',\n 20020,\n `Reconciled ${subscription.key} / ${table.name}: ${mismatch.buckets.length} buckets differed, fetched ${fetch.length}, adopted ${addMembership.length}, moved out ${moveOut.length}`,\n );\n }\n\n await this._store.updateSubscription(\n subscription.key,\n handedToSnapshot\n ? // No cursor: the plan step of this run sees an initial pull and stages a snapshot.\n { clearCursor: true, state: G9ESubscriptionState.Active, clearError: true, reconciled: true }\n : {\n cursor: summary.cursor,\n definitionHash: summary.definitionHash,\n authHash: summary.authHash,\n state: G9ESubscriptionState.Active,\n clearError: true,\n reconciled: true,\n },\n ct,\n );\n return report;\n }\n}\n\n// ---------------------------------------------------------------- helpers\n\nfunction remove<T>(list: T[], item: T): void {\n const index = list.indexOf(item);\n if (index >= 0) list.splice(index, 1);\n}\n\nfunction messageOf(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction historyOf(history: { [key: string]: number }, key: string, fallback: number): number {\n const value = history[key];\n return value !== undefined && value > 0 ? value : fallback;\n}\n\nfunction needsReconcile(\n subscription: G9SyncSubscriptionRecord,\n request: G9ResolvedSyncRequest,\n states: { [key: string]: G9DtSubscriptionState },\n definitions: { [name: string]: G9DtSubscriptionDefinition },\n nowMs: number,\n): boolean {\n if (subscription.state === G9ESubscriptionState.NeedsReconcile) return true;\n const state = states[subscription.key];\n if (state && (state.action === G9ESubscriptionAction.Reconcile || state.action === G9ESubscriptionAction.ResyncRequired)) return true;\n if (subscription.cursor === null) return false;\n if (request.forceReconcile) return true;\n const definition = definitions[subscription.name];\n return (\n definition !== undefined &&\n definition.reconcileIntervalMinutes > 0 &&\n (subscription.lastReconcileUtcMs ?? subscription.lastSuccessUtcMs ?? subscription.createdUtcMs) < nowMs - definition.reconcileIntervalMinutes * 60000\n );\n}\n\n/**\n * Everything a staged pull's rows depend on (ADR-0046): the server's epoch, the exact set of subscriptions with their\n * definition and authorisation hashes, and the negotiated columns. The cursor is deliberately NOT part of it (ADR-0060).\n */\nexport function stageGeneration(\n hello: G9DtHelloResult,\n plannable: readonly G9SyncSubscriptionRecord[],\n states: { [key: string]: G9DtSubscriptionState },\n negotiated: readonly G9DtNegotiatedTable[],\n): string {\n let text = guidToN(hello.epoch) + '\\n';\n for (const subscription of plannable.slice().sort((a, b) => compareOrdinal(a.key, b.key))) {\n const state = states[subscription.key];\n text += subscription.key + '\\u001F' + ((state ? state.definitionHash : null) ?? subscription.definitionHash ?? '') + '\\u001F' + ((state ? state.authHash : null) ?? subscription.authHash ?? '') + '\\n';\n }\n text += '\\n';\n const tables = negotiated.map((t, i) => ({ t, i })).sort((a, b) => a.t.tableId - b.t.tableId || a.i - b.i);\n for (const { t } of tables) text += String(t.tableId) + '\\u001F' + t.columns.map((c) => c.name).join(',') + '\\n';\n return toHex(sha256(utf8Encode(text)));\n}\n\nfunction actionCode(action: number): string {\n switch (action) {\n case G9ESubscriptionAction.Unknown:\n return G9SyncErrorCodes.UnknownSubscription;\n case G9ESubscriptionAction.Forbidden:\n return G9SyncErrorCodes.SubscriptionForbidden;\n default:\n return G9SyncErrorCodes.InvalidParameters;\n }\n}\n\nfunction chunked<T>(items: readonly T[], size: number): T[][] {\n const out: T[][] = [];\n for (let i = 0; i < items.length; i += size) out.push(items.slice(i, i + size));\n return out;\n}\n\nasync function* toChunks(batch: G9PushBatch): AsyncGenerator<G9DtSyncChunk> {\n let sequence = 0;\n for (const frame of batch.frames) yield { sequence: sequence++, payload: frame, rowCount: 0, isFinal: false };\n}\n"]}
|