@vibeorm/sql 5.9.0 → 5.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/ast.d.ts +120 -4
  2. package/dist/codecs.d.ts +106 -12
  3. package/dist/composable.d.ts +44 -4
  4. package/dist/dialect.d.ts +24 -1
  5. package/dist/dialects/migration-inventory.d.ts +0 -11
  6. package/dist/dialects/mysql-generated-columns.d.ts +1 -5
  7. package/dist/dialects/mysql-index-expressions.d.ts +1 -19
  8. package/dist/dialects/mysql-row-rules.d.ts +1 -7
  9. package/dist/dialects/postgres-generated-columns.d.ts +0 -5
  10. package/dist/dialects/postgres-index-expressions.d.ts +1 -11
  11. package/dist/dialects/postgres-rls-readiness.d.ts +0 -2
  12. package/dist/dialects/postgres-rls.d.ts +7 -1
  13. package/dist/dialects/postgres-row-rules.d.ts +1 -24
  14. package/dist/dialects/sqlite-fts.d.ts +2 -2
  15. package/dist/dialects/sqlite-generated-columns.d.ts +1 -12
  16. package/dist/dialects/sqlite-index-expressions.d.ts +1 -24
  17. package/dist/dialects/sqlite-json-equality.d.ts +1 -14
  18. package/dist/dialects/sqlite-row-rules.d.ts +1 -7
  19. package/dist/dialects/sqlite-table-definition.d.ts +0 -19
  20. package/dist/dialects/test-databases.d.ts +96 -0
  21. package/dist/expr-fragment.d.ts +13 -0
  22. package/dist/identifiers.d.ts +1 -4
  23. package/dist/index.d.ts +9 -5
  24. package/dist/index.js +3754 -3052
  25. package/dist/index.js.map +46 -43
  26. package/dist/json-patch.d.ts +0 -14
  27. package/dist/json-path.d.ts +1 -2
  28. package/dist/key-list.d.ts +0 -21
  29. package/dist/native-types.d.ts +3 -1
  30. package/dist/params.d.ts +0 -2
  31. package/dist/query/expressions.d.ts +1 -33
  32. package/dist/query/index.js.map +7 -7
  33. package/dist/query/mutations.d.ts +1 -14
  34. package/dist/query/reusable.d.ts +1 -16
  35. package/dist/query/select.d.ts +1 -10
  36. package/dist/query/sources.d.ts +1 -36
  37. package/dist/query/state.d.ts +1 -77
  38. package/dist/query-plan.d.ts +2 -2
  39. package/dist/result-decoder.d.ts +21 -1
  40. package/dist/row-rules.d.ts +1 -19
  41. package/dist/sql-bindings.d.ts +7 -43
  42. package/dist/sql-handles.d.ts +1 -3
  43. package/dist/sql-input.d.ts +8 -24
  44. package/dist/timestamp-identity.d.ts +6 -12
  45. package/dist/timestamp-text.d.ts +36 -0
  46. package/package.json +2 -2
package/dist/index.js.map CHANGED
@@ -1,69 +1,72 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/timestamp-identity.ts", "../src/native-enum-parameter.ts", "../src/json-list-parameter.ts", "../src/json-patch.ts", "../src/ast.ts", "../src/json-path.ts", "../src/dialects/external-ownership.ts", "../src/dialects/external-dependents.ts", "../src/params.ts", "../src/sql-bindings.ts", "../src/parameter-snapshot.ts", "../src/sql-input.ts", "../src/result-decoder.ts", "../src/pg-array.ts", "../src/codecs.ts", "../src/sql-handles.ts", "../src/dialects/postgres-physical-catalog.ts", "../src/dialects/postgres-index-keys.ts", "../src/index-columns.ts", "../src/index-expressions.ts", "../src/predicate.ts", "../src/dialects/postgres-index-expressions.ts", "../src/dialects/sqlite-table-definition.ts", "../src/dialects/sqlite-index-expressions.ts", "../src/dialects/mysql-index-expressions.ts", "../src/dialects/mysql-generated-columns.ts", "../src/dialects/sqlite-generated-columns.ts", "../src/dialects/module-dependency.ts", "../src/dialects/migration-replay-coverage.ts", "../src/dialects/migration-shadow.ts", "../src/dialects/migration-shadow-marker.ts", "../src/module-journal.ts", "../src/capabilities.ts", "../src/identifiers.ts", "../src/dialects/sqlite.ts", "../src/dialects/sqlite-fts.ts", "../src/dialects/sqlite-session.ts", "../src/composable.ts", "../src/query-plan.ts", "../src/exclusion.ts", "../src/locks.ts", "../src/json-transport.ts", "../src/dialects/postgres.ts", "../src/dialects/mysql.ts", "../src/dialects/registry.ts", "../src/key-list.ts", "../src/local-date.ts", "../src/date-truncation.ts", "../src/native-types.ts", "../src/generated-columns.ts", "../src/dialects/postgres-generated-columns.ts", "../src/row-rules.ts", "../src/dialects/postgres-row-rules.ts", "../src/dialects/sqlite-row-rules.ts", "../src/dialects/mysql-row-rules.ts", "../src/dialects/sqlite-json-equality.ts", "../src/dialects/diagnostics.ts", "../src/dialects/postgres-diagnostics.ts", "../src/dialects/postgres-rls-readiness.ts", "../src/dialects/postgres-rls.ts", "../src/render.ts", "../src/like.ts", "../src/dialects/postgres-type-identity.ts", "../src/dialects/postgres-default-identity.ts", "../src/dialects/constraint-owned-index.ts", "../src/dialects/mysql-check-probe.ts", "../src/dialects/migration-history.ts", "../src/dialects/sqlite-constraints.ts", "../src/dialects/migration-visibility.ts", "../src/dialects/migration-inventory.ts", "../src/dialects/migration-objects.ts", "../src/dialects/postgres-migration.ts"],
3
+ "sources": ["../src/timestamp-identity.ts", "../src/timestamp-text.ts", "../src/native-enum-parameter.ts", "../src/json-list-parameter.ts", "../src/json-patch.ts", "../src/ast.ts", "../src/json-path.ts", "../src/dialects/external-ownership.ts", "../src/dialects/external-dependents.ts", "../src/params.ts", "../src/sql-bindings.ts", "../src/parameter-snapshot.ts", "../src/sql-input.ts", "../src/result-decoder.ts", "../src/pg-array.ts", "../src/codecs.ts", "../src/sql-handles.ts", "../src/dialects/postgres-physical-catalog.ts", "../src/dialects/postgres-index-keys.ts", "../src/index-columns.ts", "../src/index-expressions.ts", "../src/predicate.ts", "../src/dialects/postgres-index-expressions.ts", "../src/dialects/sqlite-table-definition.ts", "../src/dialects/sqlite-index-expressions.ts", "../src/dialects/mysql-index-expressions.ts", "../src/dialects/mysql-generated-columns.ts", "../src/dialects/sqlite-generated-columns.ts", "../src/dialects/module-dependency.ts", "../src/dialects/migration-replay-coverage.ts", "../src/dialects/migration-shadow.ts", "../src/dialects/migration-shadow-marker.ts", "../src/dialects/test-databases.ts", "../src/module-journal.ts", "../src/capabilities.ts", "../src/identifiers.ts", "../src/dialects/sqlite.ts", "../src/dialects/sqlite-fts.ts", "../src/dialects/sqlite-session.ts", "../src/composable.ts", "../src/expr-fragment.ts", "../src/dialects/sqlite-json-equality.ts", "../src/json-transport.ts", "../src/dialects/diagnostics.ts", "../src/dialects/postgres-diagnostics.ts", "../src/dialects/postgres-rls-readiness.ts", "../src/dialects/postgres-rls.ts", "../src/render.ts", "../src/like.ts", "../src/locks.ts", "../src/date-truncation.ts", "../src/key-list.ts", "../src/query-plan.ts", "../src/exclusion.ts", "../src/dialects/postgres.ts", "../src/dialects/mysql.ts", "../src/dialects/registry.ts", "../src/local-date.ts", "../src/native-types.ts", "../src/generated-columns.ts", "../src/dialects/postgres-generated-columns.ts", "../src/row-rules.ts", "../src/dialects/postgres-row-rules.ts", "../src/dialects/sqlite-row-rules.ts", "../src/dialects/mysql-row-rules.ts", "../src/dialects/postgres-type-identity.ts", "../src/dialects/postgres-default-identity.ts", "../src/dialects/constraint-owned-index.ts", "../src/dialects/mysql-check-probe.ts", "../src/dialects/migration-history.ts", "../src/dialects/sqlite-constraints.ts", "../src/dialects/migration-visibility.ts", "../src/dialects/migration-inventory.ts", "../src/dialects/migration-objects.ts", "../src/dialects/postgres-migration.ts"],
4
4
  "sourcesContent": [
5
- "/** Lossless database identity, never an enumerable property or a public Date subtype. */\ntype TimestampIdentity = {\n readonly milliseconds: number;\n readonly text: string;\n readonly numeric: number | undefined;\n /**\n * The exact equality key: given by the decoder, or computed on first use\n * ({@link identityKey}) — a pure function of `milliseconds` and `text`, so\n * computing it later yields the same string (A-02: most decoded Dates never\n * need it, and building it cost more than the parse itself).\n */\n key: string | undefined;\n readonly kind: \"timestamp\" | \"time\" | \"timetz\" | \"sqlite\";\n};\n\nconst identities = new WeakMap<Date, TimestampIdentity>();\n\n/** The canonical timestamp key: the instant's ISO text with the sub-millisecond digits the transport text carried. */\nfunction canonicalKey(params: { milliseconds: number; text: string }): string {\n const fraction = /\\.(\\d+)/.exec(params.text)?.[1] ?? \"\";\n const remainder = fraction.slice(3).replace(/0+$/, \"\");\n const canonical = Date.prototype.toISOString.call(new Date(params.milliseconds)).replace(/(\\.\\d{3})Z$/, `$1${remainder}Z`);\n return `date:${canonical}`;\n}\n\nfunction identityKey(identity: TimestampIdentity): string {\n if (identity.key === undefined) identity.key = canonicalKey({ milliseconds: identity.milliseconds, text: identity.text });\n return identity.key;\n}\n\n/** Retain transport text while the ordinary Date still represents the decoded value. */\nexport function rememberTimestampIdentity(params: {\n date: Date;\n text: string;\n numeric?: number;\n key?: string;\n kind?: TimestampIdentity[\"kind\"];\n}): Date {\n const { date, text } = params;\n const milliseconds = Date.prototype.getTime.call(date);\n // An invalid Date has no ISO text: the eager key used to throw its RangeError here, so it still does.\n if (!Number.isFinite(milliseconds)) Date.prototype.toISOString.call(date);\n identities.set(date, {\n milliseconds,\n text,\n numeric: params.numeric,\n key: params.key,\n kind: params.kind ?? \"timestamp\",\n });\n return date;\n}\n\nfunction identityOf(params: { date: Date }): TimestampIdentity | undefined {\n const stored = identities.get(params.date);\n if (stored !== undefined && stored.milliseconds !== Date.prototype.getTime.call(params.date)) {\n identities.delete(params.date);\n return undefined;\n }\n return stored;\n}\n\n/** Exact equality key when available; caller-created/mutated Dates keep millisecond semantics. */\nexport function timestampIdentityKey(params: { date: Date }): string {\n const identity = identityOf(params);\n return identity !== undefined ? identityKey(identity) : `date:${Number.isFinite(Date.prototype.getTime.call(params.date)) ? Date.prototype.toISOString.call(params.date) : \"invalid\"}`;\n}\n\n/** Exact parameter text, valid only for an unchanged decoded Date. */\nexport function timestampIdentityText(params: { date: Date; kind?: TimestampIdentity[\"kind\"] }): string | undefined {\n const identity = identityOf(params);\n return identity !== undefined && (params.kind === undefined || identity.kind === params.kind) ? identity.text : undefined;\n}\n\n/** SQLite legacy integer epochs remain integers rather than being rewritten to ISO text. */\nexport function sqliteTimestampIdentityValue(params: { date: Date }): string | number | undefined {\n const identity = identityOf(params);\n return identity?.kind === \"sqlite\" ? identity.numeric ?? identity.text : undefined;\n}\n\n/** Compare retained native identities; SQLite text ordering remains the database's collation. */\nexport function compareTimestampDates(params: { left: Date; right: Date }): -1 | 0 | 1 | null {\n const left = identityOf({ date: params.left });\n const right = identityOf({ date: params.right });\n if (timestampIdentityKey({ date: params.left }) === timestampIdentityKey({ date: params.right })) return 0;\n const rank = (a: number | bigint | string, b: number | bigint | string): -1 | 0 | 1 => a < b ? -1 : a > b ? 1 : 0;\n if (left?.kind === \"sqlite\" || right?.kind === \"sqlite\") {\n return left?.numeric !== undefined && right?.numeric !== undefined ? rank(left.numeric, right.numeric) : null;\n }\n const clock = (identity: TimestampIdentity): readonly [bigint, number] => {\n const [, hours, minutes, seconds, offset] = identityKey(identity).split(\":\");\n const [whole, fraction = \"\"] = seconds!.split(\".\");\n const local = BigInt(Number(hours) * 3600 + Number(minutes) * 60 + Number(whole)) * 1_000_000_000n\n + BigInt(fraction.padEnd(9, \"0\"));\n const zone = Number(offset);\n // PostgreSQL timetz orders unwrapped UTC time, then seconds WEST of UTC.\n return [local - BigInt(zone) * 1_000_000n, -zone];\n };\n if ((left?.kind !== undefined && left.kind !== \"timestamp\") || (right?.kind !== undefined && right.kind !== \"timestamp\")) {\n if (left === undefined || right === undefined || left.kind !== right.kind) return null;\n const a = clock(left);\n const b = clock(right);\n return rank(a[0], b[0]) || rank(a[1], b[1]);\n }\n const milliseconds = rank(Date.prototype.getTime.call(params.left), Date.prototype.getTime.call(params.right));\n if (milliseconds !== 0) return milliseconds;\n const a = /\\.(\\d+)/.exec(left?.text ?? \"\")?.[1]?.slice(3) ?? \"\";\n const b = /\\.(\\d+)/.exec(right?.text ?? \"\")?.[1]?.slice(3) ?? \"\";\n return rank(a.padEnd(Math.max(a.length, b.length), \"0\"), b.padEnd(Math.max(a.length, b.length), \"0\"));\n}\n\n/** Snapshot the value and its valid database identity without sharing mutable state. */\nexport function cloneTimestampDate(params: { date: Date }): Date {\n const date = new Date(Date.prototype.getTime.call(params.date));\n const identity = identityOf(params);\n if (identity !== undefined) identities.set(date, identity);\n return date;\n}\n",
5
+ "/** Lossless database identity, never an enumerable property or a public Date subtype. */\ntype TimestampIdentity = {\n readonly milliseconds: number;\n readonly text: string;\n readonly numeric: number | undefined;\n /**\n * The exact equality key: given by the decoder, or computed on first use\n * ({@link identityKey}) — a pure function of `milliseconds` and `text`, so\n * computing it later yields the same string (A-02: most decoded Dates never\n * need it, and building it cost more than the parse itself).\n */\n key: string | undefined;\n readonly kind: \"timestamp\" | \"time\" | \"timetz\" | \"sqlite\";\n /**\n * A parameter the MySQL DateTime codec handed on for the adapter to write in\n * its zone with every fraction digit ({@link boundTimestampParameter}); a\n * Date a caller passes is never one.\n */\n readonly bound?: true;\n};\n\nconst identities = new WeakMap<Date, TimestampIdentity>();\n\n/** The canonical timestamp key: the instant's ISO text with the sub-millisecond digits the transport text carried. */\nfunction canonicalKey(params: { milliseconds: number; text: string }): string {\n const fraction = /\\.(\\d+)/.exec(params.text)?.[1] ?? \"\";\n const remainder = fraction.slice(3).replace(/0+$/, \"\");\n const canonical = Date.prototype.toISOString.call(new Date(params.milliseconds)).replace(/(\\.\\d{3})Z$/, `$1${remainder}Z`);\n return `date:${canonical}`;\n}\n\nfunction identityKey(identity: TimestampIdentity): string {\n if (identity.key === undefined) identity.key = canonicalKey({ milliseconds: identity.milliseconds, text: identity.text });\n return identity.key;\n}\n\n/**\n * Retain transport text while the ordinary Date still represents the decoded value.\n * @internal\n */\nexport function rememberTimestampIdentity(params: {\n date: Date;\n text: string;\n numeric?: number;\n key?: string;\n kind?: TimestampIdentity[\"kind\"];\n}): Date {\n const { date, text } = params;\n const milliseconds = Date.prototype.getTime.call(date);\n // An invalid Date has no ISO text: the eager key used to throw its RangeError here, so it still does.\n if (!Number.isFinite(milliseconds)) Date.prototype.toISOString.call(date);\n identities.set(date, {\n milliseconds,\n text,\n numeric: params.numeric,\n key: params.key,\n kind: params.kind ?? \"timestamp\",\n });\n return date;\n}\n\nfunction identityOf(params: { date: Date }): TimestampIdentity | undefined {\n const stored = identities.get(params.date);\n if (stored !== undefined && stored.milliseconds !== Date.prototype.getTime.call(params.date)) {\n identities.delete(params.date);\n return undefined;\n }\n return stored;\n}\n\n/** Exact equality key when available; caller-created/mutated Dates keep millisecond semantics. */\nexport function timestampIdentityKey(params: { date: Date }): string {\n const identity = identityOf(params);\n return identity !== undefined ? identityKey(identity) : `date:${Number.isFinite(Date.prototype.getTime.call(params.date)) ? Date.prototype.toISOString.call(params.date) : \"invalid\"}`;\n}\n\n/** Exact parameter text, valid only for an unchanged decoded Date. */\nexport function timestampIdentityText(params: { date: Date; kind?: TimestampIdentity[\"kind\"] }): string | undefined {\n const identity = identityOf(params);\n return identity !== undefined && (params.kind === undefined || identity.kind === params.kind) ? identity.text : undefined;\n}\n\n/**\n * SQLite legacy integer epochs remain integers rather than being rewritten to ISO text.\n * @internal\n */\nexport function sqliteTimestampIdentityValue(params: { date: Date }): string | number | undefined {\n const identity = identityOf(params);\n return identity?.kind === \"sqlite\" ? identity.numeric ?? identity.text : undefined;\n}\n\n/** Compare retained native identities; SQLite text ordering remains the database's collation. */\nexport function compareTimestampDates(params: { left: Date; right: Date }): -1 | 0 | 1 | null {\n const left = identityOf({ date: params.left });\n const right = identityOf({ date: params.right });\n if (timestampIdentityKey({ date: params.left }) === timestampIdentityKey({ date: params.right })) return 0;\n const rank = (a: number | bigint | string, b: number | bigint | string): -1 | 0 | 1 => a < b ? -1 : a > b ? 1 : 0;\n if (left?.kind === \"sqlite\" || right?.kind === \"sqlite\") {\n return left?.numeric !== undefined && right?.numeric !== undefined ? rank(left.numeric, right.numeric) : null;\n }\n const clock = (identity: TimestampIdentity): readonly [bigint, number] => {\n const [, hours, minutes, seconds, offset] = identityKey(identity).split(\":\");\n const [whole, fraction = \"\"] = seconds!.split(\".\");\n const local = BigInt(Number(hours) * 3600 + Number(minutes) * 60 + Number(whole)) * 1_000_000_000n\n + BigInt(fraction.padEnd(9, \"0\"));\n const zone = Number(offset);\n // PostgreSQL timetz orders unwrapped UTC time, then seconds WEST of UTC.\n return [local - BigInt(zone) * 1_000_000n, -zone];\n };\n if ((left?.kind !== undefined && left.kind !== \"timestamp\") || (right?.kind !== undefined && right.kind !== \"timestamp\")) {\n if (left === undefined || right === undefined || left.kind !== right.kind) return null;\n const a = clock(left);\n const b = clock(right);\n return rank(a[0], b[0]) || rank(a[1], b[1]);\n }\n const milliseconds = rank(Date.prototype.getTime.call(params.left), Date.prototype.getTime.call(params.right));\n if (milliseconds !== 0) return milliseconds;\n const a = /\\.(\\d+)/.exec(left?.text ?? \"\")?.[1]?.slice(3) ?? \"\";\n const b = /\\.(\\d+)/.exec(right?.text ?? \"\")?.[1]?.slice(3) ?? \"\";\n return rank(a.padEnd(Math.max(a.length, b.length), \"0\"), b.padEnd(Math.max(a.length, b.length), \"0\"));\n}\n\n/**\n * A copy of an identity-carrying `date` marked as a bound parameter: the\n * adapter writes it as wall-clock text in its own zone, keeping the\n * sub-millisecond digits a driver `Date` drops. The caller's `Date` is never\n * marked, so a raw statement that binds it keeps the driver's own serialization.\n * @internal\n */\nexport function boundTimestampParameter(params: { date: Date }): Date {\n const identity = identityOf(params);\n const date = new Date(Date.prototype.getTime.call(params.date));\n if (identity !== undefined) identities.set(date, { ...identity, bound: true });\n return date;\n}\n\n/**\n * The database text of a parameter marked by {@link boundTimestampParameter};\n * `undefined` for any other value.\n * @internal\n */\nexport function boundTimestampText(params: { value: unknown }): string | undefined {\n const { value } = params;\n if (!(value instanceof Date)) return undefined;\n const identity = identityOf({ date: value });\n return identity?.bound === true ? identity.text : undefined;\n}\n\n/** Snapshot the value and its valid database identity without sharing mutable state. */\nexport function cloneTimestampDate(params: { date: Date }): Date {\n const date = new Date(Date.prototype.getTime.call(params.date));\n const identity = identityOf(params);\n if (identity !== undefined) identities.set(date, identity);\n return date;\n}\n",
6
+ "/**\n * Char-code decoding of the fixed timestamp text PostgreSQL, MySQL and SQLite\n * print: `YYYY-MM-DD HH:MM:SS[.f]`, with or without an offset.\n *\n * Parsing it by regular expression and `new Date(text)` costs a few hundred\n * nanoseconds per value; the layout is fixed, so one pass over the character\n * codes yields the same instant several times cheaper (node-postgres cells,\n * the `::text` key columns of a keyset page, the join strategy's JSON).\n *\n * This function only ACCEPTS or DECLINES: it returns `undefined` for every\n * text outside the plain form, and the caller then runs its general parser.\n * An accepted text decodes to exactly the instant that parser returns\n * (differential tests in adapter-pg `tests/timestamp-text.test.ts` and\n * `tests/datetime-text-fast-path.test.ts` here).\n */\n\n// Plain (not frozen) module-private arrays: JavaScriptCore reads a frozen\n// array's elements ≈ 2× slower, which cost this parser half its gain.\n\n/** Days per month in a common year; February is checked separately. */\nconst DAYS_IN_MONTH: readonly number[] = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n/** The digit positions of `YYYY-MM-DD HH:MM:SS`. */\nconst DIGIT_POSITIONS: readonly number[] = [0, 1, 2, 3, 5, 6, 8, 9, 11, 12, 14, 15, 17, 18];\n\n/**\n * Decode `YYYY-MM-DD HH:MM:SS[.f{1,6}]` as a `Date`: zone-less text is read as\n * UTC wall-clock time, zoned text at its offset. Fraction digits beyond the\n * third are truncated.\n *\n * `zoned`: `true` requires `±HH` or `±HH:MM` after the time (PostgreSQL's\n * `timestamptz` text), `false` requires nothing after it (`timestamp`, MySQL\n * `DATETIME`); `\"either\"` also takes a `T` between date and time and a `Z`\n * offset (ISO 8601: the join strategy's JSON, SQLite's stored text).\n *\n * Returns `undefined` — \"use the general parser\" — for anything else: years\n * before 1000 (`Date.UTC` maps 0–99 to 1900–1999), BC dates, `infinity`,\n * offsets with seconds (historic local mean time), date-only text, 7+\n * fraction digits, and out-of-range fields (month 13, February 30, hour 24,\n * second 60).\n */\nexport function parsePlainTimestampText(params: { readonly text: string; readonly zoned: boolean | \"either\" }): Date | undefined {\n const { text, zoned } = params;\n const length = text.length;\n const separator = text.charCodeAt(10);\n if (\n length < 19 ||\n text.charCodeAt(4) !== 45 ||\n text.charCodeAt(7) !== 45 ||\n (separator !== 32 && (zoned !== \"either\" || separator !== 84)) ||\n text.charCodeAt(13) !== 58 ||\n text.charCodeAt(16) !== 58\n ) {\n return undefined;\n }\n for (let position = 0; position < DIGIT_POSITIONS.length; position++) {\n const code = text.charCodeAt(DIGIT_POSITIONS[position] as number);\n if (code < 48 || code > 57) return undefined;\n }\n const year =\n (text.charCodeAt(0) - 48) * 1000 + (text.charCodeAt(1) - 48) * 100 + (text.charCodeAt(2) - 48) * 10 + (text.charCodeAt(3) - 48);\n const month = (text.charCodeAt(5) - 48) * 10 + (text.charCodeAt(6) - 48);\n const day = (text.charCodeAt(8) - 48) * 10 + (text.charCodeAt(9) - 48);\n const hour = (text.charCodeAt(11) - 48) * 10 + (text.charCodeAt(12) - 48);\n const minute = (text.charCodeAt(14) - 48) * 10 + (text.charCodeAt(15) - 48);\n const second = (text.charCodeAt(17) - 48) * 10 + (text.charCodeAt(18) - 48);\n if (year < 1000 || month < 1 || month > 12 || day < 1 || hour > 23 || minute > 59 || second > 59) return undefined;\n if (day > 28) {\n const leap = year % 4 === 0 && (year % 100 !== 0 || year % 400 === 0);\n const days = month === 2 ? (leap ? 29 : 28) : (DAYS_IN_MONTH[month - 1] as number);\n if (day > days) return undefined;\n }\n\n let index = 19;\n let milliseconds = 0;\n if (index < length && text.charCodeAt(index) === 46) {\n index++;\n const start = index;\n while (index < length) {\n const code = text.charCodeAt(index);\n if (code < 48 || code > 57) break;\n if (index - start < 3) milliseconds = milliseconds * 10 + (code - 48);\n index++;\n }\n const digits = index - start;\n if (digits === 0 || digits > 6) return undefined;\n if (digits === 1) milliseconds *= 100;\n else if (digits === 2) milliseconds *= 10;\n }\n\n let offsetMinutes = 0;\n if (zoned === \"either\" && index === length - 1 && text.charCodeAt(index) === 90) {\n index = length;\n } else if (zoned === true || (zoned === \"either\" && index < length)) {\n if (index + 3 > length) return undefined;\n const sign = text.charCodeAt(index);\n if (sign !== 43 && sign !== 45) return undefined;\n const hours1 = text.charCodeAt(index + 1) - 48;\n const hours2 = text.charCodeAt(index + 2) - 48;\n if (hours1 < 0 || hours1 > 9 || hours2 < 0 || hours2 > 9 || hours1 * 10 + hours2 > 23) return undefined;\n offsetMinutes = (hours1 * 10 + hours2) * 60;\n index += 3;\n if (index < length) {\n // `±HH:MM` only; `±HH:MM:SS` (seconds offsets) declines to the general parser.\n if (index + 3 !== length || text.charCodeAt(index) !== 58) return undefined;\n const minutes1 = text.charCodeAt(index + 1) - 48;\n const minutes2 = text.charCodeAt(index + 2) - 48;\n if (minutes1 < 0 || minutes1 > 5 || minutes2 < 0 || minutes2 > 9) return undefined;\n offsetMinutes += minutes1 * 10 + minutes2;\n index = length;\n }\n if (sign === 45) offsetMinutes = -offsetMinutes;\n }\n if (index !== length) return undefined;\n\n return new Date(Date.UTC(year, month - 1, day, hour, minute, second, milliseconds) - offsetMinutes * 60_000);\n}\n",
6
7
  "import type { QualifiedSqlName } from \"@vibeorm/schema\";\n\nconst NATIVE_ENUM_ARRAY_PARAMETER: unique symbol = Symbol(\"vibeorm.nativeEnumArrayParameter\");\n\n/** Encoded enum-array text plus its immutable physical type; never passed to a driver. */\nexport type NativeEnumArrayParameter = {\n readonly [NATIVE_ENUM_ARRAY_PARAMETER]: true;\n readonly value: string;\n readonly type: QualifiedSqlName;\n};\n\n/** Attach a typed native enum identity to centralized codec output, without re-encoding values. */\nexport function nativeEnumArrayParameter(params: { value: string; type: QualifiedSqlName }): NativeEnumArrayParameter {\n return { [NATIVE_ENUM_ARRAY_PARAMETER]: true, value: params.value, type: params.type };\n}\n\n/** Narrow the internal typed parameter before collecting its plain wire value. */\nexport function isNativeEnumArrayParameter(value: unknown): value is NativeEnumArrayParameter {\n return typeof value === \"object\" && value !== null && NATIVE_ENUM_ARRAY_PARAMETER in value;\n}\n",
7
8
  "const JSON_LIST_PARAMETER: unique symbol = Symbol(\"vibeorm.jsonListParameter\");\n\n/**\n * The element type of a postgres Json LIST column: `jsonb[]` by default,\n * `json[]` for `Json[] @db.Json`. Comparison sites (`has`, `hasEvery`,\n * `hasSome`, `equals`) render a `json` operand and its column as jsonb —\n * `json` has no equality operator; write sites (`push`) keep `json`.\n */\nexport type JsonListStorage = \"jsonb\" | \"json\";\n\n/**\n * A Json LIST parameter — one element's JSON text (`has`, `push` of one\n * element) or a whole list of JSON texts (`hasEvery`, `hasSome`, `equals`,\n * `push` of an array) — plus the column's element type. Never passed to a\n * driver: the ParamCollector collects the plain value and renders\n * `$n::text::jsonb` (or `$n::text::jsonb[]` for a whole list).\n *\n * Why it exists: an OID-typed driver (bun:sql with named statements) resolves\n * the parameter's postgres type and re-serializes the JS value AS that type. A\n * pre-stringified JSON element bound into a slot the server infers as `jsonb`\n * (`$n = ANY(\"col\")`, `array_append(\"col\", $n)`) arrives DOUBLE-ENCODED, and\n * `has: { a: 1 }` then matches nothing (live-proven on Bun 1.4.3). The `::text`\n * pin makes every driver send the text and the SERVER parse it — the same\n * trap `JsonParamCell` closes for Json columns.\n */\nexport type JsonListParameter = {\n readonly [JSON_LIST_PARAMETER]: true;\n readonly value: string | readonly string[];\n readonly storage: JsonListStorage;\n};\n\n/** Attach the json/jsonb element type to an encoded Json list operand, without re-encoding it. */\nexport function jsonListParameter(params: { value: string | readonly string[]; storage: JsonListStorage }): JsonListParameter {\n return { [JSON_LIST_PARAMETER]: true, value: params.value, storage: params.storage };\n}\n\n/** Narrow the internal typed parameter before collecting its plain wire value. */\nexport function isJsonListParameter(value: unknown): value is JsonListParameter {\n return typeof value === \"object\" && value !== null && JSON_LIST_PARAMETER in value;\n}\n",
8
- "/**\n * JSON key-level update: an ordered list of `set` / `remove` steps applied to\n * ONE Json column in ONE assignment, without reading the document first.\n *\n * Semantics (identical on every dialect):\n * - `set` replaces or adds the member at its path and creates missing\n * intermediate objects; a SQL NULL column starts from `{}`.\n * - `remove` deletes the member; an absent member (or an absent container on\n * the way) is a no-op, and a SQL NULL column stays NULL.\n * - Every container a step passes through must be an object or absent. An\n * array, a scalar or JSON `null` there refuses the write.\n *\n * The steps are folded at build time into one write tree, so the SQL reads\n * only the ORIGINAL column, never an earlier step's result: its text grows\n * linearly with the steps. A container whose value an earlier `set` wrote is\n * known here and checked in JavaScript ({@link planJsonPatch} reports the\n * conflict before any SQL); every other container is checked in the statement\n * against the original document, and a failed check fails the statement on\n * purpose with a marker the client maps back to a typed error:\n * `__vibe_veto:json_patch:<nonce>:<check index>:<found type>`.\n */\n\nimport { internalError } from \"@vibeorm/schema\";\nimport { CHAIN_VETO_PREFIX } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { jsonPathString } from \"./json-path.ts\";\nimport type { ParamCollector } from \"./params.ts\";\n\n// ─── Marker ───────────────────────────────────────────────────────\n\n/** One step of a JSON patch; `value` is the JSON text the Json codec wrote. */\nexport type JsonPatchStep =\n | { readonly set: readonly string[]; readonly value: string }\n | { readonly remove: readonly string[] };\n\n/**\n * An UPDATE set value that patches a Json column in place. Recognised\n * structurally inside `UpdateStatement.set` and conflict updates, with the\n * same discipline as the other set markers: the Json codec stringifies JSON\n * payloads before they reach the AST, so a document is never mistaken for it.\n */\nexport type JsonPatchOperation = {\n readonly __jsonPatch: true;\n readonly steps: readonly JsonPatchStep[];\n /** Per-call value bound into the refusal marker; the client maps only the markers it issued. */\n readonly nonce: string;\n /** `json` for a postgres `json` column (`Json @db.Json`): patched through jsonb, stored as json. */\n readonly storage?: \"json\";\n};\n\n/** The veto token a refused patch carries after {@link CHAIN_VETO_PREFIX}. */\nconst JSON_PATCH_VETO_TOKEN = \"json_patch\";\n\n/** Narrow an UPDATE set value to a {@link JsonPatchOperation}. */\nexport function isJsonPatchOperation(value: unknown): value is JsonPatchOperation {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n if (!Object.hasOwn(value, \"__jsonPatch\")) return false;\n const keys = Object.keys(value);\n if (keys.some((key) => key !== \"__jsonPatch\" && key !== \"steps\" && key !== \"nonce\" && key !== \"storage\")) return false;\n const candidate = value as { __jsonPatch: unknown; steps: unknown; nonce: unknown; storage?: unknown };\n return candidate.__jsonPatch === true && Array.isArray(candidate.steps) && candidate.steps.length > 0 &&\n typeof candidate.nonce === \"string\" && (candidate.storage === undefined || candidate.storage === \"json\");\n}\n\n// ─── Fold ─────────────────────────────────────────────────────────\n\n/** JSON types a container can hold instead of an object. */\nexport type JsonPatchFoundType = \"array\" | \"string\" | \"number\" | \"boolean\" | \"null\";\n\n/** A container of the ORIGINAL document that must be an object or absent; `step` is the first step that passes through it. */\nexport type JsonPatchCheck = { readonly path: readonly string[]; readonly step: number };\n\n/** A step that passes through a non-object value an earlier `set` of the same patch wrote. */\nexport type JsonPatchConflict = { readonly step: number; readonly path: readonly string[]; readonly found: JsonPatchFoundType };\n\n/** {@link planJsonPatch}: the in-statement checks in render order, or the conflict known before any SQL. */\nexport type JsonPatchPlan = { readonly checks: readonly JsonPatchCheck[] } | { readonly conflict: JsonPatchConflict };\n\ntype EditNode = { readonly kind: \"edit\"; create: boolean; readonly children: Map<string, PatchNode> };\ntype ReplaceNode = { readonly kind: \"replace\"; text: string; parsed?: unknown };\ntype PatchNode = EditNode | ReplaceNode | { readonly kind: \"delete\" };\ntype Folded = { readonly root: EditNode; readonly checks: readonly JsonPatchCheck[] } | { readonly conflict: JsonPatchConflict };\n\nconst editNode = (): EditNode => ({ kind: \"edit\", create: false, children: new Map() });\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction foundType(value: unknown): JsonPatchFoundType {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n switch (typeof value) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n }\n throw internalError({ message: \"a parsed JSON value has no JSON type\" });\n}\n\n/** Own-property write: `__proto__` is an ordinary member name in JSON. */\nfunction defineMember(params: { container: Record<string, unknown>; key: string; value: unknown }): void {\n Object.defineProperty(params.container, params.key, { value: params.value, enumerable: true, writable: true, configurable: true });\n}\n\n/**\n * Apply the rest of a step inside a value the patch already knows (an earlier\n * `set` wrote it). Mirrors the SQL semantics exactly.\n */\nfunction applyKnown(params: { value: unknown; rest: readonly string[]; step: JsonPatchStep; at: readonly string[]; index: number }): JsonPatchConflict | undefined {\n const { rest, step, index } = params;\n let container = params.value;\n for (let depth = 0; depth < rest.length; depth++) {\n if (!isJsonObject(container)) return { step: index, path: [...params.at, ...rest.slice(0, depth)], found: foundType(container) };\n const key = rest[depth] as string;\n if (depth === rest.length - 1) {\n if (\"set\" in step) defineMember({ container, key, value: JSON.parse(step.value) as unknown });\n else delete container[key];\n return undefined;\n }\n if (!Object.hasOwn(container, key)) {\n if (!(\"set\" in step)) return undefined;\n defineMember({ container, key, value: {} });\n }\n container = container[key];\n }\n return undefined;\n}\n\nfunction fold(steps: readonly JsonPatchStep[]): Folded {\n const root = editNode();\n const checks: JsonPatchCheck[] = [];\n const checked = new Set<string>();\n for (let index = 0; index < steps.length; index++) {\n const step = steps[index] as JsonPatchStep;\n const setting = \"set\" in step;\n const path = setting ? step.set : step.remove;\n if (path.length === 0) throw internalError({ message: \"a JSON patch step needs a non-empty path\" });\n let node = root;\n for (let depth = 0; depth < path.length; depth++) {\n const signature = JSON.stringify(path.slice(0, depth));\n if (!checked.has(signature)) {\n checked.add(signature);\n checks.push({ path: path.slice(0, depth), step: index });\n }\n if (setting) node.create = true;\n const key = path[depth] as string;\n if (depth === path.length - 1) {\n node.children.set(key, setting ? { kind: \"replace\", text: step.value } : { kind: \"delete\" });\n break;\n }\n let child = node.children.get(key);\n if (child === undefined) {\n child = editNode();\n node.children.set(key, child);\n }\n if (child.kind === \"edit\") {\n node = child;\n continue;\n }\n if (child.kind === \"delete\") {\n // Removed by an earlier step: absent now. A remove below it is a no-op;\n // a set starts the member again from `{}`.\n if (!setting) break;\n child = { kind: \"replace\", text: \"{}\", parsed: {} };\n node.children.set(key, child);\n }\n child.parsed ??= JSON.parse(child.text) as unknown;\n const conflict = applyKnown({ value: child.parsed, rest: path.slice(depth + 1), step, at: path.slice(0, depth + 1), index });\n if (conflict !== undefined) return { conflict };\n break;\n }\n }\n return { root, checks };\n}\n\n/**\n * Fold a patch's steps: the checks the statement runs on the original\n * document (index = the check index its refusal marker carries), or the\n * conflict an earlier `set` of the same patch makes certain.\n */\nexport function planJsonPatch(params: { steps: readonly JsonPatchStep[] }): JsonPatchPlan {\n const folded = fold(params.steps);\n return \"conflict\" in folded ? { conflict: folded.conflict } : { checks: folded.checks };\n}\n\nconst textOf = (node: ReplaceNode): string => (node.parsed === undefined ? node.text : JSON.stringify(node.parsed));\n\n/** The members an edit node writes: values and creating edits (pure-remove subtrees ride the deletes). */\nfunction writtenMembers(node: EditNode): [string, ReplaceNode | EditNode][] {\n const out: [string, ReplaceNode | EditNode][] = [];\n for (const [key, child] of node.children) {\n if (child.kind === \"replace\" || (child.kind === \"edit\" && child.create)) out.push([key, child]);\n }\n return out;\n}\n\n/** Every removed member under the edit nodes, in step order of first appearance. */\nfunction deletedPaths(params: { node: EditNode; path: readonly string[] }): string[][] {\n const out: string[][] = [];\n for (const [key, child] of params.node.children) {\n if (child.kind === \"delete\") out.push([...params.path, key]);\n else if (child.kind === \"edit\") out.push(...deletedPaths({ node: child, path: [...params.path, key] }));\n }\n return out;\n}\n\n// ─── Rendering ────────────────────────────────────────────────────\n\nconst VETO_TEXT = `${CHAIN_VETO_PREFIX}${JSON_PATCH_VETO_TOKEN}:`;\n\n/**\n * The patched value of one Json column — `CASE WHEN <a container is not an\n * object> THEN <fail on purpose> … ELSE <patched document> END` — where `read`\n * is the column as the assignment reads it (qualified in a conflict update).\n * Every placeholder is collected in text order.\n */\nexport function renderJsonPatch(params: { dialect: SqlDialect; patch: JsonPatchOperation; read: string; collector: ParamCollector }): string {\n const folded = fold(params.patch.steps);\n if (\"conflict\" in folded) {\n throw internalError({ message: \"a JSON patch whose steps conflict reached the renderer; the query builder refuses it\" });\n }\n switch (params.dialect.jsonPathMode) {\n case \"operators\":\n return renderPostgresPatch({ ...params, ...folded });\n case \"sqliteExtract\":\n return renderSqlitePatch({ ...params, ...folded });\n case \"mysqlExtract\":\n return renderMysqlPatch({ ...params, ...folded });\n }\n}\n\ntype RenderInput = {\n readonly patch: JsonPatchOperation;\n readonly read: string;\n readonly collector: ParamCollector;\n readonly root: EditNode;\n readonly checks: readonly JsonPatchCheck[];\n};\n\n/**\n * PostgreSQL: `jsonb_build_object` merged with `||` per edited object, `#-`\n * per removed member. Every container on a rendered path is checked to be an\n * object, so `#>` and `#-` read an integer-like key as a member name, never\n * as an array index. The refusal casts a marker to integer (SQLSTATE 22P02);\n * `concat` is STABLE and reads the row, so the planner never folds it.\n */\nfunction renderPostgresPatch(params: RenderInput): string {\n const { patch, read, collector } = params;\n const json = patch.storage === \"json\";\n const typeOf = json ? \"json_typeof\" : \"jsonb_typeof\";\n const at = (source: string, path: readonly string[]): string =>\n path.length === 0 ? source : `${source} #> ${collector.add([...path])}::text[]`;\n const arms = params.checks.map((check, index) => {\n const condition = `${typeOf}(${at(read, check.path)}) <> 'object'`;\n const marker = collector.add(`${patch.nonce}:${index}`);\n return `WHEN ${condition} THEN to_jsonb(CAST(concat('${VETO_TEXT}', ${marker}::text, ':', ${typeOf}(${at(read, check.path)})) AS integer))`;\n });\n const source = json ? `${read}::jsonb` : read;\n const build = (node: EditNode, path: readonly string[]): string => {\n const base = at(source, path);\n const start = node.create ? `COALESCE(${base}, '{}'::jsonb)` : base;\n const members = writtenMembers(node);\n if (members.length === 0) return start;\n const pairs = members.map(([key, child]) => {\n const name = `${collector.add(key)}::text`;\n return `${name}, ${child.kind === \"replace\" ? `${collector.add(textOf(child))}::text::jsonb` : build(child, [...path, key])}`;\n });\n return `(${start} || jsonb_build_object(${pairs.join(\", \")}))`;\n };\n let result = build(params.root, []);\n const deletes = deletedPaths({ node: params.root, path: [] });\n if (deletes.length > 0) result = `(${result}${deletes.map((path) => ` #- ${collector.add(path)}::text[]`).join(\"\")})`;\n const value = `CASE ${arms.join(\" \")} ELSE ${result} END`;\n return json ? `(${value})::json` : value;\n}\n\n/**\n * SQLite: `json_set` per edited object (values wrapped in `json()` so text is\n * read as JSON), `json_remove` for the removed members. The refusal is a bad\n * JSON path, whose error message quotes the marker.\n */\nfunction renderSqlitePatch(params: RenderInput): string {\n const { patch, read, collector } = params;\n const typeOf = (path: readonly string[]): string =>\n path.length === 0 ? `json_type(${read})` : `json_type(${read}, ${collector.add(jsonPathString(path))})`;\n const arms = params.checks.map((check, index) => {\n const condition = `${typeOf(check.path)} <> 'object'`;\n const marker = collector.add(`${patch.nonce}:${index}`);\n return `WHEN ${condition} THEN json_extract('{}', '${VETO_TEXT}' || ${marker} || ':' || ${typeOf(check.path)})`;\n });\n const build = (node: EditNode, path: readonly string[]): string => {\n const base = path.length === 0 ? read : `json_extract(${read}, ${collector.add(jsonPathString(path))})`;\n const start = node.create ? `COALESCE(${base}, '{}')` : base;\n const members = writtenMembers(node);\n if (members.length === 0) return start;\n const pairs = members.map(([key, child]) => {\n const member = collector.add(jsonPathString([key]));\n return `${member}, json(${child.kind === \"replace\" ? collector.add(textOf(child)) : build(child, [...path, key])})`;\n });\n return `json_set(${start}, ${pairs.join(\", \")})`;\n };\n let result = build(params.root, []);\n const deletes = deletedPaths({ node: params.root, path: [] });\n if (deletes.length > 0) result = `json_remove(${result}, ${deletes.map((path) => collector.add(jsonPathString(path))).join(\", \")})`;\n return `CASE ${arms.join(\" \")} ELSE ${result} END`;\n}\n\n/**\n * MySQL: `JSON_SET` per edited object (it adds a member only to an existing\n * object, so missing ones start from `JSON_OBJECT()`), `JSON_REMOVE` for the\n * removed members. The refusal is `UUID_TO_BIN` of the marker (error 1411,\n * which quotes the value); `JSON_ARRAY` keeps the CASE's type JSON.\n */\nfunction renderMysqlPatch(params: RenderInput): string {\n const { patch, read, collector } = params;\n const at = (path: readonly string[]): string =>\n path.length === 0 ? read : `JSON_EXTRACT(${read}, ${collector.add(jsonPathString(path))})`;\n const arms = params.checks.map((check, index) => {\n const condition = `JSON_TYPE(${at(check.path)}) <> 'OBJECT'`;\n const marker = collector.add(`${patch.nonce}:${index}`);\n return `WHEN ${condition} THEN JSON_ARRAY(UUID_TO_BIN(CONCAT('${VETO_TEXT}', ${marker}, ':', JSON_TYPE(${at(check.path)}))))`;\n });\n const build = (node: EditNode, path: readonly string[]): string => {\n const base = at(path);\n const start = node.create ? `COALESCE(${base}, JSON_OBJECT())` : base;\n const members = writtenMembers(node);\n if (members.length === 0) return start;\n const pairs = members.map(([key, child]) => {\n const member = collector.add(jsonPathString([key]));\n return `${member}, ${child.kind === \"replace\" ? `CAST(${collector.add(textOf(child))} AS JSON)` : build(child, [...path, key])}`;\n });\n return `JSON_SET(${start}, ${pairs.join(\", \")})`;\n };\n let result = build(params.root, []);\n const deletes = deletedPaths({ node: params.root, path: [] });\n if (deletes.length > 0) result = `JSON_REMOVE(${result}, ${deletes.map((path) => collector.add(jsonPathString(path))).join(\", \")})`;\n return `CASE ${arms.join(\" \")} ELSE ${result} END`;\n}\n\n// ─── Refusal markers ──────────────────────────────────────────────\n\n/** A refusal marker found in a database error message: the nonce, the check index, and the container's type as the database spelled it. */\nexport type JsonPatchVeto = { readonly nonce: string; readonly check: number; readonly found: string };\n\n/** The JSON patch refusal a database error message quotes, or `undefined`. */\nexport function jsonPatchVetoOf(params: { message: string }): JsonPatchVeto | undefined {\n const start = params.message.indexOf(VETO_TEXT);\n if (start < 0) return undefined;\n const match = /^([0-9a-f]+):(\\d+):([A-Za-z]+)/.exec(params.message.slice(start + VETO_TEXT.length));\n if (match === null) return undefined;\n return { nonce: match[1] as string, check: Number(match[2]), found: match[3] as string };\n}\n",
9
- "import type { NativeEnumArrayParameter } from \"./native-enum-parameter.ts\";\nimport type { JsonListParameter } from \"./json-list-parameter.ts\";\nimport type { SqlFragment } from \"./composable.ts\";\nimport type { RlsReadinessQuery } from \"./dialects/postgres-rls-readiness.ts\";\n/**\n * The SQL AST — the small statement language the runtime and migrate packages\n * build and dialects render.\n *\n * Deliberately minimal at P0 (single-table statements, no joins/subqueries);\n * grows with the runtime in P2/P3. Every shape added here needs a catalog case\n * (tests/catalog/cases.ts) in the same change.\n */\n\nimport type {\n AdvisoryLockMode,\n DateTruncationStorage,\n DateTruncationUnit,\n RlsContextIR,\n RowLockStrength,\n RowLockWaitPolicy,\n ScalarType,\n SchemaIR,\n SqlFragmentSpec,\n} from \"@vibeorm/schema\";\n\n// ─── References ───────────────────────────────────────────────────\n\n/** A column reference, optionally table-qualified. */\nexport type ColRef = {\n readonly table?: string;\n readonly name: string;\n /**\n * Projection-only wire transform. `jsonText` uses the dialect's JSON text\n * projection to preserve SQL NULL versus the JSON document `null` before\n * driver parsing, without converting a postgres `json` column to `jsonb`.\n * `castText` renders a dialect text cast and preserves `alias ?? name`,\n * including timestamp identity before driver Date truncation. PostgreSQL\n * uses `\"col\"::text`; SQLite/MySQL use CAST AS TEXT/CHAR. `encodeBase64`\n * is postgres-only and renders `encode(\"col\", 'base64')`.\n * `encodeArrayBase64` is postgres-only and renders\n * `encode(array_send(\"col\"), 'base64')` — a `bytea[]` column's binary array\n * form (dimensions, NULL elements, raw element bytes) as base64: faithful\n * whatever the session's `bytea_output`, keeping a NULL column (`NULL`), an\n * empty array and NULL elements distinct (5.0 lane V; the lateral subselect's\n * `Bytes[]` form, decoded by the runtime's JSON-transport plan). Other users:\n * the lateral subselect (SQL review B3: raw `to_jsonb` would ship BigInt/Decimal as float64 JSON\n * numbers and Bytes as `\\x` hex text), and every row projection of a\n * `Float[]`/`Json[]` column (bun:sql's array parser refuses float arrays\n * printed with an exponent and json arrays holding integers beyond int32;\n * the runtime parses the array literal text itself). Never set on\n * filter/order refs.\n */\n readonly transform?: \"castText\" | \"encodeBase64\" | \"encodeArrayBase64\" | \"jsonText\";\n /**\n * Comparison/order/aggregate cast, sqlite Decimal only (SQL review B4):\n * Decimal stores as exact TEXT there and text comparison is lexicographic —\n * compare, ORDER BY and aggregate sites render `CAST(\"col\" AS REAL)` (with\n * NUMBER operands) instead. Never set on projections or GROUP BY keys, so\n * storage and read-back stay the exact text.\n */\n readonly castReal?: boolean;\n /** Native enum order key through a scalar subquery: MySQL reads its member index, other dialects keep the column. */\n readonly enumOrdinal?: true;\n /**\n * Order/distinct/compare cast, postgres `json` columns only (`Json @db.Json`,\n * release-3.0 D3): `json` has no ordering or equality operator, so ORDER BY,\n * DISTINCT ON and comparison sites render `\"col\"::jsonb` (`\"col\"::jsonb[]`\n * for a `json[]` list column) — the order and distinctness of a jsonb\n * column. Never set on projections, so read-back keeps the stored text.\n */\n readonly castJsonb?: \"jsonb\" | \"jsonb[]\";\n /**\n * Calendar truncation of a timestamp column, for a `groupBy` date key. The\n * reference renders as the start of its period in a named time zone\n * (`date_trunc('day', \"col\", 'Europe/Oslo')`; see `renderDateTruncation`),\n * in the column's own SQL type. Set on the projection, GROUP BY and ORDER BY\n * refs of one key, which then repeat the identical expression text\n * (PostgreSQL matches GROUP BY expressions by structure); a projection keeps\n * `alias ?? name` as its output name. Never set on filter refs. Dialects\n * without the `dateTruncation` capability refuse it when rendering.\n */\n readonly truncate?: DateTruncation;\n /**\n * A `groupBy` expression key read from the column ({@link GroupKeyExpression}):\n * the text at a JSON path, or a string's leading characters. Like\n * {@link ColRef.truncate} it is set on the projection (with `alias`, the\n * key's result name), GROUP BY and ORDER BY refs of one key, which repeat\n * the identical text: every operand is a validated literal, never a bound\n * parameter, so PostgreSQL and MySQL match the GROUP BY expression.\n */\n readonly groupKey?: GroupKeyExpression;\n /**\n * The first non-NULL of these references — `COALESCE(\"a\", \"b\")` — instead\n * of the column `name`: the value of an `orderBy: { _coalesce: … }` term.\n * Each member renders as its own reference, casts included (a sqlite\n * Decimal member as `CAST(… AS REAL)`, a mysql native enum as its member\n * index). Set on ORDER BY and comparison refs only. `name` is then\n * {@link COALESCE_REF_NAME}, never a column of a table, so a reader that\n * looks a column up by name finds none.\n */\n readonly coalesce?: readonly ColRef[];\n /**\n * Projection alias: renders `ref AS \"alias\"`. PROJECTION-ONLY — filter,\n * order and correlation refs never set it (the renderer ignores it outside\n * a projection list). Used by the single-statement M2M join to expose the\n * join table's parent-key column under a reserved name (`__vibe_parent`).\n */\n readonly alias?: string;\n};\n\n/**\n * The `name` of a {@link ColRef.coalesce} reference. The `__vibe_` column\n * prefix is reserved by schema validation, so no model column carries it.\n */\nexport const COALESCE_REF_NAME: string = \"__vibe_coalesce\";\n\n/** A {@link ColRef.coalesce} reference over `members`. */\nexport function coalesceRef(params: { members: readonly ColRef[] }): ColRef {\n return { name: COALESCE_REF_NAME, coalesce: params.members };\n}\n\n/** A {@link ColRef.truncate} request: the calendar unit, the zone that defines the calendar, and the column's storage form. */\nexport type DateTruncation = {\n readonly unit: DateTruncationUnit;\n /** A time-zone name (`\"Europe/Oslo\"`, `\"UTC\"`), rendered as a string literal after a strict character check. */\n readonly timeZone: string;\n readonly storage: DateTruncationStorage;\n};\n\n/**\n * A {@link ColRef.groupKey} expression.\n *\n * - `jsonPathText`: the text at an object-key path of a JSON column — a JSON\n * string unquoted, a number or boolean in its JSON spelling, JSON `null` and\n * a missing path SQL NULL, an object or array its JSON text. Each step reads\n * an object member only. `storage: \"json\"` marks a postgres `json` column,\n * read through jsonb like the JSON filters.\n * - `prefix`: the first `length` characters of a string column.\n */\nexport type GroupKeyExpression =\n | { readonly kind: \"jsonPathText\"; readonly path: readonly string[]; readonly storage?: \"json\" }\n | { readonly kind: \"prefix\"; readonly length: number };\n\nexport type TableRef = {\n readonly name: string;\n /** Explicit fixed PostgreSQL placement; absence preserves existing SQL. */\n readonly namespace?: string;\n readonly alias?: string;\n};\n\n// ─── Aggregates ───────────────────────────────────────────────────\n\n/** Aggregate functions applied to one column. */\nexport type AggFn = \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\";\n\n/** Reference to an aggregate expression: `COUNT(*)` or `FN(\"col\")`. */\nexport type AggRef =\n | { readonly fn: \"countAll\"; readonly filter?: SqlExpr }\n | {\n readonly fn: AggFn;\n readonly column: ColRef;\n /** Native enum MIN/MAX: projections and HAVING return the database label; order keys keep its ordinal. */\n readonly enumOrder?: \"value\" | \"ordinal\";\n /**\n * Aggregate only the rows the predicate admits: `AGG(x) FILTER (WHERE …)`\n * or `AGG(CASE WHEN … THEN x END)` per the dialect's\n * `filteredAggregates` capability. Its parameters bind each time the\n * aggregate renders (projection, HAVING, ORDER BY), in text order.\n */\n readonly filter?: SqlExpr;\n };\n\n/**\n * One aggregate projection: `FN(\"col\") AS \"alias\"`. The alias is part of the\n * catalog contract — the runtime derives result keys from it deterministically\n * (`_count___all`, `_avg__score`), never by parsing the SQL text back.\n */\nexport type AggSelect = {\n readonly agg: AggRef;\n readonly alias: string;\n /** Projection-only result cast; native aggregate comparisons and ordering stay typed. */\n readonly castText?: true;\n};\n\n// ─── JSON filters ─────────────────────────────────────────────────\n\n/**\n * JSON path predicates (Prisma's Json filter surface). `not` is `equals` with\n * `negate` — there is no separate op. `exists` takes a boolean `value`: the\n * member at the path (object keys only) is present (its value may be JSON\n * `null`) or, for `false`, the document is present and the member is not; a\n * SQL NULL column is unknown for both. Which ops a dialect can express is\n * declared on `SqlDialect.supportedJsonOps` and enforced at render time too.\n */\nexport type JsonFilterOp =\n | \"equals\"\n | \"exists\"\n | \"string_contains\"\n | \"string_starts_with\"\n | \"string_ends_with\"\n | \"array_contains\"\n | \"array_starts_with\"\n | \"array_ends_with\";\n\n// ─── Expressions ──────────────────────────────────────────────────\n\nexport type ComparisonOp = \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\";\n\n/**\n * The column facts one member of a {@link SqlExpr} `keyList` tuple needs to\n * bind exactly like the equality `\"col\" = $n` would. Postgres binds each\n * member as ONE typed array (`$n::<element type>[]`), so it needs the\n * column's element type: the declared native type without its modifier\n * (`timestamptz`, never `timestamptz(3)` — a typmod cast would round\n * `.1234` onto a stored `.123` that `=` does not match), `bpchar` for\n * `char(n)`, `citext`, the enum's own type. MySQL needs to know a time-of-day\n * member (`SqlDialect.timeOfDayInStrategy`); SQLite needs nothing.\n */\nexport type KeyListMember = {\n /** The column's scalar type; `\"Enum\"` for an enum column. */\n readonly type: ScalarType | \"Enum\";\n /** The declared `@db.*` native type, verbatim (`VarChar(191)`, `Uuid`, `Timestamptz(3)`). */\n readonly nativeType?: string;\n /**\n * A database-stored (native) enum's type: `namespace` qualifies it, absence\n * resolves it through the search path like the statement's table. Absent on\n * a string-stored enum, whose column is text.\n */\n readonly enumType?: { readonly namespace?: string; readonly name: string };\n /** A time-of-day column (`@db.Time(n)` / `@db.Timetz(n)`). */\n readonly timeOfDay?: boolean;\n};\n\nexport type SqlExpr =\n | { readonly kind: \"composed\"; readonly fragment: SqlFragment }\n | { readonly kind: \"cmp\"; readonly op: ComparisonOp; readonly column: ColRef; readonly value: unknown }\n /** Column-to-column comparison — the correlation predicate of EXISTS/lateral subqueries. */\n | { readonly kind: \"cmpCol\"; readonly op: ComparisonOp; readonly left: ColRef; readonly right: ColRef }\n | { readonly kind: \"isNull\"; readonly column: ColRef; readonly negate?: boolean }\n | {\n readonly kind: \"inArray\";\n readonly column: ColRef;\n readonly values: readonly unknown[];\n readonly negate?: boolean;\n /**\n * The column holds a time of day (`@db.Time(n)` / `@db.Timetz(n)`): the\n * dialect renders the membership per `SqlDialect.timeOfDayInStrategy`.\n */\n readonly timeOfDay?: boolean;\n }\n /**\n * ORDERED-TUPLE membership: `(\"a\", \"b\") IN ((?, ?), (?, ?))`. The composite\n * relation predicate — `\"a\" IN (…) AND \"b\" IN (…)` is a Cartesian SUPERSET\n * and is never a substitute. Renders per `SqlDialect.tupleInStrategy`:\n * a native row-value `IN` where the dialect has row constructors, else an OR\n * of COMPLETE conjunctions. Arity 1 is expressed as {@link SqlExpr} `inArray`\n * instead, so single-key relations keep their existing SQL.\n */\n | {\n readonly kind: \"tupleIn\";\n /** Ordered tuple columns; `rows[i][j]` binds to `columns[j]`. */\n readonly columns: readonly ColRef[];\n /** Candidate tuples — every row carries exactly `columns.length` values. */\n readonly rows: readonly (readonly unknown[])[];\n readonly negate?: boolean;\n }\n /**\n * KEY-LIST membership — the public `where: { IN: [{ a, b }, …] }` filter:\n * rows whose ordered tuple of column values equals one of `rows`, with\n * semi-join semantics (a repeated tuple never repeats a result row). Renders\n * per `SqlDialect.keyListStrategy`: postgres binds one typed ARRAY per\n * member, `(\"a\", \"b\") IN (SELECT * FROM unnest($1::int8[], $2::text[]))`,\n * so the text and the planning cost stay constant however long the list is\n * (an OR of 1 000 conjunctions planned in 114 ms on PGlite, 2 ms on\n * postgres 18; the unnest form in 0.1–0.2 ms on both). A `DateTime` member\n * without a declared native type switches postgres to the row-constructor\n * list of untyped parameters (`keyListBindsUntypedRows`: the column may be a\n * zone-less `timestamp`). MySQL renders the row-constructor list, SQLite\n * `IN (VALUES …)`. Each member compares under the column's own type and\n * collation, exactly like `\"col\" = $n`.\n *\n * An empty `rows` renders `1 = 0` (matches nothing, like an empty\n * `inArray`). The runtime emits arity 1 as `inArray` instead, so a\n * one-field key list keeps the scalar `in` SQL.\n */\n | {\n readonly kind: \"keyList\";\n /** Ordered tuple columns (compare references); `rows[i][j]` binds to `columns[j]`. */\n readonly columns: readonly ColRef[];\n /** How each member binds, in column order — see {@link KeyListMember}. */\n readonly members: readonly KeyListMember[];\n /** Encoded candidate tuples, each exactly `columns.length` long; may repeat. */\n readonly rows: readonly (readonly unknown[])[];\n }\n /**\n * ROW-VALUE comparison: `(\"a\", \"b\") > ($1, $2)` — the keyset seek (D-01).\n * SQL compares row values left to right, each pair with that column's own\n * operator, affinity and collation, which is exactly the OR expansion\n * `\"a\" > $1 OR (\"a\" = $2 AND \"b\" > $3)` when no member is NULL — and an\n * index on `(a, b)` bounds it as one range (PostgreSQL `Index Cond: ROW(…) >\n * ROW(…)`, SQLite `SEARCH … (a>?)`). A NULL member makes the comparison\n * UNKNOWN as soon as the scan reaches it, so the runtime emits it only over\n * non-null keys and values. Renders on every dialect (each has row\n * constructors); whether the runtime emits it is\n * `SqlDialect.keysetSeekStrategy`.\n */\n | {\n readonly kind: \"rowCompare\";\n readonly op: \"gt\" | \"gte\" | \"lt\" | \"lte\";\n /** Ordered row members (compare references); `values[i]` binds to `columns[i]`. */\n readonly columns: readonly ColRef[];\n /** Encoded values, exactly `columns.length` of them. */\n readonly values: readonly unknown[];\n }\n /**\n * SUBQUERY membership: `\"id\" IN (SELECT …)`, or the row-value form\n * `(\"a\", \"b\") IN (SELECT …)` for a composite key — the key-first `distinct`\n * page on PostgreSQL (D-04). The subquery projects exactly `columns.length`\n * columns and shares the statement's parameter sequence. MySQL refuses a\n * `LIMIT` directly inside an `IN` subquery (error 1235), so the renderer\n * refuses that pair there with `VIBE_UNSUPPORTED_CAPABILITY`.\n */\n | {\n readonly kind: \"inSelect\";\n /** The tested columns, in the subquery's projection order. */\n readonly columns: readonly ColRef[];\n readonly select: SelectStatement;\n }\n | {\n readonly kind: \"like\";\n readonly column: ColRef;\n /** Pre-built pattern (see like.ts helpers for escaping). */\n readonly pattern: string;\n readonly insensitive?: boolean;\n /**\n * The column carries an explicit case-insensitive collation (@collation\n * `…_ci`, board #36): an insensitive match renders as PLAIN `LIKE` — the\n * collation already folds case, and skipping LOWER() keeps the column\n * indexable. Set by the builder for mysql only.\n */\n readonly ciCollation?: boolean;\n readonly negate?: boolean;\n }\n /**\n * Case-SENSITIVE string match (`mode: \"strict\"`, board #20). `value` is the\n * RAW operand — pattern building happens at render time because escaping\n * differs per strategy (LIKE's `%`/`_`/`\\` vs GLOB's `*`/`?`/`[`). Renders\n * per `SqlDialect.strictMatchStrategy`: plain `=`/`LIKE` on postgres\n * (already byte-sensitive — a deliberate, documented no-op), `=`/`GLOB` on\n * sqlite, `= CAST(? AS BINARY)`/`LIKE CAST(? AS BINARY)` on mysql. The\n * non-native forms defeat plain indexes; docs/dialect-notes.md carries the\n * cost and the functional/`_bin`-index mitigation.\n */\n | {\n readonly kind: \"strictMatch\";\n readonly column: ColRef;\n readonly op: \"equals\" | \"contains\" | \"startsWith\" | \"endsWith\";\n readonly value: string;\n readonly negate?: boolean;\n }\n | { readonly kind: \"and\"; readonly operands: readonly SqlExpr[] }\n | { readonly kind: \"or\"; readonly operands: readonly SqlExpr[] }\n | { readonly kind: \"not\"; readonly operand: SqlExpr }\n /**\n * Correlated subquery test: `[NOT] EXISTS (SELECT …)`. The inner select\n * correlates to the outer scope through table-qualified `cmpCol` predicates;\n * its parameters merge into the statement's single parameter sequence in\n * render order. Relation filters (`some`/`every`/`none`/`is`/`isNot`)\n * compile to this shape.\n */\n | { readonly kind: \"exists\"; readonly select: SelectStatement; readonly negate?: boolean }\n /** Aggregate comparison — the HAVING predicate: `COUNT(\"col\") > $n`. */\n | { readonly kind: \"aggCmp\"; readonly op: ComparisonOp; readonly agg: AggRef; readonly value: unknown }\n /**\n * Scalar-list membership: `$n = ANY(\"col\")` — Prisma's `has`. Postgres only\n * (`capabilities.scalarArrays`); other dialects refuse at render time.\n */\n | { readonly kind: \"arrayHas\"; readonly column: ColRef; readonly value: unknown; readonly negate?: boolean }\n /** Scalar-list superset: `\"col\" @> $n` (one array param) — Prisma's `hasEvery`. Postgres only. */\n | { readonly kind: \"arrayContainsAll\"; readonly column: ColRef; readonly values: readonly unknown[] | string | NativeEnumArrayParameter | JsonListParameter }\n /** Scalar-list overlap: `\"col\" && $n` (one array param) — Prisma's `hasSome`. Postgres only. */\n | { readonly kind: \"arrayOverlaps\"; readonly column: ColRef; readonly values: readonly unknown[] | string | NativeEnumArrayParameter | JsonListParameter }\n /**\n * Scalar-list emptiness via `array_length(\"col\", 1) IS [NOT] NULL` — the v1\n * semantics kept deliberately: `empty: true` matches NULL **and** empty\n * arrays, `empty: false` matches only rows with at least one element.\n */\n | { readonly kind: \"arrayIsEmpty\"; readonly column: ColRef; readonly empty: boolean }\n /**\n * JSON path predicate. The path is always BOUND as a parameter (a `text[]`\n * on postgres, a `$.a.b[0]` path string on sqlite/mysql) — path segments\n * never become SQL text. `value` is the RAW JS operand; each dialect decides\n * its wire form (JSON.stringify for jsonb/json comparisons, LIKE patterns\n * for the string ops). `insensitive` applies to the string ops only.\n */\n | {\n readonly kind: \"jsonFilter\";\n readonly column: ColRef;\n readonly path: readonly (string | number)[];\n readonly op: JsonFilterOp;\n readonly value: unknown;\n readonly insensitive?: boolean;\n readonly negate?: boolean;\n /**\n * The column's postgres type: absent (or `jsonb`) for the default\n * `jsonb`, `json` for `Json @db.Json`. Postgres defines `=`, `<>` and\n * `@>` for jsonb only, so on a `json` column every op casts the\n * EXTRACTED value to jsonb (the string ops then read it as text), which\n * gives a jsonb column's answer. Sqlite and mysql have one JSON type\n * and ignore it.\n */\n readonly storage?: \"jsonb\" | \"json\";\n }\n /**\n * A bound extension fragment: literal text, bound parameters and quoted\n * identifiers in order (extensions.md §3 sql plane — trgm operators, rank\n * and distance terms). Parameters flow through the shared ParamCollector,\n * identifiers through dialect.quoteIdent — never hand-written.\n */\n | { readonly kind: \"fragment\"; readonly fragment: SqlFragmentSpec }\n /** Escape hatch for dialect-reviewed fragments. Text only — no parameters. */\n | { readonly kind: \"raw\"; readonly text: string };\n\n// ─── Projections ──────────────────────────────────────────────────\n\n/**\n * An aggregate projection.\n *\n * `countAll` renders `COUNT(*)`. The alias matters for portability: postgres\n * names the bare column `count`, sqlite and mysql name it `COUNT(*)` — callers\n * that must read the value back always pass an alias. Combined with a\n * non-empty `columns` list (grouped counts, `SELECT \"fk\", COUNT(*) … GROUP\n * BY \"fk\"`), it renders AFTER the columns.\n *\n * `one` renders the constant `1` — the conventional EXISTS projection; it\n * cannot be combined with a column list.\n */\nexport type SelectExpr =\n | { readonly kind: \"countAll\"; readonly alias?: string }\n | { readonly kind: \"one\" };\n\n// ─── SET operations ───────────────────────────────────────────────\n\n/** Arithmetic applied to a column's current value in an UPDATE ... SET. */\nexport type SetOperator = \"increment\" | \"decrement\" | \"multiply\" | \"divide\";\n\n/**\n * An atomic update expression: `\"col\" = \"col\" <op> $n`.\n *\n * Recognised structurally inside `UpdateStatement.set`, so the marker key is\n * deliberately unlikely (`__op`). Three layers keep a user's JSON payload from\n * ever being mistaken for one: the Json codec stringifies JSON values before\n * they reach the AST, the query builder only emits this shape for numeric\n * fields, and {@link isSetOperation} demands only the documented marker keys.\n */\nexport type SetOperation = {\n readonly __op: SetOperator;\n readonly value: number | string | bigint;\n /** Decimal arithmetic needs a REAL operand on SQLite, even for integral text. */\n readonly numericType?: \"Decimal\";\n};\n\nconst SET_OPERATORS: readonly string[] = [\"increment\", \"decrement\", \"multiply\", \"divide\"];\n\n/** Narrow an UPDATE set value to an atomic {@link SetOperation}. */\nexport function isSetOperation(value: unknown): value is SetOperation {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const keys = Object.keys(value);\n if (!keys.includes(\"__op\") || !keys.includes(\"value\")) return false;\n const candidate = value as { __op: unknown; value: unknown; numericType?: unknown };\n if (keys.length !== 2 && !(keys.length === 3 && keys.includes(\"numericType\") && candidate.numericType === \"Decimal\")) return false;\n return (\n typeof candidate.__op === \"string\" &&\n SET_OPERATORS.includes(candidate.__op) &&\n ((typeof candidate.value === \"number\" && Number.isFinite(candidate.value)) ||\n typeof candidate.value === \"string\" || typeof candidate.value === \"bigint\")\n );\n}\n\n/**\n * A scalar-list update expression (Prisma's `{ push: … }` on list columns):\n * `append` is one element (`\"col\" = array_append(\"col\", $n)`), `concat` an\n * array of elements (`\"col\" = \"col\" || $n`). Postgres only — the query builder\n * gates on `capabilities.scalarArrays` at build time and the renderer refuses\n * too. Same structural-marker discipline as {@link SetOperation}: the key is\n * unlikely, the shape exact, and Json payloads are stringified before they\n * could ever reach an UPDATE set.\n */\nexport type ListSetOperation = {\n readonly __listOp: \"append\" | \"concat\";\n readonly value: unknown;\n};\n\nconst LIST_SET_OPERATORS: readonly string[] = [\"append\", \"concat\"];\n\n/** Narrow an UPDATE set value to a {@link ListSetOperation}. */\nexport function isListSetOperation(value: unknown): value is ListSetOperation {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(\"__listOp\") || !keys.includes(\"value\")) return false;\n const candidate = value as { __listOp: unknown };\n return typeof candidate.__listOp === \"string\" && LIST_SET_OPERATORS.includes(candidate.__listOp);\n}\n\n/**\n * Database-clock marker: renders the DIALECT's `now()` expression — plus an\n * optional offset in seconds (fractional OK) bound as a parameter — instead of binding a\n * client-side timestamp. Flows as a VALUES cell, an UPDATE SET value, or a\n * comparison operand; the runtime's public `dbNow()` sentinel compiles to\n * this marker for DateTime fields (leases, TTLs — anything that must trust\n * the database's clock, never the process's). Same structural-marker\n * discipline as {@link SetOperation}: unlikely key, exact shape.\n */\nexport type DbNowMarker = {\n readonly __dbNow: true;\n readonly offsetSeconds: number;\n};\n\n/** Build a {@link DbNowMarker}; `offsetSeconds` is finite seconds — fractional is legal (lease TTLs arrive as ttlMs / 1000). */\nexport function dbNowMarker(params: { offsetSeconds: number }): DbNowMarker {\n return { __dbNow: true, offsetSeconds: params.offsetSeconds };\n}\n\n/** Narrow a value to a {@link DbNowMarker}. */\nexport function isDbNowMarker(value: unknown): value is DbNowMarker {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n // A-05: every object cell (each Date of a createMany) is asked; one own-key\n // test rejects them before the key list is built.\n if (!Object.hasOwn(value, \"__dbNow\")) return false;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(\"__dbNow\") || !keys.includes(\"offsetSeconds\")) return false;\n const candidate = value as { __dbNow: unknown; offsetSeconds: unknown };\n return (\n candidate.__dbNow === true &&\n typeof candidate.offsetSeconds === \"number\" &&\n Number.isFinite(candidate.offsetSeconds)\n );\n}\n\n// ─── Ordering ─────────────────────────────────────────────────────\n\n/** ORDER BY a column, with optional NULLS placement (native or emulated per dialect). */\nexport type OrderByColumn = {\n readonly column: ColRef;\n readonly direction: \"asc\" | \"desc\";\n /** NULLS placement; rendered natively or emulated per dialect. */\n readonly nulls?: \"first\" | \"last\";\n};\n\n/** ORDER BY an aggregate expression — grouped selects ordering by `COUNT(\"col\")`. */\nexport type OrderByAggregate = {\n readonly agg: AggRef;\n readonly direction: \"asc\" | \"desc\";\n};\n\n/**\n * ORDER BY a correlated scalar subquery — relation orderBy\n * (`orderBy: { posts: { _count: \"desc\" } }` → `(SELECT COUNT(*) …)`,\n * `orderBy: { posts: { _max: { createdAt: \"desc\" } } }` → `(SELECT MAX(…) …)`,\n * `orderBy: { author: { email: \"asc\" } }` → `(SELECT \"email\" …)`).\n * Portable: all three dialects order by scalar subqueries. The subquery\n * correlates to the outer scope through table-qualified `cmpCol` predicates,\n * exactly like `exists`; its parameters merge into the statement's single\n * sequence in render order.\n *\n * `nulls` places the NULL a missing to-one row or a parent without related\n * rows (under MIN/MAX/AVG/SUM) sorts as. Without it, NULL sorts at the\n * engine's native position. Postgres and sqlite render `NULLS FIRST|LAST`;\n * mysql renders the bare term when its native placement already matches, and\n * otherwise a leading `(<subquery>) IS NULL` term — the subquery then renders\n * twice and its parameters bind twice, in text order.\n */\nexport type OrderBySubquery = {\n readonly select: SelectStatement;\n /** A count behind a missing to-one row is zero, not NULL. */\n readonly coalesce?: 0;\n readonly direction: \"asc\" | \"desc\";\n readonly nulls?: \"first\" | \"last\";\n};\n\nexport type OrderTerm = OrderByColumn | OrderByAggregate | OrderBySubquery;\n\n// ─── Statements ───────────────────────────────────────────────────\n\n/**\n * One `LEFT JOIN LATERAL (…) AS alias ON true` clause aggregating a correlated\n * subquery into a single JSON value per outer row — the \"join\" relation-loading\n * strategy (postgres/pglite, and MySQL 8.0.14+ since lane J; gated on\n * `capabilities.lateralJoin` and rendered through `SqlDialect.lateralJson`).\n * MySQL renders positional rows only (`JSON_ARRAY`, `JSON_ARRAYAGG`, `ON\n * true`); its aggregate cannot order, so an ordered list level carries a\n * `select.rowNumber` without partition — rendered as the row's last slot.\n *\n * Renders (agg `jsonArray`):\n * `LEFT JOIN LATERAL (SELECT COALESCE(json_agg(to_json(\"__sub\".*)), '[]'::json)\n * AS \"columnAlias\" FROM (<select>) AS \"__sub\") AS \"alias\" ON true`\n * and (agg `jsonObject`):\n * `LEFT JOIN LATERAL (SELECT to_json(\"__sub\".*) AS \"columnAlias\"\n * FROM (<select>) AS \"__sub\") AS \"alias\" ON true`\n *\n * `to_json` over a subselect (not `json_build_object`) sidesteps postgres's\n * 100-argument function limit on wide models (v1 lesson); `json` rather than\n * `jsonb` because the value is transport only — jsonb's binary build + re-\n * serialization cost 2–3.7× the server time for identical decoded values.\n * The inner select's ORDER BY drives the aggregate's element order. Consumers\n * must run the codec table over the parsed JSON children: `to_json` turns\n * timestamps into strings and loses BigInt-ness (LEARNINGS).\n */\nexport type LateralJoin = {\n /** Join alias (`__lat_0`) — the outer projection selects `alias.columnAlias`. */\n readonly alias: string;\n /** Column the aggregated JSON value is exposed under (`__rel_posts`). */\n readonly columnAlias: string;\n /** jsonArray: many rows; jsonObject: one row or NULL; count: a scalar COUNT(*) lateral. */\n readonly agg: \"jsonArray\" | \"jsonObject\" | \"count\";\n /**\n * Object output is the SQL-layer default. Positional rows follow the exact\n * select.columns order, using explicit output names (never SELECT *).\n * Above JSON_TRANSPORT.chunkSize, a row is an array of fixed-size chunks;\n * the final chunk may be shorter. Scalar/list/Json field values stay in one\n * slot. Consumers must use the SAME projection to decode the payload.\n */\n readonly rowFormat?: \"object\" | \"positional\";\n /** The correlated child select — may reference outer columns via table-qualified refs. */\n readonly select: SelectStatement;\n};\n\n/**\n * One scalar subquery in a projection. The builder guarantees a single column\n * and at most one row. Hidden sort values stay inside derived tables rather\n * than becoming result fields. `coalesce` preserves a count across a missing\n * to-one hop.\n */\nexport type ScalarSubquery = {\n readonly alias: string;\n readonly select: SelectStatement;\n readonly coalesce?: 0;\n};\n\n/**\n * One correlated scalar `COUNT(*)` projected into a select list:\n * `(SELECT COUNT(*) FROM … WHERE <correlation>) AS \"alias\"` — the relation\n * `_count` of the round-trip campaign's R-03b, which saves the separate grouped\n * count statement. Portable: postgres, sqlite and mysql all evaluate a\n * correlated scalar subquery once per output row; the runtime wraps a paged\n * root in a derived table first, so the subqueries run only for the page.\n * The select must be ONE ungrouped `COUNT(*)` (`columns: []`, `selectExpr`\n * countAll, no grouping, paging, distinct or lock) — anything else is refused\n * at render. Its parameters join the statement's single sequence in text order\n * (the select list renders before FROM).\n */\nexport type CountSubquery = {\n /** Output column the count is exposed under (`__vibe_count_0`). */\n readonly alias: string;\n /** The correlated count select — references outer columns via table-qualified refs. */\n readonly select: SelectStatement;\n};\n\n/**\n * One `INNER JOIN \"table\" AS alias ON left = right [AND …]` clause — plain\n * equality joins only, portable across all dialects. Added for the\n * single-statement implicit-M2M load (child rows joined to their join-table\n * membership rows); extra join-table columns project through the statement's\n * `columns` list with a table qualifier + `alias`.\n */\nexport type InnerJoin = {\n readonly table: TableRef;\n /** Equality pairs ANDed into the ON clause; never empty. */\n readonly on: readonly { readonly left: ColRef; readonly right: ColRef }[];\n};\n\n// ─── Fix lane Q2 (D-03): derived-table LEFT JOIN ───\n\n/**\n * One `LEFT JOIN (<select>) AS \"alias\" ON \"alias\".\"k\" = \"outer\".\"c\" [AND …]`\n * clause — portable, equality ON pairs only. Built for the to-one relation\n * `orderBy` (`orderBy: { author: { email: \"asc\" } }`): the target's key and\n * sort columns ride a derived table under RESERVED aliases (`__vibe_ok0`,\n * `__vibe_ov0`), so the outer statement's unqualified column names can never\n * become ambiguous, and the outer ORDER BY names `\"alias\".\"__vibe_ov0\"`.\n * Every engine merges such a derived table into a plain join (measured:\n * postgres pulls it up into a hash/nested-loop left join, sqlite flattens it,\n * mysql merges it), so the planner may hash-join instead of evaluating a\n * correlated subquery per candidate row.\n *\n * The builder emits it only for links that match AT MOST ONE target row, so\n * the join keeps the parent row count. The derived select must alias every\n * projected column; its parameters (none today) join the statement's single\n * sequence where the clause renders (after `keyTable`, before\n * `lateralJoins`). A statement with a `rowLock` refuses it: postgres rejects\n * FOR UPDATE on the nullable side of an outer join, and mysql would lock the\n * joined rows too.\n */\nexport type LeftJoin = {\n /** Derived-table alias (`__ord1`). */\n readonly alias: string;\n /** The derived table — every projected column carries an `alias`. */\n readonly select: SelectStatement;\n /** Equality pairs ANDed into the ON clause; never empty. */\n readonly on: readonly { readonly left: ColRef; readonly right: ColRef }[];\n};\n\n/**\n * How one member of a {@link KeyTableJoin} tuple binds inside the derived\n * table. `value` binds the parameter as it is: it stays COERCIBLE, so a text\n * column's OWN collation decides `=` — the equality `col IN (?, …)` uses.\n * `integer` and `decimal` cast the parameter into the column's numeric family:\n * BigInt and Decimal values travel as strings, and a derived-table string\n * compared with a numeric column goes through a double (measured on mysql:\n * `9007199254740993` matched `9007199254740992`).\n *\n * `integer` renders `CAST(? AS SIGNED)`. `decimal` renders\n * `CAST(? AS DECIMAL(65, scale))` with the tested column's own scale: 65 is\n * MySQL's maximum precision, so the cast holds every value a\n * `DECIMAL(p, scale)` column can hold. A fixed `DECIMAL(65,30)` held only 35\n * integer digits and clipped a `Decimal(65, 0)` key onto its maximum, which\n * matched nothing (review finding 1); the column's own precision would clip a\n * wider value onto the column's maximum and pair it with a row it does not\n * equal (measured: `CAST('100000' AS DECIMAL(5,0))` is `99999`). `scale` is\n * 0–30, MySQL's range.\n *\n * `citext` (postgres only) renders `CAST($n AS citext)`: a postgres `citext`\n * key compares case-insensitively, and a bare VALUES parameter would be\n * `text`, whose `=` against a citext column is the case-sensitive text\n * operator. A VALUES cell has no column to infer a type from, so every member\n * of a postgres key table binds typed: `citext`, `text` (`CAST($n AS text)`,\n * a text or varchar column) or `integer` (`CAST($n AS bigint)`, exact against\n * any integer column) — any other member refuses on postgres. `text` is\n * postgres-only; mysql binds text members as `value`.\n */\nexport type KeyTableMember =\n | { readonly kind: \"value\" }\n | { readonly kind: \"integer\" }\n | { readonly kind: \"decimal\"; readonly scale: number }\n /** MySQL-only lossless temporal operands in mixed collation-aware key tuples. */\n | { readonly kind: \"timestamp\" }\n | { readonly kind: \"time\" }\n | { readonly kind: \"citext\" }\n | { readonly kind: \"text\" };\n\n/**\n * The batch's key tuples as a derived table, each tagged with its ORDINAL\n * (row `i` carries `i`), INNER JOINed on the tested columns — mysql:\n * `INNER JOIN (VALUES ROW(?, 0), ROW(?, 1)) AS \\`alias\\` (\\`__vibe_k0\\`, \\`ordinal\\`)\n * ON col = \\`alias\\`.\\`__vibe_k0\\``; postgres only over `citext` members\n * (`(VALUES (CAST($1 AS citext), 0), …)`, release 3.0 nested writes).\n * Member columns are named `__vibe_k<i>` (a reserved prefix, so unqualified\n * child columns never collide with them).\n *\n * Why it exists (EPIC R): a relation load used to stitch children to parents\n * by comparing decoded keys in JavaScript, while mysql's collations equate\n * spellings (`acme` = `Acme` = `ACME`, `cafe` = `Café`, `x ` = `x`) that\n * JavaScript keeps apart — the foreign key and the `IN` filter accepted the\n * child, the stitch dropped it. Joined this way the DATABASE pairs every child\n * row with every batch key it considers equal, and the projected ordinal names\n * the key; the join is also the membership filter.\n */\nexport type KeyTableJoin = {\n /** Derived-table alias (`__vibe_keys`); the ordinal projects as `alias.ordinalAlias`. */\n readonly alias: string;\n /** The statement's columns, compared member by member (`=`), in tuple order. */\n readonly columns: readonly ColRef[];\n /** How each member binds, in tuple order — see {@link KeyTableMember}. */\n readonly members: readonly KeyTableMember[];\n /** Encoded key tuples; never empty, each as long as `columns`. */\n readonly rows: readonly (readonly unknown[])[];\n /** Output name of the ordinal column. */\n readonly ordinalAlias: string;\n};\n\n/**\n * A `ROW_NUMBER() OVER (PARTITION BY … [ORDER BY …]) AS \"alias\"` projection,\n * appended after `columns` — the distinct emulation on dialects without\n * `DISTINCT ON` (sqlite ≥3.25, mysql ≥8.0 both have window functions): the\n * outer statement filters `alias = 1` on the derived table, restoring\n * SQL-side take/skip and bounded transfer (N10).\n */\nexport type RowNumberProjection = {\n readonly partitionBy: readonly ColRef[];\n /** Intra-partition order picking the representative row; may be empty. */\n readonly orderBy: readonly OrderTerm[];\n readonly alias: string;\n};\n\n// ─── Fix lane Q1 (round 3, DB-01): per-key page ──────────────────\n\n/**\n * A PER-KEY PAGE of one child table as a derived-table FROM\n * (`SelectStatement.keyPage`): for every listed key tuple, the child rows\n * whose key columns equal it, ordered by `select.orderBy` and cut by\n * `select.limit`/`select.offset` — each key's OWN page, plus a rank column\n * (`rankAlias`) that orders the rows inside their key. The paged include's\n * `ROW_NUMBER() OVER (PARTITION BY key …)` window returns the same rows but\n * numbers EVERY child of every listed key first; this form reads one page of\n * primary keys per key through an index on (key columns, order columns),\n * then each page row once by its primary key.\n *\n * Rendered per `SqlDialect.keyPageStrategy`:\n * - `lateral` (postgres): `unnest($1::<type>[], …) AS \"__vibe_keys\"\n * (\"__vibe_k0\", …) CROSS JOIN LATERAL (SELECT <identity>, ROW_NUMBER() OVER\n * (PARTITION BY <key> ORDER BY <order>) AS <rank> FROM <table> WHERE <key> =\n * \"__vibe_keys\".\"__vibe_k<i>\" … ORDER BY <order> LIMIT … OFFSET …) AS\n * \"__vibe_ids\" INNER JOIN <table> AS \"__vibe_page\" ON <identity> pairs`.\n * - `inLimit` (sqlite, which has no LATERAL): the key tuples as `(VALUES …)`\n * (columns `column1`, `column2`, …, as SQLite names a VALUES clause's\n * columns) joined to `<table> AS \"__vibe_page\"` ON `(<identity>) IN (SELECT\n * <identity> … WHERE <key> = \"__vibe_keys\".\"column<i>\" … ORDER BY … LIMIT …)`,\n * the rank re-derived over the fetched page (`ROW_NUMBER() OVER (PARTITION\n * BY <key> ORDER BY <order>)`): its values differ from the window's, its\n * order inside a key does not.\n * - `window` (mysql): refused with `VIBE_UNSUPPORTED_CAPABILITY` — measured\n * no gain there; the runtime keeps the window.\n *\n * The caller guarantees what makes the page equal to the window's: the order\n * is total inside a key (the identity columns are among the key and order\n * columns), the key tuples are distinct and compare exactly (no folding\n * collation). Members bind like the key-list filter's (`KeyListMember`).\n */\nexport type KeyPage = {\n /** How each key member binds, in member order (postgres: one typed array each). */\n readonly members: readonly KeyListMember[];\n /** Encoded, distinct key tuples; never empty, each `members.length` long. */\n readonly rows: readonly (readonly unknown[])[];\n /** The child columns each key member equals, in member order (unqualified). */\n readonly keyColumns: readonly ColRef[];\n /** The child's primary-key columns (unqualified) — each page row is read once by them. */\n readonly identity: readonly ColRef[];\n /**\n * ONE key's page: the child `table` (no alias), the projected `columns`\n * (unqualified; transforms and aliases render as usual), an optional extra\n * `where`, the non-empty `orderBy` (plain column terms), `limit`/`offset`.\n * Any other member is refused.\n */\n readonly select: SelectStatement;\n /** Output name of the rank column. */\n readonly rankAlias: string;\n};\n\n/**\n * Statement-count pass EPIC 4 (round-3 ST-07): bound key tuples as the FROM\n * of a select (`SelectStatement.fromKeys`) — a derived table named\n * `table.name` whose columns are `columns`, one row per tuple. The write\n * follow-up puts it where the parent table would be: the find path's laterals\n * correlate to `\"<table.name>\".\"<column>\"` exactly as over the table, but read\n * the RETURNED key values instead of the parent row (a deleted row, or a\n * native-RLS parent whose SELECT policy the per-relation loads never met).\n *\n * Renders where `SqlDialect.keyListStrategy` is `unnest` (postgres) as the\n * typed form of a `VALUES` list — one array per column, typed like the\n * key-list filter's members (`postgresKeyListElementType`), so the text does\n * not depend on the tuple count: `FROM unnest($1::text[], $2::int4[]) AS\n * \"Post\" (\"id\", \"authorId\")`. A `DateTime` member without a declared native\n * type (`keyListBindsUntypedRows`) and every other dialect refuse with\n * `VIBE_UNSUPPORTED_CAPABILITY` — those dialects have no lateral joins either.\n */\nexport type KeyRows = {\n /** Output column names of the derived table, in member order. */\n readonly columns: readonly string[];\n /** How each column binds, in column order — see {@link KeyListMember}. */\n readonly members: readonly KeyListMember[];\n /** Encoded tuples; never empty, each exactly `columns.length` long. */\n readonly rows: readonly (readonly unknown[])[];\n};\n\n/**\n * `GROUP BY GROUPING SETS (…)` over a select's `groupBy` columns. Each set\n * lists indexes into `groupBy`; `()` is the grand total. The projection gains\n * `CASE GROUPING(<every groupBy column>) WHEN <mask> THEN <set index> … END AS\n * \"<indexAlias>\"` after the aggregates, so a row names the set that produced\n * it, and an ORDER BY term may name `indexAlias` as a bare column (an output\n * column). Dialect `groupingSets` capability: `\"groupingSets\"` renders any\n * list, `\"rollup\"` only the rollup chain of `groupBy` in order (`GROUP BY a,\n * b WITH ROLLUP`), `\"none\"` refuses.\n */\nexport type GroupingSets = {\n readonly sets: readonly (readonly number[])[];\n readonly indexAlias: string;\n};\n\nexport type SelectStatement = {\n readonly kind: \"select\";\n readonly table: TableRef;\n /** Empty array renders as `SELECT *` (unless `selectExpr` replaces it). */\n readonly columns: readonly ColRef[];\n /**\n * Aggregate projection. Replaces the column list when `columns` is empty;\n * a `countAll` with columns renders after them (grouped counts).\n */\n readonly selectExpr?: SelectExpr;\n /**\n * Aliased aggregate projections (`AVG(\"col\") AS \"_avg__col\"`), rendered\n * after `columns` — the aggregate/groupBy/count-select shapes. Cannot be\n * combined with `selectExpr`.\n */\n readonly aggregates?: readonly AggSelect[];\n /** Correlated `COUNT(*)` subqueries, rendered after `aggregates` — see {@link CountSubquery}. */\n readonly countSubqueries?: readonly CountSubquery[];\n /** Scalar values projected after count subqueries and before a row number. */\n readonly scalarSubqueries?: readonly ScalarSubquery[];\n /**\n * `SELECT DISTINCT ON (cols)` — postgres only (`capabilities.distinctOn`;\n * other dialects refuse at render time and the runtime emulates client-side\n * instead). ORDER BY must lead with these columns; the query builder\n * guarantees that arrangement.\n */\n readonly distinctOn?: readonly ColRef[];\n /**\n * Plain `SELECT DISTINCT` over the whole projection — every dialect. The\n * query builder sets it only where it returns exactly the rows its\n * `ROW_NUMBER()` distinct emulation would (sqlite/mysql, value-exact keys,\n * projection equal to the distinct fields); never together with\n * `distinctOn` (the renderer refuses the pair).\n */\n readonly distinct?: true;\n /**\n * Derived-table FROM: renders `FROM (<fromSelect>) AS \"<table.name>\"` —\n * `table.name` is the subquery ALIAS and `table.alias` must be unset. Used\n * by aggregate-over-a-subset shapes (`aggregate({ take, skip, orderBy })`).\n */\n readonly fromSelect?: SelectStatement;\n /** Lateral JSON-aggregation joins — postgres and MySQL 8.0.14+, see {@link LateralJoin}. */\n readonly lateralJoins?: readonly LateralJoin[];\n /** Plain equality INNER JOINs — portable, see {@link InnerJoin}. */\n readonly innerJoins?: readonly InnerJoin[];\n /** Key-table join, rendered after `innerJoins` — mysql only, see {@link KeyTableJoin}. */\n readonly keyTable?: KeyTableJoin;\n /** Fix lane Q2 (D-03): derived-table LEFT JOINs, rendered after `keyTable` — see {@link LeftJoin}. */\n readonly leftJoins?: readonly LeftJoin[];\n /** ROW_NUMBER window projection — see {@link RowNumberProjection}. */\n readonly rowNumber?: RowNumberProjection;\n /**\n * Fix lane Q1 (DB-01): derived-table FROM over a per-key page — renders\n * `FROM (<per-key page>) AS \"<table.name>\"` like `fromSelect` (and never\n * together with it); see {@link KeyPage}.\n */\n readonly keyPage?: KeyPage;\n /**\n * Fix lane Q2 (round 3, DB-07): derived-table FROM over a `UNION ALL` of\n * branch selects — renders `FROM (SELECT * FROM (<branch 0>) AS\n * \"__vibe_u0\" UNION ALL SELECT * FROM (<branch 1>) AS \"__vibe_u1\" …) AS\n * \"<table.name>\"`. Each branch keeps its own ORDER BY and LIMIT: wrapped in\n * its own derived table, a limited branch is valid on all three engines\n * (SQLite refuses ORDER BY/LIMIT on a bare compound member). At least two\n * branches; each a plain `SELECT <columns> FROM <table> [WHERE] [ORDER BY]\n * [LIMIT]` projecting the same output names in the same order; never\n * together with `fromSelect`, `keyPage` or a `table.alias`. Parameters bind\n * branch by branch, in text order.\n */\n readonly fromUnion?: readonly SelectStatement[];\n /**\n * Statement-count pass EPIC 4 (ST-07): derived-table FROM over bound key\n * tuples, named `table.name` with the listed column names — see\n * {@link KeyRows}. Never together with `fromSelect`, `keyPage`, `fromUnion`,\n * a `table.alias` or a `rowLock`.\n */\n readonly fromKeys?: KeyRows;\n readonly where?: SqlExpr;\n readonly groupBy?: readonly ColRef[];\n /** Grouping sets over `groupBy` — see {@link GroupingSets}. */\n readonly groupingSets?: GroupingSets;\n /** HAVING predicate — grouped selects; may contain `aggCmp` expressions. */\n readonly having?: SqlExpr;\n readonly orderBy?: readonly OrderTerm[];\n readonly limit?: number;\n readonly offset?: number;\n /**\n * Row-locking read (`SELECT … FOR UPDATE SKIP LOCKED`) — see {@link RowLock}.\n * The internal read-before-write overlays (dialects without RETURNING) set\n * the plain `{ strength: \"update\", wait: \"wait\" }` lock. Rendered only where\n * the dialect names the clause (`dialect.rowLockSyntax`); sqlite has none and\n * needs none — its write transactions already exclude each other.\n */\n readonly rowLock?: RowLock;\n};\n\n/**\n * The lock a locking read takes: one strength, one wait policy. Both members\n * are REQUIRED here — defaulting happens once, in the query builder, so the\n * rendered SQL is a function of the AST alone.\n *\n * `of` narrows the lock to named FROM items (`FOR UPDATE OF \"Parent\"`). The\n * join relation strategy needs it: its statement also reads child rows through\n * `LEFT JOIN LATERAL` subqueries, and an unnarrowed clause is refused by\n * postgres (\"FOR UPDATE is not allowed with aggregate functions\", from the\n * children's `json_agg`). With `of` naming the statement's own table only the\n * parent rows are locked. Each name must be the statement's table alias, or its\n * unqualified table name when it has no alias — the only FROM item the AST\n * names; the renderer refuses anything else. Dialects without a locking-read\n * clause render nothing, as for a lock without `of`.\n */\nexport type RowLock = {\n readonly strength: RowLockStrength;\n readonly wait: RowLockWaitPolicy;\n readonly of?: readonly string[];\n};\n\n/**\n * Sentinel VALUES cell: render the `DEFAULT` keyword instead of a placeholder\n * (M4) — a heterogeneous createMany row that omits a field lets the COLUMN\n * default apply (or NULL on a defaultless nullable column), exactly like a\n * single-row insert that omits it. Postgres/mysql only\n * (`dialect.rowDefaultKeyword`); sqlite groups rows instead.\n */\nexport const SQL_DEFAULT_CELL: { readonly __sqlDefault: true } = Object.freeze({ __sqlDefault: true });\n\n/**\n * Sentinel update-arm cell: the column keeps its current value —\n * `` `col` = `table`.`col` `` (V8, the insert-if-missing upsert). Valid only in\n * an {@link OnConflictUpdate} `update` set, where MySQL's `ON DUPLICATE KEY\n * UPDATE` needs at least one assignment: a self-assignment changes nothing on a\n * duplicate and, unlike `INSERT IGNORE`, leaves every other error an error.\n * Refused in a plain UPDATE's SET list.\n */\nexport const SQL_KEEP_CELL: { readonly __sqlKeep: true } = Object.freeze({ __sqlKeep: true });\n\n/** Is this update cell the {@link SQL_KEEP_CELL} sentinel? */\nexport function isSqlKeepCell(value: unknown): boolean {\n return value === SQL_KEEP_CELL;\n}\n\n/** Is this VALUES cell the {@link SQL_DEFAULT_CELL} sentinel? */\nexport function isSqlDefaultCell(value: unknown): boolean {\n return value === SQL_DEFAULT_CELL;\n}\n\n/**\n * VALUES/SET cell carrying a Json column's parameter (the codec's JSON text).\n *\n * Why it exists: OID-typed drivers (bun:sql) resolve each parameter's postgres\n * type and re-serialize the JS value AS that type — a pre-stringified Json\n * param bound straight into a bare jsonb slot arrives DOUBLE-ENCODED (a jsonb\n * string holding the document; live-proven on Bun 1.3.14). The postgres\n * renderer pins the parameter's type instead (`$n::text::jsonb`,\n * `SqlDialect.jsonParamCast`), so every driver sends the text through and the\n * SERVER parses it; text-param drivers (node-postgres, pglite) are unaffected.\n * Sqlite/mysql render the bare placeholder — their Json transport is already\n * plain text. The COLLECTED parameter is the plain text either way: this\n * wrapper never crosses the wire.\n *\n * `storage: \"json\"` marks a postgres `json` column (`Json @db.Json`): the cell\n * renders `$n::text::json`, so the column stores the text as written (key\n * order and spelling kept) instead of jsonb's normalized text (release-3.0\n * D3). Absent = jsonb; dialects without a param cast ignore it.\n */\nexport type JsonParamCell = { readonly __jsonParam: true; readonly text: string; readonly storage?: \"json\" };\n\n/** Wrap a Json column's encoded (stringified) parameter for cast-site rendering. */\nexport function jsonParamCell(params: { text: string; storage?: \"json\" }): JsonParamCell {\n return params.storage === \"json\" ? { __jsonParam: true, text: params.text, storage: \"json\" } : { __jsonParam: true, text: params.text };\n}\n\n/** Is this VALUES/SET cell a {@link JsonParamCell}? */\nexport function isJsonParamCell(value: unknown): value is JsonParamCell {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { __jsonParam?: unknown }).__jsonParam === true\n );\n}\n\n/**\n * Reference to the row PROPOSED for insertion, inside an upsert's update arm:\n * `excluded.\"col\"` on postgres/sqlite, `` `new`.`col` `` on mysql's row-alias\n * form (`SqlDialect.excludedRowRef`). It is a COLUMN REFERENCE, not a\n * parameter — it names the value already bound in this statement's VALUES\n * list, which is what lets ONE batched upsert write each conflicting row's own\n * incoming values without binding them a second time.\n */\nexport type ExcludedRef = { readonly __excluded: true; readonly column: string };\n\n/** Reference the incoming row's `column` from inside an upsert update arm. */\nexport function excludedRef(params: { column: string }): ExcludedRef {\n return { __excluded: true, column: params.column };\n}\n\n/** Is this SET cell an {@link ExcludedRef}? */\nexport function isExcludedRef(value: unknown): value is ExcludedRef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { __excluded?: unknown }).__excluded === true\n );\n}\n\n/**\n * One RETURNING column: a bare column name renders `\"col\"`; `castText` renders\n * a dialect text cast (postgres `::text`, sqlite `CAST AS TEXT`) for lossless\n * transport, including timestamps and postgres arrays. `jsonText`\n * applies the dialect's JSON text projection, as {@link ColRef.transform} does\n * for SELECT. Dialects without RETURNING still omit the clause and flag it.\n */\nexport type ReturningColumn =\n | string\n | { readonly name: string; readonly castText: true }\n | { readonly name: string; readonly transform: \"jsonText\" }\n | CaptureReturningColumn\n | OtherRowReturningColumn;\n\n/**\n * A RETURNING column read from a row OTHER than the one the statement wrote,\n * exposed as `alias` and projected like the written row's own column\n * (`projection`), so one codec decodes both:\n *\n * - `from: \"old\"` — the row as it was before the statement (capability\n * `rowCapture`, PostgreSQL 18): `old.\"col\" AS \"alias\"`, NULL in every column\n * for a row the statement inserted;\n * - `from: { source }` — the joined source of an `UPDATE … FROM` by its alias\n * (capability `returningReadsJoinedSource`): `\"source\".\"col\" AS \"alias\"`.\n */\nexport type OtherRowReturningColumn = {\n readonly from: \"old\" | { readonly source: string };\n readonly name: string;\n readonly alias: string;\n readonly projection?: \"castText\" | \"jsonText\";\n};\n\n/**\n * A row-capture RETURNING column (`$transaction(…, { capture })`, dialects with\n * the `rowCapture` capability: PostgreSQL 18, where RETURNING names the row\n * before the statement `old` and the row after it `new`):\n *\n * - `\"old\"` / `\"new\"`: `old.\"col\"::text AS \"alias\"` / `new.\"col\"::text AS \"alias\"`,\n * the value as text so every type survives exactly (`old` is all NULL for an\n * inserted row, `new` for a deleted one);\n * - `\"inserted\"`: `(old.\"col\" IS NULL) AS \"alias\"` — the arm of an `INSERT …\n * ON CONFLICT DO UPDATE` row, true when it was inserted (`col` must be a\n * column no stored row holds NULL in: a primary-key column);\n * - `\"old\"` / `\"new\"` with `hop`: the related row's column, read in the same\n * statement — `(SELECT \"__vibe_h\".\"col\"::text FROM \"Related\" AS \"__vibe_h\"\n * WHERE \"__vibe_h\".\"id\" = new.\"relatedId\") AS \"alias\"` (see {@link CaptureHop});\n * - `\"key\"`: `old.\"col\" AS \"alias\"` in the column's own type, for a chain's\n * {@link CaptureCascade} to match child rows on;\n * - `\"cascade\"` ({@link CaptureCascadeReturningColumn}): the images of the\n * child rows a referential action of this row changes.\n */\nexport type CaptureReturningColumn =\n | {\n readonly capture: \"old\" | \"new\" | \"inserted\" | \"key\";\n readonly name: string;\n readonly alias: string;\n /** With `\"old\"` / `\"new\"`: read `name` from the related row instead of this one. */\n readonly hop?: CaptureHop;\n }\n | CaptureCascadeReturningColumn;\n\n/**\n * A to-one hop of a capture cell: the row of `table` whose `on[i].target`\n * columns equal the reading row's `on[i].source` columns. The target columns\n * must be a unique key (a scalar subquery that found two rows would fail the\n * statement); no row, or a NULL source column, reads NULL.\n */\nexport type CaptureHop = {\n readonly table: TableRef;\n readonly on: readonly { readonly target: string; readonly source: string }[];\n};\n\n/** One cell of a {@link CaptureCascade} image: a child column, or a column of its related row. */\nexport type CaptureCell = {\n readonly name: string;\n readonly hop?: CaptureHop;\n};\n\n/**\n * The distinct images of the child rows of `table` whose `on[i].child` columns\n * equal a written parent row's `on[i].parent` columns: `(SELECT\n * array_agg(\"__vibe_i\")::text FROM (SELECT DISTINCT ARRAY[<cells>] AS \"__vibe_i\"\n * FROM \"Child\" AS \"__vibe_c\" WHERE <match> LIMIT $n) AS \"__vibe_d\")`, NULL when\n * no child matched. Read inside the parent's statement, whose snapshot still\n * holds the rows its foreign keys' referential actions remove or rewrite at\n * the statement's end. `limit` is bound as a parameter.\n */\nexport type CaptureCascade = {\n readonly table: TableRef;\n readonly on: readonly { readonly child: string; readonly parent: string }[];\n readonly cells: readonly CaptureCell[];\n readonly limit: number;\n};\n\n/**\n * A per-row {@link CaptureCascade} in RETURNING: `parent` columns are read from\n * `old.` (`\"__vibe_c\".\"child\" = old.\"parent\"`).\n */\nexport type CaptureCascadeReturningColumn = {\n readonly capture: \"cascade\";\n readonly alias: string;\n readonly cascade: CaptureCascade;\n};\n\n/** The column name a {@link ReturningColumn} exposes in the result row. */\nexport function returningColumnName(column: ReturningColumn): string {\n return typeof column === \"string\" ? column : \"capture\" in column || \"from\" in column ? column.alias : column.name;\n}\n\n/** Is this RETURNING column read from another row ({@link OtherRowReturningColumn})? */\nexport function isOtherRowReturningColumn(column: ReturningColumn): column is OtherRowReturningColumn {\n return typeof column !== \"string\" && \"from\" in column;\n}\n\n/** Is this RETURNING column a row-capture column ({@link CaptureReturningColumn})? */\nexport function isCaptureReturningColumn(column: ReturningColumn): column is CaptureReturningColumn {\n return typeof column !== \"string\" && \"capture\" in column;\n}\n\nexport type InsertStatement = {\n readonly kind: \"insert\";\n readonly table: TableRef;\n readonly columns: readonly string[];\n /** Row values aligned to `columns` — deterministic parameter order. */\n readonly rows: readonly (readonly unknown[])[];\n /** Upsert clause: ON CONFLICT (pg/sqlite) or ON DUPLICATE KEY (mysql). */\n readonly onConflict?: OnConflictClause;\n /** Rendered as RETURNING where the dialect supports it, else omitted+flagged. */\n readonly returning?: readonly ReturningColumn[];\n /**\n * Bind the rows as ONE typed array per column instead of one parameter per\n * value (`SqlDialect.bulkInsertForm` `\"unnest\"`, postgres): `INSERT INTO t\n * (\"a\", \"b\") SELECT \"c1\", \"c2\" FROM unnest($1::text[], $2::int4[]) WITH\n * ORDINALITY AS \"__vibe_rows\" (\"c1\", \"c2\", \"ord\") ORDER BY \"ord\"`. The text\n * is the same for 2 rows and for 3 000, and the statement binds one parameter\n * per column. `ORDER BY \"ord\"` keeps input order (sequence values, the\n * `ON CONFLICT DO NOTHING` winner).\n *\n * One entry per column, in `columns` order: the column's DECLARED type facts\n * (see {@link KeyListMember}; a `Json` entry names its storage through\n * `nativeType`). Each array binds the BASE type (`varchar`, never\n * `varchar(191)` — an explicit modifier cast truncates silently), so the\n * INSERT's own assignment applies the column's length and precision exactly\n * as it does for a VALUES parameter. `rows` stays row-major: the renderer\n * transposes it. Every cell is a plain value, SQL NULL or a\n * {@link JsonParamCell} — never `DEFAULT` or the database clock (the query\n * builder keeps VALUES for those; the renderer refuses them).\n */\n readonly unnest?: readonly KeyListMember[];\n};\n\n/** Conflicting rows are updated with these column values. */\nexport type OnConflictUpdate = {\n /** Conflict target columns (ignored by the mysql form). */\n readonly columns: readonly string[];\n /**\n * Named-constraint target: `ON CONFLICT ON CONSTRAINT \"name\" DO UPDATE`.\n * Postgres only; replaces the column-list target when present.\n */\n readonly constraint?: string;\n /**\n * Partial-index arbiter predicate, RAW SQL: `ON CONFLICT (cols) WHERE pred\n * DO UPDATE …` (postgres/sqlite; requires `columns`). Raw for the same\n * reason {@link OnConflictDoNothing.conflictWhere} is — both engines match\n * the clause against the index's OWN stored predicate structurally, so a\n * bound parameter could never match and the text mirrors the schema\n * declaration byte-for-byte. Mysql's ODKU names no target and refuses it.\n */\n readonly conflictWhere?: string;\n readonly update: Readonly<Record<string, unknown>>;\n /**\n * Guard on the update arm, BOUND parameters: `ON CONFLICT (…) DO UPDATE SET\n * … WHERE <guard>` — the conflicting row is updated (and returned) only when\n * the guard admits it; otherwise the statement writes and returns nothing.\n * Postgres has both the target row and `excluded` in scope there, so every\n * column ref must carry `table` (the target table's name), exactly as the\n * SET self-references do. Needs the `conflictUpdateWhere` capability:\n * mysql's ODKU has no WHERE and refuses it (`VIBE_UNSUPPORTED_CAPABILITY`).\n */\n readonly updateWhere?: SqlExpr;\n /**\n * MySQL only (`upsertForm: \"onDuplicateKey\"`): append\n * `` `col` = LAST_INSERT_ID(`col`) `` to the update list so the UPDATE arm\n * records the addressed row's key — without it `LAST_INSERT_ID()` is stale\n * on the update arm and the read-back can resolve a wrong, unrelated row\n * (SQL review B2, live-proven on 8.4). Only meaningful for integer keys.\n */\n readonly lastInsertIdColumn?: string;\n};\n\n/**\n * Conflicting rows are skipped (`createMany({ skipDuplicates: true })`).\n * An empty/absent target means \"any conflict\" — the mysql form\n * (`ON DUPLICATE KEY UPDATE k = t.k`, dialect `doNothingForm:\n * \"duplicateKeyKeep\"`) can only express that, so it ignores a bare `columns`\n * target (documented degradation) and REFUSES the refined targets below.\n */\nexport type OnConflictDoNothing = {\n /**\n * MySQL form only (`duplicateKeyKeep`): the column the duplicate arm assigns\n * to itself (`` `k` = `t`.`k` ``, a no-op). Absent = the first inserted\n * column; an all-default row (no column) must name one.\n */\n readonly keepColumn?: string;\n /**\n * MySQL form only, single-row statements: a decimal literal S (digits only).\n * The keep assignment becomes `` `k` = IF(LAST_INSERT_ID(S), `t`.`k`, `t`.`k`) ``,\n * so a skipped duplicate reports S as the statement's insert id (an inserted\n * row reports its own id, or 0) — the exact skipped verdict that the\n * affected count cannot give with CLIENT_FOUND_ROWS (an unchanged duplicate\n * counts 1, like an insert). The builder picks S unequal to the row's\n * explicit AUTO_INCREMENT value.\n */\n readonly duplicateFlag?: string;\n readonly columns?: readonly string[];\n /**\n * Partial-index target predicate, RAW SQL: `ON CONFLICT (cols) WHERE pred\n * DO NOTHING` (postgres/sqlite; requires `columns`). Raw — and rendered\n * verbatim — because BOTH engines match the clause against the index's OWN\n * stored predicate structurally: a bound parameter could never match, so\n * the text mirrors the schema declaration's `where:` string byte-for-byte.\n */\n readonly conflictWhere?: string;\n /** Named-constraint target (`ON CONSTRAINT \"name\"`) — postgres only. */\n readonly constraint?: string;\n readonly doNothing: true;\n};\n\nexport type OnConflictClause = OnConflictUpdate | OnConflictDoNothing;\n\nexport type UpdateStatement = {\n readonly kind: \"update\";\n readonly table: TableRef;\n /** The target's alias; required with {@link UpdateStatement.from}, where two relations are in scope. */\n readonly alias?: string;\n /**\n * A joined source: `UPDATE … FROM` on PostgreSQL/SQLite (its `on` AND-ed\n * before `where`), `UPDATE … JOIN … ON` on MySQL. A\n * {@link SourceColumnRef} set value reads its columns.\n */\n readonly from?: UpdateSource;\n /**\n * Column → parameter value, or an atomic {@link SetOperation}. As a\n * {@link ChainStep} only (statement-maxx lane C3), a value may be a\n * {@link StepColumnRef} to an EARLIER step: `\"col\" = (SELECT \"c\" FROM\n * \"step\")` — the step must return at most one row (an owner resolved by a\n * unique where, or an owner INSERT of one row).\n */\n readonly set: Readonly<Record<string, unknown>>;\n readonly where?: SqlExpr;\n readonly returning?: readonly ReturningColumn[];\n};\n\nexport type DeleteStatement = {\n readonly kind: \"delete\";\n readonly table: TableRef;\n readonly where?: SqlExpr;\n readonly returning?: readonly ReturningColumn[];\n};\n\n/** Native RLS DDL, kept distinct from ordinary row-query expressions. */\nexport type RlsEnableStatement = { readonly kind: \"rlsEnable\"; readonly table: string };\nexport type RlsForceStatement = { readonly kind: \"rlsForce\"; readonly table: string };\n/** Disable native row policy enforcement on a physical table. */\nexport type RlsDisableStatement = { readonly kind: \"rlsDisable\"; readonly table: string };\n/** Remove forced owner enforcement on a physical table. */\nexport type RlsNoForceStatement = { readonly kind: \"rlsNoForce\"; readonly table: string };\n/** Drop the managed policy by default, or the supplied policy name. */\nexport type RlsDropPolicyStatement = { readonly kind: \"rlsDropPolicy\"; readonly table: string; readonly policyName?: string };\nexport type RlsPolicyStatement = {\n readonly kind: \"rlsPolicy\";\n readonly schema: SchemaIR;\n readonly model: string;\n /** Probe policies use a distinct identity without changing the predicate. */\n readonly policyName?: string;\n /** Only the probe target may be temporary; parent relations always remain public. */\n readonly targetSchema?: \"public\" | \"pg_temp\";\n};\n\n/** Values are validated/serialized by runtime; null is the absent setting sentinel. */\nexport type RlsContextStatement = {\n readonly kind: \"rlsContext\";\n readonly context: RlsContextIR;\n readonly values: Readonly<Record<string, string | null>>;\n /** PGlite: bind this trusted runtime role first, in the same statement. */\n readonly role?: string;\n /** Switch the transaction to READ ONLY in the same statement, after the claims. */\n readonly readOnly?: boolean;\n /** Report the backend as `\"backendPid\"` / `\"backendStart\"` text columns. */\n readonly backend?: boolean;\n};\n\n/** Trusted pre-existing PGlite execution role; never a request-supplied principal. */\nexport type RlsRoleStatement = { readonly kind: \"rlsRole\"; readonly role: string };\n\n// ─── Advisory locks ───────────────────────────────────────────────\n\n/**\n * An advisory lock's key: a lock space the APPLICATION defines, so a resource\n * with no row of its own can still be locked.\n *\n * Two forms, exactly as PostgreSQL offers them, and they are DIFFERENT lock\n * spaces — holding `{ classId: 11, objectId: 22 }` does not block the single\n * key `11 * 2^32 + 22` (probe-verified on PostgreSQL 18.6). Pick one form per\n * resource family and stay in it.\n */\nexport type AdvisoryLockKey =\n | { readonly key: bigint }\n | { readonly classId: number; readonly objectId: number };\n\n/**\n * Take a TRANSACTION-scoped advisory lock. Released by commit and by rollback\n * (including `ROLLBACK TO SAVEPOINT` when it was taken after the savepoint —\n * probe-verified), never by an explicit unlock call, so no leak can outlive the\n * transaction on a pooled connection.\n *\n * `wait: \"nowait\"` renders the `pg_try_advisory_xact_lock*` family, whose single\n * boolean column says whether the lock was taken; `\"wait\"` renders the blocking\n * family, which returns void.\n */\nexport type AdvisoryLockStatement = {\n readonly kind: \"advisoryLock\";\n readonly mode: AdvisoryLockMode;\n readonly wait: \"wait\" | \"nowait\";\n readonly key: AdvisoryLockKey;\n};\n\n/** An ordered set of transaction-scoped bigint advisory locks. */\nexport type AdvisoryLocksStatement = {\n readonly kind: \"advisoryLocks\";\n readonly keys: readonly bigint[];\n readonly mode: AdvisoryLockMode;\n};\n\n/** The column an advisory try-lock projects its verdict into. */\nexport const ADVISORY_LOCK_RESULT_COLUMN: string = \"acquired\";\n\n// ─── Statement chains ────────────────────────────────────────────────\n\n/**\n * A cell of an {@link InsertSelectStatement} that reads a column of an EARLIER\n * chain step: `\"step\".\"column\"`. A column reference, not a parameter — the\n * value comes from the step's rows inside the same statement (a child row\n * taking its parent's key from the parent step, round-trip campaign EPIC F).\n * The step must be named in the insert's `from` list.\n */\nexport type StepColumnRef = { readonly __stepColumn: true; readonly step: string; readonly column: string };\n\n/** Reference `column` of the earlier chain step `step` from an INSERT … SELECT cell. */\nexport function stepColumnRef(params: { step: string; column: string }): StepColumnRef {\n return { __stepColumn: true, step: params.step, column: params.column };\n}\n\n/** The joined relation of an {@link UpdateStatement}: its table, alias and join condition. */\nexport type UpdateSource = UpdateTableSource | UpdateSelectSource;\n\n/** A joined table: `FROM \"table\" AS alias` (`updateMany({ from })`). */\nexport type UpdateTableSource = { readonly table: TableRef; readonly alias: string; readonly on: SqlExpr };\n\n/**\n * A joined subquery: `FROM (SELECT …) AS alias`, PostgreSQL only. With a\n * locking read of the target table it is the row as it was before the write,\n * and an {@link OtherRowReturningColumn} `from: { source: alias }` returns its\n * values (`update({ previous })`, capability `returningReadsJoinedSource`).\n */\nexport type UpdateSelectSource = { readonly select: SelectStatement; readonly alias: string; readonly on: SqlExpr };\n\n/** An UPDATE set value read from the joined source's `column` (`UPDATE … FROM`). */\nexport type SourceColumnRef = { readonly __sourceColumn: true; readonly column: string };\n\n/** Read `column` of an {@link UpdateStatement}'s joined source as a set value. */\nexport function sourceColumnRef(params: { column: string }): SourceColumnRef {\n return Object.freeze({ __sourceColumn: true, column: params.column });\n}\n\n/** Is this UPDATE set value a {@link SourceColumnRef}? */\nexport function isSourceColumnRef(value: unknown): value is SourceColumnRef {\n if (typeof value !== \"object\" || value === null) return false;\n const candidate = value as { __sourceColumn?: unknown; column?: unknown };\n return candidate.__sourceColumn === true && typeof candidate.column === \"string\" && Object.keys(value).length === 2;\n}\n\n/** Is this INSERT … SELECT cell a {@link StepColumnRef}? */\nexport function isStepColumnRef(value: unknown): value is StepColumnRef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { __stepColumn?: unknown }).__stepColumn === true\n );\n}\n\n/**\n * `INSERT INTO t (cols) SELECT <cells> [FROM \"step\", …] [WHERE <expr>]\n * [RETURNING …]` — an INSERT whose ONE row is a SELECT list instead of a\n * VALUES row, so a WHERE can veto the write inside the statement and cells can\n * read earlier steps. Valid ONLY as a {@link ChainStep} statement.\n *\n * Cells take the same forms as a VALUES cell — a codec-encoded value, a\n * {@link JsonParamCell}, a {@link DbNowMarker} — plus {@link StepColumnRef}.\n * The {@link SQL_DEFAULT_CELL} is refused: `DEFAULT` is not allowed in a SELECT\n * list; an omitted column takes its default by being absent from `columns`.\n *\n * Parameter typing (O-03, probed on PostgreSQL): a bare parameter in this\n * one-row SELECT list takes the TARGET column's type, exactly as in VALUES.\n */\nexport type InsertSelectStatement = {\n readonly kind: \"insertSelect\";\n readonly table: TableRef;\n readonly columns: readonly string[];\n /** One cell per column, aligned to `columns` — deterministic parameter order. */\n readonly cells: readonly unknown[];\n /** Earlier chain steps the SELECT reads FROM, in order (absent: a one-row SELECT without FROM). */\n readonly from?: readonly string[];\n /**\n * Several source rows (round-trip campaign EPIC F): the SELECT reads them\n * from a derived table `alias`, joined after the `from` steps, and the\n * `cells` read its columns through `stepColumnRef({ step: alias, column })`.\n * See {@link ChainRowSource} for how the rows are typed.\n */\n readonly source?: ChainRowSource;\n readonly where?: SqlExpr;\n /**\n * `ON CONFLICT (<columns>) DO NOTHING` (statement-maxx lane C2): a row whose\n * conflict target already exists is skipped and not returned — the implicit\n * many-to-many join INSERT, where re-connecting an existing pair is a no-op.\n * Postgres form only (the chain renders nowhere else); at least one column.\n */\n readonly conflictDoNothing?: { readonly columns: readonly string[] };\n readonly returning?: readonly ReturningColumn[];\n};\n\n/**\n * Rows an {@link InsertSelectStatement} inserts, as ONE derived table:\n * `(SELECT <cols> FROM (VALUES (<typed NULL row>), ($1, $2), …) AS \"alias\"\n * (<cols>) OFFSET 1) AS \"alias\"`.\n *\n * Why the typed NULL row (review O-03): a bare parameter outside the INSERT's\n * own VALUES has no type, and PostgreSQL resolves an all-parameter column of a\n * VALUES list or UNION in FROM as `text` (\"column is of type integer but\n * expression is of type text\"). The first row is one `(SELECT \"col\" FROM\n * <typedBy> WHERE FALSE)` per column — a NULL of the TARGET column's exact\n * type (enums, `numeric(p,s)`, `varchar(n)`, domains and arrays included) —\n * so every parameter below takes that type, with no cast map anywhere;\n * `OFFSET 1` drops the row. (A `UNION ALL` of one-row SELECTs types the same\n * way but costs ~10× the planning time at 1000 rows — EPIC F shape gate.)\n *\n * Cells take the VALUES forms: a codec-encoded value, a {@link JsonParamCell}\n * or a {@link DbNowMarker}; the DEFAULT cell is refused (a homogeneous row set\n * omits the column instead). A cell carrying its OWN type (the Json cast, the\n * clock) must agree with the column's type under VALUES' common-type rules,\n * which are stricter than INSERT's assignment casts — the builder keeps such\n * columns out (EPIC F eligibility). Rows are read in list order, which is the\n * order the INSERT consumes them.\n */\nexport type ChainRowSource = {\n readonly alias: string;\n /** The table whose columns type the rows — normally the INSERT's own table. */\n readonly typedBy: TableRef;\n readonly columns: readonly string[];\n /** At least one row, each aligned to `columns`. */\n readonly rows: readonly (readonly unknown[])[];\n};\n\n/** What one chain step may be: a read, or a data-modifying statement with RETURNING. */\nexport type ChainStepStatement =\n | SelectStatement\n | InsertStatement\n | InsertSelectStatement\n | UpdateStatement\n | DeleteStatement;\n\n/**\n * One named step: rendered `\"name\" AS (<statement>)`. Later steps and the\n * result read it as a table (`FROM \"name\"`, `EXISTS (SELECT 1 FROM \"name\" …)`,\n * a {@link StepColumnRef}). A data-modifying step contributes the rows its\n * RETURNING list names.\n */\nexport type ChainStep = {\n readonly name: string;\n readonly statement: ChainStepStatement;\n};\n\n/**\n * The chain's final SELECT: the rows of `rowsFrom` (in that order, `UNION\n * ALL`), each projecting `columns`.\n *\n * `verdict` adds one column `alias` = `expr` to every row, AND guarantees a\n * row: when the `rowsFrom` steps return nothing, the result is exactly ONE\n * verdict row whose `columns` are all NULL. A caller recognizes it by NULL in\n * a column the steps never return as NULL (a primary key). Accounting\n * consequence: such a statement returns one row per written row OR one\n * verdict row — a caller that counts returned rows as row changes must undo a\n * verdict-row outcome (the upsert fold always rolls it back).\n */\nexport type ChainResult = {\n /** Both lists may be empty for a tally-only result: one count row, no model values. */\n readonly rowsFrom: readonly string[];\n readonly columns: readonly string[];\n readonly verdict?: { readonly alias: string; readonly expr: SqlExpr };\n /**\n * In-statement vetoes (round-trip campaign EPIC F), checked in order: when\n * `step` returned no row (fewer than `minRows`, EPIC W), the STATEMENT FAILS — so the database undoes every\n * effect of every step, trigger writes included — with an error whose\n * message carries `__vibe_veto:<token>:<nonce>:` ({@link CHAIN_VETO_PREFIX},\n * {@link chainVetoToken}). Requires `tally`: the veto is the tally column's\n * guard, so it is evaluated exactly once, on the one guaranteed result row.\n */\n readonly veto?: readonly ChainVeto[];\n /**\n * One column `alias` on every result row: the number of rows the listed\n * data-modifying steps returned (their RETURNING rows = their direct\n * effects). Guarantees one row like `verdict`. Row-change accounting reads\n * it instead of counting result rows (effect `writeTally`).\n */\n readonly tally?: ChainTally;\n /**\n * Row capture ({@link ChainCapture}): per captured data-modifying step, its\n * row count and its distinct before and after images, on every result row\n * (uncorrelated scalar subqueries, evaluated once). Needs the dialect's\n * `rowCapture` capability. Rendered after every other result column, so\n * their bound limits come last.\n */\n readonly capture?: readonly ChainCapture[];\n};\n\n/**\n * One captured step of a chain ({@link ChainResult.capture}). Result columns,\n * `<alias>` being this entry's alias:\n *\n * - `<alias>_n`: `(SELECT count(*) FROM \"step\")`;\n * - `<alias>_i` (with `inserted`): the rows whose arm marker is true;\n * - `<alias>_b` / `<alias>_a` (with `before` / `after`): `(SELECT\n * array_agg(\"__vibe_i\")::text FROM (SELECT DISTINCT ARRAY[\"c0\", \"c1\"] AS\n * \"__vibe_i\" FROM \"step\" LIMIT $n) AS \"__vibe_d\")` — a two-dimensional text\n * array literal of at most `limit` distinct images, NULL when the step\n * returned no row. With `inserted`, both read the update arm's rows only\n * (`WHERE NOT` the marker), and `_a` is left out with `insertedOnly`;\n * - `<alias>_ia` (with `inserted` and `after`): the insert arm's after images\n * (`WHERE` the marker), so an upsert's after images arrive per arm.\n *\n * `before` / `after` name columns the step RETURNS (its\n * {@link CaptureReturningColumn} aliases), in image order. `limit` is bound once.\n */\nexport type ChainCapture = {\n readonly step: string;\n readonly alias: string;\n /** The step's `\"inserted\"` arm-marker column, for an `INSERT … ON CONFLICT DO UPDATE` step. */\n readonly inserted?: string;\n /** With `inserted`: images of inserted rows only — `<alias>_ia`, no `<alias>_a`. */\n readonly insertedOnly?: true;\n readonly before?: readonly string[];\n readonly after?: readonly string[];\n /** The most distinct images one image column returns: a positive safe integer, bound as a parameter. */\n readonly limit: number;\n /**\n * Child images of the step's rows, one result column `<alias>_c<j>` each: a\n * {@link CaptureCascade} whose `parent` columns name columns the step\n * RETURNS, matched by `EXISTS (SELECT 1 FROM \"step\" AS \"__vibe_k\" WHERE\n * \"__vibe_k\".\"parent\" = \"__vibe_c\".\"child\")`.\n */\n readonly cascades?: readonly CaptureCascade[];\n};\n\n/**\n * Fail the statement when `step` returned no row; `token` names the veto in the\n * error. `nonce` is bound as a PARAMETER into the marker (never SQL text): a\n * per-call random value the caller requires back in the error, so a user value\n * that merely looks like a marker is never read as a veto.\n *\n * `minRows` (EPIC W) makes the veto count-sensitive: the statement fails when\n * `step` returned FEWER rows than that (a multi-row INSERT a trigger shortened).\n * Omitted or 1 = \"no row\". A positive safe integer, rendered as SQL text.\n * `exactRows` instead requires equality, including zero. It is a nonnegative\n * safe integer and cannot combine with `minRows`.\n */\nexport type ChainVeto = { readonly step: string; readonly token: string; readonly nonce: string; readonly minRows?: number; readonly exactRows?: number };\n\n/** Count the RETURNING rows of `steps` into the result column `alias`. */\nexport type ChainTally = { readonly alias: string; readonly steps: readonly string[] };\n\n/** Marker every chain veto error message carries, followed by `<token>:<nonce>:`. */\nexport const CHAIN_VETO_PREFIX: string = \"__vibe_veto:\";\n\n/** Allowed veto tokens: lower-case words — they are rendered into SQL text. */\nexport const CHAIN_VETO_TOKEN_PATTERN: RegExp = /^[a-z][a-z0-9_]*$/;\n\n/**\n * The veto token a database error message carries for this `nonce`, or\n * `undefined`. Matches the marker anywhere in the text, so a localized server\n * message (`lc_messages`) still yields it: the marker is the invalid VALUE the\n * message quotes. A marker without the caller's nonce is not a veto.\n */\nexport function chainVetoToken(params: { message: string; nonce: string }): string | undefined {\n const { message, nonce } = params;\n if (nonce === \"\") return undefined;\n for (let start = message.indexOf(CHAIN_VETO_PREFIX); start >= 0; start = message.indexOf(CHAIN_VETO_PREFIX, start + 1)) {\n const rest = message.slice(start + CHAIN_VETO_PREFIX.length);\n const match = /^([a-z][a-z0-9_]*):/.exec(rest);\n if (match !== null && rest.startsWith(`${nonce}:`, match[0].length)) return match[1];\n }\n return undefined;\n}\n\n/**\n * ONE statement made of an ordered chain of named steps — reads (a locked\n * probe) and data-modifying statements with RETURNING — ending in a final\n * SELECT over them (round-trip campaign EPIC 4, reused by EPIC F). Renders as\n * `WITH \"a\" AS (…), \"b\" AS (…) SELECT …` on a dialect whose\n * `statementChain` strategy names the form (postgres); every other dialect\n * refuses at render time (`VIBE_UNSUPPORTED_CAPABILITY`) — callers gate on\n * the strategy first and keep their multi-statement path there.\n *\n * PostgreSQL semantics the builder relies on: every step sees ONE snapshot\n * (a step never sees another step's writes — only its RETURNING rows), steps\n * that reference a step run after it, and the statement is atomic: an error in\n * any step undoes every step's effects, trigger writes included.\n */\nexport type ChainStatement = {\n readonly kind: \"chain\";\n readonly steps: readonly ChainStep[];\n readonly result: ChainResult;\n};\n\nexport type SqlStatement = SelectStatement | InsertStatement | UpdateStatement | DeleteStatement |\n RlsEnableStatement | RlsForceStatement | RlsDisableStatement | RlsNoForceStatement | RlsDropPolicyStatement |\n RlsPolicyStatement | RlsContextStatement | RlsRoleStatement | AdvisoryLockStatement | AdvisoryLocksStatement | ChainStatement;\n\n/** Readiness statements remain distinct from application queries. */\nexport type RlsReadinessStatement = { readonly kind: \"rlsReadiness\"; readonly query: RlsReadinessQuery; readonly searchPath?: string };\n/** Temporary clone lifecycle surrounding a desired-policy probe. */\nexport type RlsProbeTableStatement = { readonly kind: \"rlsProbeTable\"; readonly table: string; readonly action: \"create\" | \"drop\" };\n/** Migration transaction-local policy search-path scope. */\nexport type RlsPolicyPathStatement = { readonly kind: \"rlsPolicyPath\"; readonly stage: \"save\" | \"empty\" | \"restore\" };\n",
10
- "/** `$.a.b[0]` path string for sqlite/mysql — always bound, never spliced. */\nexport function jsonPathString(path: readonly (string | number)[]): string {\n let out = \"$\";\n for (const segment of path) {\n if (typeof segment === \"number\") {\n out += `[${segment}]`;\n } else if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(segment)) {\n out += `.${segment}`;\n } else {\n // A quoted key uses JSON-string escaping in both engines' path syntax:\n // the backslash FIRST, or a key containing one silently matches nothing.\n out += `.\"${segment.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n }\n }\n return out;\n}\n",
9
+ "/**\n * JSON key-level update: an ordered list of `set` / `remove` steps applied to\n * ONE Json column in ONE assignment, without reading the document first.\n *\n * Semantics (identical on every dialect):\n * - `set` replaces or adds the member at its path and creates missing\n * intermediate objects; a SQL NULL column starts from `{}`.\n * - `remove` deletes the member; an absent member (or an absent container on\n * the way) is a no-op, and a SQL NULL column stays NULL.\n * - Every container a step passes through must be an object or absent. An\n * array, a scalar or JSON `null` there refuses the write.\n *\n * The steps are folded at build time into one write tree, so the SQL reads\n * only the ORIGINAL column, never an earlier step's result: its text grows\n * linearly with the steps. A container whose value an earlier `set` wrote is\n * known here and checked in JavaScript ({@link planJsonPatch} reports the\n * conflict before any SQL); every other container is checked in the statement\n * against the original document, and a failed check fails the statement on\n * purpose with a marker the client maps back to a typed error:\n * `__vibe_veto:json_patch:<nonce>:<check index>:<found type>`.\n */\n\nimport { internalError } from \"@vibeorm/schema\";\nimport { CHAIN_VETO_PREFIX } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { jsonPathString } from \"./json-path.ts\";\nimport type { ParamCollector } from \"./params.ts\";\n\n// ─── Marker ───────────────────────────────────────────────────────\n\n/** One step of a JSON patch; `value` is the JSON text the Json codec wrote. */\nexport type JsonPatchStep =\n | { readonly set: readonly string[]; readonly value: string }\n | { readonly remove: readonly string[] };\n\n/**\n * An UPDATE set value that patches a Json column in place. Recognised\n * structurally inside `UpdateStatement.set` and conflict updates, with the\n * same discipline as the other set markers: the Json codec stringifies JSON\n * payloads before they reach the AST, so a document is never mistaken for it.\n */\nexport type JsonPatchOperation = {\n readonly __jsonPatch: true;\n readonly steps: readonly JsonPatchStep[];\n /** Per-call value bound into the refusal marker; the client maps only the markers it issued. */\n readonly nonce: string;\n /** `json` for a postgres `json` column (`Json @db.Json`): patched through jsonb, stored as json. */\n readonly storage?: \"json\";\n};\n\n/** The veto token a refused patch carries after {@link CHAIN_VETO_PREFIX}. */\nconst JSON_PATCH_VETO_TOKEN = \"json_patch\";\n\n/** Narrow an UPDATE set value to a {@link JsonPatchOperation}. */\nexport function isJsonPatchOperation(value: unknown): value is JsonPatchOperation {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n if (!Object.hasOwn(value, \"__jsonPatch\")) return false;\n const keys = Object.keys(value);\n if (keys.some((key) => key !== \"__jsonPatch\" && key !== \"steps\" && key !== \"nonce\" && key !== \"storage\")) return false;\n const candidate = value as { __jsonPatch: unknown; steps: unknown; nonce: unknown; storage?: unknown };\n return candidate.__jsonPatch === true && Array.isArray(candidate.steps) && candidate.steps.length > 0 &&\n typeof candidate.nonce === \"string\" && (candidate.storage === undefined || candidate.storage === \"json\");\n}\n\n// ─── Fold ─────────────────────────────────────────────────────────\n\n/** JSON types a container can hold instead of an object. */\nexport type JsonPatchFoundType = \"array\" | \"string\" | \"number\" | \"boolean\" | \"null\";\n\n/** A container of the ORIGINAL document that must be an object or absent; `step` is the first step that passes through it. */\nexport type JsonPatchCheck = { readonly path: readonly string[]; readonly step: number };\n\n/** A step that passes through a non-object value an earlier `set` of the same patch wrote. */\nexport type JsonPatchConflict = { readonly step: number; readonly path: readonly string[]; readonly found: JsonPatchFoundType };\n\n/** {@link planJsonPatch}: the in-statement checks in render order, or the conflict known before any SQL. */\nexport type JsonPatchPlan = { readonly checks: readonly JsonPatchCheck[] } | { readonly conflict: JsonPatchConflict };\n\ntype EditNode = { readonly kind: \"edit\"; create: boolean; readonly children: Map<string, PatchNode> };\ntype ReplaceNode = { readonly kind: \"replace\"; text: string; parsed?: unknown };\ntype PatchNode = EditNode | ReplaceNode | { readonly kind: \"delete\" };\ntype Folded = { readonly root: EditNode; readonly checks: readonly JsonPatchCheck[] } | { readonly conflict: JsonPatchConflict };\n\nconst editNode = (): EditNode => ({ kind: \"edit\", create: false, children: new Map() });\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction foundType(value: unknown): JsonPatchFoundType {\n if (value === null) return \"null\";\n if (Array.isArray(value)) return \"array\";\n switch (typeof value) {\n case \"string\":\n return \"string\";\n case \"number\":\n return \"number\";\n case \"boolean\":\n return \"boolean\";\n }\n throw internalError({ message: \"a parsed JSON value has no JSON type\" });\n}\n\n/** Own-property write: `__proto__` is an ordinary member name in JSON. */\nfunction defineMember(params: { container: Record<string, unknown>; key: string; value: unknown }): void {\n Object.defineProperty(params.container, params.key, { value: params.value, enumerable: true, writable: true, configurable: true });\n}\n\n/**\n * Apply the rest of a step inside a value the patch already knows (an earlier\n * `set` wrote it). Mirrors the SQL semantics exactly.\n */\nfunction applyKnown(params: { value: unknown; rest: readonly string[]; step: JsonPatchStep; at: readonly string[]; index: number }): JsonPatchConflict | undefined {\n const { rest, step, index } = params;\n let container = params.value;\n for (let depth = 0; depth < rest.length; depth++) {\n if (!isJsonObject(container)) return { step: index, path: [...params.at, ...rest.slice(0, depth)], found: foundType(container) };\n const key = rest[depth] as string;\n if (depth === rest.length - 1) {\n if (\"set\" in step) defineMember({ container, key, value: JSON.parse(step.value) as unknown });\n else delete container[key];\n return undefined;\n }\n if (!Object.hasOwn(container, key)) {\n if (!(\"set\" in step)) return undefined;\n defineMember({ container, key, value: {} });\n }\n container = container[key];\n }\n return undefined;\n}\n\nfunction fold(steps: readonly JsonPatchStep[]): Folded {\n const root = editNode();\n const checks: JsonPatchCheck[] = [];\n const checked = new Set<string>();\n for (let index = 0; index < steps.length; index++) {\n const step = steps[index] as JsonPatchStep;\n const setting = \"set\" in step;\n const path = setting ? step.set : step.remove;\n if (path.length === 0) throw internalError({ message: \"a JSON patch step needs a non-empty path\" });\n let node = root;\n for (let depth = 0; depth < path.length; depth++) {\n const signature = JSON.stringify(path.slice(0, depth));\n if (!checked.has(signature)) {\n checked.add(signature);\n checks.push({ path: path.slice(0, depth), step: index });\n }\n if (setting) node.create = true;\n const key = path[depth] as string;\n if (depth === path.length - 1) {\n node.children.set(key, setting ? { kind: \"replace\", text: step.value } : { kind: \"delete\" });\n break;\n }\n let child = node.children.get(key);\n if (child === undefined) {\n child = editNode();\n node.children.set(key, child);\n }\n if (child.kind === \"edit\") {\n node = child;\n continue;\n }\n if (child.kind === \"delete\") {\n // Removed by an earlier step: absent now. A remove below it is a no-op;\n // a set starts the member again from `{}`.\n if (!setting) break;\n child = { kind: \"replace\", text: \"{}\", parsed: {} };\n node.children.set(key, child);\n }\n child.parsed ??= JSON.parse(child.text) as unknown;\n const conflict = applyKnown({ value: child.parsed, rest: path.slice(depth + 1), step, at: path.slice(0, depth + 1), index });\n if (conflict !== undefined) return { conflict };\n break;\n }\n }\n return { root, checks };\n}\n\n/**\n * Fold a patch's steps: the checks the statement runs on the original\n * document (index = the check index its refusal marker carries), or the\n * conflict an earlier `set` of the same patch makes certain.\n */\nexport function planJsonPatch(params: { steps: readonly JsonPatchStep[] }): JsonPatchPlan {\n const folded = fold(params.steps);\n return \"conflict\" in folded ? { conflict: folded.conflict } : { checks: folded.checks };\n}\n\nconst textOf = (node: ReplaceNode): string => (node.parsed === undefined ? node.text : JSON.stringify(node.parsed));\n\n/** The members an edit node writes: values and creating edits (pure-remove subtrees ride the deletes). */\nfunction writtenMembers(node: EditNode): [string, ReplaceNode | EditNode][] {\n const out: [string, ReplaceNode | EditNode][] = [];\n for (const [key, child] of node.children) {\n if (child.kind === \"replace\" || (child.kind === \"edit\" && child.create)) out.push([key, child]);\n }\n return out;\n}\n\n/** Every removed member under the edit nodes, in step order of first appearance. */\nfunction deletedPaths(params: { node: EditNode; path: readonly string[] }): string[][] {\n const out: string[][] = [];\n for (const [key, child] of params.node.children) {\n if (child.kind === \"delete\") out.push([...params.path, key]);\n else if (child.kind === \"edit\") out.push(...deletedPaths({ node: child, path: [...params.path, key] }));\n }\n return out;\n}\n\n// ─── Rendering ────────────────────────────────────────────────────\n\nconst VETO_TEXT = `${CHAIN_VETO_PREFIX}${JSON_PATCH_VETO_TOKEN}:`;\n\n/**\n * The patched value of one Json column — `CASE WHEN <a container is not an\n * object> THEN <fail on purpose> … ELSE <patched document> END` — where `read`\n * is the column as the assignment reads it (qualified in a conflict update).\n * Every placeholder is collected in text order.\n * @internal\n */\nexport function renderJsonPatch(params: { dialect: SqlDialect; patch: JsonPatchOperation; read: string; collector: ParamCollector }): string {\n const folded = fold(params.patch.steps);\n if (\"conflict\" in folded) {\n throw internalError({ message: \"a JSON patch whose steps conflict reached the renderer; the query builder refuses it\" });\n }\n switch (params.dialect.jsonPathMode) {\n case \"operators\":\n return renderPostgresPatch({ ...params, ...folded });\n case \"sqliteExtract\":\n return renderSqlitePatch({ ...params, ...folded });\n case \"mysqlExtract\":\n return renderMysqlPatch({ ...params, ...folded });\n }\n}\n\ntype RenderInput = {\n readonly patch: JsonPatchOperation;\n readonly read: string;\n readonly collector: ParamCollector;\n readonly root: EditNode;\n readonly checks: readonly JsonPatchCheck[];\n};\n\n/**\n * PostgreSQL: `jsonb_build_object` merged with `||` per edited object, `#-`\n * per removed member. Every container on a rendered path is checked to be an\n * object, so `#>` and `#-` read an integer-like key as a member name, never\n * as an array index. The refusal casts a marker to integer (SQLSTATE 22P02);\n * `concat` is STABLE and reads the row, so the planner never folds it.\n */\nfunction renderPostgresPatch(params: RenderInput): string {\n const { patch, read, collector } = params;\n const json = patch.storage === \"json\";\n const typeOf = json ? \"json_typeof\" : \"jsonb_typeof\";\n const at = (source: string, path: readonly string[]): string =>\n path.length === 0 ? source : `${source} #> ${collector.add([...path])}::text[]`;\n const arms = params.checks.map((check, index) => {\n const condition = `${typeOf}(${at(read, check.path)}) <> 'object'`;\n const marker = collector.add(`${patch.nonce}:${index}`);\n return `WHEN ${condition} THEN to_jsonb(CAST(concat('${VETO_TEXT}', ${marker}::text, ':', ${typeOf}(${at(read, check.path)})) AS integer))`;\n });\n const source = json ? `${read}::jsonb` : read;\n const build = (node: EditNode, path: readonly string[]): string => {\n const base = at(source, path);\n const start = node.create ? `COALESCE(${base}, '{}'::jsonb)` : base;\n const members = writtenMembers(node);\n if (members.length === 0) return start;\n const pairs = members.map(([key, child]) => {\n const name = `${collector.add(key)}::text`;\n return `${name}, ${child.kind === \"replace\" ? `${collector.add(textOf(child))}::text::jsonb` : build(child, [...path, key])}`;\n });\n return `(${start} || jsonb_build_object(${pairs.join(\", \")}))`;\n };\n let result = build(params.root, []);\n const deletes = deletedPaths({ node: params.root, path: [] });\n if (deletes.length > 0) result = `(${result}${deletes.map((path) => ` #- ${collector.add(path)}::text[]`).join(\"\")})`;\n const value = `CASE ${arms.join(\" \")} ELSE ${result} END`;\n return json ? `(${value})::json` : value;\n}\n\n/**\n * SQLite: `json_set` per edited object (values wrapped in `json()` so text is\n * read as JSON), `json_remove` for the removed members. The refusal is a bad\n * JSON path, whose error message quotes the marker.\n */\nfunction renderSqlitePatch(params: RenderInput): string {\n const { patch, read, collector } = params;\n const typeOf = (path: readonly string[]): string =>\n path.length === 0 ? `json_type(${read})` : `json_type(${read}, ${collector.add(jsonPathString(path))})`;\n const arms = params.checks.map((check, index) => {\n const condition = `${typeOf(check.path)} <> 'object'`;\n const marker = collector.add(`${patch.nonce}:${index}`);\n return `WHEN ${condition} THEN json_extract('{}', '${VETO_TEXT}' || ${marker} || ':' || ${typeOf(check.path)})`;\n });\n const build = (node: EditNode, path: readonly string[]): string => {\n const base = path.length === 0 ? read : `json_extract(${read}, ${collector.add(jsonPathString(path))})`;\n const start = node.create ? `COALESCE(${base}, '{}')` : base;\n const members = writtenMembers(node);\n if (members.length === 0) return start;\n const pairs = members.map(([key, child]) => {\n const member = collector.add(jsonPathString([key]));\n return `${member}, json(${child.kind === \"replace\" ? collector.add(textOf(child)) : build(child, [...path, key])})`;\n });\n return `json_set(${start}, ${pairs.join(\", \")})`;\n };\n let result = build(params.root, []);\n const deletes = deletedPaths({ node: params.root, path: [] });\n if (deletes.length > 0) result = `json_remove(${result}, ${deletes.map((path) => collector.add(jsonPathString(path))).join(\", \")})`;\n return `CASE ${arms.join(\" \")} ELSE ${result} END`;\n}\n\n/**\n * MySQL: `JSON_SET` per edited object (it adds a member only to an existing\n * object, so missing ones start from `JSON_OBJECT()`), `JSON_REMOVE` for the\n * removed members. The refusal is `UUID_TO_BIN` of the marker (error 1411,\n * which quotes the value); `JSON_ARRAY` keeps the CASE's type JSON.\n */\nfunction renderMysqlPatch(params: RenderInput): string {\n const { patch, read, collector } = params;\n const at = (path: readonly string[]): string =>\n path.length === 0 ? read : `JSON_EXTRACT(${read}, ${collector.add(jsonPathString(path))})`;\n const arms = params.checks.map((check, index) => {\n const condition = `JSON_TYPE(${at(check.path)}) <> 'OBJECT'`;\n const marker = collector.add(`${patch.nonce}:${index}`);\n return `WHEN ${condition} THEN JSON_ARRAY(UUID_TO_BIN(CONCAT('${VETO_TEXT}', ${marker}, ':', JSON_TYPE(${at(check.path)}))))`;\n });\n const build = (node: EditNode, path: readonly string[]): string => {\n const base = at(path);\n const start = node.create ? `COALESCE(${base}, JSON_OBJECT())` : base;\n const members = writtenMembers(node);\n if (members.length === 0) return start;\n const pairs = members.map(([key, child]) => {\n const member = collector.add(jsonPathString([key]));\n return `${member}, ${child.kind === \"replace\" ? `CAST(${collector.add(textOf(child))} AS JSON)` : build(child, [...path, key])}`;\n });\n return `JSON_SET(${start}, ${pairs.join(\", \")})`;\n };\n let result = build(params.root, []);\n const deletes = deletedPaths({ node: params.root, path: [] });\n if (deletes.length > 0) result = `JSON_REMOVE(${result}, ${deletes.map((path) => collector.add(jsonPathString(path))).join(\", \")})`;\n return `CASE ${arms.join(\" \")} ELSE ${result} END`;\n}\n\n// ─── Refusal markers ──────────────────────────────────────────────\n\n/** A refusal marker found in a database error message: the nonce, the check index, and the container's type as the database spelled it. */\nexport type JsonPatchVeto = { readonly nonce: string; readonly check: number; readonly found: string };\n\n/** The JSON patch refusal a database error message quotes, or `undefined`. */\nexport function jsonPatchVetoOf(params: { message: string }): JsonPatchVeto | undefined {\n const start = params.message.indexOf(VETO_TEXT);\n if (start < 0) return undefined;\n const match = /^([0-9a-f]+):(\\d+):([A-Za-z]+)/.exec(params.message.slice(start + VETO_TEXT.length));\n if (match === null) return undefined;\n return { nonce: match[1] as string, check: Number(match[2]), found: match[3] as string };\n}\n",
10
+ "import type { NativeEnumArrayParameter } from \"./native-enum-parameter.ts\";\nimport type { JsonListParameter } from \"./json-list-parameter.ts\";\nimport type { SqlFragment } from \"./composable.ts\";\nimport type { RlsReadinessQuery } from \"./dialects/postgres-rls-readiness.ts\";\n/**\n * The SQL AST — the small statement language the runtime and migrate packages\n * build and dialects render.\n *\n * Deliberately minimal at P0 (single-table statements, no joins/subqueries);\n * grows with the runtime in P2/P3. Every shape added here needs a catalog case\n * (tests/catalog/cases.ts) in the same change.\n */\n\nimport type {\n AdvisoryLockMode,\n DateTruncationStorage,\n DateTruncationUnit,\n RlsContextIR,\n RowLockStrength,\n RowLockWaitPolicy,\n ScalarType,\n SchemaIR,\n SqlFragmentSpec,\n} from \"@vibeorm/schema\";\n\n// ─── References ───────────────────────────────────────────────────\n\n/** A column reference, optionally table-qualified. */\nexport type ColRef = {\n readonly table?: string;\n readonly name: string;\n /**\n * Projection-only wire transform. `jsonText` uses the dialect's JSON text\n * projection to preserve SQL NULL versus the JSON document `null` before\n * driver parsing, without converting a postgres `json` column to `jsonb`.\n * `castText` renders a dialect text cast and preserves `alias ?? name`,\n * including timestamp identity before driver Date truncation. PostgreSQL\n * uses `\"col\"::text`; SQLite/MySQL use CAST AS TEXT/CHAR. `encodeBase64`\n * is postgres-only and renders `encode(\"col\", 'base64')`.\n * `encodeArrayBase64` is postgres-only and renders\n * `encode(array_send(\"col\"), 'base64')` — a `bytea[]` column's binary array\n * form (dimensions, NULL elements, raw element bytes) as base64: faithful\n * whatever the session's `bytea_output`, keeping a NULL column (`NULL`), an\n * empty array and NULL elements distinct (5.0 lane V; the lateral subselect's\n * `Bytes[]` form, decoded by the runtime's JSON-transport plan). Other users:\n * the lateral subselect (SQL review B3: raw `to_jsonb` would ship BigInt/Decimal as float64 JSON\n * numbers and Bytes as `\\x` hex text), and every row projection of a\n * `Float[]`/`Json[]` column (bun:sql's array parser refuses float arrays\n * printed with an exponent and json arrays holding integers beyond int32;\n * the runtime parses the array literal text itself). Never set on\n * filter/order refs.\n */\n readonly transform?: \"castText\" | \"encodeBase64\" | \"encodeArrayBase64\" | \"jsonText\";\n /**\n * Comparison/order/aggregate cast, sqlite Decimal only (SQL review B4):\n * Decimal stores as exact TEXT there and text comparison is lexicographic —\n * compare, ORDER BY and aggregate sites render `CAST(\"col\" AS REAL)` (with\n * NUMBER operands) instead. Never set on projections or GROUP BY keys, so\n * storage and read-back stay the exact text.\n */\n readonly castReal?: boolean;\n /** Native enum order key through a scalar subquery: MySQL reads its member index, other dialects keep the column. */\n readonly enumOrdinal?: true;\n /**\n * Order/distinct/compare cast, postgres `json` columns only (`Json @db.Json`,\n * release-3.0 D3): `json` has no ordering or equality operator, so ORDER BY,\n * DISTINCT ON and comparison sites render `\"col\"::jsonb` (`\"col\"::jsonb[]`\n * for a `json[]` list column) — the order and distinctness of a jsonb\n * column. Never set on projections, so read-back keeps the stored text.\n */\n readonly castJsonb?: \"jsonb\" | \"jsonb[]\";\n /**\n * Calendar truncation of a timestamp column, for a `groupBy` date key. The\n * reference renders as the start of its period in a named time zone\n * (`date_trunc('day', \"col\", 'Europe/Oslo')`; see `renderDateTruncation`),\n * in the column's own SQL type. Set on the projection, GROUP BY and ORDER BY\n * refs of one key, which then repeat the identical expression text\n * (PostgreSQL matches GROUP BY expressions by structure); a projection keeps\n * `alias ?? name` as its output name. Never set on filter refs. Dialects\n * without the `dateTruncation` capability refuse it when rendering.\n */\n readonly truncate?: DateTruncation;\n /**\n * A `groupBy` expression key read from the column ({@link GroupKeyExpression}):\n * the text at a JSON path, or a string's leading characters. Like\n * {@link ColRef.truncate} it is set on the projection (with `alias`, the\n * key's result name), GROUP BY and ORDER BY refs of one key, which repeat\n * the identical text: every operand is a validated literal, never a bound\n * parameter, so PostgreSQL and MySQL match the GROUP BY expression.\n */\n readonly groupKey?: GroupKeyExpression;\n /**\n * The first non-NULL of these references — `COALESCE(\"a\", \"b\")` — instead\n * of the column `name`: the value of an `orderBy: { _coalesce: … }` term.\n * Each member renders as its own reference, casts included (a sqlite\n * Decimal member as `CAST(… AS REAL)`, a mysql native enum as its member\n * index). Set on ORDER BY and comparison refs only. `name` is then\n * {@link COALESCE_REF_NAME}, never a column of a table, so a reader that\n * looks a column up by name finds none.\n */\n readonly coalesce?: readonly ColRef[];\n /**\n * Projection alias: renders `ref AS \"alias\"`. PROJECTION-ONLY — filter,\n * order and correlation refs never set it (the renderer ignores it outside\n * a projection list). Used by the single-statement M2M join to expose the\n * join table's parent-key column under a reserved name (`__vibe_parent`).\n */\n readonly alias?: string;\n};\n\n/**\n * The `name` of a {@link ColRef.coalesce} reference. The `__vibe_` column\n * prefix is reserved by schema validation, so no model column carries it.\n */\nexport const COALESCE_REF_NAME: string = \"__vibe_coalesce\";\n\n/** A {@link ColRef.coalesce} reference over `members`. */\nexport function coalesceRef(params: { members: readonly ColRef[] }): ColRef {\n return { name: COALESCE_REF_NAME, coalesce: params.members };\n}\n\n/** A {@link ColRef.truncate} request: the calendar unit, the zone that defines the calendar, and the column's storage form. */\nexport type DateTruncation = {\n readonly unit: DateTruncationUnit;\n /** A time-zone name (`\"Europe/Oslo\"`, `\"UTC\"`), rendered as a string literal after a strict character check. */\n readonly timeZone: string;\n readonly storage: DateTruncationStorage;\n};\n\n/**\n * A {@link ColRef.groupKey} expression.\n *\n * - `jsonPathText`: the text at an object-key path of a JSON column — a JSON\n * string unquoted, a number or boolean in its JSON spelling, JSON `null` and\n * a missing path SQL NULL, an object or array its JSON text. Each step reads\n * an object member only. `storage: \"json\"` marks a postgres `json` column,\n * read through jsonb like the JSON filters.\n * - `prefix`: the first `length` characters of a string column.\n */\nexport type GroupKeyExpression =\n | { readonly kind: \"jsonPathText\"; readonly path: readonly string[]; readonly storage?: \"json\" }\n | { readonly kind: \"prefix\"; readonly length: number };\n\nexport type TableRef = {\n readonly name: string;\n /** Explicit fixed PostgreSQL placement; absence preserves existing SQL. */\n readonly namespace?: string;\n readonly alias?: string;\n};\n\n// ─── Aggregates ───────────────────────────────────────────────────\n\n/** Aggregate functions applied to one column. */\nexport type AggFn = \"count\" | \"avg\" | \"sum\" | \"min\" | \"max\";\n\n/** Reference to an aggregate expression: `COUNT(*)` or `FN(\"col\")`. */\nexport type AggRef =\n | { readonly fn: \"countAll\"; readonly filter?: SqlExpr }\n | {\n readonly fn: AggFn;\n readonly column: ColRef;\n /** Native enum MIN/MAX: projections and HAVING return the database label; order keys keep its ordinal. */\n readonly enumOrder?: \"value\" | \"ordinal\";\n /**\n * Aggregate only the rows the predicate admits: `AGG(x) FILTER (WHERE …)`\n * or `AGG(CASE WHEN … THEN x END)` per the dialect's\n * `filteredAggregates` capability. Its parameters bind each time the\n * aggregate renders (projection, HAVING, ORDER BY), in text order.\n */\n readonly filter?: SqlExpr;\n };\n\n/**\n * One aggregate projection: `FN(\"col\") AS \"alias\"`. The alias is part of the\n * catalog contract — the runtime derives result keys from it deterministically\n * (`_count___all`, `_avg__score`), never by parsing the SQL text back.\n */\nexport type AggSelect = {\n readonly agg: AggRef;\n readonly alias: string;\n /** Projection-only result cast; native aggregate comparisons and ordering stay typed. */\n readonly castText?: true;\n};\n\n// ─── JSON filters ─────────────────────────────────────────────────\n\n/**\n * JSON path predicates (Prisma's Json filter surface). `not` is `equals` with\n * `negate` — there is no separate op. `exists` takes a boolean `value`: the\n * member at the path (object keys only) is present (its value may be JSON\n * `null`) or, for `false`, the document is present and the member is not; a\n * SQL NULL column is unknown for both. Which ops a dialect can express is\n * declared on `SqlDialect.supportedJsonOps` and enforced at render time too.\n */\nexport type JsonFilterOp =\n | \"equals\"\n | \"exists\"\n | \"string_contains\"\n | \"string_starts_with\"\n | \"string_ends_with\"\n | \"array_contains\"\n | \"array_starts_with\"\n | \"array_ends_with\";\n\n// ─── Expressions ──────────────────────────────────────────────────\n\nexport type ComparisonOp = \"eq\" | \"ne\" | \"gt\" | \"gte\" | \"lt\" | \"lte\";\n\n/**\n * The column facts one member of a {@link SqlExpr} `keyList` tuple needs to\n * bind exactly like the equality `\"col\" = $n` would. Postgres binds each\n * member as ONE typed array (`$n::<element type>[]`), so it needs the\n * column's element type: the declared native type without its modifier\n * (`timestamptz`, never `timestamptz(3)` — a typmod cast would round\n * `.1234` onto a stored `.123` that `=` does not match), `bpchar` for\n * `char(n)`, `citext`, the enum's own type. MySQL needs to know a time-of-day\n * member (`SqlDialect.timeOfDayInStrategy`); SQLite needs nothing.\n */\nexport type KeyListMember = {\n /** The column's scalar type; `\"Enum\"` for an enum column. */\n readonly type: ScalarType | \"Enum\";\n /** The declared `@db.*` native type, verbatim (`VarChar(191)`, `Uuid`, `Timestamptz(3)`). */\n readonly nativeType?: string;\n /**\n * A database-stored (native) enum's type: `namespace` qualifies it, absence\n * resolves it through the search path like the statement's table. Absent on\n * a string-stored enum, whose column is text.\n */\n readonly enumType?: { readonly namespace?: string; readonly name: string };\n /** A time-of-day column (`@db.Time(n)` / `@db.Timetz(n)`). */\n readonly timeOfDay?: boolean;\n};\n\nexport type SqlExpr =\n | { readonly kind: \"composed\"; readonly fragment: SqlFragment }\n | { readonly kind: \"cmp\"; readonly op: ComparisonOp; readonly column: ColRef; readonly value: unknown }\n /** Column-to-column comparison — the correlation predicate of EXISTS/lateral subqueries. */\n | { readonly kind: \"cmpCol\"; readonly op: ComparisonOp; readonly left: ColRef; readonly right: ColRef }\n | { readonly kind: \"isNull\"; readonly column: ColRef; readonly negate?: boolean }\n | {\n readonly kind: \"inArray\";\n readonly column: ColRef;\n readonly values: readonly unknown[];\n readonly negate?: boolean;\n /**\n * The column holds a time of day (`@db.Time(n)` / `@db.Timetz(n)`): the\n * dialect renders the membership per `SqlDialect.timeOfDayInStrategy`.\n */\n readonly timeOfDay?: boolean;\n }\n /**\n * ORDERED-TUPLE membership: `(\"a\", \"b\") IN ((?, ?), (?, ?))`. The composite\n * relation predicate — `\"a\" IN (…) AND \"b\" IN (…)` is a Cartesian SUPERSET\n * and is never a substitute. Renders per `SqlDialect.tupleInStrategy`:\n * a native row-value `IN` where the dialect has row constructors, else an OR\n * of COMPLETE conjunctions. Arity 1 is expressed as {@link SqlExpr} `inArray`\n * instead, so single-key relations keep their existing SQL.\n */\n | {\n readonly kind: \"tupleIn\";\n /** Ordered tuple columns; `rows[i][j]` binds to `columns[j]`. */\n readonly columns: readonly ColRef[];\n /** Candidate tuples — every row carries exactly `columns.length` values. */\n readonly rows: readonly (readonly unknown[])[];\n readonly negate?: boolean;\n }\n /**\n * KEY-LIST membership — the public `where: { IN: [{ a, b }, …] }` filter:\n * rows whose ordered tuple of column values equals one of `rows`, with\n * semi-join semantics (a repeated tuple never repeats a result row). Renders\n * per `SqlDialect.keyListStrategy`: postgres binds one typed ARRAY per\n * member, `(\"a\", \"b\") IN (SELECT * FROM unnest($1::int8[], $2::text[]))`,\n * so the text and the planning cost stay constant however long the list is\n * (an OR of 1 000 conjunctions planned in 114 ms on PGlite, 2 ms on\n * postgres 18; the unnest form in 0.1–0.2 ms on both). A `DateTime` member\n * without a declared native type switches postgres to the row-constructor\n * list of untyped parameters (`keyListBindsUntypedRows`: the column may be a\n * zone-less `timestamp`). MySQL renders the row-constructor list, SQLite\n * `IN (VALUES …)`. Each member compares under the column's own type and\n * collation, exactly like `\"col\" = $n`.\n *\n * An empty `rows` renders `1 = 0` (matches nothing, like an empty\n * `inArray`). The runtime emits arity 1 as `inArray` instead, so a\n * one-field key list keeps the scalar `in` SQL.\n */\n | {\n readonly kind: \"keyList\";\n /** Ordered tuple columns (compare references); `rows[i][j]` binds to `columns[j]`. */\n readonly columns: readonly ColRef[];\n /** How each member binds, in column order — see {@link KeyListMember}. */\n readonly members: readonly KeyListMember[];\n /** Encoded candidate tuples, each exactly `columns.length` long; may repeat. */\n readonly rows: readonly (readonly unknown[])[];\n }\n /**\n * ROW-VALUE comparison: `(\"a\", \"b\") > ($1, $2)` — the keyset seek (D-01).\n * SQL compares row values left to right, each pair with that column's own\n * operator, affinity and collation, which is exactly the OR expansion\n * `\"a\" > $1 OR (\"a\" = $2 AND \"b\" > $3)` when no member is NULL — and an\n * index on `(a, b)` bounds it as one range (PostgreSQL `Index Cond: ROW(…) >\n * ROW(…)`, SQLite `SEARCH … (a>?)`). A NULL member makes the comparison\n * UNKNOWN as soon as the scan reaches it, so the runtime emits it only over\n * non-null keys and values. Renders on every dialect (each has row\n * constructors); whether the runtime emits it is\n * `SqlDialect.keysetSeekStrategy`.\n */\n | {\n readonly kind: \"rowCompare\";\n readonly op: \"gt\" | \"gte\" | \"lt\" | \"lte\";\n /** Ordered row members (compare references); `values[i]` binds to `columns[i]`. */\n readonly columns: readonly ColRef[];\n /** Encoded values, exactly `columns.length` of them. */\n readonly values: readonly unknown[];\n }\n /**\n * SUBQUERY membership: `\"id\" IN (SELECT …)`, or the row-value form\n * `(\"a\", \"b\") IN (SELECT …)` for a composite key — the key-first `distinct`\n * page on PostgreSQL (D-04). The subquery projects exactly `columns.length`\n * columns and shares the statement's parameter sequence. MySQL refuses a\n * `LIMIT` directly inside an `IN` subquery (error 1235), so the renderer\n * refuses that pair there with `VIBE_UNSUPPORTED_CAPABILITY`.\n */\n | {\n readonly kind: \"inSelect\";\n /** The tested columns, in the subquery's projection order. */\n readonly columns: readonly ColRef[];\n readonly select: SelectStatement;\n /** The subquery yields at most one row: one column, rendered `\"fk\" = (SELECT …)`. */\n readonly single?: true;\n }\n | {\n readonly kind: \"like\";\n readonly column: ColRef;\n /** Pre-built pattern (see like.ts helpers for escaping). */\n readonly pattern: string;\n readonly insensitive?: boolean;\n /**\n * The column carries an explicit case-insensitive collation (@collation\n * `…_ci`, board #36): an insensitive match renders as PLAIN `LIKE` — the\n * collation already folds case, and skipping LOWER() keeps the column\n * indexable. Set by the builder for mysql only.\n */\n readonly ciCollation?: boolean;\n readonly negate?: boolean;\n }\n /**\n * Case-SENSITIVE string match (`mode: \"strict\"`, board #20). `value` is the\n * RAW operand — pattern building happens at render time because escaping\n * differs per strategy (LIKE's `%`/`_`/`\\` vs GLOB's `*`/`?`/`[`). Renders\n * per `SqlDialect.strictMatchStrategy`: plain `=`/`LIKE` on postgres\n * (already byte-sensitive — a deliberate, documented no-op), `=`/`GLOB` on\n * sqlite, `= CAST(? AS BINARY)`/`LIKE CAST(? AS BINARY)` on mysql. The\n * non-native forms defeat plain indexes; docs/dialect-notes.md carries the\n * cost and the functional/`_bin`-index mitigation.\n */\n | {\n readonly kind: \"strictMatch\";\n readonly column: ColRef;\n readonly op: \"equals\" | \"contains\" | \"startsWith\" | \"endsWith\";\n readonly value: string;\n readonly negate?: boolean;\n }\n | { readonly kind: \"and\"; readonly operands: readonly SqlExpr[] }\n | { readonly kind: \"or\"; readonly operands: readonly SqlExpr[] }\n | { readonly kind: \"not\"; readonly operand: SqlExpr }\n /**\n * Correlated subquery test: `[NOT] EXISTS (SELECT …)`. The inner select\n * correlates to the outer scope through table-qualified `cmpCol` predicates;\n * its parameters merge into the statement's single parameter sequence in\n * render order. Relation filters (`some`/`every`/`none`/`is`/`isNot`)\n * compile to this shape.\n */\n | { readonly kind: \"exists\"; readonly select: SelectStatement; readonly negate?: boolean }\n /** Aggregate comparison — the HAVING predicate: `COUNT(\"col\") > $n`. */\n | { readonly kind: \"aggCmp\"; readonly op: ComparisonOp; readonly agg: AggRef; readonly value: unknown }\n /**\n * Scalar-list membership: `$n = ANY(\"col\")` — Prisma's `has`. Postgres only\n * (`capabilities.scalarArrays`); other dialects refuse at render time.\n */\n | { readonly kind: \"arrayHas\"; readonly column: ColRef; readonly value: unknown; readonly negate?: boolean }\n /** Scalar-list superset: `\"col\" @> $n` (one array param) — Prisma's `hasEvery`. Postgres only. */\n | { readonly kind: \"arrayContainsAll\"; readonly column: ColRef; readonly values: readonly unknown[] | string | NativeEnumArrayParameter | JsonListParameter }\n /** Scalar-list overlap: `\"col\" && $n` (one array param) — Prisma's `hasSome`. Postgres only. */\n | { readonly kind: \"arrayOverlaps\"; readonly column: ColRef; readonly values: readonly unknown[] | string | NativeEnumArrayParameter | JsonListParameter }\n /**\n * Scalar-list emptiness via `array_length(\"col\", 1) IS [NOT] NULL` — the v1\n * semantics kept deliberately: `empty: true` matches NULL **and** empty\n * arrays, `empty: false` matches only rows with at least one element.\n */\n | { readonly kind: \"arrayIsEmpty\"; readonly column: ColRef; readonly empty: boolean }\n /**\n * JSON path predicate. The path is always BOUND as a parameter (a `text[]`\n * on postgres, a `$.a.b[0]` path string on sqlite/mysql) — path segments\n * never become SQL text. `value` is the RAW JS operand; each dialect decides\n * its wire form (JSON.stringify for jsonb/json comparisons, LIKE patterns\n * for the string ops). `insensitive` applies to the string ops only.\n */\n | {\n readonly kind: \"jsonFilter\";\n readonly column: ColRef;\n readonly path: readonly (string | number)[];\n readonly op: JsonFilterOp;\n readonly value: unknown;\n readonly insensitive?: boolean;\n readonly negate?: boolean;\n /**\n * The column's postgres type: absent (or `jsonb`) for the default\n * `jsonb`, `json` for `Json @db.Json`. Postgres defines `=`, `<>` and\n * `@>` for jsonb only, so on a `json` column every op casts the\n * EXTRACTED value to jsonb (the string ops then read it as text), which\n * gives a jsonb column's answer. Sqlite and mysql have one JSON type\n * and ignore it.\n */\n readonly storage?: \"jsonb\" | \"json\";\n }\n /**\n * A bound extension fragment: literal text, bound parameters and quoted\n * identifiers in order (extensions.md §3 sql plane — trgm operators, rank\n * and distance terms). Parameters flow through the shared ParamCollector,\n * identifiers through dialect.quoteIdent — never hand-written.\n */\n | { readonly kind: \"fragment\"; readonly fragment: SqlFragmentSpec }\n /** Escape hatch for dialect-reviewed fragments. Text only — no parameters. */\n | { readonly kind: \"raw\"; readonly text: string };\n\n// ─── Projections ──────────────────────────────────────────────────\n\n/**\n * An aggregate projection.\n *\n * `countAll` renders `COUNT(*)`. The alias matters for portability: postgres\n * names the bare column `count`, sqlite and mysql name it `COUNT(*)` — callers\n * that must read the value back always pass an alias. Combined with a\n * non-empty `columns` list (grouped counts, `SELECT \"fk\", COUNT(*) … GROUP\n * BY \"fk\"`), it renders AFTER the columns.\n *\n * `one` renders the constant `1` — the conventional EXISTS projection; it\n * cannot be combined with a column list.\n *\n * `exists` asks whether the statement's own FROM and WHERE match a row:\n * `SELECT EXISTS (SELECT 1 FROM … WHERE …) AS \"alias\"` — one row, one\n * boolean-valued column (PostgreSQL `boolean`, SQLite and MySQL `0`/`1`). It\n * takes no column list, aggregate, grouping, order, paging, lock or join.\n */\nexport type SelectExpr =\n | { readonly kind: \"countAll\"; readonly alias?: string }\n | { readonly kind: \"one\" }\n | { readonly kind: \"exists\"; readonly alias: string };\n\n// ─── SET operations ───────────────────────────────────────────────\n\n/** Arithmetic applied to a column's current value in an UPDATE ... SET. */\nexport type SetOperator = \"increment\" | \"decrement\" | \"multiply\" | \"divide\";\n\n/**\n * An atomic update expression: `\"col\" = \"col\" <op> $n`.\n *\n * Recognised structurally inside `UpdateStatement.set`, so the marker key is\n * deliberately unlikely (`__op`). Three layers keep a user's JSON payload from\n * ever being mistaken for one: the Json codec stringifies JSON values before\n * they reach the AST, the query builder only emits this shape for numeric\n * fields, and {@link isSetOperation} demands only the documented marker keys.\n */\nexport type SetOperation = {\n readonly __op: SetOperator;\n readonly value: number | string | bigint;\n /** Decimal arithmetic needs a REAL operand on SQLite, even for integral text. */\n readonly numericType?: \"Decimal\";\n};\n\nconst SET_OPERATORS: readonly string[] = [\"increment\", \"decrement\", \"multiply\", \"divide\"];\n\n/** Narrow an UPDATE set value to an atomic {@link SetOperation}. */\nexport function isSetOperation(value: unknown): value is SetOperation {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n // Answered before the keys are listed: a `Bytes` value has one own key per byte.\n if (!Object.hasOwn(value, \"__op\")) return false;\n const keys = Object.keys(value);\n if (!keys.includes(\"__op\") || !keys.includes(\"value\")) return false;\n const candidate = value as { __op: unknown; value: unknown; numericType?: unknown };\n if (keys.length !== 2 && !(keys.length === 3 && keys.includes(\"numericType\") && candidate.numericType === \"Decimal\")) return false;\n return (\n typeof candidate.__op === \"string\" &&\n SET_OPERATORS.includes(candidate.__op) &&\n ((typeof candidate.value === \"number\" && Number.isFinite(candidate.value)) ||\n typeof candidate.value === \"string\" || typeof candidate.value === \"bigint\")\n );\n}\n\n/**\n * A scalar-list update expression (Prisma's `{ push: … }` on list columns):\n * `append` is one element (`\"col\" = array_append(\"col\", $n)`), `concat` an\n * array of elements (`\"col\" = \"col\" || $n`). Postgres only — the query builder\n * gates on `capabilities.scalarArrays` at build time and the renderer refuses\n * too. Same structural-marker discipline as {@link SetOperation}: the key is\n * unlikely, the shape exact, and Json payloads are stringified before they\n * could ever reach an UPDATE set.\n */\nexport type ListSetOperation = {\n readonly __listOp: \"append\" | \"concat\";\n readonly value: unknown;\n};\n\nconst LIST_SET_OPERATORS: readonly string[] = [\"append\", \"concat\"];\n\n/** Narrow an UPDATE set value to a {@link ListSetOperation}. */\nexport function isListSetOperation(value: unknown): value is ListSetOperation {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n // Answered before the keys are listed: a `Bytes` value has one own key per byte.\n if (!Object.hasOwn(value, \"__listOp\")) return false;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(\"__listOp\") || !keys.includes(\"value\")) return false;\n const candidate = value as { __listOp: unknown };\n return typeof candidate.__listOp === \"string\" && LIST_SET_OPERATORS.includes(candidate.__listOp);\n}\n\n/**\n * Database-clock marker: renders the DIALECT's `now()` expression — plus an\n * optional offset in seconds (fractional OK) bound as a parameter — instead of binding a\n * client-side timestamp. Flows as a VALUES cell, an UPDATE SET value, or a\n * comparison operand; the runtime's public `dbNow()` sentinel compiles to\n * this marker for DateTime fields (leases, TTLs — anything that must trust\n * the database's clock, never the process's). Same structural-marker\n * discipline as {@link SetOperation}: unlikely key, exact shape.\n */\nexport type DbNowMarker = {\n readonly __dbNow: true;\n readonly offsetSeconds: number;\n};\n\n/** Build a {@link DbNowMarker}; `offsetSeconds` is finite seconds — fractional is legal (lease TTLs arrive as ttlMs / 1000). */\nexport function dbNowMarker(params: { offsetSeconds: number }): DbNowMarker {\n return { __dbNow: true, offsetSeconds: params.offsetSeconds };\n}\n\n/** Narrow a value to a {@link DbNowMarker}. */\nexport function isDbNowMarker(value: unknown): value is DbNowMarker {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n // A-05: every object cell (each Date of a createMany) is asked; one own-key\n // test rejects them before the key list is built.\n if (!Object.hasOwn(value, \"__dbNow\")) return false;\n const keys = Object.keys(value);\n if (keys.length !== 2 || !keys.includes(\"__dbNow\") || !keys.includes(\"offsetSeconds\")) return false;\n const candidate = value as { __dbNow: unknown; offsetSeconds: unknown };\n return (\n candidate.__dbNow === true &&\n typeof candidate.offsetSeconds === \"number\" &&\n Number.isFinite(candidate.offsetSeconds)\n );\n}\n\n// ─── Ordering ─────────────────────────────────────────────────────\n\n/** ORDER BY a column, with optional NULLS placement (native or emulated per dialect). */\nexport type OrderByColumn = {\n readonly column: ColRef;\n readonly direction: \"asc\" | \"desc\";\n /** NULLS placement; rendered natively or emulated per dialect. */\n readonly nulls?: \"first\" | \"last\";\n};\n\n/** ORDER BY an aggregate expression — grouped selects ordering by `COUNT(\"col\")`. */\nexport type OrderByAggregate = {\n readonly agg: AggRef;\n readonly direction: \"asc\" | \"desc\";\n};\n\n/**\n * ORDER BY a correlated scalar subquery — relation orderBy\n * (`orderBy: { posts: { _count: \"desc\" } }` → `(SELECT COUNT(*) …)`,\n * `orderBy: { posts: { _max: { createdAt: \"desc\" } } }` → `(SELECT MAX(…) …)`,\n * `orderBy: { author: { email: \"asc\" } }` → `(SELECT \"email\" …)`).\n * Portable: all three dialects order by scalar subqueries. The subquery\n * correlates to the outer scope through table-qualified `cmpCol` predicates,\n * exactly like `exists`; its parameters merge into the statement's single\n * sequence in render order.\n *\n * `nulls` places the NULL a missing to-one row or a parent without related\n * rows (under MIN/MAX/AVG/SUM) sorts as. Without it, NULL sorts at the\n * engine's native position. Postgres and sqlite render `NULLS FIRST|LAST`;\n * mysql renders the bare term when its native placement already matches, and\n * otherwise a leading `(<subquery>) IS NULL` term — the subquery then renders\n * twice and its parameters bind twice, in text order.\n */\nexport type OrderBySubquery = {\n readonly select: SelectStatement;\n /** A count behind a missing to-one row is zero, not NULL. */\n readonly coalesce?: 0;\n readonly direction: \"asc\" | \"desc\";\n readonly nulls?: \"first\" | \"last\";\n};\n\nexport type OrderTerm = OrderByColumn | OrderByAggregate | OrderBySubquery;\n\n// ─── Statements ───────────────────────────────────────────────────\n\n/**\n * One `LEFT JOIN LATERAL (…) AS alias ON true` clause aggregating a correlated\n * subquery into a single JSON value per outer row — the \"join\" relation-loading\n * strategy (postgres/pglite, and MySQL 8.0.14+ since lane J; gated on\n * `capabilities.lateralJoin` and rendered through `SqlDialect.lateralJson`).\n * MySQL renders positional rows only (`JSON_ARRAY`, `JSON_ARRAYAGG`, `ON\n * true`); its aggregate cannot order, so an ordered list level carries a\n * `select.rowNumber` without partition — rendered as the row's last slot.\n *\n * Renders (agg `jsonArray`):\n * `LEFT JOIN LATERAL (SELECT COALESCE(json_agg(to_json(\"__sub\".*)), '[]'::json)\n * AS \"columnAlias\" FROM (<select>) AS \"__sub\") AS \"alias\" ON true`\n * and (agg `jsonObject`):\n * `LEFT JOIN LATERAL (SELECT to_json(\"__sub\".*) AS \"columnAlias\"\n * FROM (<select>) AS \"__sub\") AS \"alias\" ON true`\n *\n * `to_json` over a subselect (not `json_build_object`) sidesteps postgres's\n * 100-argument function limit on wide models (v1 lesson); `json` rather than\n * `jsonb` because the value is transport only — jsonb's binary build + re-\n * serialization cost 2–3.7× the server time for identical decoded values.\n * The inner select's ORDER BY drives the aggregate's element order. Consumers\n * must run the codec table over the parsed JSON children: `to_json` turns\n * timestamps into strings and loses BigInt-ness (LEARNINGS).\n */\nexport type LateralJoin = {\n /** Join alias (`__lat_0`) — the outer projection selects `alias.columnAlias`. */\n readonly alias: string;\n /**\n * Column the aggregated JSON value is exposed under (`__rel_posts`). An\n * `aggregate` lateral exposes one column per entry of its select's\n * `aggregates` instead, under each entry's alias.\n */\n readonly columnAlias: string;\n /**\n * jsonArray: many rows; jsonObject: one row or NULL; count: a scalar COUNT(*)\n * lateral; aggregate: one ungrouped row of `aggregates` (no columns), which\n * an aggregate without GROUP BY returns even over zero rows.\n */\n readonly agg: \"jsonArray\" | \"jsonObject\" | \"count\" | \"aggregate\";\n /**\n * Object output is the SQL-layer default. Positional rows follow the exact\n * select.columns order, using explicit output names (never SELECT *).\n * Above JSON_TRANSPORT.chunkSize, a row is an array of fixed-size chunks;\n * the final chunk may be shorter. Scalar/list/Json field values stay in one\n * slot. Consumers must use the SAME projection to decode the payload.\n */\n readonly rowFormat?: \"object\" | \"positional\";\n /**\n * Positional rows only: output names of `select.columns` the subselect\n * projects for the statement's own use (an order key the aggregate's ORDER\n * BY reads, a key a nested lateral correlates on) but the JSON row leaves\n * out. The row is the remaining columns in `select.columns` order.\n */\n readonly hidden?: readonly string[];\n /** The correlated child select — may reference outer columns via table-qualified refs. */\n readonly select: SelectStatement;\n};\n\n/**\n * One scalar subquery in a projection. The builder guarantees a single column\n * and at most one row. Hidden sort values stay inside derived tables rather\n * than becoming result fields. `coalesce` preserves a count across a missing\n * to-one hop.\n */\nexport type ScalarSubquery = {\n readonly alias: string;\n readonly select: SelectStatement;\n readonly coalesce?: 0;\n};\n\n/**\n * One correlated scalar `COUNT(*)` projected into a select list:\n * `(SELECT COUNT(*) FROM … WHERE <correlation>) AS \"alias\"` — the relation\n * `_count` of the round-trip campaign's R-03b, which saves the separate grouped\n * count statement. Portable: postgres, sqlite and mysql all evaluate a\n * correlated scalar subquery once per output row; the runtime wraps a paged\n * root in a derived table first, so the subqueries run only for the page.\n * The select must be ONE ungrouped `COUNT(*)` (`columns: []`, `selectExpr`\n * countAll, no grouping, paging, distinct or lock) — anything else is refused\n * at render. Its parameters join the statement's single sequence in text order\n * (the select list renders before FROM).\n */\nexport type CountSubquery = {\n /** Output column the count is exposed under (`__vibe_count_0`). */\n readonly alias: string;\n /** The correlated count select — references outer columns via table-qualified refs. */\n readonly select: SelectStatement;\n};\n\n/**\n * One `INNER JOIN \"table\" AS alias ON left = right [AND …]` clause — plain\n * equality joins only, portable across all dialects. Added for the\n * single-statement implicit-M2M load (child rows joined to their join-table\n * membership rows); extra join-table columns project through the statement's\n * `columns` list with a table qualifier + `alias`.\n */\nexport type InnerJoin = {\n readonly table: TableRef;\n /** Equality pairs ANDed into the ON clause; never empty. */\n readonly on: readonly { readonly left: ColRef; readonly right: ColRef }[];\n};\n\n// ─── Fix lane Q2 (D-03): derived-table LEFT JOIN ───\n\n/**\n * One `LEFT JOIN (<select>) AS \"alias\" ON \"alias\".\"k\" = \"outer\".\"c\" [AND …]`\n * clause — portable, equality ON pairs only. Built for the to-one relation\n * `orderBy` (`orderBy: { author: { email: \"asc\" } }`): the target's key and\n * sort columns ride a derived table under RESERVED aliases (`__vibe_ok0`,\n * `__vibe_ov0`), so the outer statement's unqualified column names can never\n * become ambiguous, and the outer ORDER BY names `\"alias\".\"__vibe_ov0\"`.\n * Every engine merges such a derived table into a plain join (measured:\n * postgres pulls it up into a hash/nested-loop left join, sqlite flattens it,\n * mysql merges it), so the planner may hash-join instead of evaluating a\n * correlated subquery per candidate row.\n *\n * The builder emits it only for links that match AT MOST ONE target row, so\n * the join keeps the parent row count. The derived select must alias every\n * projected column; its parameters (none today) join the statement's single\n * sequence where the clause renders (after `keyTable`, before\n * `lateralJoins`). A statement with a `rowLock` refuses it: postgres rejects\n * FOR UPDATE on the nullable side of an outer join, and mysql would lock the\n * joined rows too.\n */\nexport type LeftJoin = {\n /** Derived-table alias (`__ord1`). */\n readonly alias: string;\n /** The derived table — every projected column carries an `alias`. */\n readonly select: SelectStatement;\n /** Equality pairs ANDed into the ON clause; never empty. */\n readonly on: readonly { readonly left: ColRef; readonly right: ColRef }[];\n};\n\n/**\n * How one member of a {@link KeyTableJoin} tuple binds inside the derived\n * table. `value` binds the parameter as it is: it stays COERCIBLE, so a text\n * column's OWN collation decides `=` — the equality `col IN (?, …)` uses.\n * `integer` and `decimal` cast the parameter into the column's numeric family:\n * BigInt and Decimal values travel as strings, and a derived-table string\n * compared with a numeric column goes through a double (measured on mysql:\n * `9007199254740993` matched `9007199254740992`).\n *\n * `integer` renders `CAST(? AS SIGNED)`. `decimal` renders\n * `CAST(? AS DECIMAL(65, scale))` with the tested column's own scale: 65 is\n * MySQL's maximum precision, so the cast holds every value a\n * `DECIMAL(p, scale)` column can hold. A fixed `DECIMAL(65,30)` held only 35\n * integer digits and clipped a `Decimal(65, 0)` key onto its maximum, which\n * matched nothing (review finding 1); the column's own precision would clip a\n * wider value onto the column's maximum and pair it with a row it does not\n * equal (measured: `CAST('100000' AS DECIMAL(5,0))` is `99999`). `scale` is\n * 0–30, MySQL's range.\n *\n * `citext` (postgres only) renders `CAST($n AS citext)`: a postgres `citext`\n * key compares case-insensitively, and a bare VALUES parameter would be\n * `text`, whose `=` against a citext column is the case-sensitive text\n * operator. A VALUES cell has no column to infer a type from, so every member\n * of a postgres key table binds typed: `citext`, `text` (`CAST($n AS text)`,\n * a text or varchar column) or `integer` (`CAST($n AS bigint)`, exact against\n * any integer column) — any other member refuses on postgres. `text` is\n * postgres-only; mysql binds text members as `value`.\n */\nexport type KeyTableMember =\n | { readonly kind: \"value\" }\n | { readonly kind: \"integer\" }\n | { readonly kind: \"decimal\"; readonly scale: number }\n /** MySQL-only lossless temporal operands in mixed collation-aware key tuples. */\n | { readonly kind: \"timestamp\" }\n | { readonly kind: \"time\" }\n | { readonly kind: \"citext\" }\n | { readonly kind: \"text\" };\n\n/**\n * The batch's key tuples as a derived table, each tagged with its ORDINAL\n * (row `i` carries `i`), INNER JOINed on the tested columns — mysql:\n * `INNER JOIN (VALUES ROW(?, 0), ROW(?, 1)) AS \\`alias\\` (\\`__vibe_k0\\`, \\`ordinal\\`)\n * ON col = \\`alias\\`.\\`__vibe_k0\\``; postgres only over `citext` members\n * (`(VALUES (CAST($1 AS citext), 0), …)`, release 3.0 nested writes).\n * Member columns are named `__vibe_k<i>` (a reserved prefix, so unqualified\n * child columns never collide with them).\n *\n * Why it exists (EPIC R): a relation load used to stitch children to parents\n * by comparing decoded keys in JavaScript, while mysql's collations equate\n * spellings (`acme` = `Acme` = `ACME`, `cafe` = `Café`, `x ` = `x`) that\n * JavaScript keeps apart — the foreign key and the `IN` filter accepted the\n * child, the stitch dropped it. Joined this way the DATABASE pairs every child\n * row with every batch key it considers equal, and the projected ordinal names\n * the key; the join is also the membership filter.\n */\nexport type KeyTableJoin = {\n /** Derived-table alias (`__vibe_keys`); the ordinal projects as `alias.ordinalAlias`. */\n readonly alias: string;\n /** The statement's columns, compared member by member (`=`), in tuple order. */\n readonly columns: readonly ColRef[];\n /** How each member binds, in tuple order — see {@link KeyTableMember}. */\n readonly members: readonly KeyTableMember[];\n /** Encoded key tuples; never empty, each as long as `columns`. */\n readonly rows: readonly (readonly unknown[])[];\n /** Output name of the ordinal column. */\n readonly ordinalAlias: string;\n};\n\n/**\n * A `ROW_NUMBER() OVER (PARTITION BY … [ORDER BY …]) AS \"alias\"` projection,\n * appended after `columns` — the distinct emulation on dialects without\n * `DISTINCT ON` (sqlite ≥3.25, mysql ≥8.0 both have window functions): the\n * outer statement filters `alias = 1` on the derived table, restoring\n * SQL-side take/skip and bounded transfer (N10).\n */\nexport type RowNumberProjection = {\n readonly partitionBy: readonly ColRef[];\n /** Intra-partition order picking the representative row; may be empty. */\n readonly orderBy: readonly OrderTerm[];\n readonly alias: string;\n};\n\n// ─── Fix lane Q1 (round 3, DB-01): per-key page ──────────────────\n\n/**\n * A PER-KEY PAGE of one child table as a derived-table FROM\n * (`SelectStatement.keyPage`): for every listed key tuple, the child rows\n * whose key columns equal it, ordered by `select.orderBy` and cut by\n * `select.limit`/`select.offset` — each key's OWN page, plus a rank column\n * (`rankAlias`) that orders the rows inside their key. The paged include's\n * `ROW_NUMBER() OVER (PARTITION BY key …)` window returns the same rows but\n * numbers EVERY child of every listed key first; this form reads one page of\n * primary keys per key through an index on (key columns, order columns),\n * then each page row once by its primary key.\n *\n * Rendered per `SqlDialect.keyPageStrategy`:\n * - `lateral` (postgres): `unnest($1::<type>[], …) AS \"__vibe_keys\"\n * (\"__vibe_k0\", …) CROSS JOIN LATERAL (SELECT <identity>, ROW_NUMBER() OVER\n * (PARTITION BY <key> ORDER BY <order>) AS <rank> FROM <table> WHERE <key> =\n * \"__vibe_keys\".\"__vibe_k<i>\" … ORDER BY <order> LIMIT … OFFSET …) AS\n * \"__vibe_ids\" INNER JOIN <table> AS \"__vibe_page\" ON <identity> pairs`.\n * - `inLimit` (sqlite, which has no LATERAL): the key tuples as `(VALUES …)`\n * (columns `column1`, `column2`, …, as SQLite names a VALUES clause's\n * columns) joined to `<table> AS \"__vibe_page\"` ON `(<identity>) IN (SELECT\n * <identity> … WHERE <key> = \"__vibe_keys\".\"column<i>\" … ORDER BY … LIMIT …)`,\n * the rank re-derived over the fetched page (`ROW_NUMBER() OVER (PARTITION\n * BY <key> ORDER BY <order>)`): its values differ from the window's, its\n * order inside a key does not.\n * - `window` (mysql): refused with `VIBE_UNSUPPORTED_CAPABILITY` — measured\n * no gain there; the runtime keeps the window.\n *\n * The caller guarantees what makes the page equal to the window's: the order\n * is total inside a key (the identity columns are among the key and order\n * columns), the key tuples are distinct and compare exactly (no folding\n * collation). Members bind like the key-list filter's (`KeyListMember`).\n */\nexport type KeyPage = {\n /** How each key member binds, in member order (postgres: one typed array each). */\n readonly members: readonly KeyListMember[];\n /** Encoded, distinct key tuples; never empty, each `members.length` long. */\n readonly rows: readonly (readonly unknown[])[];\n /** The child columns each key member equals, in member order (unqualified). */\n readonly keyColumns: readonly ColRef[];\n /** The child's primary-key columns (unqualified) — each page row is read once by them. */\n readonly identity: readonly ColRef[];\n /**\n * ONE key's page: the child `table` (no alias), the projected `columns`\n * (unqualified; transforms and aliases render as usual), an optional extra\n * `where`, the non-empty `orderBy` (plain column terms), `limit`/`offset`.\n * Any other member is refused.\n */\n readonly select: SelectStatement;\n /** Output name of the rank column. */\n readonly rankAlias: string;\n};\n\n/**\n * Statement-count pass EPIC 4 (round-3 ST-07): bound key tuples as the FROM\n * of a select (`SelectStatement.fromKeys`) — a derived table named\n * `table.name` whose columns are `columns`, one row per tuple. The write\n * follow-up puts it where the parent table would be: the find path's laterals\n * correlate to `\"<table.name>\".\"<column>\"` exactly as over the table, but read\n * the RETURNED key values instead of the parent row (a deleted row, or a\n * native-RLS parent whose SELECT policy the per-relation loads never met).\n *\n * Renders where `SqlDialect.keyListStrategy` is `unnest` (postgres) as the\n * typed form of a `VALUES` list — one array per column, typed like the\n * key-list filter's members (`postgresKeyListElementType`), so the text does\n * not depend on the tuple count: `FROM unnest($1::text[], $2::int4[]) AS\n * \"Post\" (\"id\", \"authorId\")`. A `DateTime` member without a declared native\n * type (`keyListBindsUntypedRows`) and every other dialect refuse with\n * `VIBE_UNSUPPORTED_CAPABILITY` — those dialects have no lateral joins either.\n */\nexport type KeyRows = {\n /** Output column names of the derived table, in member order. */\n readonly columns: readonly string[];\n /** How each column binds, in column order — see {@link KeyListMember}. */\n readonly members: readonly KeyListMember[];\n /** Encoded tuples; never empty, each exactly `columns.length` long. */\n readonly rows: readonly (readonly unknown[])[];\n};\n\n/**\n * `GROUP BY GROUPING SETS (…)` over a select's `groupBy` columns. Each set\n * lists indexes into `groupBy`; `()` is the grand total. The projection gains\n * `CASE GROUPING(<every groupBy column>) WHEN <mask> THEN <set index> … END AS\n * \"<indexAlias>\"` after the aggregates, so a row names the set that produced\n * it, and an ORDER BY term may name `indexAlias` as a bare column (an output\n * column). Dialect `groupingSets` capability: `\"groupingSets\"` renders any\n * list, `\"rollup\"` only the rollup chain of `groupBy` in order (`GROUP BY a,\n * b WITH ROLLUP`), `\"none\"` refuses.\n */\nexport type GroupingSets = {\n readonly sets: readonly (readonly number[])[];\n readonly indexAlias: string;\n};\n\nexport type SelectStatement = {\n readonly kind: \"select\";\n readonly table: TableRef;\n /** Empty array renders as `SELECT *` (unless `selectExpr` replaces it). */\n readonly columns: readonly ColRef[];\n /**\n * Aggregate projection. Replaces the column list when `columns` is empty;\n * a `countAll` with columns renders after them (grouped counts).\n */\n readonly selectExpr?: SelectExpr;\n /**\n * Aliased aggregate projections (`AVG(\"col\") AS \"_avg__col\"`), rendered\n * after `columns` — the aggregate/groupBy/count-select shapes. Cannot be\n * combined with `selectExpr`.\n */\n readonly aggregates?: readonly AggSelect[];\n /** Correlated `COUNT(*)` subqueries, rendered after `aggregates` — see {@link CountSubquery}. */\n readonly countSubqueries?: readonly CountSubquery[];\n /** Scalar values projected after count subqueries and before a row number. */\n readonly scalarSubqueries?: readonly ScalarSubquery[];\n /**\n * `SELECT DISTINCT ON (cols)` — postgres only (`capabilities.distinctOn`;\n * other dialects refuse at render time and the runtime emulates client-side\n * instead). ORDER BY must lead with these columns; the query builder\n * guarantees that arrangement.\n */\n readonly distinctOn?: readonly ColRef[];\n /**\n * Plain `SELECT DISTINCT` over the whole projection — every dialect. The\n * query builder sets it only where it returns exactly the rows its\n * `ROW_NUMBER()` distinct emulation would (sqlite/mysql, value-exact keys,\n * projection equal to the distinct fields); never together with\n * `distinctOn` (the renderer refuses the pair).\n */\n readonly distinct?: true;\n /**\n * Derived-table FROM: renders `FROM (<fromSelect>) AS \"<table.name>\"` —\n * `table.name` is the subquery ALIAS and `table.alias` must be unset. Used\n * by aggregate-over-a-subset shapes (`aggregate({ take, skip, orderBy })`).\n */\n readonly fromSelect?: SelectStatement;\n /** Lateral JSON-aggregation joins — postgres and MySQL 8.0.14+, see {@link LateralJoin}. */\n readonly lateralJoins?: readonly LateralJoin[];\n /** Plain equality INNER JOINs — portable, see {@link InnerJoin}. */\n readonly innerJoins?: readonly InnerJoin[];\n /** Key-table join, rendered after `innerJoins` — mysql only, see {@link KeyTableJoin}. */\n readonly keyTable?: KeyTableJoin;\n /** Fix lane Q2 (D-03): derived-table LEFT JOINs, rendered after `keyTable` — see {@link LeftJoin}. */\n readonly leftJoins?: readonly LeftJoin[];\n /** ROW_NUMBER window projection — see {@link RowNumberProjection}. */\n readonly rowNumber?: RowNumberProjection;\n /**\n * Fix lane Q1 (DB-01): derived-table FROM over a per-key page — renders\n * `FROM (<per-key page>) AS \"<table.name>\"` like `fromSelect` (and never\n * together with it); see {@link KeyPage}.\n */\n readonly keyPage?: KeyPage;\n /**\n * Fix lane Q2 (round 3, DB-07): derived-table FROM over a `UNION ALL` of\n * branch selects — renders `FROM (SELECT * FROM (<branch 0>) AS\n * \"__vibe_u0\" UNION ALL SELECT * FROM (<branch 1>) AS \"__vibe_u1\" …) AS\n * \"<table.name>\"`. Each branch keeps its own ORDER BY and LIMIT: wrapped in\n * its own derived table, a limited branch is valid on all three engines\n * (SQLite refuses ORDER BY/LIMIT on a bare compound member). At least two\n * branches; each a plain `SELECT <columns> FROM <table> [WHERE] [ORDER BY]\n * [LIMIT]` projecting the same output names in the same order; never\n * together with `fromSelect`, `keyPage` or a `table.alias`. Parameters bind\n * branch by branch, in text order.\n */\n readonly fromUnion?: readonly SelectStatement[];\n /**\n * Statement-count pass EPIC 4 (ST-07): derived-table FROM over bound key\n * tuples, named `table.name` with the listed column names — see\n * {@link KeyRows}. Never together with `fromSelect`, `keyPage`, `fromUnion`,\n * a `table.alias` or a `rowLock`.\n */\n readonly fromKeys?: KeyRows;\n readonly where?: SqlExpr;\n readonly groupBy?: readonly ColRef[];\n /** Grouping sets over `groupBy` — see {@link GroupingSets}. */\n readonly groupingSets?: GroupingSets;\n /** HAVING predicate — grouped selects; may contain `aggCmp` expressions. */\n readonly having?: SqlExpr;\n readonly orderBy?: readonly OrderTerm[];\n readonly limit?: number;\n readonly offset?: number;\n /**\n * Row-locking read (`SELECT … FOR UPDATE SKIP LOCKED`) — see {@link RowLock}.\n * The internal read-before-write overlays (dialects without RETURNING) set\n * the plain `{ strength: \"update\", wait: \"wait\" }` lock. Rendered only where\n * the dialect names the clause (`dialect.rowLockSyntax`); sqlite has none and\n * needs none — its write transactions already exclude each other.\n */\n readonly rowLock?: RowLock;\n};\n\n/**\n * The lock a locking read takes: one strength, one wait policy. Both members\n * are REQUIRED here — defaulting happens once, in the query builder, so the\n * rendered SQL is a function of the AST alone.\n *\n * `of` narrows the lock to named FROM items (`FOR UPDATE OF \"Parent\"`). The\n * join relation strategy needs it: its statement also reads child rows through\n * `LEFT JOIN LATERAL` subqueries, and an unnarrowed clause is refused by\n * postgres (\"FOR UPDATE is not allowed with aggregate functions\", from the\n * children's `json_agg`). With `of` naming the statement's own table only the\n * parent rows are locked. Each name must be the statement's table alias, or its\n * unqualified table name when it has no alias — the only FROM item the AST\n * names; the renderer refuses anything else. Dialects without a locking-read\n * clause render nothing, as for a lock without `of`.\n */\nexport type RowLock = {\n readonly strength: RowLockStrength;\n readonly wait: RowLockWaitPolicy;\n readonly of?: readonly string[];\n};\n\n/**\n * Sentinel VALUES cell: render the `DEFAULT` keyword instead of a placeholder\n * (M4) — a heterogeneous createMany row that omits a field lets the COLUMN\n * default apply (or NULL on a defaultless nullable column), exactly like a\n * single-row insert that omits it. Postgres/mysql only\n * (`dialect.rowDefaultKeyword`); sqlite groups rows instead.\n */\nexport const SQL_DEFAULT_CELL: { readonly __sqlDefault: true } = Object.freeze({ __sqlDefault: true });\n\n/**\n * Sentinel update-arm cell: the column keeps its current value —\n * `` `col` = `table`.`col` `` (V8, the insert-if-missing upsert). Valid only in\n * an {@link OnConflictUpdate} `update` set, where MySQL's `ON DUPLICATE KEY\n * UPDATE` needs at least one assignment: a self-assignment changes nothing on a\n * duplicate and, unlike `INSERT IGNORE`, leaves every other error an error.\n * Refused in a plain UPDATE's SET list.\n */\nexport const SQL_KEEP_CELL: { readonly __sqlKeep: true } = Object.freeze({ __sqlKeep: true });\n\n/** Is this update cell the {@link SQL_KEEP_CELL} sentinel? */\nexport function isSqlKeepCell(value: unknown): boolean {\n return value === SQL_KEEP_CELL;\n}\n\n/** Is this VALUES cell the {@link SQL_DEFAULT_CELL} sentinel? */\nexport function isSqlDefaultCell(value: unknown): boolean {\n return value === SQL_DEFAULT_CELL;\n}\n\n/**\n * VALUES/SET cell carrying a Json column's parameter (the codec's JSON text).\n *\n * Why it exists: OID-typed drivers (bun:sql) resolve each parameter's postgres\n * type and re-serialize the JS value AS that type — a pre-stringified Json\n * param bound straight into a bare jsonb slot arrives DOUBLE-ENCODED (a jsonb\n * string holding the document; live-proven on Bun 1.3.14). The postgres\n * renderer pins the parameter's type instead (`$n::text::jsonb`,\n * `SqlDialect.jsonParamCast`), so every driver sends the text through and the\n * SERVER parses it; text-param drivers (node-postgres, pglite) are unaffected.\n * Sqlite/mysql render the bare placeholder — their Json transport is already\n * plain text. The COLLECTED parameter is the plain text either way: this\n * wrapper never crosses the wire.\n *\n * `storage: \"json\"` marks a postgres `json` column (`Json @db.Json`): the cell\n * renders `$n::text::json`, so the column stores the text as written (key\n * order and spelling kept) instead of jsonb's normalized text (release-3.0\n * D3). Absent = jsonb; dialects without a param cast ignore it.\n */\nexport type JsonParamCell = { readonly __jsonParam: true; readonly text: string; readonly storage?: \"json\" };\n\n/** Wrap a Json column's encoded (stringified) parameter for cast-site rendering. */\nexport function jsonParamCell(params: { text: string; storage?: \"json\" }): JsonParamCell {\n return params.storage === \"json\" ? { __jsonParam: true, text: params.text, storage: \"json\" } : { __jsonParam: true, text: params.text };\n}\n\n/** Is this VALUES/SET cell a {@link JsonParamCell}? */\nexport function isJsonParamCell(value: unknown): value is JsonParamCell {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { __jsonParam?: unknown }).__jsonParam === true\n );\n}\n\n/**\n * Reference to the row PROPOSED for insertion, inside an upsert's update arm:\n * `excluded.\"col\"` on postgres/sqlite, `` `new`.`col` `` on mysql's row-alias\n * form (`SqlDialect.excludedRowRef`). It is a COLUMN REFERENCE, not a\n * parameter — it names the value already bound in this statement's VALUES\n * list, which is what lets ONE batched upsert write each conflicting row's own\n * incoming values without binding them a second time.\n */\nexport type ExcludedRef = { readonly __excluded: true; readonly column: string };\n\n/** Reference the incoming row's `column` from inside an upsert update arm. */\nexport function excludedRef(params: { column: string }): ExcludedRef {\n return { __excluded: true, column: params.column };\n}\n\n/** Is this SET cell an {@link ExcludedRef}? */\nexport function isExcludedRef(value: unknown): value is ExcludedRef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { __excluded?: unknown }).__excluded === true\n );\n}\n\n/**\n * One RETURNING column: a bare column name renders `\"col\"`; `castText` renders\n * a dialect text cast (postgres `::text`, sqlite `CAST AS TEXT`) for lossless\n * transport, including timestamps and postgres arrays. `jsonText`\n * applies the dialect's JSON text projection, as {@link ColRef.transform} does\n * for SELECT. Dialects without RETURNING still omit the clause and flag it.\n */\nexport type ReturningColumn =\n | string\n | { readonly name: string; readonly castText: true }\n | { readonly name: string; readonly transform: \"jsonText\" }\n | CaptureReturningColumn\n | OtherRowReturningColumn\n | ServerVersionReturningColumn;\n\n/**\n * The server's `server_version_num` as text, exposed as `alias`:\n * `pg_catalog.current_setting('server_version_num') AS \"alias\"`. Rides a write\n * whose client does not know the server version yet, so the next statement can\n * take the form that version allows without a read of its own. Dialects with\n * the `rowCapture` capability only (the version decides whether it applies).\n */\nexport type ServerVersionReturningColumn = {\n readonly serverVersion: true;\n readonly alias: string;\n};\n\n/**\n * A RETURNING column read from a row OTHER than the one the statement wrote,\n * exposed as `alias` and projected like the written row's own column\n * (`projection`), so one codec decodes both:\n *\n * - `from: \"old\"` — the row as it was before the statement (capability\n * `rowCapture`, PostgreSQL 18): `old.\"col\" AS \"alias\"`, NULL in every column\n * for a row the statement inserted;\n * - `from: { source }` — the joined source of an `UPDATE … FROM` by its alias\n * (capability `returningReadsJoinedSource`): `\"source\".\"col\" AS \"alias\"`.\n */\nexport type OtherRowReturningColumn = {\n readonly from: \"old\" | { readonly source: string };\n readonly name: string;\n readonly alias: string;\n readonly projection?: \"castText\" | \"jsonText\";\n};\n\n/**\n * A row-capture RETURNING column (`$transaction(…, { capture })`, dialects with\n * the `rowCapture` capability: PostgreSQL 18, where RETURNING names the row\n * before the statement `old` and the row after it `new`):\n *\n * - `\"old\"` / `\"new\"`: `old.\"col\"::text AS \"alias\"` / `new.\"col\"::text AS \"alias\"`,\n * the value as text so every type survives exactly (`old` is all NULL for an\n * inserted row, `new` for a deleted one);\n * - `\"inserted\"`: `(old.\"col\" IS NULL) AS \"alias\"` — the arm of an `INSERT …\n * ON CONFLICT DO UPDATE` row, true when it was inserted (`col` must be a\n * column no stored row holds NULL in: a primary-key column);\n * - `\"old\"` / `\"new\"` with `hop`: the related row's column, read in the same\n * statement — `(SELECT \"__vibe_h\".\"col\"::text FROM \"Related\" AS \"__vibe_h\"\n * WHERE \"__vibe_h\".\"id\" = new.\"relatedId\") AS \"alias\"` (see {@link CaptureHop});\n * - `\"key\"`: `old.\"col\" AS \"alias\"` in the column's own type, for a chain's\n * {@link CaptureCascade} to match child rows on;\n * - `\"cascade\"` ({@link CaptureCascadeReturningColumn}): the images of the\n * child rows a referential action of this row changes.\n */\nexport type CaptureReturningColumn =\n | {\n readonly capture: \"old\" | \"new\" | \"inserted\" | \"key\";\n readonly name: string;\n readonly alias: string;\n /** With `\"old\"` / `\"new\"`: read `name` from the related row instead of this one. */\n readonly hop?: CaptureHop;\n }\n | CaptureCascadeReturningColumn;\n\n/**\n * A to-one hop of a capture cell: the row of `table` whose `on[i].target`\n * columns equal the reading row's `on[i].source` columns. The target columns\n * must be a unique key (a scalar subquery that found two rows would fail the\n * statement); no row, or a NULL source column, reads NULL.\n */\nexport type CaptureHop = {\n readonly table: TableRef;\n readonly on: readonly { readonly target: string; readonly source: string }[];\n};\n\n/** One cell of a {@link CaptureCascade} image: a child column, or a column of its related row. */\nexport type CaptureCell = {\n readonly name: string;\n readonly hop?: CaptureHop;\n};\n\n/**\n * The distinct images of the child rows of `table` whose `on[i].child` columns\n * equal a written parent row's `on[i].parent` columns: `(SELECT\n * array_agg(\"__vibe_i\")::text FROM (SELECT DISTINCT ARRAY[<cells>] AS \"__vibe_i\"\n * FROM \"Child\" AS \"__vibe_c\" WHERE <match> LIMIT $n) AS \"__vibe_d\")`, NULL when\n * no child matched. Read inside the parent's statement, whose snapshot still\n * holds the rows its foreign keys' referential actions remove or rewrite at\n * the statement's end. `limit` is bound as a parameter.\n */\nexport type CaptureCascade = {\n readonly table: TableRef;\n readonly on: readonly { readonly child: string; readonly parent: string }[];\n readonly cells: readonly CaptureCell[];\n readonly limit: number;\n};\n\n/**\n * A per-row {@link CaptureCascade} in RETURNING: `parent` columns are read from\n * `old.` (`\"__vibe_c\".\"child\" = old.\"parent\"`).\n */\nexport type CaptureCascadeReturningColumn = {\n readonly capture: \"cascade\";\n readonly alias: string;\n readonly cascade: CaptureCascade;\n};\n\n/** The column name a {@link ReturningColumn} exposes in the result row. */\nexport function returningColumnName(column: ReturningColumn): string {\n return typeof column === \"string\" ? column : \"capture\" in column || \"from\" in column || \"serverVersion\" in column ? column.alias : column.name;\n}\n\n/** Is this RETURNING column read from another row ({@link OtherRowReturningColumn})? */\nexport function isOtherRowReturningColumn(column: ReturningColumn): column is OtherRowReturningColumn {\n return typeof column !== \"string\" && \"from\" in column;\n}\n\n/** Is this RETURNING column a row-capture column ({@link CaptureReturningColumn})? */\nexport function isCaptureReturningColumn(column: ReturningColumn): column is CaptureReturningColumn {\n return typeof column !== \"string\" && \"capture\" in column;\n}\n\nexport type InsertStatement = {\n readonly kind: \"insert\";\n readonly table: TableRef;\n readonly columns: readonly string[];\n /** Row values aligned to `columns` — deterministic parameter order. */\n readonly rows: readonly (readonly unknown[])[];\n /** Upsert clause: ON CONFLICT (pg/sqlite) or ON DUPLICATE KEY (mysql). */\n readonly onConflict?: OnConflictClause;\n /** Rendered as RETURNING where the dialect supports it, else omitted+flagged. */\n readonly returning?: readonly ReturningColumn[];\n /**\n * Bind the rows as ONE typed array per column instead of one parameter per\n * value (`SqlDialect.bulkInsertForm` `\"unnest\"`, postgres): `INSERT INTO t\n * (\"a\", \"b\") SELECT \"c1\", \"c2\" FROM unnest($1::text[], $2::int4[]) WITH\n * ORDINALITY AS \"__vibe_rows\" (\"c1\", \"c2\", \"ord\") ORDER BY \"ord\"`. The text\n * is the same for 2 rows and for 3 000, and the statement binds one parameter\n * per column. `ORDER BY \"ord\"` keeps input order (sequence values, the\n * `ON CONFLICT DO NOTHING` winner).\n *\n * One entry per column, in `columns` order: the column's DECLARED type facts\n * (see {@link KeyListMember}; a `Json` entry names its storage through\n * `nativeType`). Each array binds the BASE type (`varchar`, never\n * `varchar(191)` — an explicit modifier cast truncates silently), so the\n * INSERT's own assignment applies the column's length and precision exactly\n * as it does for a VALUES parameter. `rows` stays row-major: the renderer\n * transposes it. Every cell is a plain value, SQL NULL or a\n * {@link JsonParamCell} — never `DEFAULT` or the database clock (the query\n * builder keeps VALUES for those; the renderer refuses them).\n */\n readonly unnest?: readonly KeyListMember[];\n};\n\n/** Conflicting rows are updated with these column values. */\nexport type OnConflictUpdate = {\n /** Conflict target columns (ignored by the mysql form). */\n readonly columns: readonly string[];\n /**\n * Named-constraint target: `ON CONFLICT ON CONSTRAINT \"name\" DO UPDATE`.\n * Postgres only; replaces the column-list target when present.\n */\n readonly constraint?: string;\n /**\n * Partial-index arbiter predicate, RAW SQL: `ON CONFLICT (cols) WHERE pred\n * DO UPDATE …` (postgres/sqlite; requires `columns`). Raw for the same\n * reason {@link OnConflictDoNothing.conflictWhere} is — both engines match\n * the clause against the index's OWN stored predicate structurally, so a\n * bound parameter could never match and the text mirrors the schema\n * declaration byte-for-byte. Mysql's ODKU names no target and refuses it.\n */\n readonly conflictWhere?: string;\n readonly update: Readonly<Record<string, unknown>>;\n /**\n * Guard on the update arm, BOUND parameters: `ON CONFLICT (…) DO UPDATE SET\n * … WHERE <guard>` — the conflicting row is updated (and returned) only when\n * the guard admits it; otherwise the statement writes and returns nothing.\n * Postgres has both the target row and `excluded` in scope there, so every\n * column ref must carry `table` (the target table's name), exactly as the\n * SET self-references do. Needs the `conflictUpdateWhere` capability:\n * mysql's ODKU has no WHERE and refuses it (`VIBE_UNSUPPORTED_CAPABILITY`).\n */\n readonly updateWhere?: SqlExpr;\n /**\n * Skip-unchanged guard: the conflicting row is updated only when at least\n * one of these columns' stored value differs, NULL counting as a value,\n * from the value its `update` assignment would write (each column must have\n * one). Rendered as the first member of the update arm's `WHERE`, AND-ed\n * with {@link OnConflictUpdate.updateWhere}; a skipped row writes nothing\n * and returns nothing. On ON DUPLICATE KEY UPDATE (no WHERE) the columns it\n * leaves out are assigned first, keeping their stored value when nothing\n * else would change, and the dialect itself skips the unchanged row.\n * Needs `upsertSkipUnchanged`.\n */\n readonly skipUnchanged?: readonly UnchangedColumn[];\n /**\n * The table's native row-security predicate, RAW SQL without parameters\n * (the managed policy's check, columns qualified by the target table's\n * name). With a guard on the arm ({@link OnConflictUpdate.updateWhere} or\n * {@link OnConflictUpdate.skipUnchanged}) the arm's `WHERE` becomes\n * `(<policy>) IS NOT TRUE OR (<guard>)`: PostgreSQL evaluates that `WHERE`\n * before its row-security check of the conflicting row, so a row the policy\n * hides must always take the update path and fail that check, whatever its\n * values. Ignored when the arm has no guard; refused by a dialect without\n * `nativeRowLevelSecurity`.\n */\n readonly rowPolicy?: string;\n /**\n * MySQL only, a single-row statement: the duplicate arm also runs\n * `` `column` = IF(LAST_INSERT_ID(flag), `t`.`column`, `t`.`column`) `` (a\n * self-assignment, rendered last), so the statement reports `flag` as its\n * insert id exactly when the row took the update arm — the one signal that\n * tells an inserted row from an unchanged one when the driver reports no\n * `Duplicates:` info. `flag` is a decimal literal.\n */\n readonly duplicateFlag?: { readonly column: string; readonly flag: string };\n /**\n * MySQL only (`upsertForm: \"onDuplicateKey\"`): append\n * `` `col` = LAST_INSERT_ID(`col`) `` to the update list so the UPDATE arm\n * records the addressed row's key — without it `LAST_INSERT_ID()` is stale\n * on the update arm and the read-back can resolve a wrong, unrelated row\n * (SQL review B2, live-proven on 8.4). Only meaningful for integer keys.\n */\n readonly lastInsertIdColumn?: string;\n};\n\n/**\n * One column a skip-unchanged conflict arm compares. `json`: a Json column,\n * compared as `jsonb` on postgres (its `json` type has no equality operator;\n * `\"list\"` for a Json list).\n */\nexport type UnchangedColumn = {\n readonly column: string;\n readonly json?: \"scalar\" | \"list\";\n /**\n * A column whose SQL equality can be coarser than \"the stored value would\n * not change\"; the renderer compares it exactly where the dialect needs it.\n * See {@link UnchangedExactness}.\n */\n readonly bytes?: UnchangedExactness;\n /**\n * A text column the schema declares with a folding type or collation\n * (`citext`, a `@collation` that is not byte-ordered): its equality may call\n * `'x'` and `'X'` equal on any dialect, not only under MySQL's default.\n */\n readonly folds?: true;\n /** The column is a list of `bytes`'s kind (a postgres array). */\n readonly list?: true;\n};\n\n/**\n * Why a compared column's own equality may call two different stored values\n * equal:\n * - `\"text\"`: a text column; MySQL's default `_ai_ci` collation folds case\n * and accents (and see `folds`).\n * - `\"decimal\"`: a Decimal column without a declared scale (PostgreSQL's bare\n * `numeric` keeps `1.50` and `1.5` apart, its equality does not).\n * - `\"float\"`: a float column (`-0` equals `0`).\n * - `\"other\"`: a Json or list column, or a text-like column of another\n * declared type, compared by its bytes on MySQL.\n */\nexport type UnchangedExactness = \"text\" | \"decimal\" | \"float\" | \"other\";\n\n/**\n * Conflicting rows are skipped (`createMany({ skipDuplicates: true })`).\n * An empty/absent target means \"any conflict\" — the mysql form\n * (`ON DUPLICATE KEY UPDATE k = t.k`, dialect `doNothingForm:\n * \"duplicateKeyKeep\"`) can only express that, so it ignores a bare `columns`\n * target (documented degradation) and REFUSES the refined targets below.\n */\nexport type OnConflictDoNothing = {\n /**\n * MySQL form only (`duplicateKeyKeep`): the column the duplicate arm assigns\n * to itself (`` `k` = `t`.`k` ``, a no-op). Absent = the first inserted\n * column; an all-default row (no column) must name one.\n */\n readonly keepColumn?: string;\n /**\n * MySQL form only, single-row statements: a decimal literal S (digits only).\n * The keep assignment becomes `` `k` = IF(LAST_INSERT_ID(S), `t`.`k`, `t`.`k`) ``,\n * so a skipped duplicate reports S as the statement's insert id (an inserted\n * row reports its own id, or 0) — the exact skipped verdict that the\n * affected count cannot give with CLIENT_FOUND_ROWS (an unchanged duplicate\n * counts 1, like an insert). The builder picks S unequal to the row's\n * explicit AUTO_INCREMENT value.\n */\n readonly duplicateFlag?: string;\n readonly columns?: readonly string[];\n /**\n * Partial-index target predicate, RAW SQL: `ON CONFLICT (cols) WHERE pred\n * DO NOTHING` (postgres/sqlite; requires `columns`). Raw — and rendered\n * verbatim — because BOTH engines match the clause against the index's OWN\n * stored predicate structurally: a bound parameter could never match, so\n * the text mirrors the schema declaration's `where:` string byte-for-byte.\n */\n readonly conflictWhere?: string;\n /** Named-constraint target (`ON CONSTRAINT \"name\"`) — postgres only. */\n readonly constraint?: string;\n readonly doNothing: true;\n};\n\nexport type OnConflictClause = OnConflictUpdate | OnConflictDoNothing;\n\nexport type UpdateStatement = {\n readonly kind: \"update\";\n readonly table: TableRef;\n /** The target's alias; required with {@link UpdateStatement.from}, where two relations are in scope. */\n readonly alias?: string;\n /**\n * A joined source: `UPDATE … FROM` on PostgreSQL/SQLite (its `on` AND-ed\n * before `where`), `UPDATE … JOIN … ON` on MySQL. A\n * {@link SourceColumnRef} set value reads its columns.\n */\n readonly from?: UpdateSource;\n /**\n * Column → parameter value, or an atomic {@link SetOperation}. As a\n * {@link ChainStep} only (statement-maxx lane C3), a value may be a\n * {@link StepColumnRef} to an EARLIER step: `\"col\" = (SELECT \"c\" FROM\n * \"step\")` — the step must return at most one row (an owner resolved by a\n * unique where, or an owner INSERT of one row).\n */\n readonly set: Readonly<Record<string, unknown>>;\n readonly where?: SqlExpr;\n readonly returning?: readonly ReturningColumn[];\n};\n\nexport type DeleteStatement = {\n readonly kind: \"delete\";\n readonly table: TableRef;\n readonly where?: SqlExpr;\n readonly returning?: readonly ReturningColumn[];\n};\n\n/** Native RLS DDL, kept distinct from ordinary row-query expressions. */\nexport type RlsEnableStatement = { readonly kind: \"rlsEnable\"; readonly table: string };\nexport type RlsForceStatement = { readonly kind: \"rlsForce\"; readonly table: string };\n/** Disable native row policy enforcement on a physical table. */\nexport type RlsDisableStatement = { readonly kind: \"rlsDisable\"; readonly table: string };\n/** Remove forced owner enforcement on a physical table. */\nexport type RlsNoForceStatement = { readonly kind: \"rlsNoForce\"; readonly table: string };\n/** Drop the managed policy by default, or the supplied policy name. */\nexport type RlsDropPolicyStatement = { readonly kind: \"rlsDropPolicy\"; readonly table: string; readonly policyName?: string };\nexport type RlsPolicyStatement = {\n readonly kind: \"rlsPolicy\";\n readonly schema: SchemaIR;\n readonly model: string;\n /** Probe policies use a distinct identity without changing the predicate. */\n readonly policyName?: string;\n /** Only the probe target may be temporary; parent relations always remain public. */\n readonly targetSchema?: \"public\" | \"pg_temp\";\n};\n\n/** Values are validated/serialized by runtime; null is the absent setting sentinel. */\nexport type RlsContextStatement = {\n readonly kind: \"rlsContext\";\n readonly context: RlsContextIR;\n readonly values: Readonly<Record<string, string | null>>;\n /** PGlite: bind this trusted runtime role first, in the same statement. */\n readonly role?: string;\n /** Switch the transaction to READ ONLY in the same statement, after the claims. */\n readonly readOnly?: boolean;\n /** Report the backend as `\"backendPid\"` / `\"backendStart\"` text columns. */\n readonly backend?: boolean;\n};\n\n/** Trusted pre-existing PGlite execution role; never a request-supplied principal. */\nexport type RlsRoleStatement = { readonly kind: \"rlsRole\"; readonly role: string };\n\n// ─── Advisory locks ───────────────────────────────────────────────\n\n/**\n * An advisory lock's key: a lock space the APPLICATION defines, so a resource\n * with no row of its own can still be locked.\n *\n * Two forms, exactly as PostgreSQL offers them, and they are DIFFERENT lock\n * spaces — holding `{ classId: 11, objectId: 22 }` does not block the single\n * key `11 * 2^32 + 22` (probe-verified on PostgreSQL 18.6). Pick one form per\n * resource family and stay in it.\n */\nexport type AdvisoryLockKey =\n | { readonly key: bigint }\n | { readonly classId: number; readonly objectId: number };\n\n/**\n * Take a TRANSACTION-scoped advisory lock. Released by commit and by rollback\n * (including `ROLLBACK TO SAVEPOINT` when it was taken after the savepoint —\n * probe-verified), never by an explicit unlock call, so no leak can outlive the\n * transaction on a pooled connection.\n *\n * `wait: \"nowait\"` renders the `pg_try_advisory_xact_lock*` family, whose single\n * boolean column says whether the lock was taken; `\"wait\"` renders the blocking\n * family, which returns void.\n */\nexport type AdvisoryLockStatement = {\n readonly kind: \"advisoryLock\";\n readonly mode: AdvisoryLockMode;\n readonly wait: \"wait\" | \"nowait\";\n readonly key: AdvisoryLockKey;\n};\n\n/** An ordered set of transaction-scoped bigint advisory locks. */\nexport type AdvisoryLocksStatement = {\n readonly kind: \"advisoryLocks\";\n readonly keys: readonly bigint[];\n readonly mode: AdvisoryLockMode;\n};\n\n/** The column an advisory try-lock projects its verdict into. */\nexport const ADVISORY_LOCK_RESULT_COLUMN: string = \"acquired\";\n\n// ─── Statement chains ────────────────────────────────────────────────\n\n/**\n * A cell of an {@link InsertSelectStatement} that reads a column of an EARLIER\n * chain step: `\"step\".\"column\"`. A column reference, not a parameter — the\n * value comes from the step's rows inside the same statement (a child row\n * taking its parent's key from the parent step, round-trip campaign EPIC F).\n * The step must be named in the insert's `from` list.\n */\nexport type StepColumnRef = { readonly __stepColumn: true; readonly step: string; readonly column: string };\n\n/** Reference `column` of the earlier chain step `step` from an INSERT … SELECT cell. */\nexport function stepColumnRef(params: { step: string; column: string }): StepColumnRef {\n return { __stepColumn: true, step: params.step, column: params.column };\n}\n\n/** The joined relation of an {@link UpdateStatement}: its table, alias and join condition. */\nexport type UpdateSource = UpdateTableSource | UpdateSelectSource;\n\n/** A joined table: `FROM \"table\" AS alias` (`updateMany({ from })`). */\nexport type UpdateTableSource = { readonly table: TableRef; readonly alias: string; readonly on: SqlExpr };\n\n/**\n * A joined subquery: `FROM (SELECT …) AS alias`, PostgreSQL only. With a\n * locking read of the target table it is the row as it was before the write,\n * and an {@link OtherRowReturningColumn} `from: { source: alias }` returns its\n * values (`update({ previous })`, capability `returningReadsJoinedSource`).\n */\nexport type UpdateSelectSource = { readonly select: SelectStatement; readonly alias: string; readonly on: SqlExpr };\n\n/** An UPDATE set value read from the joined source's `column` (`UPDATE … FROM`). */\nexport type SourceColumnRef = { readonly __sourceColumn: true; readonly column: string };\n\n/** Read `column` of an {@link UpdateStatement}'s joined source as a set value. */\nexport function sourceColumnRef(params: { column: string }): SourceColumnRef {\n return Object.freeze({ __sourceColumn: true, column: params.column });\n}\n\n/** Is this UPDATE set value a {@link SourceColumnRef}? */\nexport function isSourceColumnRef(value: unknown): value is SourceColumnRef {\n if (typeof value !== \"object\" || value === null) return false;\n const candidate = value as { __sourceColumn?: unknown; column?: unknown };\n return candidate.__sourceColumn === true && typeof candidate.column === \"string\" && Object.keys(value).length === 2;\n}\n\n/** Is this INSERT … SELECT cell a {@link StepColumnRef}? */\nexport function isStepColumnRef(value: unknown): value is StepColumnRef {\n return (\n typeof value === \"object\" &&\n value !== null &&\n (value as { __stepColumn?: unknown }).__stepColumn === true\n );\n}\n\n/**\n * `INSERT INTO t (cols) SELECT <cells> [FROM \"step\", …] [WHERE <expr>]\n * [RETURNING …]` — an INSERT whose ONE row is a SELECT list instead of a\n * VALUES row, so a WHERE can veto the write inside the statement and cells can\n * read earlier steps. Valid ONLY as a {@link ChainStep} statement.\n *\n * Cells take the same forms as a VALUES cell — a codec-encoded value, a\n * {@link JsonParamCell}, a {@link DbNowMarker} — plus {@link StepColumnRef}.\n * The {@link SQL_DEFAULT_CELL} is refused: `DEFAULT` is not allowed in a SELECT\n * list; an omitted column takes its default by being absent from `columns`.\n *\n * Parameter typing (O-03, probed on PostgreSQL): a bare parameter in this\n * one-row SELECT list takes the TARGET column's type, exactly as in VALUES.\n */\nexport type InsertSelectStatement = {\n readonly kind: \"insertSelect\";\n readonly table: TableRef;\n readonly columns: readonly string[];\n /** One cell per column, aligned to `columns` — deterministic parameter order. */\n readonly cells: readonly unknown[];\n /** Earlier chain steps the SELECT reads FROM, in order (absent: a one-row SELECT without FROM). */\n readonly from?: readonly string[];\n /**\n * Several source rows (round-trip campaign EPIC F): the SELECT reads them\n * from a derived table `alias`, joined after the `from` steps, and the\n * `cells` read its columns through `stepColumnRef({ step: alias, column })`.\n * See {@link ChainRowSource} for how the rows are typed.\n */\n readonly source?: ChainRowSource;\n readonly where?: SqlExpr;\n /**\n * `ON CONFLICT (<columns>) DO NOTHING` (statement-maxx lane C2): a row whose\n * conflict target already exists is skipped and not returned — the implicit\n * many-to-many join INSERT, where re-connecting an existing pair is a no-op.\n * Postgres form only (the chain renders nowhere else); at least one column.\n */\n readonly conflictDoNothing?: { readonly columns: readonly string[] };\n readonly returning?: readonly ReturningColumn[];\n};\n\n/**\n * Rows an {@link InsertSelectStatement} inserts, as ONE derived table:\n * `(SELECT <cols> FROM (VALUES (<typed NULL row>), ($1, $2), …) AS \"alias\"\n * (<cols>) OFFSET 1) AS \"alias\"`.\n *\n * Why the typed NULL row (review O-03): a bare parameter outside the INSERT's\n * own VALUES has no type, and PostgreSQL resolves an all-parameter column of a\n * VALUES list or UNION in FROM as `text` (\"column is of type integer but\n * expression is of type text\"). The first row is one `(SELECT \"col\" FROM\n * <typedBy> WHERE FALSE)` per column — a NULL of the TARGET column's exact\n * type (enums, `numeric(p,s)`, `varchar(n)`, domains and arrays included) —\n * so every parameter below takes that type, with no cast map anywhere;\n * `OFFSET 1` drops the row. (A `UNION ALL` of one-row SELECTs types the same\n * way but costs ~10× the planning time at 1000 rows — EPIC F shape gate.)\n *\n * Cells take the VALUES forms: a codec-encoded value, a {@link JsonParamCell}\n * or a {@link DbNowMarker}; the DEFAULT cell is refused (a homogeneous row set\n * omits the column instead). A cell carrying its OWN type (the Json cast, the\n * clock) must agree with the column's type under VALUES' common-type rules,\n * which are stricter than INSERT's assignment casts — the builder keeps such\n * columns out (EPIC F eligibility). Rows are read in list order, which is the\n * order the INSERT consumes them.\n */\nexport type ChainRowSource = {\n readonly alias: string;\n /** The table whose columns type the rows — normally the INSERT's own table. */\n readonly typedBy: TableRef;\n readonly columns: readonly string[];\n /** At least one row, each aligned to `columns`. */\n readonly rows: readonly (readonly unknown[])[];\n};\n\n/** What one chain step may be: a read, or a data-modifying statement with RETURNING. */\nexport type ChainStepStatement =\n | SelectStatement\n | InsertStatement\n | InsertSelectStatement\n | UpdateStatement\n | DeleteStatement;\n\n/**\n * One named step: rendered `\"name\" AS (<statement>)`. Later steps and the\n * result read it as a table (`FROM \"name\"`, `EXISTS (SELECT 1 FROM \"name\" …)`,\n * a {@link StepColumnRef}). A data-modifying step contributes the rows its\n * RETURNING list names.\n */\nexport type ChainStep = {\n readonly name: string;\n readonly statement: ChainStepStatement;\n};\n\n/**\n * The chain's final SELECT: the rows of `rowsFrom` (in that order, `UNION\n * ALL`), each projecting `columns`.\n *\n * `verdict` adds one column `alias` = `expr` to every row, AND guarantees a\n * row: when the `rowsFrom` steps return nothing, the result is exactly ONE\n * verdict row whose `columns` are all NULL. A caller recognizes it by NULL in\n * a column the steps never return as NULL (a primary key). Accounting\n * consequence: such a statement returns one row per written row OR one\n * verdict row — a caller that counts returned rows as row changes must undo a\n * verdict-row outcome (the upsert fold always rolls it back).\n */\nexport type ChainResult = {\n /** Both lists may be empty for a tally-only result: one count row, no model values. */\n readonly rowsFrom: readonly string[];\n readonly columns: readonly string[];\n readonly verdict?: { readonly alias: string; readonly expr: SqlExpr };\n /**\n * In-statement vetoes (round-trip campaign EPIC F), checked in order: when\n * `step` returned no row (fewer than `minRows`, EPIC W), the STATEMENT FAILS — so the database undoes every\n * effect of every step, trigger writes included — with an error whose\n * message carries `__vibe_veto:<token>:<nonce>:` ({@link CHAIN_VETO_PREFIX},\n * {@link chainVetoToken}). Requires `tally`: the veto is the tally column's\n * guard, so it is evaluated exactly once, on the one guaranteed result row.\n */\n readonly veto?: readonly ChainVeto[];\n /**\n * A step whose rows every veto depends on: when it returned no row, no veto\n * is checked and the statement succeeds, answering the one guaranteed row\n * with NULL columns and the tally (rendered as the first CASE arm, `WHEN NOT\n * EXISTS (SELECT 1 FROM \"step\") THEN <tally>`). A nested write whose\n * missing parent is an answer, not an error, gates its children's vetoes on\n * the parent step this way. Requires `tally` and at least one veto.\n */\n readonly vetoGate?: string;\n /**\n * One column `alias` on every result row: the number of rows the listed\n * data-modifying steps returned (their RETURNING rows = their direct\n * effects). Guarantees one row like `verdict`. Row-change accounting reads\n * it instead of counting result rows (effect `writeTally`).\n */\n readonly tally?: ChainTally;\n /**\n * Row capture ({@link ChainCapture}): per captured data-modifying step, its\n * row count and its distinct before and after images, on every result row\n * (uncorrelated scalar subqueries, evaluated once). Needs the dialect's\n * `rowCapture` capability. Rendered after every other result column, so\n * their bound limits come last.\n */\n readonly capture?: readonly ChainCapture[];\n};\n\n/**\n * One captured step of a chain ({@link ChainResult.capture}). Result columns,\n * `<alias>` being this entry's alias:\n *\n * - `<alias>_n`: `(SELECT count(*) FROM \"step\")`;\n * - `<alias>_i` (with `inserted`): the rows whose arm marker is true;\n * - `<alias>_b` / `<alias>_a` (with `before` / `after`): `(SELECT\n * array_agg(\"__vibe_i\")::text FROM (SELECT DISTINCT ARRAY[\"c0\", \"c1\"] AS\n * \"__vibe_i\" FROM \"step\" LIMIT $n) AS \"__vibe_d\")` — a two-dimensional text\n * array literal of at most `limit` distinct images, NULL when the step\n * returned no row. With `inserted`, both read the update arm's rows only\n * (`WHERE NOT` the marker), and `_a` is left out with `insertedOnly`;\n * - `<alias>_ia` (with `inserted` and `after`): the insert arm's after images\n * (`WHERE` the marker), so an upsert's after images arrive per arm.\n *\n * `before` / `after` name columns the step RETURNS (its\n * {@link CaptureReturningColumn} aliases), in image order. `limit` is bound once.\n */\nexport type ChainCapture = {\n readonly step: string;\n readonly alias: string;\n /** The step's `\"inserted\"` arm-marker column, for an `INSERT … ON CONFLICT DO UPDATE` step. */\n readonly inserted?: string;\n /** With `inserted`: images of inserted rows only — `<alias>_ia`, no `<alias>_a`. */\n readonly insertedOnly?: true;\n readonly before?: readonly string[];\n readonly after?: readonly string[];\n /** The most distinct images one image column returns: a positive safe integer, bound as a parameter. */\n readonly limit: number;\n /**\n * Child images of the step's rows, one result column `<alias>_c<j>` each: a\n * {@link CaptureCascade} whose `parent` columns name columns the step\n * RETURNS, matched by `EXISTS (SELECT 1 FROM \"step\" AS \"__vibe_k\" WHERE\n * \"__vibe_k\".\"parent\" = \"__vibe_c\".\"child\")`.\n */\n readonly cascades?: readonly CaptureCascade[];\n};\n\n/**\n * Fail the statement when `step` returned no row; `token` names the veto in the\n * error. `nonce` is bound as a PARAMETER into the marker (never SQL text): a\n * per-call random value the caller requires back in the error, so a user value\n * that merely looks like a marker is never read as a veto.\n *\n * `minRows` (EPIC W) makes the veto count-sensitive: the statement fails when\n * `step` returned FEWER rows than that (a multi-row INSERT a trigger shortened).\n * Omitted or 1 = \"no row\". A positive safe integer, rendered as SQL text.\n * `exactRows` instead requires equality, including zero. It is a nonnegative\n * safe integer and cannot combine with `minRows`.\n */\nexport type ChainVeto = { readonly step: string; readonly token: string; readonly nonce: string; readonly minRows?: number; readonly exactRows?: number };\n\n/** Count the RETURNING rows of `steps` into the result column `alias`. */\nexport type ChainTally = { readonly alias: string; readonly steps: readonly string[] };\n\n/** Marker every chain veto error message carries, followed by `<token>:<nonce>:`. */\nexport const CHAIN_VETO_PREFIX: string = \"__vibe_veto:\";\n\n/** Allowed veto tokens: lower-case words — they are rendered into SQL text. */\nexport const CHAIN_VETO_TOKEN_PATTERN: RegExp = /^[a-z][a-z0-9_]*$/;\n\n/**\n * The veto token a database error message carries for this `nonce`, or\n * `undefined`. Matches the marker anywhere in the text, so a localized server\n * message (`lc_messages`) still yields it: the marker is the invalid VALUE the\n * message quotes. A marker without the caller's nonce is not a veto.\n */\nexport function chainVetoToken(params: { message: string; nonce: string }): string | undefined {\n const { message, nonce } = params;\n if (nonce === \"\") return undefined;\n for (let start = message.indexOf(CHAIN_VETO_PREFIX); start >= 0; start = message.indexOf(CHAIN_VETO_PREFIX, start + 1)) {\n const rest = message.slice(start + CHAIN_VETO_PREFIX.length);\n const match = /^([a-z][a-z0-9_]*):/.exec(rest);\n if (match !== null && rest.startsWith(`${nonce}:`, match[0].length)) return match[1];\n }\n return undefined;\n}\n\n/**\n * ONE statement made of an ordered chain of named steps — reads (a locked\n * probe) and data-modifying statements with RETURNING — ending in a final\n * SELECT over them (round-trip campaign EPIC 4, reused by EPIC F). Renders as\n * `WITH \"a\" AS (…), \"b\" AS (…) SELECT …` on a dialect whose\n * `statementChain` strategy names the form (postgres); every other dialect\n * refuses at render time (`VIBE_UNSUPPORTED_CAPABILITY`) — callers gate on\n * the strategy first and keep their multi-statement path there.\n *\n * PostgreSQL semantics the builder relies on: every step sees ONE snapshot\n * (a step never sees another step's writes — only its RETURNING rows), steps\n * that reference a step run after it, and the statement is atomic: an error in\n * any step undoes every step's effects, trigger writes included.\n */\nexport type ChainStatement = {\n readonly kind: \"chain\";\n readonly steps: readonly ChainStep[];\n readonly result: ChainResult;\n};\n\nexport type SqlStatement = SelectStatement | InsertStatement | UpdateStatement | DeleteStatement |\n RlsEnableStatement | RlsForceStatement | RlsDisableStatement | RlsNoForceStatement | RlsDropPolicyStatement |\n RlsPolicyStatement | RlsContextStatement | RlsRoleStatement | AdvisoryLockStatement | AdvisoryLocksStatement | ChainStatement;\n\n/** Readiness statements remain distinct from application queries. */\nexport type RlsReadinessStatement = { readonly kind: \"rlsReadiness\"; readonly query: RlsReadinessQuery; readonly searchPath?: string };\n/** Temporary clone lifecycle surrounding a desired-policy probe. */\nexport type RlsProbeTableStatement = { readonly kind: \"rlsProbeTable\"; readonly table: string; readonly action: \"create\" | \"drop\" };\n/** Migration transaction-local policy search-path scope. */\nexport type RlsPolicyPathStatement = { readonly kind: \"rlsPolicyPath\"; readonly stage: \"save\" | \"empty\" | \"restore\" };\n",
11
+ "/**\n * `$.a.b[0]` path string for sqlite/mysql — always bound, never spliced.\n * @internal\n */\nexport function jsonPathString(path: readonly (string | number)[]): string {\n let out = \"$\";\n for (const segment of path) {\n if (typeof segment === \"number\") {\n out += `[${segment}]`;\n } else if (/^[A-Za-z_][A-Za-z0-9_]*$/.test(segment)) {\n out += `.${segment}`;\n } else {\n // A quoted key uses JSON-string escaping in both engines' path syntax:\n // the backslash FIRST, or a key containing one silently matches nothing.\n out += `.\"${segment.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll('\"', '\\\\\"')}\"`;\n }\n }\n return out;\n}\n",
11
12
  "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/** Complete catalog ownership edges, including endpoints outside the migration namespace. */\nexport function renderExternalOwnershipCatalog(params: { dialect: SqlDialect; operation: \"namespaces\" | \"inheritance\" | \"ownedSequences\" | \"foreignKeys\" }): RenderedQuery {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"externalObjects\" });\n const scope = \"n.nspname <> 'information_schema' AND n.nspname NOT LIKE 'pg\\\\_%' ESCAPE '\\\\' AND n.nspname NOT IN ('_vibeorm_shadow', '_vibe_shadow')\";\n let text: string;\n switch (params.operation) {\n case \"namespaces\": text = `SELECT n.nspname::text AS namespace, has_schema_privilege(n.oid, 'USAGE') AS visible FROM pg_catalog.pg_namespace n WHERE ${scope} ORDER BY n.nspname`; break;\n case \"inheritance\": text = `SELECT n.nspname::text AS namespace, c.relname::text AS name, pn.nspname::text AS \"parentNamespace\", p.relname::text AS \"parentName\" FROM pg_catalog.pg_inherits i JOIN pg_catalog.pg_class c ON c.oid = i.inhrelid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace JOIN pg_catalog.pg_class p ON p.oid = i.inhparent JOIN pg_catalog.pg_namespace pn ON pn.oid = p.relnamespace WHERE ${scope} ORDER BY n.nspname, c.relname, pn.nspname, p.relname`; break;\n case \"ownedSequences\": text = `SELECT n.nspname::text AS namespace, s.relname::text AS name, tn.nspname::text AS \"tableNamespace\", t.relname::text AS \"tableName\" FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_class s ON s.oid = d.objid AND s.relkind = 'S' JOIN pg_catalog.pg_namespace n ON n.oid = s.relnamespace JOIN pg_catalog.pg_class t ON t.oid = d.refobjid JOIN pg_catalog.pg_namespace tn ON tn.oid = t.relnamespace WHERE d.classid = 'pg_class'::regclass AND d.refclassid = 'pg_class'::regclass AND d.deptype IN ('a', 'i') AND d.refobjsubid > 0 AND ${scope} ORDER BY n.nspname, s.relname`; break;\n case \"foreignKeys\": text = `SELECT n.nspname::text AS namespace, t.relname::text AS table, rn.nspname::text AS \"refNamespace\", r.relname::text AS \"refTable\", c.conname::text AS name FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class t ON t.oid = c.conrelid JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace JOIN pg_catalog.pg_class r ON r.oid = c.confrelid JOIN pg_catalog.pg_namespace rn ON rn.oid = r.relnamespace WHERE c.contype = 'f' AND ${scope} ORDER BY n.nspname, t.relname, c.conname`; break;\n }\n return { text, values: [], returning: \"none\" };\n}\n",
12
13
  "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n/** An application type, relation or column whose planned drop or retype must not break another owner's objects. */\nexport type ExternalDependentTarget =\n | { readonly kind: \"type\" | \"relation\"; readonly namespace: string; readonly name: string }\n | { readonly kind: \"column\"; readonly namespace: string; readonly name: string; readonly column: string };\n\n/**\n * Normal (`deptype = 'n'`) catalog dependents of each target, answered per\n * target position. A target covers its array type; a relation also covers its\n * row type, and a relation or column also covers the sequences it owns\n * (identity and serial), whose dependents are what a drop would break. Each\n * dependent is anchored to its relation (columns, defaults, view rules,\n * triggers, table constraints, policies, composite types) or to its own\n * namespace and name (routines, domains), so ownership can be decided outside\n * SQL. Read-only.\n */\nexport function renderExternalDependents(params: { dialect: SqlDialect; targets: readonly ExternalDependentTarget[] }): RenderedQuery {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"externalObjects\" });\n const collector = new ParamCollector(params.dialect);\n const requests = params.targets.map((target, position) => ({ position, kind: target.kind, namespace: target.namespace, name: target.name, column: target.kind === \"column\" ? target.column : null }));\n // Bind serialized JSON as text; a jsonb wire parameter is JSON-encoded again by Bun.\n const request = collector.add(JSON.stringify(requests));\n const text = `WITH request AS (\n SELECT * FROM jsonb_to_recordset(${request}::text::jsonb) AS request(position integer, kind text, namespace text, name text, \"column\" text)\n), target AS (\n SELECT request.position, 'pg_type'::regclass AS classid, t.oid AS objid, NULL::integer AS objsubid FROM request JOIN pg_catalog.pg_namespace n ON n.nspname = request.namespace JOIN pg_catalog.pg_type t ON t.typnamespace = n.oid AND t.typname = request.name WHERE request.kind = 'type'\n UNION ALL SELECT request.position, 'pg_class'::regclass, c.oid, a.attnum::integer FROM request JOIN pg_catalog.pg_namespace n ON n.nspname = request.namespace JOIN pg_catalog.pg_class c ON c.relnamespace = n.oid AND c.relname = request.name LEFT JOIN pg_catalog.pg_attribute a ON request.kind = 'column' AND a.attrelid = c.oid AND a.attname = request.\"column\" AND NOT a.attisdropped WHERE request.kind = 'relation' OR request.kind = 'column' AND a.attnum IS NOT NULL\n), owned AS (\n SELECT position, classid, objid, objsubid FROM target\n UNION SELECT target.position, 'pg_type'::regclass, c.reltype, NULL FROM target JOIN pg_catalog.pg_class c ON c.oid = target.objid WHERE target.classid = 'pg_class'::regclass AND target.objsubid IS NULL AND c.reltype <> 0\n UNION SELECT target.position, 'pg_class'::regclass, s.oid, NULL FROM target JOIN pg_catalog.pg_depend sd ON sd.refclassid = target.classid AND sd.refobjid = target.objid AND (target.objsubid IS NULL OR sd.refobjsubid = target.objsubid) AND sd.classid = 'pg_class'::regclass AND sd.deptype IN ('a', 'i') JOIN pg_catalog.pg_class s ON s.oid = sd.objid AND s.relkind = 'S'\n), referenced AS (\n SELECT position, classid, objid, objsubid FROM owned\n UNION SELECT owned.position, 'pg_type'::regclass, t.typarray, NULL FROM owned JOIN pg_catalog.pg_type t ON t.oid = owned.objid WHERE owned.classid = 'pg_type'::regclass AND t.typarray <> 0\n)\nSELECT DISTINCT referenced.position, dependent.type AS \"dependentType\", dependent.identity AS \"dependentIdentity\", ref.identity AS referenced, d.classid::regclass::text AS \"dependentClass\",\n rn.nspname::text AS \"relationNamespace\", rel.relname::text AS \"relationName\", rel.relkind::text AS \"relationKind\", col.attname::text AS \"columnName\",\n COALESCE(pn.nspname, tn.nspname, dependent.schema)::text AS \"objectNamespace\", COALESCE(p.proname, ty.typname)::text AS \"objectName\"\nFROM referenced\nJOIN pg_catalog.pg_depend d ON d.refclassid = referenced.classid AND d.refobjid = referenced.objid AND (referenced.objsubid IS NULL OR d.refobjsubid = referenced.objsubid) AND d.deptype = 'n'\nCROSS JOIN LATERAL pg_catalog.pg_identify_object(d.classid, d.objid, d.objsubid) dependent\nCROSS JOIN LATERAL pg_catalog.pg_identify_object(d.refclassid, d.refobjid, d.refobjsubid) ref\nLEFT JOIN pg_catalog.pg_class self ON d.classid = 'pg_class'::regclass AND self.oid = d.objid\nLEFT JOIN pg_catalog.pg_index ix ON ix.indexrelid = self.oid\nLEFT JOIN pg_catalog.pg_attrdef ad ON d.classid = 'pg_attrdef'::regclass AND ad.oid = d.objid\nLEFT JOIN pg_catalog.pg_rewrite rw ON d.classid = 'pg_rewrite'::regclass AND rw.oid = d.objid\nLEFT JOIN pg_catalog.pg_trigger tg ON d.classid = 'pg_trigger'::regclass AND tg.oid = d.objid\nLEFT JOIN pg_catalog.pg_constraint con ON d.classid = 'pg_constraint'::regclass AND con.oid = d.objid\nLEFT JOIN pg_catalog.pg_policy pol ON d.classid = 'pg_policy'::regclass AND pol.oid = d.objid\nLEFT JOIN pg_catalog.pg_type ty ON d.classid = 'pg_type'::regclass AND ty.oid = d.objid\nLEFT JOIN pg_catalog.pg_namespace tn ON tn.oid = ty.typnamespace\nLEFT JOIN pg_catalog.pg_proc p ON d.classid = 'pg_proc'::regclass AND p.oid = d.objid\nLEFT JOIN pg_catalog.pg_namespace pn ON pn.oid = p.pronamespace\nLEFT JOIN pg_catalog.pg_class rel ON rel.oid = COALESCE(ix.indrelid, self.oid, ad.adrelid, rw.ev_class, tg.tgrelid, NULLIF(con.conrelid, 0), pol.polrelid, NULLIF(ty.typrelid, 0))\nLEFT JOIN pg_catalog.pg_namespace rn ON rn.oid = rel.relnamespace\nLEFT JOIN pg_catalog.pg_attribute col ON col.attrelid = rel.oid AND col.attnum = CASE WHEN self.oid IS NOT NULL AND d.objsubid > 0 THEN d.objsubid WHEN ad.oid IS NOT NULL THEN ad.adnum END\nORDER BY 1, 2, 3, 4`;\n return { text, values: collector.values, returning: \"none\" };\n}\n",
13
14
  "/** Parameter transport and the single placeholder-index producer. */\nimport { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { isSqlBindingCollector, recordSqlBinding, renderSqlParameterTransport, sqlParameterTransport, sqlParameterWireValue } from \"./sql-bindings.ts\";\n\nexport class ParamCollector {\n private readonly dialect: SqlDialect;\n private reserved: number = 0;\n readonly values: unknown[];\n\n constructor(dialect: SqlDialect) {\n this.dialect = dialect;\n this.values = [];\n }\n\n /** @internal Allocate recorded positions without inserting sample values. */\n reserve(): string {\n const index = isSqlBindingCollector({ collector: this }) ? ++this.reserved : this.values.length;\n return this.dialect.placeholder({ index });\n }\n\n /** Actual positional slots, including repeats of a named input. */\n count(): number {\n return isSqlBindingCollector({ collector: this }) ? this.reserved : this.values.length;\n }\n\n /** Register one value; ordinary and reusable paths share transport spelling. */\n add(value: unknown): string {\n const transport = sqlParameterTransport({ value });\n if (isSqlBindingCollector({ collector: this })) return recordSqlBinding({\n collector: this, source: { kind: \"literal\", value }, transport, encode: (params) => params.value,\n });\n if (transport.kind !== \"plain\" && !this.dialect.capabilities.scalarArrays) throw unsupportedCapability({ dialect: this.dialect.name, feature: \"scalarArrays\" });\n this.values.push(sqlParameterWireValue({ value }));\n return renderSqlParameterTransport({ dialect: this.dialect, placeholder: this.reserve(), transport });\n }\n\n /** Register many values in positional order. */\n addMany(values: readonly unknown[]): string[] {\n return values.map((value) => this.add(value));\n }\n}\n",
14
- "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport type { ParamCollector } from \"./params.ts\";\nimport { snapshotSqlValue } from \"./parameter-snapshot.ts\";\nimport { isJsonListParameter } from \"./json-list-parameter.ts\";\nimport { isNativeEnumArrayParameter } from \"./native-enum-parameter.ts\";\nimport { toPgArrayLiteral } from \"./pg-array.ts\";\nimport { sqlInputScopeKeys, sqlParamKey } from \"./sql-input.ts\";\nimport type { SqlInputContract, SqlInputScope, SqlParam } from \"./sql-input.ts\";\n\n/** @internal Declared SQL transport is separate from execution-time values. */\nexport type SqlParameterTransport =\n | { readonly kind: \"plain\" }\n | { readonly kind: \"native-enum-array\"; readonly type: QualifiedSqlName }\n | { readonly kind: \"json-list\"; readonly storage: \"json\" | \"jsonb\"; readonly whole: boolean };\n/** @internal A binding reads a captured literal or one named input. */\nexport type SqlBindingSource = { readonly kind: \"literal\"; readonly value: unknown } | { readonly kind: \"input\"; readonly param: SqlParam<unknown> };\n/** @internal Value work reused by ordinary and structural parameter emission. */\nexport type SqlBindingEncoder = (params: { readonly value: unknown; readonly dialect: SqlDialect }) => unknown;\ndeclare const programBrand: unique symbol;\n/** @internal Binding programs are authentic and never expose their captured values. */\nexport type SqlBindingProgram = { readonly [programBrand]: true };\ntype Slot = { readonly kind: \"slot\"; readonly source: SqlBindingSource; readonly key?: string; readonly transport: SqlParameterTransport; readonly encode: SqlBindingEncoder; readonly rejectNull: boolean; readonly validate?: (value: unknown) => void };\ntype Step = Slot | { readonly kind: \"check\"; readonly check: () => void };\ntype Recording = { readonly dialect: SqlDialect; readonly scope: SqlInputScope; readonly steps: Step[]; readonly contracts: Map<string, SqlInputContract>; readonly used: Set<string> };\ntype ProgramState = { readonly dialect: SqlDialect; readonly keys: readonly string[]; readonly steps: readonly Step[] };\nconst recordings = new WeakMap<ParamCollector, Recording>();\nconst programs = new WeakMap<object, ProgramState>();\n\nfunction invalid(message: string): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message });\n}\nfunction unsupported(message: string): never {\n throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message });\n}\n\n/** @internal Inspect already captured data only; never invoke an encoder. */\nexport function sqlParameterTransport(params: { value: unknown }): SqlParameterTransport {\n if (isNativeEnumArrayParameter(params.value)) return { kind: \"native-enum-array\", type: params.value.type };\n if (isJsonListParameter(params.value)) return { kind: \"json-list\", storage: params.value.storage, whole: typeof params.value.value !== \"string\" };\n return { kind: \"plain\" };\n}\n\n/** @internal Shared ordinary/reusable placeholder suffixes. */\nexport function renderSqlParameterTransport(params: { dialect: SqlDialect; placeholder: string; transport: SqlParameterTransport }): string {\n const { dialect, placeholder, transport } = params;\n if (transport.kind === \"plain\") return placeholder;\n if (!dialect.capabilities.scalarArrays) throw unsupportedCapability({ dialect: dialect.name, feature: \"scalarArrays\" });\n if (transport.kind === \"native-enum-array\") return `${placeholder}::${dialect.quoteIdent({ name: transport.type.namespace })}.${dialect.quoteIdent({ name: transport.type.name })}[]`;\n return `${placeholder}::text::${transport.storage}${transport.whole ? \"[]\" : \"\"}`;\n}\n\n/** @internal Shared marker unwrapping; ordinary admission remains unchanged. */\nexport function sqlParameterWireValue(params: { value: unknown }): unknown {\n if (isNativeEnumArrayParameter(params.value)) return params.value.value;\n if (isJsonListParameter(params.value)) return typeof params.value.value === \"string\" ? params.value.value : toPgArrayLiteral({ values: params.value.value });\n return params.value;\n}\n\n/** @internal Detect structural recording without changing normal collector callers. */\nexport function isSqlBindingCollector(params: { collector: ParamCollector }): boolean {\n return recordings.has(params.collector);\n}\n\n/** @internal Start one compiler pass with no execution values. */\nexport function startSqlBindingCollection(params: { collector: ParamCollector; dialect: SqlDialect; scope: SqlInputScope }): void {\n sqlInputScopeKeys({ scope: params.scope });\n if (recordings.has(params.collector)) invalid(\"SQL binding collection was already started\");\n recordings.set(params.collector, { dialect: params.dialect, scope: params.scope, steps: [], contracts: new Map(), used: new Set() });\n}\n\nfunction contractShape(contract: SqlInputContract): string {\n return JSON.stringify({ scalar: contract.scalar, nullable: contract.nullable, list: contract.list, nativeType: contract.nativeType,\n enumValues: contract.enumValues, enumType: contract.enumType === undefined ? undefined : [contract.enumType.namespace, contract.enumType.name], jsonStorage: contract.jsonStorage });\n}\n\nfunction sameContract(left: SqlInputContract, right: SqlInputContract): boolean {\n return left.encoder === right.encoder && left.columnIdentity === right.columnIdentity && contractShape(left) === contractShape(right);\n}\n\n/** @internal Register an encoded slot without executing its encoder. */\nexport function recordSqlBinding(params: {\n collector: ParamCollector;\n source: SqlBindingSource;\n contract?: SqlInputContract;\n transport: SqlParameterTransport;\n encode: SqlBindingEncoder;\n rejectNull?: boolean;\n validate?: (value: unknown) => void;\n}): string {\n const state = recordings.get(params.collector) ?? invalid(\"SQL input tokens require execution through their reusable template\");\n let key: string | undefined;\n if (params.source.kind === \"input\") {\n key = sqlParamKey({ param: params.source.param, scope: state.scope });\n if (params.contract === undefined) invalid(\"Named SQL inputs require an effective encoding contract\");\n const previous = state.contracts.get(key);\n if (previous !== undefined && !sameContract(previous, params.contract)) invalid(`SQL input \"${key}\" has incompatible encoding contracts`);\n state.contracts.set(key, params.contract);\n state.used.add(key);\n }\n const transport: SqlParameterTransport = params.transport.kind === \"native-enum-array\"\n ? Object.freeze({ ...params.transport, type: Object.freeze({ ...params.transport.type }) }) : Object.freeze({ ...params.transport });\n const source: SqlBindingSource = params.source.kind === \"literal\" ? Object.freeze({ kind: \"literal\", value: snapshotSqlValue(params.source.value) }) : Object.freeze({ ...params.source });\n const placeholder = params.collector.reserve();\n const text = renderSqlParameterTransport({ dialect: state.dialect, placeholder, transport });\n state.steps.push(Object.freeze({ kind: \"slot\", source, key, transport, encode: params.encode, rejectNull: params.rejectNull === true, ...(params.validate === undefined ? {} : { validate: params.validate }) }));\n return text;\n}\n\n/** @internal Retain per-call validation when a fixed NULL frame emits no slot. */\nexport function recordSqlBindingCheck(params: { collector: ParamCollector; check: () => void }): void {\n const state = recordings.get(params.collector) ?? invalid(\"Expected a structural SQL collector\");\n state.steps.push(Object.freeze({ kind: \"check\", check: params.check }));\n}\n\n/** @internal Seal the rendered program after checking actual emitted input usage. */\nexport function finishSqlBindingCollection(params: { collector: ParamCollector }): SqlBindingProgram {\n const state = recordings.get(params.collector) ?? invalid(\"Expected a structural SQL collector\");\n const keys = sqlInputScopeKeys({ scope: state.scope });\n for (const key of keys) if (!state.used.has(key)) invalid(`Declared SQL input \"${key}\" is unused by the finished query`);\n const program = Object.freeze(Object.create(null)) as SqlBindingProgram;\n programs.set(program, { dialect: state.dialect, keys, steps: Object.freeze([...state.steps]) });\n return program;\n}\n\nfunction inputSnapshot(params: { keys: readonly string[]; value: unknown; isHandle: (value: object) => boolean }): Record<string, unknown> {\n const value = params.value === undefined && params.keys.length === 0 ? Object.create(null) as object : params.value;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) invalid(\"Reusable SQL parameters require an exact plain record\");\n const prototype: unknown = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) invalid(\"Reusable SQL parameters require a plain record without inherited inputs\");\n const own = Reflect.ownKeys(value);\n if (own.length !== params.keys.length || own.some((key) => typeof key !== \"string\" || !params.keys.includes(key))) invalid(\"Reusable SQL parameters must contain exactly the declared names\");\n const descriptors = params.keys.map((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !(\"value\" in descriptor) || descriptor.value === undefined) invalid(`SQL input \"${key}\" must be an own defined data property`);\n return { key, value: descriptor.value as unknown };\n });\n const snapshot: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n // Every declared value is snapshotted, and handles refused, before any slot encoder runs.\n for (const entry of descriptors) snapshot[entry.key] = snapshotSqlValue(entry.value, new Set(), params.isHandle);\n return snapshot;\n}\n\nfunction sameTransport(left: SqlParameterTransport, right: SqlParameterTransport): boolean {\n if (left.kind !== right.kind) return false;\n if (left.kind === \"native-enum-array\" && right.kind === \"native-enum-array\") return left.type.namespace === right.type.namespace && left.type.name === right.type.name;\n if (left.kind === \"json-list\" && right.kind === \"json-list\") return left.storage === right.storage && left.whole === right.whole;\n return true;\n}\n\n/** @internal Snapshot and bind synchronously; no cache entry retains this call's values. */\nexport function bindSqlBindingProgram(params: { program: SqlBindingProgram; params?: unknown; isHandle: (value: object) => boolean }): unknown[] {\n const state = programs.get(params.program) ?? invalid(\"Expected an authentic SQL binding program\");\n const inputs = inputSnapshot({ keys: state.keys, value: params.params, isHandle: params.isHandle });\n const encodedInputs = new Map<string, unknown>();\n const values: unknown[] = [];\n for (const step of state.steps) {\n if (step.kind === \"check\") { step.check(); continue; }\n const value = step.source.kind === \"literal\" ? step.source.value : inputs[step.key!];\n step.validate?.(value);\n if (step.rejectNull && value === null) invalid(\"SQL comparison and membership inputs cannot be SQL NULL; use isNull\");\n let encoded: unknown;\n if (step.key !== undefined && encodedInputs.has(step.key)) encoded = encodedInputs.get(step.key);\n else {\n encoded = snapshotSqlValue(step.encode({ value: snapshotSqlValue(value), dialect: state.dialect }));\n if (step.key !== undefined) encodedInputs.set(step.key, encoded);\n }\n step.validate?.(encoded);\n if (step.rejectNull && encoded === null) invalid(\"SQL comparison and membership encoders cannot produce SQL NULL; use isNull\");\n if (encoded !== null && !sameTransport(step.transport, sqlParameterTransport({ value: encoded }))) unsupported(\"A reusable SQL encoder produced an undeclared parameter transport shape\");\n values.push(snapshotSqlValue(sqlParameterWireValue({ value: encoded })));\n }\n return values;\n}\n",
15
+ "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport type { ParamCollector } from \"./params.ts\";\nimport { snapshotSqlValue } from \"./parameter-snapshot.ts\";\nimport { isJsonListParameter } from \"./json-list-parameter.ts\";\nimport { isNativeEnumArrayParameter } from \"./native-enum-parameter.ts\";\nimport { toPgArrayLiteral } from \"./pg-array.ts\";\nimport { sqlInputScopeKeys, sqlParamKey } from \"./sql-input.ts\";\nimport type { SqlInputContract, SqlInputScope, SqlParam } from \"./sql-input.ts\";\n\n/** Declared SQL transport is separate from execution-time values. */\nexport type SqlParameterTransport =\n | { readonly kind: \"plain\" }\n | { readonly kind: \"native-enum-array\"; readonly type: QualifiedSqlName }\n | { readonly kind: \"json-list\"; readonly storage: \"json\" | \"jsonb\"; readonly whole: boolean };\n/** A binding reads a captured literal or one named input. */\nexport type SqlBindingSource = { readonly kind: \"literal\"; readonly value: unknown } | { readonly kind: \"input\"; readonly param: SqlParam<unknown> };\n/** Value work reused by ordinary and structural parameter emission. */\nexport type SqlBindingEncoder = (params: { readonly value: unknown; readonly dialect: SqlDialect }) => unknown;\ndeclare const programBrand: unique symbol;\n/** @internal Binding programs are authentic and never expose their captured values. */\nexport type SqlBindingProgram = { readonly [programBrand]: true };\ntype Slot = { readonly kind: \"slot\"; readonly source: SqlBindingSource; readonly key?: string; readonly transport: SqlParameterTransport; readonly encode: SqlBindingEncoder; readonly rejectNull: boolean; readonly validate?: (value: unknown) => void };\ntype Step = Slot | { readonly kind: \"check\"; readonly check: () => void };\ntype Recording = { readonly dialect: SqlDialect; readonly scope: SqlInputScope; readonly steps: Step[]; readonly contracts: Map<string, SqlInputContract>; readonly used: Set<string> };\ntype ProgramState = { readonly dialect: SqlDialect; readonly keys: readonly string[]; readonly steps: readonly Step[] };\nconst recordings = new WeakMap<ParamCollector, Recording>();\nconst programs = new WeakMap<object, ProgramState>();\n\nfunction invalid(message: string): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message });\n}\nfunction unsupported(message: string): never {\n throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message });\n}\n\n/** @internal Inspect already captured data only; never invoke an encoder. */\nexport function sqlParameterTransport(params: { value: unknown }): SqlParameterTransport {\n if (isNativeEnumArrayParameter(params.value)) return { kind: \"native-enum-array\", type: params.value.type };\n if (isJsonListParameter(params.value)) return { kind: \"json-list\", storage: params.value.storage, whole: typeof params.value.value !== \"string\" };\n return { kind: \"plain\" };\n}\n\n/** @internal Shared ordinary/reusable placeholder suffixes. */\nexport function renderSqlParameterTransport(params: { dialect: SqlDialect; placeholder: string; transport: SqlParameterTransport }): string {\n const { dialect, placeholder, transport } = params;\n if (transport.kind === \"plain\") return placeholder;\n if (!dialect.capabilities.scalarArrays) throw unsupportedCapability({ dialect: dialect.name, feature: \"scalarArrays\" });\n if (transport.kind === \"native-enum-array\") return `${placeholder}::${dialect.quoteIdent({ name: transport.type.namespace })}.${dialect.quoteIdent({ name: transport.type.name })}[]`;\n return `${placeholder}::text::${transport.storage}${transport.whole ? \"[]\" : \"\"}`;\n}\n\n/** @internal Shared marker unwrapping; ordinary admission remains unchanged. */\nexport function sqlParameterWireValue(params: { value: unknown }): unknown {\n if (isNativeEnumArrayParameter(params.value)) return params.value.value;\n if (isJsonListParameter(params.value)) return typeof params.value.value === \"string\" ? params.value.value : toPgArrayLiteral({ values: params.value.value });\n return params.value;\n}\n\n/** Detect structural recording without changing normal collector callers. */\nexport function isSqlBindingCollector(params: { collector: ParamCollector }): boolean {\n return recordings.has(params.collector);\n}\n\n/** @internal Start one compiler pass with no execution values. */\nexport function startSqlBindingCollection(params: { collector: ParamCollector; dialect: SqlDialect; scope: SqlInputScope }): void {\n sqlInputScopeKeys({ scope: params.scope });\n if (recordings.has(params.collector)) invalid(\"SQL binding collection was already started\");\n recordings.set(params.collector, { dialect: params.dialect, scope: params.scope, steps: [], contracts: new Map(), used: new Set() });\n}\n\nfunction contractShape(contract: SqlInputContract): string {\n return JSON.stringify({ scalar: contract.scalar, nullable: contract.nullable, list: contract.list, nativeType: contract.nativeType,\n enumValues: contract.enumValues, enumType: contract.enumType === undefined ? undefined : [contract.enumType.namespace, contract.enumType.name], jsonStorage: contract.jsonStorage });\n}\n\nfunction sameContract(left: SqlInputContract, right: SqlInputContract): boolean {\n return left.encoder === right.encoder && left.columnIdentity === right.columnIdentity && contractShape(left) === contractShape(right);\n}\n\n/** Register an encoded slot without executing its encoder. */\nexport function recordSqlBinding(params: {\n collector: ParamCollector;\n source: SqlBindingSource;\n contract?: SqlInputContract;\n transport: SqlParameterTransport;\n encode: SqlBindingEncoder;\n rejectNull?: boolean;\n validate?: (value: unknown) => void;\n}): string {\n const state = recordings.get(params.collector) ?? invalid(\"SQL input tokens require execution through their reusable template\");\n let key: string | undefined;\n if (params.source.kind === \"input\") {\n key = sqlParamKey({ param: params.source.param, scope: state.scope });\n if (params.contract === undefined) invalid(\"Named SQL inputs require an effective encoding contract\");\n const previous = state.contracts.get(key);\n if (previous !== undefined && !sameContract(previous, params.contract)) invalid(`SQL input \"${key}\" has incompatible encoding contracts`);\n state.contracts.set(key, params.contract);\n state.used.add(key);\n }\n const transport: SqlParameterTransport = params.transport.kind === \"native-enum-array\"\n ? Object.freeze({ ...params.transport, type: Object.freeze({ ...params.transport.type }) }) : Object.freeze({ ...params.transport });\n const source: SqlBindingSource = params.source.kind === \"literal\" ? Object.freeze({ kind: \"literal\", value: snapshotSqlValue(params.source.value) }) : Object.freeze({ ...params.source });\n const placeholder = params.collector.reserve();\n const text = renderSqlParameterTransport({ dialect: state.dialect, placeholder, transport });\n state.steps.push(Object.freeze({ kind: \"slot\", source, key, transport, encode: params.encode, rejectNull: params.rejectNull === true, ...(params.validate === undefined ? {} : { validate: params.validate }) }));\n return text;\n}\n\n/** Retain per-call validation when a fixed NULL frame emits no slot. */\nexport function recordSqlBindingCheck(params: { collector: ParamCollector; check: () => void }): void {\n const state = recordings.get(params.collector) ?? invalid(\"Expected a structural SQL collector\");\n state.steps.push(Object.freeze({ kind: \"check\", check: params.check }));\n}\n\n/** @internal Seal the rendered program after checking actual emitted input usage. */\nexport function finishSqlBindingCollection(params: { collector: ParamCollector }): SqlBindingProgram {\n const state = recordings.get(params.collector) ?? invalid(\"Expected a structural SQL collector\");\n const keys = sqlInputScopeKeys({ scope: state.scope });\n for (const key of keys) if (!state.used.has(key)) invalid(`Declared SQL input \"${key}\" is unused by the finished query`);\n const program = Object.freeze(Object.create(null)) as SqlBindingProgram;\n programs.set(program, { dialect: state.dialect, keys, steps: Object.freeze([...state.steps]) });\n return program;\n}\n\nfunction inputSnapshot(params: { keys: readonly string[]; value: unknown; isHandle: (value: object) => boolean }): Record<string, unknown> {\n const value = params.value === undefined && params.keys.length === 0 ? Object.create(null) as object : params.value;\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) invalid(\"Reusable SQL parameters require an exact plain record\");\n const prototype: unknown = Object.getPrototypeOf(value);\n if (prototype !== Object.prototype && prototype !== null) invalid(\"Reusable SQL parameters require a plain record without inherited inputs\");\n const own = Reflect.ownKeys(value);\n if (own.length !== params.keys.length || own.some((key) => typeof key !== \"string\" || !params.keys.includes(key))) invalid(\"Reusable SQL parameters must contain exactly the declared names\");\n const descriptors = params.keys.map((key) => {\n const descriptor = Object.getOwnPropertyDescriptor(value, key);\n if (descriptor === undefined || !(\"value\" in descriptor) || descriptor.value === undefined) invalid(`SQL input \"${key}\" must be an own defined data property`);\n return { key, value: descriptor.value as unknown };\n });\n const snapshot: Record<string, unknown> = Object.create(null) as Record<string, unknown>;\n // Every declared value is snapshotted, and handles refused, before any slot encoder runs.\n for (const entry of descriptors) snapshot[entry.key] = snapshotSqlValue(entry.value, new Set(), params.isHandle);\n return snapshot;\n}\n\nfunction sameTransport(left: SqlParameterTransport, right: SqlParameterTransport): boolean {\n if (left.kind !== right.kind) return false;\n if (left.kind === \"native-enum-array\" && right.kind === \"native-enum-array\") return left.type.namespace === right.type.namespace && left.type.name === right.type.name;\n if (left.kind === \"json-list\" && right.kind === \"json-list\") return left.storage === right.storage && left.whole === right.whole;\n return true;\n}\n\n/** @internal Snapshot and bind synchronously; no cache entry retains this call's values. */\nexport function bindSqlBindingProgram(params: { program: SqlBindingProgram; params?: unknown; isHandle: (value: object) => boolean }): unknown[] {\n const state = programs.get(params.program) ?? invalid(\"Expected an authentic SQL binding program\");\n const inputs = inputSnapshot({ keys: state.keys, value: params.params, isHandle: params.isHandle });\n const encodedInputs = new Map<string, unknown>();\n const values: unknown[] = [];\n for (const step of state.steps) {\n if (step.kind === \"check\") { step.check(); continue; }\n const value = step.source.kind === \"literal\" ? step.source.value : inputs[step.key!];\n step.validate?.(value);\n if (step.rejectNull && value === null) invalid(\"SQL comparison and membership inputs cannot be SQL NULL; use isNull\");\n let encoded: unknown;\n if (step.key !== undefined && encodedInputs.has(step.key)) encoded = encodedInputs.get(step.key);\n else {\n encoded = snapshotSqlValue(step.encode({ value: snapshotSqlValue(value), dialect: state.dialect }));\n if (step.key !== undefined) encodedInputs.set(step.key, encoded);\n }\n step.validate?.(encoded);\n if (step.rejectNull && encoded === null) invalid(\"SQL comparison and membership encoders cannot produce SQL NULL; use isNull\");\n if (encoded !== null && !sameTransport(step.transport, sqlParameterTransport({ value: encoded }))) unsupported(\"A reusable SQL encoder produced an undeclared parameter transport shape\");\n values.push(snapshotSqlValue(sqlParameterWireValue({ value: encoded })));\n }\n return values;\n}\n",
15
16
  "import { VibeError } from \"@vibeorm/schema\";\nimport { isSqlParam } from \"./sql-input.ts\";\nimport { isSqlHandle } from \"./sql-handles.ts\";\nimport { cloneTimestampDate } from \"./timestamp-identity.ts\";\n\n/**\n * Snapshot mutable values while preserving plain-object and array validation evidence.\n * Every path refuses authentic SQL handles at every depth. Reusable scopes may\n * supply an additional bundle-local identity check.\n */\nexport function snapshotSqlValue(value: unknown, ancestors: ReadonlySet<object> = new Set(), isHandle?: (value: object) => boolean): unknown {\n const invalid = (message: string): never => { throw new VibeError({ code: \"VIBE_VALIDATION\", message }); };\n if (isSqlParam(value)) return invalid(\"SQL input tokens are valid only in admitted reusable builder positions\");\n if (typeof value === \"object\" && value !== null && (isSqlHandle(value) || isHandle?.(value))) return invalid(\"SQL builder, plan, template, input and fragment handles are not execution values\");\n if (value === undefined) return invalid(\"SQL values cannot be undefined; omit a defaulted column or use null\");\n if (value === null || typeof value === \"string\" || typeof value === \"boolean\" || typeof value === \"bigint\") return value;\n if (typeof value === \"number\") return value;\n if (value instanceof Date) return Number.isFinite(value.getTime()) ? cloneTimestampDate({ date: value }) : invalid(\"SQL dates must be finite\");\n if (value instanceof Uint8Array) return new Uint8Array(value);\n if (typeof value !== \"object\") return invalid(\"Unsupported SQL parameter value\");\n if (ancestors.has(value)) return invalid(\"Cyclic SQL parameter values are unsupported\");\n const array = Array.isArray(value);\n const prototype: unknown = Object.getPrototypeOf(value);\n if (array ? prototype !== Array.prototype : prototype !== Object.prototype && prototype !== null) return invalid(\"SQL parameters require standard arrays or plain objects\");\n const nested = new Set([...ancestors, value]);\n const snapshot: object = array ? [] : Object.create(prototype === null ? null : Object.prototype) as object;\n for (const key of Reflect.ownKeys(value)) {\n const descriptor = Object.getOwnPropertyDescriptor(value, key)!;\n if (!(\"value\" in descriptor)) return invalid(\"SQL parameter objects and arrays cannot contain accessors\");\n Object.defineProperty(snapshot, key, { ...descriptor, value: snapshotSqlValue(descriptor.value, nested, isHandle) });\n }\n return snapshot;\n}\n",
16
- "import { VibeError } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName, ScalarType } from \"@vibeorm/schema\";\nimport { resultScalarContract } from \"./result-decoder.ts\";\nimport { registerSqlHandleCheck } from \"./sql-handles.ts\";\nimport type { ResultDecoder, ResultParameterEncoder } from \"./result-decoder.ts\";\n\ndeclare const sqlParamBrand: unique symbol;\ndeclare const sqlInputBrand: unique symbol;\ndeclare const scopeBrand: unique symbol;\n/** A write-only named input token, never a result expression. */\nexport type SqlParam<T> = { readonly [sqlParamBrand]: T };\n/** An authentic column-specific input contract. */\nexport type SqlInput<T> = { readonly [sqlInputBrand]: T };\n/** Explicit input declarations for a fixed SQL template. */\nexport type SqlInputMap = Readonly<Record<string, ResultDecoder<unknown> | SqlInput<unknown>>>;\n/** The value admitted by one input declaration. */\nexport type SqlInputValue<D> = D extends SqlInput<infer I> ? I : D extends ResultDecoder<infer I> ? Exclude<I, undefined> : never;\n/** Required values inferred once from the declaration map. */\nexport type SqlInputValues<D extends SqlInputMap> = { readonly [K in keyof D]-?: SqlInputValue<D[K]> };\n/** Write-only tokens supplied to the synchronous build callback. */\nexport type SqlInputTokens<D extends SqlInputMap> = { readonly [K in keyof D]-?: SqlParam<SqlInputValue<D[K]>> };\n/** Execution inputs cannot widen the template's declared contract. */\nexport type SqlExecutionParams<P extends object> = keyof P extends never ? { readonly params?: Readonly<Record<string, never>> } : { readonly params: NoInfer<P> };\n/** @internal Opaque lifetime and ownership of a single build callback. */\nexport type SqlInputScope = { readonly [scopeBrand]: true };\n/** @internal Encoding and physical identity, with no read decoder or client authority. */\nexport type SqlInputContract = {\n readonly encoder: ResultParameterEncoder;\n readonly scalar: ScalarType | \"Enum\" | \"Unknown\";\n readonly nullable: boolean;\n readonly list: boolean;\n readonly nativeType?: string;\n readonly enumValues?: readonly string[];\n readonly enumType?: QualifiedSqlName;\n readonly jsonStorage?: \"json\" | \"jsonb\";\n readonly columnIdentity?: object;\n};\n\ntype ScopeState = { open: boolean; readonly keys: readonly string[]; readonly isHandle: (value: object) => boolean };\ntype TokenState = { readonly scope: SqlInputScope; readonly key: string; readonly contract: SqlInputContract };\nconst inputs = new WeakMap<object, SqlInputContract>();\nconst tokens = new WeakMap<object, TokenState>();\nconst scopes = new WeakMap<object, ScopeState>();\nregisterSqlHandleCheck({ check: (value) => inputs.has(value) || tokens.has(value) || scopes.has(value) });\n\nfunction invalid(message: string): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message });\n}\n\n/** Authentic tokens remain recognizable after their build callback closes. */\nexport function isSqlParam(value: unknown): value is SqlParam<unknown> {\n return typeof value === \"object\" && value !== null && tokens.has(value);\n}\n\n/** Authentic `qb.input` descriptors are declarations, never execution values. */\nexport function isSqlInput(value: unknown): value is SqlInput<unknown> {\n return typeof value === \"object\" && value !== null && inputs.has(value);\n}\n\n/** @internal Snapshot descriptor metadata, never encode a sample value. */\nexport function createSqlInput<T>(params: { contract: SqlInputContract }): SqlInput<T> {\n if (typeof params.contract.encoder?.encode !== \"function\") invalid(\"SQL input contracts require a parameter encoder\");\n const input = Object.freeze(Object.create(null)) as SqlInput<T>;\n inputs.set(input, Object.freeze({ ...params.contract,\n ...(params.contract.enumValues === undefined ? {} : { enumValues: Object.freeze([...params.contract.enumValues]) }),\n ...(params.contract.enumType === undefined ? {} : { enumType: Object.freeze({ ...params.contract.enumType }) }),\n }));\n return input;\n}\n\n/** @internal Read a descriptor or normalize an explicitly supplied decoder. */\nexport function sqlInputContract(params: { input: SqlInput<unknown> | ResultDecoder<unknown> }): SqlInputContract {\n const value = params.input;\n if (typeof value !== \"object\" || value === null) invalid(\"SQL input declarations require a decoder or qb.input descriptor\");\n const declared = inputs.get(value);\n if (declared !== undefined) return declared;\n if (!(\"encode\" in value) || !(\"decode\" in value) || typeof value.encode !== \"function\" || typeof value.decode !== \"function\") invalid(\"Expected an authentic SQL input descriptor or bidirectional decoder\");\n const decoder = value as ResultDecoder<unknown>;\n const physical = resultScalarContract({ decoder });\n return Object.freeze({ encoder: decoder, scalar: physical?.scalar ?? \"Unknown\", nullable: physical?.nullable ?? true, list: physical?.list ?? false });\n}\n\n/**\n * @internal Create one isolated environment of authentic named tokens. `isHandle` is the\n * calling builder bundle's own expression/source authenticity check, applied to execution values.\n */\nexport function createSqlInputScope<D extends SqlInputMap>(params: { inputs: D; isHandle: (value: object) => boolean }): { readonly scope: SqlInputScope; readonly params: SqlInputTokens<D> } {\n if (typeof params.isHandle !== \"function\") invalid(\"SQL input scopes require the builder's handle check\");\n const declarations: unknown = params.inputs;\n if (typeof declarations !== \"object\" || declarations === null || Array.isArray(declarations)) invalid(\"Reusable SQL requires an input declaration record\");\n const prototype: unknown = Object.getPrototypeOf(declarations);\n if (prototype !== Object.prototype && prototype !== null) invalid(\"SQL input declarations require a plain record\");\n const keys = Reflect.ownKeys(declarations);\n const entries: [string, SqlInputContract][] = keys.map((key): [string, SqlInputContract] => {\n if (typeof key !== \"string\" || key.length === 0 || key.includes(\"\\0\")) invalid(\"SQL input names must be nonempty strings without NUL\");\n const descriptor = Object.getOwnPropertyDescriptor(declarations, key)!;\n if (!(\"value\" in descriptor)) invalid(\"SQL input declarations cannot contain accessors\");\n return [key, sqlInputContract({ input: descriptor.value as SqlInput<unknown> | ResultDecoder<unknown> })];\n });\n const scope = Object.freeze(Object.create(null)) as SqlInputScope;\n scopes.set(scope, { open: true, keys: Object.freeze(entries.map(([key]) => key)), isHandle: params.isHandle });\n const record: Record<string, SqlParam<unknown>> = Object.create(null) as Record<string, SqlParam<unknown>>;\n for (const [key, contract] of entries) {\n const param = Object.freeze(Object.create(null)) as SqlParam<unknown>;\n tokens.set(param, { scope, key, contract });\n record[key] = param;\n }\n return { scope, params: Object.freeze(record) as SqlInputTokens<D> };\n}\n\n/** @internal Close admission even when a build callback throws. */\nexport function sealSqlInputScope(params: { scope: SqlInputScope }): void {\n const state = scopes.get(params.scope) ?? invalid(\"Expected an authentic SQL input scope\");\n state.open = false;\n}\n\n/** @internal Tokens cannot enter new expressions after their build has returned. */\nexport function assertSqlParamBuilding(params: { param: SqlParam<unknown> }): void {\n const state = tokens.get(params.param) ?? invalid(\"Expected an authentic SQL input token\");\n if (scopes.get(state.scope)?.open !== true) invalid(\"SQL input tokens cannot escape their reusable build callback\");\n}\n\n/** @internal Read the token's write contract without exposing mutable state. */\nexport function sqlParamContract(params: { param: SqlParam<unknown> }): SqlInputContract {\n return (tokens.get(params.param) ?? invalid(\"Expected an authentic SQL input token\")).contract;\n}\n\n/** @internal Validate ownership when an admitted expression is structurally rendered. */\nexport function sqlParamKey(params: { param: SqlParam<unknown>; scope: SqlInputScope }): string {\n const state = tokens.get(params.param) ?? invalid(\"Expected an authentic SQL input token\");\n if (state.scope !== params.scope) invalid(\"A reusable query cannot capture another template's input token\");\n return state.key;\n}\n\n/** @internal Ask the bundle that created this scope whether a value is one of its handles. */\nexport function sqlInputScopeHandle(params: { scope: SqlInputScope; value: object }): boolean {\n const state = scopes.get(params.scope) ?? invalid(\"Expected an authentic SQL input scope\");\n return state.isHandle(params.value);\n}\n\n/** @internal Frozen declaration keys; an open scope cannot be compiled. */\nexport function sqlInputScopeKeys(params: { scope: SqlInputScope }): readonly string[] {\n const state = scopes.get(params.scope) ?? invalid(\"Expected an authentic SQL input scope\");\n if (state.open) invalid(\"A reusable SQL build must finish before compilation\");\n return state.keys;\n}\n",
17
- "import { VibeError } from \"@vibeorm/schema\";\nimport type { Dialect, ScalarType } from \"@vibeorm/schema\";\nimport { parsePgArrayLiteral, parsePgArrayLiteralNested } from \"./pg-array.ts\";\nimport { DIALECT_CODECS } from \"./codecs.ts\";\nimport type { WireFidelity } from \"./codecs.ts\";\n\n/** DateTime's explicit opt-in raw projection/parameter representation. NULL is separate. */\nexport type ExtendedDateTime = Date | \"infinity\" | \"-infinity\";\n/** An explicit read-only result contract using the centralized wire shape. */\nexport type ResultReadDecoder<T> = {\n readonly decode: (params: { value: unknown; dialect: Dialect; wire?: WireFidelity }) => T;\n};\n/** Parameter-only contract; transformed outputs do not need a fabricated decoder. */\nexport type ResultParameterEncoder = {\n readonly encode: (params: { value: unknown; dialect: Dialect }) => unknown;\n};\n/** An explicit projection contract, with centralized bidirectional scalar conversion. */\nexport type ResultDecoder<T> = ResultReadDecoder<T> & ResultParameterEncoder;\n\n/** Physical scalar information owned by the built-in decoder that validates it. */\nexport type ResultScalarContract = {\n readonly scalar: ScalarType;\n readonly nullable: boolean;\n readonly list: boolean;\n};\nconst scalarContracts = new WeakMap<object, ResultScalarContract>();\nconst decoderIdentities = new WeakMap<object, string>();\nconst nullableDecoders = new WeakMap<object, ResultReadDecoder<unknown>>();\nconst arrayDecoders = new WeakMap<object, ResultReadDecoder<unknown>>();\n\n/** Authentic built-in composition equivalence; custom contracts remain identity-only. */\nexport function sameResultDecoder(params: { left: ResultReadDecoder<unknown>; right: ResultReadDecoder<unknown> }): boolean {\n if (params.left === params.right) return true;\n const identity = decoderIdentities.get(params.left);\n return identity !== undefined && identity === decoderIdentities.get(params.right);\n}\n\nfunction wrappedIdentity(params: { decoder: ResultReadDecoder<unknown>; kind: \"nullable\" | \"array\" }): string | undefined {\n const identity = decoderIdentities.get(params.decoder);\n return identity === undefined ? undefined : JSON.stringify([params.kind, identity]);\n}\n\n/** Read authentic built-in scalar metadata; arbitrary result decoders do not imply a SQL type. */\nexport function resultScalarContract(params: { decoder: ResultReadDecoder<unknown> }): ResultScalarContract | undefined {\n return scalarContracts.get(params.decoder);\n}\n\nfunction registerScalar<T>(params: { decoder: ResultDecoder<T>; contract: ResultScalarContract | undefined; identity?: string }): ResultDecoder<T> {\n if (params.contract !== undefined) scalarContracts.set(params.decoder, Object.freeze(params.contract));\n if (params.identity !== undefined) decoderIdentities.set(params.decoder, params.identity);\n return params.decoder;\n}\n\nfunction wrappedContract(params: { decoder: ResultDecoder<unknown>; list?: boolean; nullable?: boolean }): ResultScalarContract | undefined {\n const contract = scalarContracts.get(params.decoder);\n if (contract === undefined || (params.list === true && contract.list)) return undefined;\n return { ...contract, ...(params.list === true ? { list: true, nullable: false } : {}), ...(params.nullable === true ? { nullable: true } : {}) };\n}\n/** The output of a declared result decoder. */\nexport type Decoded<D> = D extends ResultReadDecoder<infer T> ? T : never;\n\ntype DecodeParams = { value: unknown; dialect: Dialect; wire?: WireFidelity };\n\ntype Fields = Readonly<Record<string, ResultDecoder<unknown>>>;\ntype Shape<F extends Fields> = { [K in keyof F]: Decoded<F[K]> };\n\nfunction refuse(encoding: boolean, message: string): never {\n throw new VibeError({ code: encoding ? \"VIBE_VALIDATION\" : \"VIBE_DATA_INVALID\", message });\n}\n\nfunction scalar<T>(type: ScalarType, valid: (value: unknown) => boolean): ResultDecoder<T> {\n const convert = (params: { value: unknown; dialect: Dialect; wire?: WireFidelity }, encoding: boolean): T => {\n const { value, dialect } = params;\n if (value === null || value === undefined) refuse(encoding, `A non-null ${type} projection received null or a missing column`);\n if (type === \"BigInt\" && !((typeof value === \"bigint\") || (typeof value === \"string\" && /^[+-]?\\d+$/.test(value)) || (typeof value === \"number\" && Number.isSafeInteger(value)))) {\n refuse(encoding, \"BigInt requires exact integer text, bigint, or a safe integer\");\n }\n if (type === \"Boolean\" && value !== true && value !== false && value !== 0 && value !== 1 && !(!encoding && dialect === \"mysql\" && (value === \"0\" || value === \"1\"))) refuse(encoding, \"Boolean requires true, false, 0, or 1\");\n if (type === \"Decimal\" && typeof value === \"number\") refuse(encoding, \"Decimal requires exact decimal text, not a floating-point number\");\n if ((type === \"Int\" || type === \"Float\") && typeof value === \"string\" && !/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value)) {\n refuse(encoding, `Invalid ${type} text`);\n }\n const codec = DIALECT_CODECS[dialect][type];\n const result = type === \"Json\" && params.wire?.json === \"parsed\" ? value : codec.decode(value);\n if (!valid(result)) refuse(encoding, `Invalid ${type} projection value`);\n return result as T;\n };\n return registerScalar({ identity: JSON.stringify([\"scalar\", type]), contract: { scalar: type, nullable: false, list: false }, decoder: Object.freeze({\n decode: (params: DecodeParams): T => convert(params, false),\n encode: (params: DecodeParams): unknown => {\n // A JSON input is already a JS value, not transport text.\n const value = type === \"Json\" ? params.value : convert(params, true);\n if (value === undefined || value === null) refuse(true, `A non-null ${type} parameter cannot be null or undefined`);\n return DIALECT_CODECS[params.dialect][type].encode(value);\n },\n }) });\n}\n\nconst stringDecoder: ResultDecoder<string> = scalar(\"String\", (value) => typeof value === \"string\");\nconst dateDecoder: ResultDecoder<Date> = scalar(\"DateTime\", (value) => value instanceof Date && Number.isFinite(value.getTime()));\nconst bigIntDecoder: ResultDecoder<bigint> = scalar<bigint>(\"BigInt\", (value) => typeof value === \"bigint\");\nconst SAFE_INTEGER_LIMIT: bigint = BigInt(Number.MAX_SAFE_INTEGER);\n\n/** A BigInt column read as a safe `number` (a schema's `@number` field): exact first, then refused beyond `Number.MAX_SAFE_INTEGER`, never rounded. */\nconst bigIntNumberDecoder: ResultDecoder<number> = registerScalar({ identity: JSON.stringify([\"scalar\", \"BigInt\", \"number\"]), contract: { scalar: \"BigInt\", nullable: false, list: false }, decoder: Object.freeze({\n decode: (params: DecodeParams): number => {\n const exact = bigIntDecoder.decode(params);\n if (exact > SAFE_INTEGER_LIMIT || exact < -SAFE_INTEGER_LIMIT) refuse(false, `BigInt ${exact.toString()} is beyond Number.MAX_SAFE_INTEGER, so it cannot read as a safe number`);\n return Number(exact);\n },\n encode: (params: DecodeParams): unknown => {\n const { value } = params;\n const unsafe = `${String(value)} is not a safe integer, so it is refused instead of rounded`;\n if (typeof value === \"number\" && !Number.isSafeInteger(value)) refuse(true, unsafe);\n // Integer text is checked on its exact value too: the database would store it whole.\n const encoded = bigIntDecoder.encode(params);\n const exact = BigInt(String(encoded));\n if (exact > SAFE_INTEGER_LIMIT || exact < -SAFE_INTEGER_LIMIT) refuse(true, unsafe);\n return encoded;\n },\n}) });\nconst extendedDecoder: ResultDecoder<ExtendedDateTime> = registerScalar({ identity: \"extended-date-time\", contract: { scalar: \"DateTime\", nullable: false, list: false }, decoder: Object.freeze({\n decode: (params: DecodeParams): ExtendedDateTime => {\n if (params.value === \"infinity\" || params.value === Infinity) return \"infinity\";\n if (params.value === \"-infinity\" || params.value === -Infinity) return \"-infinity\";\n return dateDecoder.decode(params);\n },\n encode: (params: DecodeParams): unknown => {\n if (params.value === \"infinity\" || params.value === \"-infinity\") {\n if (params.dialect !== \"postgres\") throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Timestamp infinity parameters require PostgreSQL\" });\n return params.value;\n }\n return dateDecoder.encode(params);\n },\n}) });\n\nfunction hasEncoder<T>(decoder: ResultReadDecoder<T>): decoder is ResultDecoder<T> {\n return \"encode\" in decoder && typeof decoder.encode === \"function\";\n}\n\nfunction nullable<T>(params: { decoder: ResultDecoder<T> }): ResultDecoder<T | null>;\nfunction nullable<T>(params: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T | null>;\nfunction nullable<T>({ decoder }: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T | null> {\n const cached = nullableDecoders.get(decoder);\n if (cached !== undefined) return cached as ResultReadDecoder<T | null>;\n const read = (params: DecodeParams): T | null => params.value === null ? null : decoder.decode(params);\n const wrapped: ResultReadDecoder<T | null> = hasEncoder(decoder)\n ? registerScalar({ identity: wrappedIdentity({ decoder, kind: \"nullable\" }), contract: wrappedContract({ decoder, nullable: true }), decoder: Object.freeze({\n decode: read,\n encode: (params: DecodeParams): unknown => params.value === null ? null : decoder.encode(params),\n }) })\n : Object.freeze({ decode: read });\n nullableDecoders.set(decoder, wrapped);\n return wrapped;\n}\n\nfunction array<T>(params: { decoder: ResultDecoder<T> }): ResultDecoder<T[]>;\nfunction array<T>(params: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T[]>;\nfunction array<T>({ decoder }: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T[]> {\n const cached = arrayDecoders.get(decoder);\n if (cached !== undefined) return cached as ResultReadDecoder<T[]>;\n const bidirectional = hasEncoder(decoder);\n const read = (params: DecodeParams): T[] => {\n const raw = params.value;\n let value: unknown;\n if (params.dialect === \"postgres\" && typeof raw === \"string\") {\n if (bidirectional) value = parsePgArrayLiteral({ literal: raw });\n else {\n const elements = parsePgArrayLiteralNested({ literal: raw });\n if (elements !== null && elements.some((element) => Array.isArray(element))) refuse(false, \"Read-only array decoders support one-dimensional SQL arrays only\");\n value = elements;\n }\n } else value = ArrayBuffer.isView(raw) && \"length\" in raw ? Array.from(raw as unknown as ArrayLike<unknown>) : raw;\n if (!Array.isArray(value)) refuse(false, \"Expected an array projection\");\n return value.map((element) => decoder.decode({ ...params, value: element }));\n };\n const wrapped: ResultReadDecoder<T[]> = hasEncoder(decoder)\n ? registerScalar({ identity: wrappedIdentity({ decoder, kind: \"array\" }), contract: wrappedContract({ decoder, list: true }), decoder: Object.freeze({\n decode: read,\n encode: (params: DecodeParams): unknown => {\n if (!Array.isArray(params.value)) refuse(true, \"Expected an array parameter\");\n return params.value.map((value) => decoder.encode({ ...params, value }));\n },\n }) })\n : Object.freeze({ decode: read });\n arrayDecoders.set(decoder, wrapped);\n return wrapped;\n}\n\n/** Write-only composition; elements are encoded once and SQL owns the final array transport. */\nexport const encode: {\n readonly array: (params: { encoder: ResultParameterEncoder }) => ResultParameterEncoder;\n} = Object.freeze({\n array: ({ encoder }: { encoder: ResultParameterEncoder }): ResultParameterEncoder => Object.freeze({\n encode: (params: Parameters<ResultParameterEncoder[\"encode\"]>[0]): unknown => {\n if (!Array.isArray(params.value)) refuse(true, \"Expected an array parameter\");\n return Array.from(params.value, (value) => encoder.encode({ ...params, value }));\n },\n }),\n});\n\n/** Result contracts: scalar codecs, explicit nullability, enum membership, and object projections. */\nexport const decode: {\n readonly string: ResultDecoder<string>;\n readonly boolean: ResultDecoder<boolean>;\n readonly int: ResultDecoder<number>;\n readonly float: ResultDecoder<number>;\n readonly bigInt: ResultDecoder<bigint>;\n /** A BigInt column as a safe `number`; a value beyond `Number.MAX_SAFE_INTEGER` refuses (`VIBE_DATA_INVALID` read, `VIBE_VALIDATION` write). */\n readonly bigIntNumber: ResultDecoder<number>;\n readonly decimal: ResultDecoder<string>;\n readonly dateTime: ResultDecoder<Date>;\n readonly extendedDateTime: ResultDecoder<ExtendedDateTime>;\n readonly json: ResultDecoder<unknown>;\n readonly bytes: ResultDecoder<Uint8Array>;\n readonly nullable: {\n <T>(params: { decoder: ResultDecoder<T> }): ResultDecoder<T | null>;\n <T>(params: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T | null>;\n };\n readonly array: {\n <T>(params: { decoder: ResultDecoder<T> }): ResultDecoder<T[]>;\n <T>(params: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T[]>;\n };\n readonly enum: <T extends string>(params: { values: readonly T[] }) => ResultDecoder<T>;\n readonly object: <F extends Fields>(params: { fields: F }) => ResultDecoder<Shape<F>>;\n} = Object.freeze({\n string: stringDecoder,\n boolean: scalar<boolean>(\"Boolean\", (value) => typeof value === \"boolean\"),\n int: scalar<number>(\"Int\", (value) => typeof value === \"number\" && Number.isSafeInteger(value)),\n float: scalar<number>(\"Float\", (value) => typeof value === \"number\" && Number.isFinite(value)),\n bigInt: bigIntDecoder,\n bigIntNumber: bigIntNumberDecoder,\n decimal: scalar<string>(\"Decimal\", (value) => typeof value === \"string\" && /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value)),\n dateTime: dateDecoder,\n extendedDateTime: extendedDecoder,\n json: scalar<unknown>(\"Json\", (value) => value !== undefined),\n bytes: scalar<Uint8Array>(\"Bytes\", (value) => value instanceof Uint8Array),\n nullable,\n array,\n enum: <T extends string>({ values }: { values: readonly T[] }): ResultDecoder<T> => {\n const members = new Set<string>(values);\n return registerScalar({ identity: JSON.stringify([\"enum\", [...members].sort()]), contract: { scalar: \"String\", nullable: false, list: false }, decoder: Object.freeze({\n decode: ({ value }: DecodeParams): T => typeof value === \"string\" && members.has(value) ? value as T : refuse(false, \"Unknown enum projection member\"),\n encode: ({ value }: DecodeParams): unknown => typeof value === \"string\" && members.has(value) ? value : refuse(true, \"Unknown enum parameter member\"),\n }) });\n },\n object: <F extends Fields>({ fields }: { fields: F }): ResultDecoder<Shape<F>> => {\n const entries = Object.entries(fields);\n const convert = (params: { value: unknown; dialect: Dialect; wire?: WireFidelity }, encoding: boolean): Shape<F> => {\n if (typeof params.value !== \"object\" || params.value === null || Array.isArray(params.value)) refuse(encoding, \"Expected a result row object\");\n const row = params.value as Record<string, unknown>;\n return Object.fromEntries(entries.map(([name, decoder]) => {\n if (!Object.hasOwn(row, name)) refuse(encoding, `Missing projection column \"${name}\"`);\n return [name, encoding ? decoder.encode({ ...params, value: row[name] }) : decoder.decode({ ...params, value: row[name] })];\n })) as Shape<F>;\n };\n return Object.freeze({ decode: (params: DecodeParams): Shape<F> => convert(params, false), encode: (params: DecodeParams): unknown => convert(params, true) });\n },\n});\n",
17
+ "import { VibeError } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName, ScalarType } from \"@vibeorm/schema\";\nimport { resultScalarContract } from \"./result-decoder.ts\";\nimport { registerSqlHandleCheck } from \"./sql-handles.ts\";\nimport type { ResultDecoder, ResultParameterEncoder } from \"./result-decoder.ts\";\n\ndeclare const sqlParamBrand: unique symbol;\ndeclare const sqlInputBrand: unique symbol;\ndeclare const scopeBrand: unique symbol;\n/** A write-only named input token, never a result expression. */\nexport type SqlParam<T> = { readonly [sqlParamBrand]: T };\n/** An authentic column-specific input contract. */\nexport type SqlInput<T> = { readonly [sqlInputBrand]: T };\n/** Explicit input declarations for a fixed SQL template. */\nexport type SqlInputMap = Readonly<Record<string, ResultDecoder<unknown> | SqlInput<unknown>>>;\n/** The value admitted by one input declaration. */\nexport type SqlInputValue<D> = D extends SqlInput<infer I> ? I : D extends ResultDecoder<infer I> ? Exclude<I, undefined> : never;\n/** Required values inferred once from the declaration map. */\nexport type SqlInputValues<D extends SqlInputMap> = { readonly [K in keyof D]-?: SqlInputValue<D[K]> };\n/** Write-only tokens supplied to the synchronous build callback. */\nexport type SqlInputTokens<D extends SqlInputMap> = { readonly [K in keyof D]-?: SqlParam<SqlInputValue<D[K]>> };\n/** Execution inputs cannot widen the template's declared contract. */\nexport type SqlExecutionParams<P extends object> = keyof P extends never ? { readonly params?: Readonly<Record<string, never>> } : { readonly params: NoInfer<P> };\n/** Opaque lifetime and ownership of a single build callback. */\nexport type SqlInputScope = { readonly [scopeBrand]: true };\n/** Encoding and physical identity, with no read decoder or client authority. */\nexport type SqlInputContract = {\n readonly encoder: ResultParameterEncoder;\n readonly scalar: ScalarType | \"Enum\" | \"Unknown\";\n readonly nullable: boolean;\n readonly list: boolean;\n readonly nativeType?: string;\n readonly enumValues?: readonly string[];\n readonly enumType?: QualifiedSqlName;\n readonly jsonStorage?: \"json\" | \"jsonb\";\n readonly columnIdentity?: object;\n};\n\ntype ScopeState = { open: boolean; readonly keys: readonly string[]; readonly isHandle: (value: object) => boolean };\ntype TokenState = { readonly scope: SqlInputScope; readonly key: string; readonly contract: SqlInputContract };\nconst inputs = new WeakMap<object, SqlInputContract>();\nconst tokens = new WeakMap<object, TokenState>();\nconst scopes = new WeakMap<object, ScopeState>();\nregisterSqlHandleCheck({ check: (value) => inputs.has(value) || tokens.has(value) || scopes.has(value) });\n\nfunction invalid(message: string): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message });\n}\n\n/** Authentic tokens remain recognizable after their build callback closes. */\nexport function isSqlParam(value: unknown): value is SqlParam<unknown> {\n return typeof value === \"object\" && value !== null && tokens.has(value);\n}\n\n/**\n * Authentic `qb.input` descriptors are declarations, never execution values.\n * @internal\n */\nexport function isSqlInput(value: unknown): value is SqlInput<unknown> {\n return typeof value === \"object\" && value !== null && inputs.has(value);\n}\n\n/** Snapshot descriptor metadata, never encode a sample value. */\nexport function createSqlInput<T>(params: { contract: SqlInputContract }): SqlInput<T> {\n if (typeof params.contract.encoder?.encode !== \"function\") invalid(\"SQL input contracts require a parameter encoder\");\n const input = Object.freeze(Object.create(null)) as SqlInput<T>;\n inputs.set(input, Object.freeze({ ...params.contract,\n ...(params.contract.enumValues === undefined ? {} : { enumValues: Object.freeze([...params.contract.enumValues]) }),\n ...(params.contract.enumType === undefined ? {} : { enumType: Object.freeze({ ...params.contract.enumType }) }),\n }));\n return input;\n}\n\n/** Read a descriptor or normalize an explicitly supplied decoder. */\nexport function sqlInputContract(params: { input: SqlInput<unknown> | ResultDecoder<unknown> }): SqlInputContract {\n const value = params.input;\n if (typeof value !== \"object\" || value === null) invalid(\"SQL input declarations require a decoder or qb.input descriptor\");\n const declared = inputs.get(value);\n if (declared !== undefined) return declared;\n if (!(\"encode\" in value) || !(\"decode\" in value) || typeof value.encode !== \"function\" || typeof value.decode !== \"function\") invalid(\"Expected an authentic SQL input descriptor or bidirectional decoder\");\n const decoder = value as ResultDecoder<unknown>;\n const physical = resultScalarContract({ decoder });\n return Object.freeze({ encoder: decoder, scalar: physical?.scalar ?? \"Unknown\", nullable: physical?.nullable ?? true, list: physical?.list ?? false });\n}\n\n/**\n * Create one isolated environment of authentic named tokens. `isHandle` is the\n * calling builder bundle's own expression/source authenticity check, applied to execution values.\n */\nexport function createSqlInputScope<D extends SqlInputMap>(params: { inputs: D; isHandle: (value: object) => boolean }): { readonly scope: SqlInputScope; readonly params: SqlInputTokens<D> } {\n if (typeof params.isHandle !== \"function\") invalid(\"SQL input scopes require the builder's handle check\");\n const declarations: unknown = params.inputs;\n if (typeof declarations !== \"object\" || declarations === null || Array.isArray(declarations)) invalid(\"Reusable SQL requires an input declaration record\");\n const prototype: unknown = Object.getPrototypeOf(declarations);\n if (prototype !== Object.prototype && prototype !== null) invalid(\"SQL input declarations require a plain record\");\n const keys = Reflect.ownKeys(declarations);\n const entries: [string, SqlInputContract][] = keys.map((key): [string, SqlInputContract] => {\n if (typeof key !== \"string\" || key.length === 0 || key.includes(\"\\0\")) invalid(\"SQL input names must be nonempty strings without NUL\");\n const descriptor = Object.getOwnPropertyDescriptor(declarations, key)!;\n if (!(\"value\" in descriptor)) invalid(\"SQL input declarations cannot contain accessors\");\n return [key, sqlInputContract({ input: descriptor.value as SqlInput<unknown> | ResultDecoder<unknown> })];\n });\n const scope = Object.freeze(Object.create(null)) as SqlInputScope;\n scopes.set(scope, { open: true, keys: Object.freeze(entries.map(([key]) => key)), isHandle: params.isHandle });\n const record: Record<string, SqlParam<unknown>> = Object.create(null) as Record<string, SqlParam<unknown>>;\n for (const [key, contract] of entries) {\n const param = Object.freeze(Object.create(null)) as SqlParam<unknown>;\n tokens.set(param, { scope, key, contract });\n record[key] = param;\n }\n return { scope, params: Object.freeze(record) as SqlInputTokens<D> };\n}\n\n/** Close admission even when a build callback throws. */\nexport function sealSqlInputScope(params: { scope: SqlInputScope }): void {\n const state = scopes.get(params.scope) ?? invalid(\"Expected an authentic SQL input scope\");\n state.open = false;\n}\n\n/** Tokens cannot enter new expressions after their build has returned. */\nexport function assertSqlParamBuilding(params: { param: SqlParam<unknown> }): void {\n const state = tokens.get(params.param) ?? invalid(\"Expected an authentic SQL input token\");\n if (scopes.get(state.scope)?.open !== true) invalid(\"SQL input tokens cannot escape their reusable build callback\");\n}\n\n/** Read the token's write contract without exposing mutable state. */\nexport function sqlParamContract(params: { param: SqlParam<unknown> }): SqlInputContract {\n return (tokens.get(params.param) ?? invalid(\"Expected an authentic SQL input token\")).contract;\n}\n\n/** @internal Validate ownership when an admitted expression is structurally rendered. */\nexport function sqlParamKey(params: { param: SqlParam<unknown>; scope: SqlInputScope }): string {\n const state = tokens.get(params.param) ?? invalid(\"Expected an authentic SQL input token\");\n if (state.scope !== params.scope) invalid(\"A reusable query cannot capture another template's input token\");\n return state.key;\n}\n\n/** @internal Ask the bundle that created this scope whether a value is one of its handles. */\nexport function sqlInputScopeHandle(params: { scope: SqlInputScope; value: object }): boolean {\n const state = scopes.get(params.scope) ?? invalid(\"Expected an authentic SQL input scope\");\n return state.isHandle(params.value);\n}\n\n/** @internal Frozen declaration keys; an open scope cannot be compiled. */\nexport function sqlInputScopeKeys(params: { scope: SqlInputScope }): readonly string[] {\n const state = scopes.get(params.scope) ?? invalid(\"Expected an authentic SQL input scope\");\n if (state.open) invalid(\"A reusable SQL build must finish before compilation\");\n return state.keys;\n}\n",
18
+ "import { VibeError } from \"@vibeorm/schema\";\nimport type { Dialect, ScalarType } from \"@vibeorm/schema\";\nimport { parsePgArrayLiteral, parsePgArrayLiteralNested } from \"./pg-array.ts\";\nimport { DIALECT_CODECS, zonedCodec } from \"./codecs.ts\";\nimport type { WireFidelity } from \"./codecs.ts\";\n\n/** DateTime's explicit opt-in raw projection/parameter representation. NULL is separate. */\nexport type ExtendedDateTime = Date | \"infinity\" | \"-infinity\";\n/** An explicit read-only result contract using the centralized wire shape. */\nexport type ResultReadDecoder<T> = {\n readonly decode: (params: { value: unknown; dialect: Dialect; wire?: WireFidelity }) => T;\n};\n/** Parameter-only contract; transformed outputs do not need a fabricated decoder. */\nexport type ResultParameterEncoder = {\n readonly encode: (params: { value: unknown; dialect: Dialect }) => unknown;\n};\n/** An explicit projection contract, with centralized bidirectional scalar conversion. */\nexport type ResultDecoder<T> = ResultReadDecoder<T> & ResultParameterEncoder;\n\n/** Physical scalar information owned by the built-in decoder that validates it. */\nexport type ResultScalarContract = {\n readonly scalar: ScalarType;\n readonly nullable: boolean;\n readonly list: boolean;\n};\nconst scalarContracts = new WeakMap<object, ResultScalarContract>();\nconst decoderIdentities = new WeakMap<object, string>();\nconst nullableDecoders = new WeakMap<object, ResultReadDecoder<unknown>>();\nconst arrayDecoders = new WeakMap<object, ResultReadDecoder<unknown>>();\n\n/** Authentic built-in composition equivalence; custom contracts remain identity-only. */\nexport function sameResultDecoder(params: { left: ResultReadDecoder<unknown>; right: ResultReadDecoder<unknown> }): boolean {\n if (params.left === params.right) return true;\n const identity = decoderIdentities.get(params.left);\n return identity !== undefined && identity === decoderIdentities.get(params.right);\n}\n\nfunction wrappedIdentity(params: { decoder: ResultReadDecoder<unknown>; kind: \"nullable\" | \"array\" }): string | undefined {\n const identity = decoderIdentities.get(params.decoder);\n return identity === undefined ? undefined : JSON.stringify([params.kind, identity]);\n}\n\n/** Read authentic built-in scalar metadata; arbitrary result decoders do not imply a SQL type. */\nexport function resultScalarContract(params: { decoder: ResultReadDecoder<unknown> }): ResultScalarContract | undefined {\n return scalarContracts.get(params.decoder);\n}\n\nfunction registerScalar<T>(params: { decoder: ResultDecoder<T>; contract: ResultScalarContract | undefined; identity?: string }): ResultDecoder<T> {\n if (params.contract !== undefined) scalarContracts.set(params.decoder, Object.freeze(params.contract));\n if (params.identity !== undefined) decoderIdentities.set(params.decoder, params.identity);\n return params.decoder;\n}\n\nfunction wrappedContract(params: { decoder: ResultDecoder<unknown>; list?: boolean; nullable?: boolean }): ResultScalarContract | undefined {\n const contract = scalarContracts.get(params.decoder);\n if (contract === undefined || (params.list === true && contract.list)) return undefined;\n return { ...contract, ...(params.list === true ? { list: true, nullable: false } : {}), ...(params.nullable === true ? { nullable: true } : {}) };\n}\n/** The output of a declared result decoder. */\nexport type Decoded<D> = D extends ResultReadDecoder<infer T> ? T : never;\n\ntype DecodeParams = { value: unknown; dialect: Dialect; wire?: WireFidelity };\n\ntype Fields = Readonly<Record<string, ResultDecoder<unknown>>>;\ntype Shape<F extends Fields> = { [K in keyof F]: Decoded<F[K]> };\n\nfunction refuse(encoding: boolean, message: string): never {\n throw new VibeError({ code: encoding ? \"VIBE_VALIDATION\" : \"VIBE_DATA_INVALID\", message });\n}\n\n/**\n * Decode one named column of a result row. A decoder's `VIBE_DATA_INVALID` comes back naming the column in the\n * message and in `meta` (with the row index and the shape token when the caller has them), never the value; the\n * decoder's own error is the `cause`. Any other error passes through unchanged.\n */\nexport function decodeResultColumn<T>(params: {\n readonly decoder: ResultReadDecoder<T>;\n readonly read: { value: unknown; dialect: Dialect; wire?: WireFidelity };\n readonly column: string;\n readonly reason: string;\n readonly prefix?: string;\n readonly meta?: Readonly<Record<string, unknown>>;\n readonly row?: number;\n readonly token?: string;\n}): T {\n try {\n return params.decoder.decode(params.read);\n } catch (error) {\n if (!(error instanceof VibeError) || error.code !== \"VIBE_DATA_INVALID\") throw error;\n const { column, row, token } = params;\n const where = `column \"${column}\"${token === undefined ? \"\" : ` (\"${token}\")`}${row === undefined ? \"\" : ` of row ${row}`}`;\n throw new VibeError({\n code: \"VIBE_DATA_INVALID\",\n message: `${params.prefix ?? \"\"}${where}: ${error.message}`,\n meta: { ...params.meta, column, ...(token === undefined ? {} : { token }), ...(row === undefined ? {} : { row }), reason: params.reason },\n cause: error,\n });\n }\n}\n\nfunction scalar<T>(type: ScalarType, valid: (value: unknown) => boolean): ResultDecoder<T> {\n const convert = (params: { value: unknown; dialect: Dialect; wire?: WireFidelity }, encoding: boolean): T => {\n const { value, dialect } = params;\n if (value === null || value === undefined) refuse(encoding, `A non-null ${type} projection received null or a missing column`);\n if (type === \"BigInt\" && !((typeof value === \"bigint\") || (typeof value === \"string\" && /^[+-]?\\d+$/.test(value)) || (typeof value === \"number\" && Number.isSafeInteger(value)))) {\n refuse(encoding, \"BigInt requires exact integer text, bigint, or a safe integer\");\n }\n if (type === \"Boolean\" && value !== true && value !== false && value !== 0 && value !== 1 && !(!encoding && dialect === \"mysql\" && (value === \"0\" || value === \"1\"))) refuse(encoding, \"Boolean requires true, false, 0, or 1\");\n if (type === \"Decimal\" && typeof value === \"number\") refuse(encoding, \"Decimal requires exact decimal text, not a floating-point number\");\n if ((type === \"Int\" || type === \"Float\") && typeof value === \"string\" && !/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value)) {\n refuse(encoding, `Invalid ${type} text`);\n }\n // A read takes the adapter's date-time zone; a parameter is the caller's value, read by the table's own rule.\n const codec = encoding ? DIALECT_CODECS[dialect][type] : zonedCodec({ dialect, codec: DIALECT_CODECS[dialect][type], wire: params.wire });\n // An Int read accepts an exact integer in any wire form: some drivers hand int8 (`count(*)`) back as a bigint.\n const input = type === \"Int\" && !encoding && typeof value === \"bigint\" ? safeIntegerOf({ value }) : value;\n const result = type === \"Json\" && params.wire?.json === \"parsed\" ? input : codec.decode(input);\n if (!valid(result)) refuse(encoding, `Invalid ${type} projection value`);\n return result as T;\n };\n return registerScalar({ identity: JSON.stringify([\"scalar\", type]), contract: { scalar: type, nullable: false, list: false }, decoder: Object.freeze({\n decode: (params: DecodeParams): T => convert(params, false),\n encode: (params: DecodeParams): unknown => {\n // A JSON input is already a JS value, not transport text.\n const value = type === \"Json\" ? params.value : convert(params, true);\n if (value === undefined || value === null) refuse(true, `A non-null ${type} parameter cannot be null or undefined`);\n return DIALECT_CODECS[params.dialect][type].encode(value);\n },\n }) });\n}\n\nfunction safeIntegerOf(params: { value: bigint }): number {\n const { value } = params;\n if (value > BigInt(Number.MAX_SAFE_INTEGER) || value < -BigInt(Number.MAX_SAFE_INTEGER)) refuse(false, \"Int is beyond Number.MAX_SAFE_INTEGER, so it is refused instead of rounded\");\n return Number(value);\n}\n\nconst stringDecoder: ResultDecoder<string> = scalar(\"String\", (value) => typeof value === \"string\");\nconst dateDecoder: ResultDecoder<Date> = scalar(\"DateTime\", (value) => value instanceof Date && Number.isFinite(value.getTime()));\nconst bigIntDecoder: ResultDecoder<bigint> = scalar<bigint>(\"BigInt\", (value) => typeof value === \"bigint\");\nconst SAFE_INTEGER_LIMIT: bigint = BigInt(Number.MAX_SAFE_INTEGER);\n\n/** A BigInt column read as a safe `number` (a schema's `@number` field): exact first, then refused beyond `Number.MAX_SAFE_INTEGER`, never rounded. */\nconst bigIntNumberDecoder: ResultDecoder<number> = registerScalar({ identity: JSON.stringify([\"scalar\", \"BigInt\", \"number\"]), contract: { scalar: \"BigInt\", nullable: false, list: false }, decoder: Object.freeze({\n decode: (params: DecodeParams): number => {\n const exact = bigIntDecoder.decode(params);\n if (exact > SAFE_INTEGER_LIMIT || exact < -SAFE_INTEGER_LIMIT) refuse(false, \"BigInt is beyond Number.MAX_SAFE_INTEGER, so it cannot read as a safe number\");\n return Number(exact);\n },\n encode: (params: DecodeParams): unknown => {\n const { value } = params;\n const unsafe = `${String(value)} is not a safe integer, so it is refused instead of rounded`;\n if (typeof value === \"number\" && !Number.isSafeInteger(value)) refuse(true, unsafe);\n // Integer text is checked on its exact value too: the database would store it whole.\n const encoded = bigIntDecoder.encode(params);\n const exact = BigInt(String(encoded));\n if (exact > SAFE_INTEGER_LIMIT || exact < -SAFE_INTEGER_LIMIT) refuse(true, unsafe);\n return encoded;\n },\n}) });\nconst extendedDecoder: ResultDecoder<ExtendedDateTime> = registerScalar({ identity: \"extended-date-time\", contract: { scalar: \"DateTime\", nullable: false, list: false }, decoder: Object.freeze({\n decode: (params: DecodeParams): ExtendedDateTime => {\n if (params.value === \"infinity\" || params.value === Infinity) return \"infinity\";\n if (params.value === \"-infinity\" || params.value === -Infinity) return \"-infinity\";\n return dateDecoder.decode(params);\n },\n encode: (params: DecodeParams): unknown => {\n if (params.value === \"infinity\" || params.value === \"-infinity\") {\n if (params.dialect !== \"postgres\") throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Timestamp infinity parameters require PostgreSQL\" });\n return params.value;\n }\n return dateDecoder.encode(params);\n },\n}) });\n\nfunction hasEncoder<T>(decoder: ResultReadDecoder<T>): decoder is ResultDecoder<T> {\n return \"encode\" in decoder && typeof decoder.encode === \"function\";\n}\n\nfunction nullable<T>(params: { decoder: ResultDecoder<T> }): ResultDecoder<T | null>;\nfunction nullable<T>(params: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T | null>;\nfunction nullable<T>({ decoder }: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T | null> {\n const cached = nullableDecoders.get(decoder);\n if (cached !== undefined) return cached as ResultReadDecoder<T | null>;\n const read = (params: DecodeParams): T | null => params.value === null ? null : decoder.decode(params);\n const wrapped: ResultReadDecoder<T | null> = hasEncoder(decoder)\n ? registerScalar({ identity: wrappedIdentity({ decoder, kind: \"nullable\" }), contract: wrappedContract({ decoder, nullable: true }), decoder: Object.freeze({\n decode: read,\n encode: (params: DecodeParams): unknown => params.value === null ? null : decoder.encode(params),\n }) })\n : Object.freeze({ decode: read });\n nullableDecoders.set(decoder, wrapped);\n return wrapped;\n}\n\nfunction array<T>(params: { decoder: ResultDecoder<T> }): ResultDecoder<T[]>;\nfunction array<T>(params: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T[]>;\nfunction array<T>({ decoder }: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T[]> {\n const cached = arrayDecoders.get(decoder);\n if (cached !== undefined) return cached as ResultReadDecoder<T[]>;\n const bidirectional = hasEncoder(decoder);\n const read = (params: DecodeParams): T[] => {\n const raw = params.value;\n let value: unknown;\n if (params.dialect === \"postgres\" && typeof raw === \"string\") {\n if (bidirectional) value = parsePgArrayLiteral({ literal: raw });\n else {\n const elements = parsePgArrayLiteralNested({ literal: raw });\n if (elements !== null && elements.some((element) => Array.isArray(element))) refuse(false, \"Read-only array decoders support one-dimensional SQL arrays only\");\n value = elements;\n }\n } else value = ArrayBuffer.isView(raw) && \"length\" in raw ? Array.from(raw as unknown as ArrayLike<unknown>) : raw;\n if (!Array.isArray(value)) refuse(false, \"Expected an array projection\");\n return value.map((element) => decoder.decode({ ...params, value: element }));\n };\n const wrapped: ResultReadDecoder<T[]> = hasEncoder(decoder)\n ? registerScalar({ identity: wrappedIdentity({ decoder, kind: \"array\" }), contract: wrappedContract({ decoder, list: true }), decoder: Object.freeze({\n decode: read,\n encode: (params: DecodeParams): unknown => {\n if (!Array.isArray(params.value)) refuse(true, \"Expected an array parameter\");\n return params.value.map((value) => decoder.encode({ ...params, value }));\n },\n }) })\n : Object.freeze({ decode: read });\n arrayDecoders.set(decoder, wrapped);\n return wrapped;\n}\n\n/** Write-only composition; elements are encoded once and SQL owns the final array transport. */\nexport const encode: {\n readonly array: (params: { encoder: ResultParameterEncoder }) => ResultParameterEncoder;\n} = Object.freeze({\n array: ({ encoder }: { encoder: ResultParameterEncoder }): ResultParameterEncoder => Object.freeze({\n encode: (params: Parameters<ResultParameterEncoder[\"encode\"]>[0]): unknown => {\n if (!Array.isArray(params.value)) refuse(true, \"Expected an array parameter\");\n return Array.from(params.value, (value) => encoder.encode({ ...params, value }));\n },\n }),\n});\n\n/** Result contracts: scalar codecs, explicit nullability, enum membership, and object projections. */\nexport const decode: {\n readonly string: ResultDecoder<string>;\n readonly boolean: ResultDecoder<boolean>;\n readonly int: ResultDecoder<number>;\n readonly float: ResultDecoder<number>;\n readonly bigInt: ResultDecoder<bigint>;\n /** A BigInt column as a safe `number`; a value beyond `Number.MAX_SAFE_INTEGER` refuses (`VIBE_DATA_INVALID` read, `VIBE_VALIDATION` write). */\n readonly bigIntNumber: ResultDecoder<number>;\n readonly decimal: ResultDecoder<string>;\n readonly dateTime: ResultDecoder<Date>;\n readonly extendedDateTime: ResultDecoder<ExtendedDateTime>;\n readonly json: ResultDecoder<unknown>;\n readonly bytes: ResultDecoder<Uint8Array>;\n readonly nullable: {\n <T>(params: { decoder: ResultDecoder<T> }): ResultDecoder<T | null>;\n <T>(params: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T | null>;\n };\n readonly array: {\n <T>(params: { decoder: ResultDecoder<T> }): ResultDecoder<T[]>;\n <T>(params: { decoder: ResultReadDecoder<T> }): ResultReadDecoder<T[]>;\n };\n /** Membership in `values`; the members stay literal types where the decoder is written inline (`decode.object({ fields: { kind: decode.enum({ values: [\"a\", \"b\"] }) } })` reads `\"a\" | \"b\"`). */\n readonly enum: <const T extends string>(params: { values: readonly T[] }) => ResultDecoder<T>;\n readonly object: <F extends Fields>(params: { fields: F }) => ResultDecoder<Shape<F>>;\n} = Object.freeze({\n string: stringDecoder,\n boolean: scalar<boolean>(\"Boolean\", (value) => typeof value === \"boolean\"),\n int: scalar<number>(\"Int\", (value) => typeof value === \"number\" && Number.isSafeInteger(value)),\n float: scalar<number>(\"Float\", (value) => typeof value === \"number\" && Number.isFinite(value)),\n bigInt: bigIntDecoder,\n bigIntNumber: bigIntNumberDecoder,\n decimal: scalar<string>(\"Decimal\", (value) => typeof value === \"string\" && /^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+)?$/.test(value)),\n dateTime: dateDecoder,\n extendedDateTime: extendedDecoder,\n json: scalar<unknown>(\"Json\", (value) => value !== undefined),\n bytes: scalar<Uint8Array>(\"Bytes\", (value) => value instanceof Uint8Array),\n nullable,\n array,\n enum: <const T extends string>({ values }: { values: readonly T[] }): ResultDecoder<T> => {\n const members = new Set<string>(values);\n return registerScalar({ identity: JSON.stringify([\"enum\", [...members].sort()]), contract: { scalar: \"String\", nullable: false, list: false }, decoder: Object.freeze({\n decode: ({ value }: DecodeParams): T => typeof value === \"string\" && members.has(value) ? value as T : refuse(false, \"Unknown enum projection member\"),\n encode: ({ value }: DecodeParams): unknown => typeof value === \"string\" && members.has(value) ? value : refuse(true, \"Unknown enum parameter member\"),\n }) });\n },\n object: <F extends Fields>({ fields }: { fields: F }): ResultDecoder<Shape<F>> => {\n const entries = Object.entries(fields);\n const convert = (params: { value: unknown; dialect: Dialect; wire?: WireFidelity }, encoding: boolean): Shape<F> => {\n if (typeof params.value !== \"object\" || params.value === null || Array.isArray(params.value)) refuse(encoding, \"Expected a result row object\");\n const row = params.value as Record<string, unknown>;\n return Object.fromEntries(entries.map(([name, decoder]) => {\n if (!Object.hasOwn(row, name)) refuse(encoding, `Missing projection column \"${name}\"`);\n return [name, encoding ? decoder.encode({ ...params, value: row[name] }) : decodeResultColumn({ decoder, read: { ...params, value: row[name] }, column: name, reason: \"column-value\" })];\n })) as Shape<F>;\n };\n return Object.freeze({ decode: (params: DecodeParams): Shape<F> => convert(params, false), encode: (params: DecodeParams): unknown => convert(params, true) });\n },\n});\n",
18
19
  "/** Elements that must be double-quoted inside a postgres array literal. */\nconst PG_ARRAY_QUOTE: RegExp = /^$|^NULL$|[{},\"\\\\\\s]/i;\n\n/** Render encoded elements as a postgres array literal (`{A,\"B,C\",NULL}`). */\nexport function toPgArrayLiteral(params: { values: readonly unknown[] }): string {\n const { values } = params;\n const parts = values.map((value) => {\n if (value === null || value === undefined) return \"NULL\";\n const text = String(value);\n return PG_ARRAY_QUOTE.test(text) ? `\"${text.replace(/[\"\\\\]/g, (char) => `\\\\${char}`)}\"` : text;\n });\n return `{${parts.join(\",\")}}`;\n}\n\n/**\n * Parse a postgres array literal into its elements, or `null` when the text is\n * not a literal (defensive — the value then passes through untouched).\n * Unquoted `NULL` is SQL NULL; postgres quotes any element that could be\n * mistaken for it.\n *\n * RD-07: elements are SLICED out of the literal (an unquoted element up to the\n * next comma, a quoted one as the runs between its escapes) instead of built\n * one character at a time; the output, malformed input included, is the same\n * as the former char-by-char parser's (differential test\n * `tests/pg-array-literal-sliced.test.ts`).\n */\nexport function parsePgArrayLiteral(params: { literal: string }): (string | null)[] | null {\n // Explicit lower bounds (`[0:1]={a,b}`) prefix the literal; the elements are the same.\n const literal = params.literal.startsWith(\"[\") ? params.literal.replace(/^\\[-?\\d+:-?\\d+\\]=/, \"\") : params.literal;\n if (literal.length < 2 || literal.charCodeAt(0) !== 123 || literal.charCodeAt(literal.length - 1) !== 125) return null;\n // The elements live in [1, end): `end` is the closing brace.\n const end = literal.length - 1;\n if (end === 1) return [];\n const out: (string | null)[] = [];\n let index = 1;\n while (index < end) {\n if (literal.charCodeAt(index) === 34) {\n // Quoted: copy the runs between backslash escapes; an escape keeps the next character verbatim.\n let text = \"\";\n index++;\n let run = index;\n while (index < end) {\n const code = literal.charCodeAt(index);\n if (code === 92) {\n text += literal.slice(run, index) + (index + 1 < end ? (literal[index + 1] as string) : \"\");\n index += 2;\n run = index;\n continue;\n }\n if (code === 34) break;\n index++;\n }\n text += literal.slice(run, Math.min(index, end));\n // Step over the closing quote (an unterminated element simply ends at the brace).\n if (index < end) index++;\n out.push(text);\n } else {\n let stop = literal.indexOf(\",\", index);\n if (stop === -1 || stop > end) stop = end;\n const text = literal.slice(index, stop);\n out.push(text === \"NULL\" ? null : text);\n index = stop;\n }\n if (literal.charCodeAt(index) === 44) index++;\n }\n return out;\n}\n\n/** One element of a parsed array literal: its text, SQL NULL, or one nested dimension. */\nexport type PgArrayLiteralElement = string | null | readonly PgArrayLiteralElement[];\n\n/**\n * Parse a postgres array literal of ANY number of dimensions —\n * `{{1,2},{3,NULL}}` becomes `[[\"1\",\"2\"],[\"3\",null]]`, the nesting\n * node-postgres returns for a known array type — or `null` when the text is\n * not a well-formed literal. Explicit bounds (`[1:2][0:1]=`) are dropped.\n * {@link parsePgArrayLiteral} stays the one-dimensional fast path; it would\n * split `{{1,2}}` at every comma.\n */\nexport function parsePgArrayLiteralNested(params: { literal: string }): PgArrayLiteralElement[] | null {\n const text = params.literal.replace(/^(?:\\[-?\\d+:-?\\d+\\])+=/, \"\");\n const cursor = { index: 0 };\n const parsed = parseDimension({ text, cursor });\n return parsed !== null && cursor.index === text.length ? parsed : null;\n}\n\n/** One `{…}` level of {@link parsePgArrayLiteralNested}, from `cursor.index` (advanced past its `}`). */\nfunction parseDimension(params: { text: string; cursor: { index: number } }): PgArrayLiteralElement[] | null {\n const { text, cursor } = params;\n if (text[cursor.index] !== \"{\") return null;\n cursor.index++;\n const out: PgArrayLiteralElement[] = [];\n if (text[cursor.index] === \"}\") {\n cursor.index++;\n return out;\n }\n while (cursor.index < text.length) {\n if (text[cursor.index] === \"{\") {\n const nested = parseDimension({ text, cursor });\n if (nested === null) return null;\n out.push(nested);\n } else if (text[cursor.index] === '\"') {\n let element = \"\";\n cursor.index++;\n while (cursor.index < text.length && text[cursor.index] !== '\"') {\n if (text[cursor.index] === \"\\\\\") cursor.index++;\n element += text[cursor.index] ?? \"\";\n cursor.index++;\n }\n if (text[cursor.index] !== '\"') return null;\n cursor.index++;\n out.push(element);\n } else {\n let element = \"\";\n while (cursor.index < text.length && text[cursor.index] !== \",\" && text[cursor.index] !== \"}\") {\n element += text[cursor.index];\n cursor.index++;\n }\n out.push(element === \"NULL\" ? null : element);\n }\n if (text[cursor.index] === \",\") {\n cursor.index++;\n continue;\n }\n if (text[cursor.index] !== \"}\") return null;\n cursor.index++;\n return out;\n }\n return null;\n}\n\n",
19
- "/**\n * The pure codec tables — constitution rule 6.\n *\n * ONE place defines how a JS value becomes a driver parameter (`encode`) and\n * how a driver value becomes a JS value (`decode`), per dialect × scalar type.\n * Nothing else in any package may coerce: v1's BigInt-as-string, enum-array and\n * timestamp bugs all came from coercion scattered across query builders and\n * relation loaders (LEARNINGS.md).\n *\n * These tables are PURE — dialect × scalar type only, no schema/model\n * awareness. The FieldMeta-aware entry points (`getCodec`/`encodeValue`/\n * `decodeValue`/`decodeRow`/`decodeRows`) live in @vibeorm/runtime, which\n * re-exports these tables so existing consumers keep one import site.\n *\n * The two rules that make it work:\n * - EVERY parameter bound by the query builder passes through `encode`.\n * - EVERY row materialized by the client passes through `decode` — including\n * every relation-loaded child row (the v1 lesson).\n *\n * Database enums ride the String codec. String-backed enums use the field-bound\n * membership codec below; their wire values are still strings on every dialect.\n */\n\nimport { VibeError, invalidStoredData, isCanonicalLocalDate, timeOfDayType } from \"@vibeorm/schema\";\nimport type { Dialect, ScalarType } from \"@vibeorm/schema\";\nimport { rememberTimestampIdentity, sqliteTimestampIdentityValue, timestampIdentityText } from \"./timestamp-identity.ts\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/**\n * One scalar type's transport rules for one dialect. Both directions see only\n * non-null values — the runtime's `encodeValue`/`decodeValue` short-circuit\n * null/undefined.\n */\nexport type ScalarCodec = {\n readonly encode: (value: unknown) => unknown;\n readonly decode: (value: unknown) => unknown;\n};\n\nexport type CodecTable = Readonly<Record<ScalarType, ScalarCodec>>;\n\n/** Field-bound membership for string-backed enums; constructed once per field, not per value. */\nexport function enumMembershipCodec(params: {\n model: string;\n field: string;\n enum: string;\n members: readonly string[];\n}): ScalarCodec {\n const { model, field, enum: enumName } = params;\n const members: ReadonlySet<string> = new Set(params.members);\n return {\n encode: (value) => {\n if (typeof value === \"string\" && members.has(value)) return value;\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `Invalid value for enum ${enumName} on ${model}.${field}`,\n meta: { model, field, enum: enumName },\n });\n },\n decode: (value) => {\n if (typeof value === \"string\" && members.has(value)) return value;\n throw invalidStoredData({ model, field, enum: enumName, value });\n },\n };\n}\n\n// ─── Wire fidelity (board #30) ────────────────────────────────────\n\n/**\n * What a DRIVER actually delivers for NON-LIST **base-table storage** columns\n * on its result path — declared per adapter (`DatabaseAdapter.wire`), verified\n * live per driver, and consumed by the runtime's decode plans to skip decoders\n * that are provably no-ops for that driver. The claims hold because base-table\n * storage types follow the declared field types by construction (migrate's\n * mappings); VIEW columns can hide any expression type under a declared field\n * type (mysql `COUNT(*)` is BIGINT-as-string under an `Int` field), so the\n * runtime exempts views from pruning entirely.\n *\n * Why it exists: the codec tables above are keyed per DIALECT, but wire forms\n * differ per DRIVER (node-postgres hands `Date` objects where a text-mode\n * driver hands strings). Without a declaration every DateTime/Json/Int column\n * pays an idempotency probe per row per read; with one, the decode plan keeps\n * only decoders that do real work. The codec DEFINITIONS stay right here —\n * rule 6 — only plan membership changes, and only under a declaration.\n *\n * An adapter that declares nothing gets the full idempotency-guarded plan\n * (today's behaviour). Declarations are PROMISES: declare only what the\n * driver verifiably does.\n */\nexport type WireFidelity = {\n /** DateTime columns arrive as JS `Date` instances (`\"native\"`) or as text/number (`\"text\"`). */\n readonly dateTime?: \"native\" | \"text\";\n /** Json columns arrive already parsed (`\"parsed\"`) or as raw JSON text (`\"text\"`). */\n readonly json?: \"parsed\" | \"text\";\n /** Int/Float columns arrive as JS numbers (`\"native\"`) or as text (`\"text\"`). */\n readonly numbers?: \"native\" | \"text\";\n /**\n * Bytes columns arrive as Node `Buffer` instances (`\"buffer\"`: node-postgres,\n * bun:sql); absent means a plain `Uint8Array` (PGlite). Never prunes a\n * decoder: the runtime's JSON-transport plan reads it, so a `\"join\"`\n * relation child's bytes (base64 on the wire) materialize in the same class\n * the driver hands the `\"query\"` strategy — value identity (5.0 lane V).\n */\n readonly bytes?: \"buffer\";\n /**\n * Zone-less date-time text (MySQL DATETIME / TIMESTAMP / DATE) is read as a\n * UTC instant by the driver (`\"utc\"`: mysql2 with `timezone: \"Z\"`). Absent\n * means another or an unknown zone (another `timezone` option, an injected\n * pool). Never prunes a decoder: the runtime reads it to decide whether a\n * dialect default of `\"join\"` keeps value identity — the JSON transport\n * decodes that text as UTC (`lateralJson.requiresUtcDateTimeWire`, lane J).\n */\n readonly zoneLessDateTime?: \"utc\";\n};\n\n/**\n * Is this scalar type's DECODE a no-op under the declared wire fidelity?\n * Provable against the decode implementations in this file, identically on\n * every dialect table:\n *\n * - `DateTime` always validates finiteness. A native-wire claim does not\n * exclude PostgreSQL infinity, and some drivers return Invalid Date for it.\n * - `Json` + `json: \"parsed\"` — {@link jsonCodec}'s decode returns non-strings\n * unchanged. (For a driver that pre-parses, skipping is also the CORRECT\n * reading of a stored top-level JSON **string**: the driver hands a bare JS\n * string, which the guarded decode would wrongly re-parse.)\n * - `Int`/`Float` + `numbers: \"native\"` — {@link numberCodec}'s decode returns\n * numbers unchanged.\n *\n * Everything else always decodes: BigInt (string→BigInt is real work on every\n * driver that can't send int64), Decimal (mysql pads), Boolean (0/1→boolean),\n * Bytes, and every LIST field (array wire forms differ per driver and are not\n * covered by the declaration) — with ONE exception the runtime applies (F13):\n * `Json` + `json: \"parsed\"` extends to list ELEMENTS, because a driver that\n * parses json parses the elements of a json ARRAY too (verified live:\n * node-postgres and PGlite both return `ARRAY['\"123\"'::jsonb]` as the JS\n * string `\"123\"`). The same `json` claim is the only one the runtime keeps\n * over a VIEW — it is a promise about the DRIVER's result path, while the\n * `dateTime`/`numbers` claims depend on the expression type a view can hide.\n */\nexport function decodeIsNoop(params: { scalarType: ScalarType; wire: WireFidelity | undefined }): boolean {\n const { scalarType, wire } = params;\n if (wire === undefined) return false;\n if (scalarType === \"DateTime\") return false;\n if (scalarType === \"Json\") return wire.json === \"parsed\";\n if (scalarType === \"Int\" || scalarType === \"Float\") return wire.numbers === \"native\";\n return false;\n}\n\n// ─── Shared codec pieces ──────────────────────────────────────────\n\nconst identity = (value: unknown): unknown => value;\n\n/** Values that already are what the driver wants, in both directions. */\nconst passthroughCodec: ScalarCodec = { encode: identity, decode: identity };\n\n/** Numbers that some drivers hand back as text (numeric-ish column types). */\nconst numberCodec: ScalarCodec = {\n encode: identity,\n decode: (value) => (typeof value === \"string\" ? Number(value) : value),\n};\n\n/**\n * BigInt. No driver serializes a JS `bigint` parameter, so it always goes out\n * as text; sqlite's INTEGER affinity converts it back on the way in. Incoming\n * values arrive as strings (postgres `int8`, mysql `BIGINT`) or numbers.\n */\nconst bigIntCodec: ScalarCodec = {\n encode: (value) => (typeof value === \"bigint\" ? value.toString() : value),\n decode: (value) => {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"string\" && /^[+-]?\\d+$/.test(value.trim())) return BigInt(value.trim());\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return BigInt(value);\n throw new VibeError({ code: \"VIBE_DATA_INVALID\", message: \"BigInt requires an integer string or a safe integer\", meta: { value } });\n },\n};\n\n/**\n * Decimal stays a string in JS, in both directions and on every dialect: no\n * float rounding, and no decimal library forced on the consumer. Numbers and\n * bigints passed in are stringified rather than silently losing precision.\n *\n * Decode is identity on postgres and sqlite: both preserve the scale the\n * value was WRITTEN with (`numeric` keeps the input's display scale; sqlite\n * stores the text), so `\"12.340\"` round-trips as `\"12.340\"` — trimming would\n * destroy information the engine kept. MySQL cannot preserve it (fixed-scale\n * DECIMAL) and gets its own decode — see {@link mysqlDecimalCodec}.\n */\nconst decimalCodec: ScalarCodec = {\n encode: (value) => (typeof value === \"number\" || typeof value === \"bigint\" ? String(value) : value),\n decode: identity,\n};\n\n/**\n * MySQL Decimal: same encode, but decode trims the fixed-scale padding.\n * MySQL's DECIMAL is fixed-scale, so the written scale is unrecoverable and\n * every value comes back padded to the column's full scale — verified live on\n * 8.4, `DECIMAL(65, 30)` returns `\"42.420000000000000000000000000000\"` where\n * postgres/sqlite return `\"42.42\"`. Trailing FRACTIONAL zeros (and a\n * then-dangling point) are an artifact of storage, not the value, so decode\n * trims them to the minimal exact string. Integer zeros are never touched.\n */\nconst mysqlDecimalCodec: ScalarCodec = {\n encode: decimalCodec.encode,\n decode: (value) => {\n if (typeof value !== \"string\" || !value.includes(\".\")) return value;\n const trimmed = value.replace(/0+$/, \"\").replace(/\\.$/, \"\");\n return trimmed === \"\" || trimmed === \"-\" ? \"0\" : trimmed;\n },\n};\n\n// ─── Zone-less date-time text ─────────────────────────────────────\n\n/**\n * `YYYY-MM-DD[T ]HH:MM[:SS[.fraction]]` carrying NO zone: the text form of a\n * postgres `timestamp without time zone` (row wire, PGlite, and the join\n * strategy's JSON transport) and of a mysql `DATETIME`.\n */\nconst ZONE_LESS_DATETIME = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,9})?)?$/;\n\n/**\n * The postgres TEXT form of a `timestamptz`: `2024-06-01 12:34:56.789+00`,\n * `+05:30`, `-03`. JavaScriptCore reads a space-separated date with a bare\n * `+HH` offset unreliably (`0001-01-01 00:00:00+00` parses as the year 2001),\n * so it is rewritten to ISO-8601 (`T`, `+HH:MM`) first. Offsets with seconds\n * (historic local mean time) fall through to the engine.\n */\nconst PG_ZONED_DATETIME = /^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2}(?::\\d{2})?)(\\.\\d{1,9})?([+-]\\d{2})(?::?(\\d{2}))?$/;\n\n/** The fields {@link parseExtendedDateTimeText} reads: year (4+ digits), date, optional time, fraction, offset (with seconds), era. */\nconst EXTENDED_DATETIME = /^(\\d{4,})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,9}))?)?)?(?:([+-])(\\d{2})(?::?(\\d{2}))?(?::?(\\d{2}))?)?( BC)?$/;\n\n/**\n * Parse date-time text into a `Date`, reading ZONE-LESS text as **UTC**.\n *\n * ECMA-262 reads `2026-01-15T12:00:00` as process-LOCAL time, so the same\n * stored value would decode to a different instant on every host time zone,\n * and to a different instant than bun:sql (UTC) or Prisma (UTC for\n * `@db.Timestamp`) return for the same row. Treat-as-UTC is the only reading\n * that yields ONE instant everywhere (MYSQL-2, live-proven; the postgres\n * `timestamp` case is proven by apps/tests `timestamp-zones.e2e`). Text with\n * an explicit `Z`/offset and date-only text parse as ECMA-262 already reads\n * them (as written / UTC midnight); anything unparseable is `undefined` so the\n * caller keeps its own fallback. Fractions beyond milliseconds are truncated —\n * `Date` has no finer resolution and engines differ on longer fractions.\n */\nexport function parseDateTimeText(params: { text: string }): Date | undefined {\n const trimmed = params.text.trim();\n const date = parseDateTimeInstant({ trimmed });\n return date === undefined ? undefined : rememberTimestampIdentity({ date, text: trimmed });\n}\n\n/**\n * {@link parseDateTimeText}'s instant without its identity record — for a caller that records its own (A-02).\n *\n * RD-08 fast paths, both EXACT by construction (they only skip work whose\n * outcome is already known, so every text decodes to the same instant):\n * - text ending in `Z` (SQLite's canonical `2026-01-01T00:00:00.000Z`): both\n * regular expressions below need a trailing digit, so today's path always\n * ended in `new Date(trimmed)`;\n * - PostgreSQL's JSON form `YYYY-MM-DDTHH:MM:SS[.sss]±HH:MM` (25 or 29\n * characters, the join strategy's transport): `ZONE_LESS_DATETIME` cannot\n * match a sign, and `PG_ZONED_DATETIME` rebuilds exactly this text (`T`, a\n * fraction of at most three digits, `±HH:MM`) before the same `new Date`.\n */\nfunction parseDateTimeInstant(params: { trimmed: string }): Date | undefined {\n const { trimmed } = params;\n const length = trimmed.length;\n if (\n (length > 0 && trimmed.charCodeAt(length - 1) === 90) ||\n ((length === 25 || (length === 29 && trimmed.charCodeAt(19) === 46)) &&\n trimmed.charCodeAt(10) === 84 &&\n trimmed.charCodeAt(length - 3) === 58 &&\n (trimmed.charCodeAt(length - 6) === 43 || trimmed.charCodeAt(length - 6) === 45))\n ) {\n const parsed = new Date(trimmed);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n if (ZONE_LESS_DATETIME.test(trimmed)) {\n const asUtc = new Date(`${trimmed.replace(\" \", \"T\").replace(/(\\.\\d{3})\\d+$/, \"$1\")}Z`);\n if (!Number.isNaN(asUtc.getTime())) return asUtc;\n }\n const zoned = PG_ZONED_DATETIME.exec(trimmed);\n if (zoned !== null) {\n const [, date, time, fraction, hours, minutes] = zoned;\n const iso = new Date(`${date}T${time}${(fraction ?? \"\").slice(0, 4)}${hours}:${minutes ?? \"00\"}`);\n if (!Number.isNaN(iso.getTime())) return iso;\n }\n const extended = parseExtendedDateTimeText({ text: trimmed });\n if (extended !== undefined) return extended;\n const parsed = new Date(trimmed);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\n/**\n * PostgreSQL date/time text with a year of five or more digits or a ` BC` era,\n * in the row text form and the JSON form: `12345-06-07 08:09:10.111+00`,\n * `12345-06-07T08:09:10.111` (zone-less), `0044-03-15T12:00:00.5+00:00 BC`,\n * `0044-03-15 BC` (`date`). ECMA-262 parses none of them (an expanded year\n * needs `+012345`), and a value near the end of year 9999 reaches them\n * through the session zone alone (`9999-12-31 23:59+00` prints as\n * `10000-01-01 00:59+01` east of UTC). Built from its fields, by the rules of\n * {@link parseDateTimeText}: the BC year astronomically (`1 BC` = year 0, the\n * reading of node-postgres), zone-less text as UTC, the fraction truncated to\n * milliseconds, an offset with seconds applied exactly.\n *\n * `undefined` for every other text — a 4-digit AD value keeps the parse it\n * had — and for an instant outside the `Date` range. Exported for the adapters\n * whose zone-less driver parsers fall back to it (one rule, rule 6).\n */\nexport function parseExtendedDateTimeText(params: { text: string }): Date | undefined {\n const match = EXTENDED_DATETIME.exec(params.text.trim());\n if (match === null) return undefined;\n const [, yearText, month, day, hours, minutes, seconds, fraction, sign, offsetHours, offsetMinutes, offsetSeconds, era] = match;\n if ((yearText as string).length < 5 && era === undefined) return undefined;\n const year = era === undefined ? Number(yearText) : 1 - Number(yearText);\n const date = new Date(0);\n date.setUTCFullYear(year, Number(month) - 1, Number(day));\n date.setUTCHours(Number(hours ?? 0), Number(minutes ?? 0), Number(seconds ?? 0), Number((fraction ?? \"\").padEnd(3, \"0\").slice(0, 3)));\n if (sign !== undefined) {\n const offset = (Number(offsetHours) * 3600 + Number(offsetMinutes ?? 0) * 60 + Number(offsetSeconds ?? 0)) * 1000;\n date.setTime(date.getTime() - (sign === \"-\" ? -offset : offset));\n }\n return Number.isNaN(date.getTime()) ? undefined : date;\n}\n\n/**\n * The decode refusal of a non-finite or unparseable DateTime — one error for\n * every DateTime codec. Exported so a statement that refuses such a value\n * itself (the runtime's in-statement value guard, round-trip follow-up D1)\n * reports exactly this error.\n */\nexport function decodedDateTimeRefusal(): VibeError {\n return new VibeError({ code: \"VIBE_DATA_INVALID\", message: \"DateTime requires a finite timestamp; use an explicit extended timestamp decoder for infinity\" });\n}\n\nfunction invalidDecodedDateTime(): never {\n throw decodedDateTimeRefusal();\n}\n\n/**\n * DateTime where the driver speaks `Date` objects (postgres, mysql). Text\n * reaching decode (the join strategy's JSON transport, a text-mode driver)\n * goes through {@link parseDateTimeText}: zone-less text is UTC.\n */\nconst dateNativeCodec: ScalarCodec = {\n encode: (value) => {\n if ((value instanceof Date && !Number.isFinite(value.getTime())) || (typeof value === \"number\" && !Number.isFinite(value)) || (typeof value === \"string\" && /^[+-]?infinity$/i.test(value.trim()))) {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: \"DateTime parameters require finite timestamps; use an extended timestamp encoder for infinity\" });\n }\n return value instanceof Date ? timestampIdentityText({ date: value }) ?? value : value;\n },\n decode: (value) => {\n const date = value instanceof Date ? value\n : typeof value === \"string\" ? parseDateTimeText({ text: value })\n : typeof value === \"number\" ? new Date(value) : undefined;\n if (date !== undefined && Number.isFinite(date.getTime())) return date;\n return invalidDecodedDateTime();\n },\n};\n\n/** DateTime on sqlite: stored as ISO-8601 UTC text (explicit `Z`), parsed back on read. */\nconst dateTextCodec: ScalarCodec = {\n encode: (value) => {\n dateNativeCodec.encode(value);\n const date = value instanceof Date ? value\n : typeof value === \"string\" ? parseDateTimeText({ text: value })\n : typeof value === \"number\" ? new Date(value) : undefined;\n if (date !== undefined && Number.isFinite(date.getTime())) return value instanceof Date ? sqliteTimestampIdentityValue({ date: value }) ?? date.toISOString() : date.toISOString();\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: \"DateTime parameters require a valid finite timestamp\" });\n },\n decode: (value) => {\n if (typeof value === \"string\") {\n // A-02: parse once and record ONE identity — the sqlite one (the shared\n // parse used to record a timestamp identity first, then this overwrote it).\n const date = parseDateTimeInstant({ trimmed: value.trim() });\n if (date === undefined || !Number.isFinite(date.getTime())) return invalidDecodedDateTime();\n return rememberTimestampIdentity({ date, text: value, key: `date:${value}`, kind: \"sqlite\" });\n }\n const date = dateNativeCodec.decode(value) as Date;\n if (typeof value === \"number\") return rememberTimestampIdentity({ date, text: date.toISOString(), numeric: value, key: `epoch:${value}`, kind: \"sqlite\" });\n return date;\n },\n};\n\n/**\n * DateTime on mysql (N4 + MYSQL-2): mysql2 serializes `Date` per the\n * adapter's pinned `timezone: \"Z\"`, but passes STRINGS verbatim — an ISO-8601\n * string operand hard-errors on strict-mode servers (1292). Encode normalizes\n * parseable strings/numbers to `Date` through {@link parseDateTimeText} —\n * ZONE-LESS strings (`2026-01-15T12:00:00`, `2026-01-15 12:00:00`) parse as\n * UTC, never process-local time (MYSQL-2, live-proven: TZ=America/New_York\n * stored 17:00Z for a noon literal): postgres under the session's pinned UTC\n * parses the same literal as UTC, so treat-as-UTC is the only reading that\n * stores the SAME instant on both dialects. Strings with an explicit Z/offset\n * parse as written; garbage passes through so the driver's own error names it.\n */\nconst mysqlDateCodec: ScalarCodec = {\n encode: (value) => {\n dateNativeCodec.encode(value);\n if (value instanceof Date) {\n const text = timestampIdentityText({ date: value, kind: \"timestamp\" });\n if (text !== undefined) {\n // MySQL parameters need zone-less UTC text, not a driver Date or ISO Z.\n const fraction = /\\.(\\d+)/.exec(text)?.[1] ?? \"\";\n return value.toISOString().replace(\"T\", \" \").replace(/\\.\\d{3}Z$/, `.${fraction.padEnd(3, \"0\")}`);\n }\n return value;\n }\n if (typeof value === \"number\") {\n const parsed = new Date(value); // epoch millis — zone-free by definition\n if (!Number.isNaN(parsed.getTime())) return parsed;\n return value;\n }\n if (typeof value === \"string\") return parseDateTimeText({ text: value }) ?? value;\n return value;\n },\n decode: dateNativeCodec.decode,\n};\n\n// ─── Time of day (`@db.Time` / `@db.Timetz`) ───────────────────────\n\nconst MILLISECONDS_PER_DAY = 86_400_000;\n\n/**\n * Time-of-day text as postgres (`time`, `timetz`, also inside JSON) and mysql\n * (`TIME`) print it: `HH:MM[:SS[.fraction]]`, then for timetz an offset\n * `+HH`, `+HH:MM` or `+HH:MM:SS`. Hours are two digits: a mysql duration\n * beyond a day (`838:59:59`) or below zero (`-01:00:00`) is not a time of day.\n */\nconst TIME_OF_DAY_TEXT = /^(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,9}))?)?(?:([+-])(\\d{2})(?::?(\\d{2}))?(?::?(\\d{2}))?)?$/;\n\nconst pad = (value: number, width: number): string => String(value).padStart(width, \"0\");\n\n/** Milliseconds since midnight UTC of a finite instant. */\nconst utcMillisecondOfDay = (date: Date): number =>\n ((date.getTime() % MILLISECONDS_PER_DAY) + MILLISECONDS_PER_DAY) % MILLISECONDS_PER_DAY;\n\n/** `HH:MM:SS.mmm` for a millisecond of the day. */\nconst timeOfDayText = (millisecond: number): string =>\n `${pad(Math.floor(millisecond / 3_600_000), 2)}:${pad(Math.floor(millisecond / 60_000) % 60, 2)}:${pad(Math.floor(millisecond / 1000) % 60, 2)}.${pad(millisecond % 1000, 3)}`;\n\n/**\n * The time-of-day codec — Prisma's contract for `DateTime @db.Time(n)` and\n * `@db.Timetz(n)` (release 3.0 decision D2), identical on every dialect that\n * holds the type (`DialectCapabilities.timeOfDayTypes`):\n *\n * - encode: the UTC time of day of the `Date` with millisecond precision,\n * `HH:MM:SS.mmm`, plus `+00` for timetz. The date part is dropped. A string\n * or epoch-millisecond number is read as an instant first (zone-less text is\n * UTC, {@link parseDateTimeText}). The full instant must never reach the\n * driver: postgres refuses `1970-01-01T13:14:15.123Z` for `time` (22007),\n * and PGlite sends a `Date` as `Date#toString()` (host-local).\n * - decode: a `Date` at `1970-01-01` with that UTC time of day. A timetz\n * offset is applied first and the result wraps into the same day\n * (`01:00:00+02` → `1970-01-01T23:00:00.000Z`); postgres's `24:00:00` wraps\n * to midnight. Fractions beyond milliseconds are truncated, as for every\n * DateTime. A driver `Date` keeps only its UTC time of day.\n *\n * Not a table row: the runtime routes a DateTime field whose native type is a\n * time of day here ({@link timeOfDayCodec}), like `float32Codec` for `@db.Real`.\n */\nfunction makeTimeOfDayCodec(params: { zoned: boolean }): ScalarCodec {\n const suffix = params.zoned ? \"+00\" : \"\";\n return Object.freeze({\n encode: (value: unknown): unknown => {\n dateNativeCodec.encode(value);\n const date = value instanceof Date ? value\n : typeof value === \"string\" ? parseDateTimeText({ text: value })\n : typeof value === \"number\" ? new Date(value) : undefined;\n if (date === undefined || !Number.isFinite(date.getTime())) {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: \"a time-of-day DateTime parameter requires a valid finite Date\", meta: { value } });\n }\n return timestampIdentityText({ date, kind: params.zoned ? \"timetz\" : \"time\" }) ?? `${timeOfDayText(utcMillisecondOfDay(date))}${suffix}`;\n },\n decode: (value: unknown): unknown => {\n if (value instanceof Date && Number.isFinite(value.getTime())) {\n if (timestampIdentityText({ date: value, kind: params.zoned ? \"timetz\" : \"time\" }) !== undefined) return value;\n const milliseconds = utcMillisecondOfDay(value);\n const text = timeOfDayText(milliseconds);\n return rememberTimestampIdentity({ date: new Date(milliseconds), text: `${text}${suffix}`, key: `${params.zoned ? \"timetz\" : \"time\"}:${text}:0`, kind: params.zoned ? \"timetz\" : \"time\" });\n }\n const match = typeof value === \"string\" ? TIME_OF_DAY_TEXT.exec(value.trim()) : null;\n if (match !== null) {\n const [, hours, minutes, seconds, fraction, sign, offsetHours, offsetMinutes, offsetSeconds] = match;\n const millisecond = Number(hours) * 3_600_000 + Number(minutes) * 60_000 + Number(seconds ?? 0) * 1000\n + Number((fraction ?? \"\").slice(0, 3).padEnd(3, \"0\"));\n const offset = sign === undefined ? 0\n : (sign === \"-\" ? -1 : 1) * (Number(offsetHours) * 3_600_000 + Number(offsetMinutes ?? 0) * 60_000 + Number(offsetSeconds ?? 0) * 1000);\n if (millisecond <= MILLISECONDS_PER_DAY) {\n const date = new Date((((millisecond - offset) % MILLISECONDS_PER_DAY) + MILLISECONDS_PER_DAY) % MILLISECONDS_PER_DAY);\n const exactFraction = (fraction ?? \"\").padEnd(3, \"0\").replace(/(?<=\\d{3})0+$/, \"\");\n // PostgreSQL date.c:timetz_cmp_internal equates values only when\n // BOTH local time and zone agree. Do not key by the wrapped UTC Date:\n // 14:00+02 differs from 12:00+00, and 24:00 differs from 00:00.\n const key = `${params.zoned ? \"timetz\" : \"time\"}:${hours}:${minutes}:${seconds ?? \"00\"}.${exactFraction}:${offset}`;\n return rememberTimestampIdentity({ date, text: (value as string).trim(), key, kind: params.zoned ? \"timetz\" : \"time\" });\n }\n }\n throw new VibeError({ code: \"VIBE_DATA_INVALID\", message: \"a time-of-day DateTime column returned a value that is not a time of day\", meta: { value } });\n },\n });\n}\n\nconst timeCodec: ScalarCodec = makeTimeOfDayCodec({ zoned: false });\nconst timetzCodec: ScalarCodec = makeTimeOfDayCodec({ zoned: true });\n\n/**\n * The time-of-day codec for a DateTime field's native type, or `undefined`\n * when the native type is not `time`/`timetz` (the DateTime table row\n * applies). The one native-type rule is `timeOfDayType` in @vibeorm/schema,\n * shared with the dialect refusal in schema validation.\n */\nexport function timeOfDayCodec(params: { nativeType: string | undefined }): ScalarCodec | undefined {\n const type = timeOfDayType({ nativeType: params.nativeType });\n return type === \"timetz\" ? timetzCodec : type === \"time\" ? timeCodec : undefined;\n}\n\n/** Canonical calendar-day text only; a driver Date cannot recover the authored day. */\nexport const localDateCodec: ScalarCodec = Object.freeze({\n encode: (value: unknown): string => {\n const candidate = { value };\n if (isCanonicalLocalDate(candidate)) return candidate.value;\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: \"A local date requires canonical YYYY-MM-DD text for a real date in years 0001–9999\",\n meta: { value },\n });\n },\n decode: (value: unknown): string => {\n const candidate = { value };\n if (isCanonicalLocalDate(candidate)) return candidate.value;\n throw new VibeError({\n code: \"VIBE_DATA_INVALID\",\n message: \"A local-date column returned noncanonical or out-of-domain calendar-day text\",\n meta: { value },\n });\n },\n});\n\n/** Booleans stored as 0/1 (sqlite INTEGER). */\nconst booleanIntCodec: ScalarCodec = {\n encode: (value) => (typeof value === \"boolean\" ? (value ? 1 : 0) : value),\n decode: (value) => (typeof value === \"number\" ? value !== 0 : value),\n};\n\n/**\n * MySQL reads TINYINT(1) as numeric 0/1 and LONGLONG predicates as exact text\n * when bigNumberStrings is enabled. Encoding still sends booleans natively.\n */\nconst booleanNativeInCodec: ScalarCodec = {\n encode: identity,\n decode: (value) => value === \"0\" ? false : value === \"1\" ? true : booleanIntCodec.decode(value),\n};\n\n/**\n * Parse stored JSON text at the centralized codec boundary. A supplied context\n * marks a bound field: its error contains only that context, never the document\n * or the native parser cause. Without context, legacy codec errors are unchanged.\n */\nexport function parseJsonText(params: {\n text: string;\n context?: Readonly<Record<string, unknown>>;\n}): unknown {\n const { text, context } = params;\n try {\n return JSON.parse(text);\n } catch (cause) {\n if (context !== undefined) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: \"a bound Json field returned text that is not valid JSON\",\n meta: { ...context },\n });\n }\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: \"a Json column returned text that is not valid JSON\",\n meta: { value: text },\n cause,\n });\n }\n}\n\n/**\n * JSON is serialized by US, on every dialect, and never handed to a driver as a\n * live object. Two reasons: drivers disagree (node-postgres stringifies objects,\n * bun:sqlite and mysql2 do not), and a JSON payload that happens to look like an\n * atomic UPDATE operation must never reach the SQL AST as an object\n * (see `isSetOperation` in ast.ts). Reads arrive as text on postgres and\n * sqlite, and already parsed from mysql2's JSON columns.\n */\nconst jsonCodec: ScalarCodec = {\n encode: (value) => JSON.stringify(value),\n decode: (value) => {\n if (typeof value !== \"string\") return value;\n return parseJsonText({ text: value });\n },\n};\n\n// ─── float32 (`Float @db.Real`) ──────────────────────────────────\n\n/**\n * The SHORTEST decimal that round-trips through float32 to the same value as\n * `value` — what postgres itself prints for a `real` (`0.1`, `3.4028235e+38`).\n *\n * A driver that reads a `real` in BINARY format (bun:sql with named\n * statements) hands back the float32 widened to float64:\n * `0.10000000149011612` for a stored `0.1`. Text-format drivers already give\n * the short form, and for those this is the identity — the shortest form of a\n * short value is itself — so it is safe on every driver. Smallest `p` in 1..9\n * with `fround(toPrecision(p)) === fround(value)`; nine significant digits\n * always identify a float32. `±0`, NaN and ±Infinity pass through.\n */\nexport function shortestFloat32(params: { value: number }): number {\n const { value } = params;\n if (value === 0 || !Number.isFinite(value)) return value;\n const target = Math.fround(value);\n for (let precision = 1; precision <= 9; precision++) {\n const candidate = Number(value.toPrecision(precision));\n if (Math.fround(candidate) === target) return candidate;\n }\n return value;\n}\n\n/**\n * `Float @db.Real` — a refinement of the Float codec keyed by the native type,\n * not by the scalar type, so it is not a table row: the runtime routes a\n * field with `nativeType: \"Real\"` here. Decode = {@link numberCodec} then\n * {@link shortestFloat32}. Real aggregates that postgres returns as `real`\n * (`min`/`max`/`sum`) use it too; `avg` returns double precision and must not.\n */\nexport const float32Codec: ScalarCodec = {\n encode: identity,\n decode: (value) => {\n const number = typeof value === \"string\" ? Number(value) : value;\n return typeof number === \"number\" ? shortestFloat32({ value: number }) : number;\n },\n};\n\n// ─── postgres array-literal elements ────────────────────────────\n\nconst booleanFromText = (text: string): unknown => (text === \"t\" ? true : text === \"f\" ? false : text);\n\n/** bytea TEXT output (`\\x0102`, the default `bytea_output = hex`). */\nconst bytesFromText = (text: string): unknown =>\n /^\\\\x(?:[0-9a-fA-F]{2})*$/.test(text) ? new Uint8Array(Buffer.from(text.slice(2), \"hex\")) : text;\n\n/**\n * Element decoders for a postgres array that arrived as its TEXT literal\n * (`{1e-07,NULL}`, `{\"{\\\"a\\\": 1}\"}`) — the runtime projects `Float[]`/`Json[]`\n * as `::text`, and drivers return arrays whose type OID they do not know\n * (`uuid[]` on bun:sql; `xml[]`, `bit[]`, `citext[]` on node-postgres) as the\n * literal. Each element is postgres's text output for its type:\n *\n * - Boolean `t`/`f`, Bytes `\\x` hex and Json text need their own conversion;\n * - every other scalar's regular postgres codec already accepts the text form\n * (`Number(\"1e-07\")`, `Number(\"NaN\")`, `Number(\"-0\")`, BigInt/Decimal text,\n * `parseDateTimeText` for `2024-06-01 12:34:56.789+00`), so `null` means\n * \"decode with the field's own codec\".\n */\nexport function postgresArrayElementFromText(params: { scalarType: ScalarType }): ((text: string) => unknown) | null {\n switch (params.scalarType) {\n case \"Boolean\":\n return booleanFromText;\n case \"Bytes\":\n return bytesFromText;\n case \"Json\":\n return jsonCodec.decode as (text: string) => unknown;\n default:\n return null;\n }\n}\n\n// ─── Per-dialect tables ───────────────────────────────────────────\n\n/** postgres (and pglite — same wire behaviour). */\nexport const POSTGRES_CODECS: CodecTable = {\n String: passthroughCodec,\n Boolean: passthroughCodec,\n Int: numberCodec,\n BigInt: bigIntCodec,\n Float: numberCodec,\n Decimal: decimalCodec,\n DateTime: dateNativeCodec,\n Json: jsonCodec,\n Bytes: passthroughCodec,\n};\n\n/** sqlite — no boolean, date or json types; everything rides TEXT/INTEGER. */\nexport const SQLITE_CODECS: CodecTable = {\n String: passthroughCodec,\n Boolean: booleanIntCodec,\n Int: numberCodec,\n BigInt: bigIntCodec,\n Float: numberCodec,\n Decimal: decimalCodec,\n DateTime: dateTextCodec,\n Json: jsonCodec,\n Bytes: passthroughCodec,\n};\n\n/** mysql — native DATETIME and JSON, booleans stored as TINYINT(1). */\nexport const MYSQL_CODECS: CodecTable = {\n String: passthroughCodec,\n Boolean: booleanNativeInCodec,\n Int: numberCodec,\n BigInt: bigIntCodec,\n Float: numberCodec,\n Decimal: mysqlDecimalCodec,\n DateTime: mysqlDateCodec,\n Json: jsonCodec,\n Bytes: passthroughCodec,\n};\n\n/** The whole table, keyed by dialect. */\nexport const DIALECT_CODECS: Readonly<Record<Dialect, CodecTable>> = {\n postgres: POSTGRES_CODECS,\n sqlite: SQLITE_CODECS,\n mysql: MYSQL_CODECS,\n};\n",
20
- "// The query entry is a separate bundle. Its existing authenticity maps must\n// participate in ordinary value admission as well as reusable input admission.\nconst checks = new Set<(value: object) => boolean>();\n\n/** @internal Register a bundle's existing SQL-handle identity check, not object shapes. */\nexport function registerSqlHandleCheck(params: { check: (value: object) => boolean }): void {\n checks.add(params.check);\n}\n\n/** @internal Authentic SQL code cannot become parameter data, including nested values. */\nexport function isSqlHandle(value: object): boolean {\n for (const check of checks) if (check(value)) return true;\n return false;\n}\n",
20
+ "/**\n * The pure codec tables — constitution rule 6.\n *\n * ONE place defines how a JS value becomes a driver parameter (`encode`) and\n * how a driver value becomes a JS value (`decode`), per dialect × scalar type.\n * Nothing else in any package may coerce: v1's BigInt-as-string, enum-array and\n * timestamp bugs all came from coercion scattered across query builders and\n * relation loaders (LEARNINGS.md).\n *\n * These tables are PURE — dialect × scalar type only, no schema/model\n * awareness. The FieldMeta-aware entry points (`getCodec`/`encodeValue`/\n * `decodeValue`/`decodeRow`/`decodeRows`) live in @vibeorm/runtime, which\n * re-exports these tables so existing consumers keep one import site.\n *\n * The two rules that make it work:\n * - EVERY parameter bound by the query builder passes through `encode`.\n * - EVERY row materialized by the client passes through `decode` — including\n * every relation-loaded child row (the v1 lesson).\n *\n * Database enums ride the String codec. String-backed enums use the field-bound\n * membership codec below; their wire values are still strings on every dialect.\n */\n\nimport { VibeError, invalidStoredData, isCanonicalLocalDate, timeOfDayType } from \"@vibeorm/schema\";\nimport type { Dialect, ScalarType } from \"@vibeorm/schema\";\nimport { boundTimestampParameter, boundTimestampText, rememberTimestampIdentity, sqliteTimestampIdentityValue, timestampIdentityText } from \"./timestamp-identity.ts\";\nimport { parsePlainTimestampText } from \"./timestamp-text.ts\";\n\n// ─── Types ────────────────────────────────────────────────────────\n\n/**\n * One scalar type's transport rules for one dialect. Both directions see only\n * non-null values — the runtime's `encodeValue`/`decodeValue` short-circuit\n * null/undefined.\n */\nexport type ScalarCodec = {\n readonly encode: (value: unknown) => unknown;\n readonly decode: (value: unknown) => unknown;\n};\n\nexport type CodecTable = Readonly<Record<ScalarType, ScalarCodec>>;\n\n/** Field-bound membership for string-backed enums; constructed once per field, not per value. */\nexport function enumMembershipCodec(params: {\n model: string;\n field: string;\n enum: string;\n members: readonly string[];\n}): ScalarCodec {\n const { model, field, enum: enumName } = params;\n const members: ReadonlySet<string> = new Set(params.members);\n return {\n encode: (value) => {\n if (typeof value === \"string\" && members.has(value)) return value;\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `Invalid value for enum ${enumName} on ${model}.${field}`,\n meta: { model, field, enum: enumName },\n });\n },\n decode: (value) => {\n if (typeof value === \"string\" && members.has(value)) return value;\n throw invalidStoredData({ model, field, enum: enumName, value });\n },\n };\n}\n\n// ─── Wire fidelity (board #30) ────────────────────────────────────\n\n/**\n * What a DRIVER actually delivers for NON-LIST **base-table storage** columns\n * on its result path — declared per adapter (`DatabaseAdapter.wire`), verified\n * live per driver, and consumed by the runtime's decode plans to skip decoders\n * that are provably no-ops for that driver. The claims hold because base-table\n * storage types follow the declared field types by construction (migrate's\n * mappings); VIEW columns can hide any expression type under a declared field\n * type (mysql `COUNT(*)` is BIGINT-as-string under an `Int` field), so the\n * runtime exempts views from pruning entirely.\n *\n * Why it exists: the codec tables above are keyed per DIALECT, but wire forms\n * differ per DRIVER (node-postgres hands `Date` objects where a text-mode\n * driver hands strings). Without a declaration every DateTime/Json/Int column\n * pays an idempotency probe per row per read; with one, the decode plan keeps\n * only decoders that do real work. The codec DEFINITIONS stay right here —\n * rule 6 — only plan membership changes, and only under a declaration.\n *\n * An adapter that declares nothing gets the full idempotency-guarded plan\n * (today's behaviour). Declarations are PROMISES: declare only what the\n * driver verifiably does.\n */\nexport type WireFidelity = {\n /** DateTime columns arrive as JS `Date` instances (`\"native\"`) or as text/number (`\"text\"`). */\n readonly dateTime?: \"native\" | \"text\";\n /** Json columns arrive already parsed (`\"parsed\"`) or as raw JSON text (`\"text\"`). */\n readonly json?: \"parsed\" | \"text\";\n /** Int/Float columns arrive as JS numbers (`\"native\"`) or as text (`\"text\"`). */\n readonly numbers?: \"native\" | \"text\";\n /**\n * Bytes columns arrive as Node `Buffer` instances (`\"buffer\"`: node-postgres,\n * bun:sql); absent means a plain `Uint8Array` (PGlite). Never prunes a\n * decoder: the runtime's JSON-transport plan reads it, so a `\"join\"`\n * relation child's bytes (base64 on the wire) materialize in the same class\n * the driver hands the `\"query\"` strategy — value identity (5.0 lane V).\n */\n readonly bytes?: \"buffer\";\n /**\n * The zone the driver reads zone-less date-time text in (MySQL DATETIME /\n * TIMESTAMP / DATE): `\"utc\"` (mysql2 with `timezone: \"Z\"`), a fixed offset\n * in minutes east of UTC, or `\"local\"` (the process zone, read the way\n * mysql2 builds a local `Date`). The MySQL DateTime decoders read the same\n * text in the same zone wherever it arrives as text (the join strategy's\n * JSON, a page key, `exactDates`), so one stored cell is one instant on every\n * path; the adapter writes a bound parameter in it. Absent reads as UTC.\n * Never prunes a decoder. `\"utc\"` alone also lets a dialect default of\n * `\"join\"` apply (`lateralJson.requiresUtcDateTimeWire`): it is declared only\n * where the zone is known to be UTC.\n */\n readonly zoneLessDateTime?: DateTimeZone;\n};\n\n/** A zone zone-less date-time text is read in: UTC, a fixed offset in minutes east of UTC, or the process's local zone. */\nexport type DateTimeZone = \"utc\" | \"local\" | { readonly offsetMinutes: number };\n\n/**\n * The declared zone as the decoders apply it: `undefined` when the text is\n * read as UTC (no declaration, `\"utc\"`, an offset of zero), else `\"local\"` or\n * the offset in minutes.\n */\nfunction zoneShift(zone: DateTimeZone | undefined): \"local\" | number | undefined {\n if (zone === undefined || zone === \"utc\") return undefined;\n if (zone === \"local\") return \"local\";\n return zone.offsetMinutes === 0 ? undefined : zone.offsetMinutes;\n}\n\n/**\n * The cache-key fragment of a wire's date-time zone: `\"\"` when zone-less text\n * reads as UTC, so every UTC plan keeps its key; else `\"local\"` or the offset.\n */\nexport function dateTimeZoneKey(params: { wire: WireFidelity | undefined }): string {\n const shift = zoneShift(params.wire?.zoneLessDateTime);\n return shift === undefined ? \"\" : String(shift);\n}\n\n/**\n * Is this scalar type's DECODE a no-op under the declared wire fidelity?\n * Provable against the decode implementations in this file, identically on\n * every dialect table:\n *\n * - `DateTime` always validates finiteness. A native-wire claim does not\n * exclude PostgreSQL infinity, and some drivers return Invalid Date for it.\n * - `Json` + `json: \"parsed\"` — {@link jsonCodec}'s decode returns non-strings\n * unchanged. (For a driver that pre-parses, skipping is also the CORRECT\n * reading of a stored top-level JSON **string**: the driver hands a bare JS\n * string, which the guarded decode would wrongly re-parse.)\n * - `Int`/`Float` + `numbers: \"native\"` — {@link numberCodec}'s decode returns\n * numbers unchanged.\n *\n * Everything else always decodes: BigInt (string→BigInt is real work on every\n * driver that can't send int64), Decimal (mysql pads), Boolean (0/1→boolean),\n * Bytes, and every LIST field (array wire forms differ per driver and are not\n * covered by the declaration) — with ONE exception the runtime applies (F13):\n * `Json` + `json: \"parsed\"` extends to list ELEMENTS, because a driver that\n * parses json parses the elements of a json ARRAY too (verified live:\n * node-postgres and PGlite both return `ARRAY['\"123\"'::jsonb]` as the JS\n * string `\"123\"`). The same `json` claim is the only one the runtime keeps\n * over a VIEW — it is a promise about the DRIVER's result path, while the\n * `dateTime`/`numbers` claims depend on the expression type a view can hide.\n */\nexport function decodeIsNoop(params: { scalarType: ScalarType; wire: WireFidelity | undefined }): boolean {\n const { scalarType, wire } = params;\n if (wire === undefined) return false;\n if (scalarType === \"DateTime\") return false;\n if (scalarType === \"Json\") return wire.json === \"parsed\";\n if (scalarType === \"Int\" || scalarType === \"Float\") return wire.numbers === \"native\";\n return false;\n}\n\n// ─── Shared codec pieces ──────────────────────────────────────────\n\nconst identity = (value: unknown): unknown => value;\n\n/** Values that already are what the driver wants, in both directions. */\nconst passthroughCodec: ScalarCodec = { encode: identity, decode: identity };\n\n/** Numbers that some drivers hand back as text (numeric-ish column types). */\nconst numberCodec: ScalarCodec = {\n encode: identity,\n decode: (value) => (typeof value === \"string\" ? Number(value) : value),\n};\n\n/**\n * BigInt. No driver serializes a JS `bigint` parameter, so it always goes out\n * as text; sqlite's INTEGER affinity converts it back on the way in. Incoming\n * values arrive as strings (postgres `int8`, mysql `BIGINT`) or numbers.\n */\nconst bigIntCodec: ScalarCodec = {\n encode: (value) => (typeof value === \"bigint\" ? value.toString() : value),\n decode: (value) => {\n if (typeof value === \"bigint\") return value;\n if (typeof value === \"string\" && /^[+-]?\\d+$/.test(value.trim())) return BigInt(value.trim());\n if (typeof value === \"number\" && Number.isSafeInteger(value)) return BigInt(value);\n throw new VibeError({ code: \"VIBE_DATA_INVALID\", message: \"BigInt requires an integer string or a safe integer\", meta: { value } });\n },\n};\n\n/**\n * Decimal stays a string in JS, in both directions and on every dialect: no\n * float rounding, and no decimal library forced on the consumer. Numbers and\n * bigints passed in are stringified rather than silently losing precision.\n *\n * Decode is identity on postgres and sqlite: both preserve the scale the\n * value was WRITTEN with (`numeric` keeps the input's display scale; sqlite\n * stores the text), so `\"12.340\"` round-trips as `\"12.340\"` — trimming would\n * destroy information the engine kept. MySQL cannot preserve it (fixed-scale\n * DECIMAL) and gets its own decode — see {@link mysqlDecimalCodec}.\n */\nconst decimalCodec: ScalarCodec = {\n encode: (value) => (typeof value === \"number\" || typeof value === \"bigint\" ? String(value) : value),\n decode: identity,\n};\n\n/**\n * MySQL Decimal: same encode, but decode trims the fixed-scale padding.\n * MySQL's DECIMAL is fixed-scale, so the written scale is unrecoverable and\n * every value comes back padded to the column's full scale — verified live on\n * 8.4, `DECIMAL(65, 30)` returns `\"42.420000000000000000000000000000\"` where\n * postgres/sqlite return `\"42.42\"`. Trailing FRACTIONAL zeros (and a\n * then-dangling point) are an artifact of storage, not the value, so decode\n * trims them to the minimal exact string. Integer zeros are never touched.\n */\nconst mysqlDecimalCodec: ScalarCodec = {\n encode: decimalCodec.encode,\n decode: (value) => {\n if (typeof value !== \"string\" || !value.includes(\".\")) return value;\n const trimmed = value.replace(/0+$/, \"\").replace(/\\.$/, \"\");\n return trimmed === \"\" || trimmed === \"-\" ? \"0\" : trimmed;\n },\n};\n\n// ─── Zone-less date-time text ─────────────────────────────────────\n\n/**\n * `YYYY-MM-DD[T ]HH:MM[:SS[.fraction]]` carrying NO zone: the text form of a\n * postgres `timestamp without time zone` (row wire, PGlite, and the join\n * strategy's JSON transport) and of a mysql `DATETIME`.\n */\nconst ZONE_LESS_DATETIME = /^\\d{4}-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,9})?)?$/;\n\n/**\n * The postgres TEXT form of a `timestamptz`: `2024-06-01 12:34:56.789+00`,\n * `+05:30`, `-03`. JavaScriptCore reads a space-separated date with a bare\n * `+HH` offset unreliably (`0001-01-01 00:00:00+00` parses as the year 2001),\n * so it is rewritten to ISO-8601 (`T`, `+HH:MM`) first. Offsets with seconds\n * (historic local mean time) fall through to the engine.\n */\nconst PG_ZONED_DATETIME = /^(\\d{4}-\\d{2}-\\d{2})[T ](\\d{2}:\\d{2}(?::\\d{2})?)(\\.\\d{1,9})?([+-]\\d{2})(?::?(\\d{2}))?$/;\n\n/** The fields {@link parseExtendedDateTimeText} reads: year (4+ digits), date, optional time, fraction, offset (with seconds), era. */\nconst EXTENDED_DATETIME = /^(\\d{4,})-(\\d{2})-(\\d{2})(?:[T ](\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,9}))?)?)?(?:([+-])(\\d{2})(?::?(\\d{2}))?(?::?(\\d{2}))?)?( BC)?$/;\n\n/** Date-only text, `YYYY-MM-DD` (a `date` column, `@db.Date`): UTC midnight, as ECMA-262 reads it. */\nconst DATE_ONLY = /^\\d{4}-\\d{2}-\\d{2}$/;\n\n/**\n * Parse date-time text into a `Date`, reading ZONE-LESS text as **UTC** — for\n * text a CALLER wrote (a filter or data value, a validator's check).\n *\n * ECMA-262 reads `2026-01-15T12:00:00` as process-LOCAL time, so the same\n * stored value would decode to a different instant on every host time zone,\n * and to a different instant than bun:sql (UTC) or Prisma (UTC for\n * `@db.Timestamp`) return for the same row. Treat-as-UTC is the only reading\n * that yields ONE instant everywhere (MYSQL-2, live-proven; the postgres\n * `timestamp` case is proven by apps/tests `timestamp-zones.e2e`). Text with\n * an explicit `Z`/offset and date-only text parse as ECMA-262 already reads\n * them (as written / UTC midnight); any other form the engine reads\n * (`Jan 15 2026 12:00 GMT`) is accepted as the engine reads it, and\n * anything unparseable is `undefined` so the caller keeps its own fallback.\n * Fractions beyond milliseconds are truncated — `Date` has no finer\n * resolution and engines differ on longer fractions. Text from the DATABASE\n * never takes that last, guessing step ({@link parseDatabaseDateTime}).\n */\nexport function parseDateTimeText(params: { text: string }): Date | undefined {\n const trimmed = params.text.trim();\n const date = parseDatabaseDateTime({ trimmed }) ?? engineDateTime({ trimmed });\n return date === undefined ? undefined : rememberTimestampIdentity({ date, text: trimmed });\n}\n\nfunction engineDateTime(params: { trimmed: string }): Date | undefined {\n const parsed = new Date(params.trimmed);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\n/**\n * The instant of date-time text a DATABASE printed, without its identity\n * record — for a decoder that records its own (A-02). Only the forms the\n * dialects print are read: the ISO layout (`YYYY-MM-DD[ T]HH:MM:SS[.f]`,\n * optionally `Z` or an offset, by char codes first, {@link parsePlainTimestampText}),\n * date-only text, five-digit years, BC dates and offsets with seconds\n * ({@link parseExtendedDateTimeText}). Anything else is `undefined`, which the\n * decoders refuse with `VIBE_DATA_INVALID`: PostgreSQL prints other layouts\n * under a non-ISO `DateStyle` (`02/01/2026 03:04:05 UTC` under `SQL, DMY`),\n * and reading those by `new Date` would swap day and month.\n */\nfunction parseDatabaseDateTime(params: { trimmed: string }): Date | undefined {\n const { trimmed } = params;\n const plain = parsePlainTimestampText({ text: trimmed, zoned: \"either\" });\n if (plain !== undefined) return plain;\n const length = trimmed.length;\n if (\n (length > 0 && trimmed.charCodeAt(length - 1) === 90) ||\n ((length === 25 || (length === 29 && trimmed.charCodeAt(19) === 46)) &&\n trimmed.charCodeAt(10) === 84 &&\n trimmed.charCodeAt(length - 3) === 58 &&\n (trimmed.charCodeAt(length - 6) === 43 || trimmed.charCodeAt(length - 6) === 45))\n ) {\n // ISO 8601 with `Z` or `±HH:MM` that the char-code pass declined (a year before 1000, 7+ fraction digits).\n if (!ISO_INSTANT.test(trimmed)) return undefined;\n const parsed = new Date(trimmed);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n }\n const json = pgJsonDateTime({ trimmed });\n if (json !== undefined) return json;\n if (ZONE_LESS_DATETIME.test(trimmed)) {\n const asUtc = new Date(`${trimmed.replace(\" \", \"T\").replace(/(\\.\\d{3})\\d+$/, \"$1\")}Z`);\n if (!Number.isNaN(asUtc.getTime())) return asUtc;\n }\n const zoned = PG_ZONED_DATETIME.exec(trimmed);\n if (zoned !== null) {\n const [, date, time, fraction, hours, minutes] = zoned;\n const iso = new Date(`${date}T${time}${(fraction ?? \"\").slice(0, 4)}${hours}:${minutes ?? \"00\"}`);\n if (!Number.isNaN(iso.getTime())) return iso;\n }\n if (DATE_ONLY.test(trimmed)) return engineDateTime({ trimmed });\n return parseExtendedDateTimeText({ text: trimmed, anyYear: true });\n}\n\n/**\n * ISO 8601 text with a `Z` or `±HH:MM` offset: what the `Z` / JSON-offset branch of {@link parseDatabaseDateTime} reads,\n * including `Date#toISOString()`'s six-digit signed years (SQLite stores a `Date` past year 9999 that way).\n */\nconst ISO_INSTANT = /^(?:\\d{4}|[+-]\\d{6})-\\d{2}-\\d{2}[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,9})?)?(?:Z|[+-]\\d{2}:\\d{2})$/;\n\n/**\n * PostgreSQL's JSON timestamp text with a fraction of 1 to 6 digits\n * (`YYYY-MM-DDTHH:MM:SS.f…±HH:MM`, 27 to 32 characters): what a bare\n * `timestamptz` column carries through the join strategy, where JSON drops a\n * fraction's trailing zeros. Every character is checked, so\n * `PG_ZONED_DATETIME` would match this text and build the same string for the\n * same `new Date`: the fraction cut to three digits. `undefined` hands the\n * text to the general path (an instant that does not parse is decided there).\n */\nfunction pgJsonDateTime(params: { trimmed: string }): Date | undefined {\n const { trimmed } = params;\n const length = trimmed.length;\n const digits = length - 26;\n if (digits < 1 || digits > 6) return undefined;\n for (let index = 0; index < length; index++) {\n const code = trimmed.charCodeAt(index);\n const expected = index === 4 || index === 7 ? 45 : index === 10 ? 84 : index === 13 || index === 16 || index === length - 3 ? 58 : index === 19 ? 46 : index === length - 6 ? -1 : 0;\n if (expected === 0 ? code < 48 || code > 57 : expected === -1 ? code !== 43 && code !== 45 : code !== expected) return undefined;\n }\n const parsed = new Date(digits <= 3 ? trimmed : `${trimmed.slice(0, 23)}${trimmed.slice(length - 6)}`);\n return Number.isNaN(parsed.getTime()) ? undefined : parsed;\n}\n\n/**\n * PostgreSQL date/time text with a year of five or more digits or a ` BC` era,\n * in the row text form and the JSON form: `12345-06-07 08:09:10.111+00`,\n * `12345-06-07T08:09:10.111` (zone-less), `0044-03-15T12:00:00.5+00:00 BC`,\n * `0044-03-15 BC` (`date`). ECMA-262 parses none of them (an expanded year\n * needs `+012345`), and a value near the end of year 9999 reaches them\n * through the session zone alone (`9999-12-31 23:59+00` prints as\n * `10000-01-01 00:59+01` east of UTC). Built from its fields, by the rules of\n * {@link parseDateTimeText}: the BC year astronomically (`1 BC` = year 0, the\n * reading of node-postgres), zone-less text as UTC, the fraction truncated to\n * milliseconds, an offset with seconds applied exactly.\n *\n * `undefined` for every other text — a 4-digit AD value keeps the parse it\n * had, unless `anyYear` (the database-text parser, after its other forms\n * declined: an offset with seconds) — and for an instant outside the `Date`\n * range. Exported for the adapters\n * whose zone-less driver parsers fall back to it (one rule, rule 6).\n */\nexport function parseExtendedDateTimeText(params: { text: string; anyYear?: boolean }): Date | undefined {\n const match = EXTENDED_DATETIME.exec(params.text.trim());\n if (match === null) return undefined;\n const [, yearText, month, day, hours, minutes, seconds, fraction, sign, offsetHours, offsetMinutes, offsetSeconds, era] = match;\n if ((yearText as string).length < 5 && era === undefined && params.anyYear !== true) return undefined;\n const year = era === undefined ? Number(yearText) : 1 - Number(yearText);\n const date = new Date(0);\n date.setUTCFullYear(year, Number(month) - 1, Number(day));\n date.setUTCHours(Number(hours ?? 0), Number(minutes ?? 0), Number(seconds ?? 0), Number((fraction ?? \"\").padEnd(3, \"0\").slice(0, 3)));\n // A field out of range would roll into the next month or day: such text is no timestamp.\n if (date.getUTCMonth() !== Number(month) - 1 || date.getUTCDate() !== Number(day) || Number(hours ?? 0) > 23 || Number(minutes ?? 0) > 59 || Number(seconds ?? 0) > 59) return undefined;\n if (sign !== undefined) {\n const offset = (Number(offsetHours) * 3600 + Number(offsetMinutes ?? 0) * 60 + Number(offsetSeconds ?? 0)) * 1000;\n date.setTime(date.getTime() - (sign === \"-\" ? -offset : offset));\n }\n return Number.isNaN(date.getTime()) ? undefined : date;\n}\n\n/**\n * The decode refusal of a non-finite or unparseable DateTime — one error for\n * every DateTime codec. Exported so a statement that refuses such a value\n * itself (the runtime's in-statement value guard, round-trip follow-up D1)\n * reports exactly this error.\n */\nexport function decodedDateTimeRefusal(): VibeError {\n return new VibeError({ code: \"VIBE_DATA_INVALID\", message: \"DateTime requires a finite timestamp; use an explicit extended timestamp decoder for infinity\" });\n}\n\nfunction invalidDecodedDateTime(): never {\n throw decodedDateTimeRefusal();\n}\n\n/**\n * DateTime where the driver speaks `Date` objects (postgres, mysql). Text\n * reaching decode (the join strategy's JSON transport, a text-mode driver)\n * goes through {@link parseDateTimeText}: zone-less text is UTC.\n */\nconst dateNativeCodec: ScalarCodec = {\n encode: (value) => {\n if ((value instanceof Date && !Number.isFinite(value.getTime())) || (typeof value === \"number\" && !Number.isFinite(value)) || (typeof value === \"string\" && /^[+-]?infinity$/i.test(value.trim()))) {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: \"DateTime parameters require finite timestamps; use an extended timestamp encoder for infinity\" });\n }\n return value instanceof Date ? timestampIdentityText({ date: value }) ?? value : value;\n },\n decode: (value) => {\n const date = value instanceof Date ? value\n : typeof value === \"string\" ? databaseDateTimeText({ text: value, dialect: \"postgres\" })\n : typeof value === \"number\" ? new Date(value) : undefined;\n if (date !== undefined && Number.isFinite(date.getTime())) return date;\n return invalidDecodedDateTime();\n },\n};\n\n/** {@link parseDatabaseDateTime} with the text's identity recorded on the `Date`; text it cannot read refuses by its cause. */\nfunction databaseDateTimeText(params: { text: string; dialect: Dialect }): Date | undefined {\n const trimmed = params.text.trim();\n const date = parseDatabaseDateTime({ trimmed });\n if (date === undefined) {\n if (/^[+-]?infinity$/i.test(trimmed)) return undefined;\n throw undecodableDateTimeText({ text: trimmed, dialect: params.dialect });\n }\n return rememberTimestampIdentity({ date, text: trimmed });\n}\n\n/** ISO-shaped date text whose month or day is zero: MySQL's zero date (`0000-00-00`) and zero-in-date values. */\nconst ZERO_DATE_TEXT = /^\\d{4}-(?:00-\\d{2}|\\d{2}-00)(?:$|[T ])/;\n\n/**\n * The refusal of database date-time text no decoder reads, by its cause —\n * each with its own `meta.reason`, so the message names the right remedy:\n *\n * - `\"zero-date\"`: a MySQL zero date or a zero month or day, which has no\n * instant (mysql2 renders a binary zero `DATETIME` as `undefined 00:00:00`);\n * - `\"datetime-out-of-range\"`: ISO-shaped text with no `Date` (a year past\n * ±275760, `294276-12-31` in PostgreSQL, or a day the calendar lacks);\n * - `\"datetime-text-layout\"`: any other layout; on PostgreSQL its cause is a\n * `DateStyle` other than ISO, and the error names that remedy\n * ({@link dateTimeTextLayoutError}).\n *\n * The text itself is never included.\n */\nexport function undecodableDateTimeText(params: { text: string; dialect: Dialect }): VibeError {\n const trimmed = params.text.trim();\n if (ZERO_DATE_TEXT.test(trimmed) || (params.dialect === \"mysql\" && trimmed.startsWith(\"undefined\"))) return zeroDateRefusal();\n if (/^\\d{4,}-\\d{2}-\\d{2}(?:$|[T ])/.test(trimmed) || /^[+-]\\d{6}-\\d{2}-\\d{2}T/.test(trimmed)) {\n return new VibeError({\n code: \"VIBE_DATA_INVALID\",\n message: \"DateTime text from the database is a timestamp a JavaScript Date cannot hold (a year outside ±275760, or a day the calendar does not have).\",\n meta: { reason: \"datetime-out-of-range\" },\n });\n }\n if (params.dialect === \"postgres\") return dateTimeTextLayoutError();\n return new VibeError({\n code: \"VIBE_DATA_INVALID\",\n message: params.dialect === \"sqlite\"\n ? \"DateTime text stored in SQLite is not ISO 8601 (YYYY-MM-DD[T ]HH:MM:SS[.fff], optionally Z or an offset), the form VibeORM writes; rewrite the column's values in that form.\"\n : \"DateTime text from the database is not in a layout VibeORM reads (YYYY-MM-DD HH:MM:SS[.ffffff]).\",\n meta: { reason: \"datetime-text-layout\", expected: \"ISO 8601\" },\n });\n}\n\n/** The refusal of a MySQL zero date: it has no instant. */\nfunction zeroDateRefusal(): VibeError {\n return new VibeError({\n code: \"VIBE_DATA_INVALID\",\n message:\n \"A DateTime column holds a zero date (0000-00-00, or a zero month or day), which has no instant; MySQL keeps it only under a sql_mode \" +\n \"without NO_ZERO_DATE / NO_ZERO_IN_DATE. Store NULL instead (UPDATE <table> SET <column> = NULL WHERE <column> = '0000-00-00') \" +\n \"or read the column as text.\",\n meta: { reason: \"zero-date\" },\n });\n}\n\n/**\n * The refusal for database DateTime text outside the ISO layouts. On\n * PostgreSQL its cause is a `DateStyle` other than ISO, set by the server,\n * the database or the role; the message and `meta.fix` name the remedies.\n * The text itself is never included.\n */\nexport function dateTimeTextLayoutError(): VibeError {\n return new VibeError({\n code: \"VIBE_DATA_INVALID\",\n message:\n \"DateTime text from the database is not in a layout VibeORM reads (ISO 8601, as PostgreSQL prints it under DateStyle = ISO). \" +\n \"The server, database or role sets another DateStyle, which moves day and month: run ALTER ROLE <role> SET DateStyle = 'ISO' \" +\n \"or ALTER DATABASE <database> SET DateStyle = 'ISO', or add options=-c%20DateStyle%3DISO to the connection URL.\",\n meta: {\n reason: \"datetime-text-layout\",\n setting: \"DateStyle\",\n expected: \"ISO\",\n fix: [\"ALTER ROLE <role> SET DateStyle = 'ISO'\", \"ALTER DATABASE <database> SET DateStyle = 'ISO'\", \"options=-c%20DateStyle%3DISO in the connection URL\"],\n },\n });\n}\n\n/** DateTime on sqlite: stored as ISO-8601 UTC text (explicit `Z`), parsed back on read. */\nconst dateTextCodec: ScalarCodec = {\n encode: (value) => {\n dateNativeCodec.encode(value);\n const date = value instanceof Date ? value\n : typeof value === \"string\" ? parseDateTimeText({ text: value })\n : typeof value === \"number\" ? new Date(value) : undefined;\n if (date !== undefined && Number.isFinite(date.getTime())) return value instanceof Date ? sqliteTimestampIdentityValue({ date: value }) ?? date.toISOString() : date.toISOString();\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: \"DateTime parameters require a valid finite timestamp\" });\n },\n decode: (value) => {\n if (typeof value === \"string\") {\n // A-02: parse once and record ONE identity — the sqlite one (the shared\n // parse used to record a timestamp identity first, then this overwrote it).\n const date = parseDatabaseDateTime({ trimmed: value.trim() });\n if (date === undefined) throw undecodableDateTimeText({ text: value, dialect: \"sqlite\" });\n if (!Number.isFinite(date.getTime())) return invalidDecodedDateTime();\n return rememberTimestampIdentity({ date, text: value, key: `date:${value}`, kind: \"sqlite\" });\n }\n const date = dateNativeCodec.decode(value) as Date;\n if (typeof value === \"number\") return rememberTimestampIdentity({ date, text: date.toISOString(), numeric: value, key: `epoch:${value}`, kind: \"sqlite\" });\n return date;\n },\n};\n\n/**\n * DateTime on mysql (N4 + MYSQL-2): mysql2 serializes `Date` in the adapter's\n * `timezone`, but passes STRINGS verbatim — an ISO-8601 string operand\n * hard-errors on strict-mode servers (1292). Encode normalizes parseable\n * strings/numbers to `Date` through {@link parseDateTimeText} — ZONE-LESS\n * strings (`2026-01-15T12:00:00`, `2026-01-15 12:00:00`) parse as UTC, never\n * process-local time (MYSQL-2, live-proven: TZ=America/New_York stored 17:00Z\n * for a noon literal): postgres under the session's pinned UTC parses the same\n * literal as UTC, so treat-as-UTC is the only reading that stores the SAME\n * instant on both dialects. Strings with an explicit Z/offset parse as\n * written; garbage passes through so the driver's own error names it. A\n * `Date` read from the server's text is bound as a marked copy the adapter\n * writes in its zone with all its fraction digits\n * ({@link mysqlBoundTimestampText}). Decode reads zone-less text as UTC; a\n * zone the adapter declares takes {@link zonedCodec}'s decode.\n */\nconst mysqlDateCodec: ScalarCodec = {\n encode: (value) => {\n dateNativeCodec.encode(value);\n if (value instanceof Date) {\n // A driver Date keeps milliseconds only: the adapter writes this one as\n // wall-clock text in its own zone, every fraction digit included.\n return timestampIdentityText({ date: value, kind: \"timestamp\" }) === undefined ? value : boundTimestampParameter({ date: value });\n }\n if (typeof value === \"number\") {\n const parsed = new Date(value); // epoch millis — zone-free by definition\n if (!Number.isNaN(parsed.getTime())) return parsed;\n return value;\n }\n if (typeof value === \"string\") return parseDateTimeText({ text: value }) ?? value;\n return value;\n },\n decode: (value) => {\n if (typeof value === \"string\") {\n const date = databaseDateTimeText({ text: value, dialect: \"mysql\" });\n if (date !== undefined && Number.isFinite(date.getTime())) return date;\n return invalidDecodedDateTime();\n }\n // On MySQL an invalid driver `Date` is a zero date (mysql2 returns one for\n // `0000-00-00`), and `undefined` is mysql2's binary zero `DATE` under `dateStrings`.\n if ((value instanceof Date && !Number.isFinite(value.getTime())) || value === undefined) throw zeroDateRefusal();\n return dateNativeCodec.decode(value);\n },\n};\n\n/**\n * DateTime on a MySQL date-only column (`@db.Date`): MySQL ROUNDS a datetime's\n * fraction when it converts it to a DATE, so `2026-12-31 23:59:59.500` and\n * later is stored, and compared, as 2027-01-01 (PostgreSQL drops the time).\n * Encode sends the instant cut to its whole second, still as a `Date`: mysql2\n * serializes it in the adapter's `timezone`, the zone its reader gives the\n * column back in, so the day written is the day read back for `\"Z\"` and every\n * fixed offset; no fraction is left to round. A `Date` decoded from the\n * server's text (a page key, a join child, `exactDates`) carries that text,\n * whose zone is the stored wall clock, not the adapter's: it is sent as its\n * day text (`YYYY-MM-DD`). Every other input is read as {@link mysqlDateCodec}\n * reads it. Decode is MySQL's DateTime decode.\n */\nconst mysqlDateOnlyCodec: ScalarCodec = Object.freeze({\n encode: (value: unknown): unknown => {\n dateNativeCodec.encode(value);\n if (value instanceof Date) {\n const day = /^\\d{4}-\\d{2}-\\d{2}/.exec(timestampIdentityText({ date: value, kind: \"timestamp\" }) ?? \"\")?.[0];\n if (day !== undefined) return day;\n }\n const date = value instanceof Date ? value\n : typeof value === \"number\" ? new Date(value)\n : typeof value === \"string\" ? parseDateTimeText({ text: value }) : undefined;\n if (date === undefined || !Number.isFinite(date.getTime())) return mysqlDateCodec.encode(value);\n return new Date(Math.floor(date.getTime() / 1000) * 1000);\n },\n decode: mysqlDateCodec.decode,\n});\n\n/**\n * The codec of a DateTime field whose native type is a date-only column on\n * `dialect`, or `undefined` (the DateTime table row applies): MySQL's\n * `@db.Date` ({@link mysqlDateOnlyCodec}). PostgreSQL's `date` input and\n * SQLite's text need none.\n */\nexport function dateOnlyCodec(params: { dialect: Dialect; nativeType: string | undefined }): ScalarCodec | undefined {\n return params.dialect === \"mysql\" && params.nativeType?.trim().toLowerCase() === \"date\" ? mysqlDateOnlyCodec : undefined;\n}\n\n// ─── MySQL date-time text in the adapter's zone ───────────────────\n\n/** Zone-less date-time text with a year of four or more digits: `YYYY-MM-DD`, optionally `[T ]HH:MM[:SS[.f]]`. */\nconst ZONE_LESS_WALL_CLOCK = /^\\d{4,}-\\d{2}-\\d{2}(?:[T ]\\d{2}:\\d{2}(?::\\d{2}(?:\\.\\d{1,9})?)?)?$/;\n\n/** Zone-less date-time text as its wall clock read as UTC, or `undefined` for any other text. */\nfunction wallClockOf(params: { text: string }): Date | undefined {\n const { text } = params;\n return parsePlainTimestampText({ text, zoned: false }) ?? (ZONE_LESS_WALL_CLOCK.test(text) ? parseExtendedDateTimeText({ text, anyYear: true }) : undefined);\n}\n\n/**\n * The instant of a wall clock (its fields read as UTC) in a zone. `\"local\"`\n * builds the `Date` from its fields the way mysql2 builds a local one, so a\n * wall clock in a daylight-saving gap or overlap lands on the instant mysql2\n * gives it; a year before 100 is built 400 years later (the same calendar)\n * and moved back, where the `Date` constructor would read it as 19xx.\n */\nfunction inZone(params: { wall: Date; shift: \"local\" | number | undefined }): Date {\n const { wall, shift } = params;\n if (shift === undefined) return wall;\n if (shift !== \"local\") return new Date(wall.getTime() - shift * 60_000);\n const year = wall.getUTCFullYear();\n const early = year >= 0 && year < 100;\n const local = new Date(early ? year + 400 : year, wall.getUTCMonth(), wall.getUTCDate(), wall.getUTCHours(), wall.getUTCMinutes(), wall.getUTCSeconds(), wall.getUTCMilliseconds());\n if (early) local.setFullYear(year);\n return local;\n}\n\n/**\n * The instant of zone-less date-time text a MySQL server printed (`DATETIME`,\n * `DATE`, a `TIMESTAMP` in the session zone), read in `zone`, the zone mysql2\n * reads the same cell in; the years 0-99 keep their year. `undefined` for any\n * other text. For the adapter's raw path; ORM reads take the codec table.\n */\nexport function parseZoneLessDateTime(params: { text: string; zone: DateTimeZone | undefined }): Date | undefined {\n const wall = wallClockOf({ text: params.text });\n return wall === undefined ? undefined : inZone({ wall, shift: zoneShift(params.zone) });\n}\n\n/** The MySQL DateTime decode for a zone that is not UTC: zone-less text is read in it; everything else as {@link mysqlDateCodec} reads it. */\nfunction zonedMysqlDecode(params: { shift: \"local\" | number }): (value: unknown) => unknown {\n const { shift } = params;\n return (value) => {\n if (typeof value !== \"string\") return mysqlDateCodec.decode(value);\n const trimmed = value.trim();\n const wall = wallClockOf({ text: trimmed });\n if (wall === undefined) return mysqlDateCodec.decode(value);\n const date = inZone({ wall, shift });\n if (!Number.isFinite(date.getTime())) return invalidDecodedDateTime();\n return rememberTimestampIdentity({ date, text: trimmed });\n };\n}\n\n/** The zoned MySQL DateTime codecs, one pair per zone (a handful of adapter options per process). */\nconst zonedMysqlCodecs = new Map<string, { readonly dateTime: ScalarCodec; readonly dateOnly: ScalarCodec }>();\n\n/**\n * `codec` as it reads under the adapter's declared zone\n * (`wire.zoneLessDateTime`): a MySQL DateTime or date-only codec reads\n * zone-less text in that zone when it is not UTC; every other codec, and every\n * codec under UTC, is returned unchanged. Encode is never changed: a `Date`\n * goes to the driver, which writes it in the same zone.\n */\nexport function zonedCodec(params: { dialect: Dialect; codec: ScalarCodec; wire: WireFidelity | undefined }): ScalarCodec {\n const { codec } = params;\n if (params.dialect !== \"mysql\" || (codec !== mysqlDateCodec && codec !== mysqlDateOnlyCodec)) return codec;\n const shift = zoneShift(params.wire?.zoneLessDateTime);\n if (shift === undefined) return codec;\n const key = String(shift);\n let pair = zonedMysqlCodecs.get(key);\n if (pair === undefined) {\n const decode = zonedMysqlDecode({ shift });\n pair = Object.freeze({\n dateTime: Object.freeze({ encode: mysqlDateCodec.encode, decode }),\n dateOnly: Object.freeze({ encode: mysqlDateOnlyCodec.encode, decode }),\n });\n zonedMysqlCodecs.set(key, pair);\n }\n return codec === mysqlDateCodec ? pair.dateTime : pair.dateOnly;\n}\n\n/**\n * The text a MySQL adapter writes for a parameter the DateTime codec bound\n * exactly (a `Date` read from the server's text, which carries more fraction\n * digits than a `Date` holds): the wall clock it was read from when that text,\n * read in `zone`, is this instant (so a wall clock in a daylight-saving gap\n * under `\"local\"` addresses its own cell); else the instant's wall clock in\n * `zone` (text with an offset, or read in another zone). Every fraction digit\n * is kept, and at least three are written. `undefined` for every other value,\n * which the driver writes as it always did. A keyset position over such a\n * value carries the same text.\n */\nexport function mysqlBoundTimestampText(params: { value: unknown; zone: DateTimeZone | undefined }): string | undefined {\n const text = boundTimestampText({ value: params.value });\n if (text === undefined) return undefined;\n const date = params.value as Date;\n const shift = zoneShift(params.zone);\n const stored = STORED_WALL_CLOCK.exec(text);\n if (stored !== null && inZone({ wall: wallClockOf({ text }) ?? new Date(Number.NaN), shift }).getTime() === Date.prototype.getTime.call(date)) {\n return `${stored[1]} ${stored[2] ?? \"00:00:00\"}.${(stored[3] ?? \"\").padEnd(3, \"0\")}`;\n }\n const digits = `.${(/\\.(\\d+)/.exec(text)?.[1] ?? \"\").padEnd(3, \"0\")}`;\n if (shift !== \"local\") {\n const wall = shift === undefined ? date : new Date(Date.prototype.getTime.call(date) + shift * 60_000);\n return Date.prototype.toISOString.call(wall).replace(\"T\", \" \").replace(/\\.\\d{3}Z$/, digits);\n }\n const pad = (value: number, width: number): string => String(value).padStart(width, \"0\");\n return `${pad(date.getFullYear(), 4)}-${pad(date.getMonth() + 1, 2)}-${pad(date.getDate(), 2)} ${pad(date.getHours(), 2)}:${pad(date.getMinutes(), 2)}:${pad(date.getSeconds(), 2)}${digits}`;\n}\n\n/** Zone-less wall-clock text as a MySQL server prints it: a four-digit-year day, then optionally the time and its fraction. */\nconst STORED_WALL_CLOCK = /^(\\d{4}-\\d{2}-\\d{2})(?:[T ](\\d{2}:\\d{2}:\\d{2})(?:\\.(\\d{1,9}))?)?$/;\n\n// ─── Time of day (`@db.Time` / `@db.Timetz`) ───────────────────────\n\nconst MILLISECONDS_PER_DAY = 86_400_000;\n\n/**\n * Time-of-day text as postgres (`time`, `timetz`, also inside JSON) and mysql\n * (`TIME`) print it: `HH:MM[:SS[.fraction]]`, then for timetz an offset\n * `+HH`, `+HH:MM` or `+HH:MM:SS`. Hours are two digits: a mysql duration\n * beyond a day (`838:59:59`) or below zero (`-01:00:00`) is not a time of day.\n */\nconst TIME_OF_DAY_TEXT = /^(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{1,9}))?)?(?:([+-])(\\d{2})(?::?(\\d{2}))?(?::?(\\d{2}))?)?$/;\n\nconst pad = (value: number, width: number): string => String(value).padStart(width, \"0\");\n\n/** Milliseconds since midnight UTC of a finite instant. */\nconst utcMillisecondOfDay = (date: Date): number =>\n ((date.getTime() % MILLISECONDS_PER_DAY) + MILLISECONDS_PER_DAY) % MILLISECONDS_PER_DAY;\n\n/** `HH:MM:SS.mmm` for a millisecond of the day. */\nconst timeOfDayText = (millisecond: number): string =>\n `${pad(Math.floor(millisecond / 3_600_000), 2)}:${pad(Math.floor(millisecond / 60_000) % 60, 2)}:${pad(Math.floor(millisecond / 1000) % 60, 2)}.${pad(millisecond % 1000, 3)}`;\n\n/**\n * The time-of-day codec — Prisma's contract for `DateTime @db.Time(n)` and\n * `@db.Timetz(n)` (release 3.0 decision D2), identical on every dialect that\n * holds the type (`DialectCapabilities.timeOfDayTypes`):\n *\n * - encode: the UTC time of day of the `Date` with millisecond precision,\n * `HH:MM:SS.mmm`, plus `+00` for timetz. The date part is dropped. A string\n * or epoch-millisecond number is read as an instant first (zone-less text is\n * UTC, {@link parseDateTimeText}). The full instant must never reach the\n * driver: postgres refuses `1970-01-01T13:14:15.123Z` for `time` (22007),\n * and PGlite sends a `Date` as `Date#toString()` (host-local).\n * - decode: a `Date` at `1970-01-01` with that UTC time of day. A timetz\n * offset is applied first and the result wraps into the same day\n * (`01:00:00+02` → `1970-01-01T23:00:00.000Z`); postgres's `24:00:00` wraps\n * to midnight. Fractions beyond milliseconds are truncated, as for every\n * DateTime. A driver `Date` keeps only its UTC time of day.\n *\n * Not a table row: the runtime routes a DateTime field whose native type is a\n * time of day here ({@link timeOfDayCodec}), like `float32Codec` for `@db.Real`.\n */\nfunction makeTimeOfDayCodec(params: { zoned: boolean }): ScalarCodec {\n const suffix = params.zoned ? \"+00\" : \"\";\n return Object.freeze({\n encode: (value: unknown): unknown => {\n dateNativeCodec.encode(value);\n const date = value instanceof Date ? value\n : typeof value === \"string\" ? parseDateTimeText({ text: value })\n : typeof value === \"number\" ? new Date(value) : undefined;\n if (date === undefined || !Number.isFinite(date.getTime())) {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: \"a time-of-day DateTime parameter requires a valid finite Date\", meta: { value } });\n }\n return timestampIdentityText({ date, kind: params.zoned ? \"timetz\" : \"time\" }) ?? `${timeOfDayText(utcMillisecondOfDay(date))}${suffix}`;\n },\n decode: (value: unknown): unknown => {\n if (value instanceof Date && Number.isFinite(value.getTime())) {\n if (timestampIdentityText({ date: value, kind: params.zoned ? \"timetz\" : \"time\" }) !== undefined) return value;\n const milliseconds = utcMillisecondOfDay(value);\n const text = timeOfDayText(milliseconds);\n return rememberTimestampIdentity({ date: new Date(milliseconds), text: `${text}${suffix}`, key: `${params.zoned ? \"timetz\" : \"time\"}:${text}:0`, kind: params.zoned ? \"timetz\" : \"time\" });\n }\n const match = typeof value === \"string\" ? TIME_OF_DAY_TEXT.exec(value.trim()) : null;\n if (match !== null) {\n const [, hours, minutes, seconds, fraction, sign, offsetHours, offsetMinutes, offsetSeconds] = match;\n const millisecond = Number(hours) * 3_600_000 + Number(minutes) * 60_000 + Number(seconds ?? 0) * 1000\n + Number((fraction ?? \"\").slice(0, 3).padEnd(3, \"0\"));\n const offset = sign === undefined ? 0\n : (sign === \"-\" ? -1 : 1) * (Number(offsetHours) * 3_600_000 + Number(offsetMinutes ?? 0) * 60_000 + Number(offsetSeconds ?? 0) * 1000);\n if (millisecond <= MILLISECONDS_PER_DAY) {\n const date = new Date((((millisecond - offset) % MILLISECONDS_PER_DAY) + MILLISECONDS_PER_DAY) % MILLISECONDS_PER_DAY);\n const exactFraction = (fraction ?? \"\").padEnd(3, \"0\").replace(/(?<=\\d{3})0+$/, \"\");\n // PostgreSQL date.c:timetz_cmp_internal equates values only when\n // BOTH local time and zone agree. Do not key by the wrapped UTC Date:\n // 14:00+02 differs from 12:00+00, and 24:00 differs from 00:00.\n const key = `${params.zoned ? \"timetz\" : \"time\"}:${hours}:${minutes}:${seconds ?? \"00\"}.${exactFraction}:${offset}`;\n return rememberTimestampIdentity({ date, text: (value as string).trim(), key, kind: params.zoned ? \"timetz\" : \"time\" });\n }\n }\n throw new VibeError({ code: \"VIBE_DATA_INVALID\", message: \"a time-of-day DateTime column returned a value that is not a time of day\", meta: { value } });\n },\n });\n}\n\nconst timeCodec: ScalarCodec = makeTimeOfDayCodec({ zoned: false });\nconst timetzCodec: ScalarCodec = makeTimeOfDayCodec({ zoned: true });\n\n/**\n * The time-of-day codec for a DateTime field's native type, or `undefined`\n * when the native type is not `time`/`timetz` (the DateTime table row\n * applies). The one native-type rule is `timeOfDayType` in @vibeorm/schema,\n * shared with the dialect refusal in schema validation.\n */\nexport function timeOfDayCodec(params: { nativeType: string | undefined }): ScalarCodec | undefined {\n const type = timeOfDayType({ nativeType: params.nativeType });\n return type === \"timetz\" ? timetzCodec : type === \"time\" ? timeCodec : undefined;\n}\n\n/** Canonical calendar-day text only; a driver Date cannot recover the authored day. */\nexport const localDateCodec: ScalarCodec = Object.freeze({\n encode: (value: unknown): string => {\n const candidate = { value };\n if (isCanonicalLocalDate(candidate)) return candidate.value;\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: \"A local date requires canonical YYYY-MM-DD text for a real date in years 0001–9999\",\n meta: { value },\n });\n },\n decode: (value: unknown): string => {\n const candidate = { value };\n if (isCanonicalLocalDate(candidate)) return candidate.value;\n throw new VibeError({\n code: \"VIBE_DATA_INVALID\",\n message: \"A local-date column returned noncanonical or out-of-domain calendar-day text\",\n meta: { value },\n });\n },\n});\n\n/** Booleans stored as 0/1 (sqlite INTEGER). */\nconst booleanIntCodec: ScalarCodec = {\n encode: (value) => (typeof value === \"boolean\" ? (value ? 1 : 0) : value),\n decode: (value) => (typeof value === \"number\" ? value !== 0 : value),\n};\n\n/**\n * MySQL reads TINYINT(1) as numeric 0/1 and LONGLONG predicates as exact text\n * when bigNumberStrings is enabled. Encoding still sends booleans natively.\n */\nconst booleanNativeInCodec: ScalarCodec = {\n encode: identity,\n decode: (value) => value === \"0\" ? false : value === \"1\" ? true : booleanIntCodec.decode(value),\n};\n\n/**\n * Parse stored JSON text at the centralized codec boundary. A supplied context\n * marks a bound field: its error contains only that context, never the document\n * or the native parser cause. Without context, legacy codec errors are unchanged.\n */\nexport function parseJsonText(params: {\n text: string;\n context?: Readonly<Record<string, unknown>>;\n}): unknown {\n const { text, context } = params;\n try {\n return JSON.parse(text);\n } catch (cause) {\n if (context !== undefined) {\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: \"a bound Json field returned text that is not valid JSON\",\n meta: { ...context },\n });\n }\n throw new VibeError({\n code: \"VIBE_INTERNAL\",\n message: \"a Json column returned text that is not valid JSON\",\n meta: { value: text },\n cause,\n });\n }\n}\n\n/**\n * JSON is serialized by US, on every dialect, and never handed to a driver as a\n * live object. Two reasons: drivers disagree (node-postgres stringifies objects,\n * bun:sqlite and mysql2 do not), and a JSON payload that happens to look like an\n * atomic UPDATE operation must never reach the SQL AST as an object\n * (see `isSetOperation` in ast.ts). Reads arrive as text on postgres and\n * sqlite, and already parsed from mysql2's JSON columns.\n */\nconst jsonCodec: ScalarCodec = {\n encode: (value) => JSON.stringify(value),\n decode: (value) => {\n if (typeof value !== \"string\") return value;\n return parseJsonText({ text: value });\n },\n};\n\n// ─── float32 (`Float @db.Real`) ──────────────────────────────────\n\n/**\n * The SHORTEST decimal that round-trips through float32 to the same value as\n * `value` — what postgres itself prints for a `real` (`0.1`, `3.4028235e+38`).\n *\n * A driver that reads a `real` in BINARY format (bun:sql with named\n * statements) hands back the float32 widened to float64:\n * `0.10000000149011612` for a stored `0.1`. Text-format drivers already give\n * the short form, and for those this is the identity — the shortest form of a\n * short value is itself — so it is safe on every driver. Smallest `p` in 1..9\n * with `fround(toPrecision(p)) === fround(value)`; nine significant digits\n * always identify a float32. `±0`, NaN and ±Infinity pass through.\n */\nexport function shortestFloat32(params: { value: number }): number {\n const { value } = params;\n if (value === 0 || !Number.isFinite(value)) return value;\n const target = Math.fround(value);\n for (let precision = 1; precision <= 9; precision++) {\n const candidate = Number(value.toPrecision(precision));\n if (Math.fround(candidate) === target) return candidate;\n }\n return value;\n}\n\n/**\n * `Float @db.Real` — a refinement of the Float codec keyed by the native type,\n * not by the scalar type, so it is not a table row: the runtime routes a\n * field with `nativeType: \"Real\"` here. Decode = {@link numberCodec} then\n * {@link shortestFloat32}. Real aggregates that postgres returns as `real`\n * (`min`/`max`/`sum`) use it too; `avg` returns double precision and must not.\n */\nexport const float32Codec: ScalarCodec = {\n encode: identity,\n decode: (value) => {\n const number = typeof value === \"string\" ? Number(value) : value;\n return typeof number === \"number\" ? shortestFloat32({ value: number }) : number;\n },\n};\n\n// ─── postgres array-literal elements ────────────────────────────\n\nconst booleanFromText = (text: string): unknown => (text === \"t\" ? true : text === \"f\" ? false : text);\n\n/** bytea TEXT output (`\\x0102`, the default `bytea_output = hex`). */\nconst bytesFromText = (text: string): unknown =>\n /^\\\\x(?:[0-9a-fA-F]{2})*$/.test(text) ? new Uint8Array(Buffer.from(text.slice(2), \"hex\")) : text;\n\n/**\n * Element decoders for a postgres array that arrived as its TEXT literal\n * (`{1e-07,NULL}`, `{\"{\\\"a\\\": 1}\"}`) — the runtime projects `Float[]`/`Json[]`\n * as `::text`, and drivers return arrays whose type OID they do not know\n * (`uuid[]` on bun:sql; `xml[]`, `bit[]`, `citext[]` on node-postgres) as the\n * literal. Each element is postgres's text output for its type:\n *\n * - Boolean `t`/`f`, Bytes `\\x` hex and Json text need their own conversion;\n * - every other scalar's regular postgres codec already accepts the text form\n * (`Number(\"1e-07\")`, `Number(\"NaN\")`, `Number(\"-0\")`, BigInt/Decimal text,\n * `parseDateTimeText` for `2024-06-01 12:34:56.789+00`), so `null` means\n * \"decode with the field's own codec\".\n */\nexport function postgresArrayElementFromText(params: { scalarType: ScalarType }): ((text: string) => unknown) | null {\n switch (params.scalarType) {\n case \"Boolean\":\n return booleanFromText;\n case \"Bytes\":\n return bytesFromText;\n case \"Json\":\n return jsonCodec.decode as (text: string) => unknown;\n default:\n return null;\n }\n}\n\n// ─── Per-dialect tables ───────────────────────────────────────────\n\n/** postgres (and pglite — same wire behaviour). */\nexport const POSTGRES_CODECS: CodecTable = {\n String: passthroughCodec,\n Boolean: passthroughCodec,\n Int: numberCodec,\n BigInt: bigIntCodec,\n Float: numberCodec,\n Decimal: decimalCodec,\n DateTime: dateNativeCodec,\n Json: jsonCodec,\n Bytes: passthroughCodec,\n};\n\n/** sqlite — no boolean, date or json types; everything rides TEXT/INTEGER. */\nexport const SQLITE_CODECS: CodecTable = {\n String: passthroughCodec,\n Boolean: booleanIntCodec,\n Int: numberCodec,\n BigInt: bigIntCodec,\n Float: numberCodec,\n Decimal: decimalCodec,\n DateTime: dateTextCodec,\n Json: jsonCodec,\n Bytes: passthroughCodec,\n};\n\n/** mysql — native DATETIME and JSON, booleans stored as TINYINT(1). */\nexport const MYSQL_CODECS: CodecTable = {\n String: passthroughCodec,\n Boolean: booleanNativeInCodec,\n Int: numberCodec,\n BigInt: bigIntCodec,\n Float: numberCodec,\n Decimal: mysqlDecimalCodec,\n DateTime: mysqlDateCodec,\n Json: jsonCodec,\n Bytes: passthroughCodec,\n};\n\n/** The whole table, keyed by dialect. */\nexport const DIALECT_CODECS: Readonly<Record<Dialect, CodecTable>> = {\n postgres: POSTGRES_CODECS,\n sqlite: SQLITE_CODECS,\n mysql: MYSQL_CODECS,\n};\n",
21
+ "// The query entry is a separate bundle. Its existing authenticity maps must\n// participate in ordinary value admission as well as reusable input admission.\nconst checks = new Set<(value: object) => boolean>();\n\n/** Register a bundle's existing SQL-handle identity check, not object shapes. */\nexport function registerSqlHandleCheck(params: { check: (value: object) => boolean }): void {\n checks.add(params.check);\n}\n\n/** @internal Authentic SQL code cannot become parameter data, including nested values. */\nexport function isSqlHandle(value: object): boolean {\n for (const check of checks) if (check(value)) return true;\n return false;\n}\n",
21
22
  "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n/** Physical schema queries; callers name each namespace without changing search_path. */\nexport type PostgresPhysicalCatalogQuery = \"tables\" | \"views\" | \"columns\" | \"constraints\" | \"checks\" | \"foreignKeys\" | \"enums\" | \"indexes\";\n\n/**\n * Read namespace-qualified physical metadata, preserving catalog type and index identities.\n * Extension members (`pg_depend.deptype = 'e'`) are left out of `tables`, `views` and `enums`:\n * the extension's own script owns them, so no plan may create or drop them. The other reads hang\n * off a table and reach the schema only through the filtered table list; PostgreSQL never records\n * an index or a constraint as an extension member on its own.\n */\nexport function renderPostgresPhysicalCatalog(params: { dialect: SqlDialect; namespace: string; query: PostgresPhysicalCatalogQuery }): RenderedQuery {\n const { dialect } = params;\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"postgresPhysicalCatalog\" });\n const collector = new ParamCollector(dialect);\n const namespace = collector.add(params.namespace);\n const extensionOwnedFilter = `NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_class c ON c.oid = d.objid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE d.classid = 'pg_class'::regclass AND d.deptype = 'e' AND n.nspname = ${namespace} AND c.relname = table_name)`;\n let text: string;\n switch (params.query) {\n case \"tables\": text = `SELECT table_name, pg_catalog.array_to_json(storage_relation.reloptions)::text AS storage_options, pg_catalog.array_to_json(storage_toast.reloptions)::text AS toast_storage_options, storage_relation.reltoastrelid <> 0 AS has_toast_table FROM information_schema.tables JOIN pg_catalog.pg_namespace storage_namespace ON storage_namespace.nspname = table_schema JOIN pg_catalog.pg_class storage_relation ON storage_relation.relnamespace = storage_namespace.oid AND storage_relation.relname = table_name LEFT JOIN pg_catalog.pg_class storage_toast ON storage_toast.oid = storage_relation.reltoastrelid WHERE table_schema = ${namespace} AND table_type = 'BASE TABLE' AND table_name <> '_vibe_migrations' AND ${extensionOwnedFilter} ORDER BY table_name`; break;\n case \"views\": text = `SELECT table_name FROM information_schema.views WHERE table_schema = ${namespace} AND ${extensionOwnedFilter} ORDER BY table_name`; break;\n case \"columns\": text = `SELECT table_name, column_name, data_type, udt_name, udt_schema, is_nullable, is_identity, is_generated, collation_name, column_default, datetime_precision, character_maximum_length, numeric_precision, numeric_scale, ordinal_position, catalog.full_type, catalog.generated_kind, catalog.generation_expression FROM information_schema.columns AS columns LEFT JOIN LATERAL (SELECT pg_catalog.format_type(a.atttypid, a.atttypmod) AS full_type, a.attgenerated::text AS generated_kind, CASE WHEN a.attgenerated <> '' THEN pg_catalog.pg_get_expr(d.adbin, d.adrelid, false) ELSE NULL END AS generation_expression FROM pg_catalog.pg_attribute a JOIN pg_catalog.pg_class c ON c.oid = a.attrelid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace LEFT JOIN pg_catalog.pg_attrdef d ON d.adrelid = a.attrelid AND d.adnum = a.attnum WHERE n.nspname = ${namespace} AND c.relname = columns.table_name AND a.attname = columns.column_name AND a.attnum > 0 AND NOT a.attisdropped) catalog ON true WHERE table_schema = ${namespace} ORDER BY table_name, ordinal_position`; break;\n case \"constraints\": text = `SELECT c.conname AS constraint_name, CASE c.contype WHEN 'p' THEN 'PRIMARY KEY' ELSE 'UNIQUE' END AS constraint_type, cl.relname AS table_name, att.attname AS column_name FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class cl ON cl.oid = c.conrelid JOIN pg_catalog.pg_namespace n ON n.oid = cl.relnamespace JOIN unnest(c.conkey) WITH ORDINALITY AS k(attnum, ord) ON true JOIN pg_catalog.pg_attribute att ON att.attrelid = c.conrelid AND att.attnum = k.attnum WHERE c.contype IN ('p', 'u') AND n.nspname = ${namespace} ORDER BY cl.relname, c.conname, k.ord`; break;\n case \"checks\": text = `SELECT cl.relname AS table_name, c.conname AS constraint_name, pg_get_constraintdef(c.oid) AS definition FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class cl ON cl.oid = c.conrelid JOIN pg_catalog.pg_namespace n ON n.oid = cl.relnamespace WHERE c.contype = 'c' AND n.nspname = ${namespace} ORDER BY cl.relname, c.conname`; break;\n case \"foreignKeys\": text = `SELECT c.conname AS constraint_name, cl.relname AS table_name, att.attname AS column_name, fn.nspname AS foreign_namespace, fcl.relname AS foreign_table_name, fatt.attname AS foreign_column_name, c.confdeltype AS on_delete_char, c.confupdtype AS on_update_char, c.convalidated AS validated, c.condeferrable AS deferrable, (SELECT bool_and(t.tgenabled IN ('O', 'A')) FROM pg_catalog.pg_trigger t WHERE t.tgconstraint = c.oid) AS triggers_enabled FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class cl ON cl.oid = c.conrelid JOIN pg_catalog.pg_namespace n ON n.oid = cl.relnamespace JOIN pg_catalog.pg_class fcl ON fcl.oid = c.confrelid JOIN pg_catalog.pg_namespace fn ON fn.oid = fcl.relnamespace JOIN unnest(c.conkey) WITH ORDINALITY AS lk(attnum, ord) ON true JOIN unnest(c.confkey) WITH ORDINALITY AS rk(attnum, ord) ON lk.ord = rk.ord JOIN pg_catalog.pg_attribute att ON att.attrelid = c.conrelid AND att.attnum = lk.attnum JOIN pg_catalog.pg_attribute fatt ON fatt.attrelid = c.confrelid AND fatt.attnum = rk.attnum WHERE c.contype = 'f' AND n.nspname = ${namespace} ORDER BY cl.relname, c.conname, lk.ord`; break;\n case \"enums\": text = `SELECT t.typname AS type_name, n.nspname AS type_namespace, e.enumlabel AS enum_value, e.enumsortorder AS sort_order FROM pg_type t JOIN pg_enum e ON t.oid = e.enumtypid JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = ${namespace} AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_type'::regclass AND d.objid = t.oid AND d.deptype = 'e') ORDER BY t.typname, e.enumsortorder`; break;\n case \"indexes\": text = `SELECT tablename AS table_name, indexname AS index_name, indexdef AS index_def, con.conname AS backing_constraint, con.contype AS backing_constraint_type, health.indisvalid AS valid, health.indisready AS ready, health.indimmediate AS immediate, health.indexprs IS NULL AS plain_columns, health.indnkeyatts AS key_count, health.indnatts AS attribute_count, pg_catalog.array_to_json(ARRAY(SELECT included.attname FROM pg_catalog.generate_series(health.indnkeyatts + 1, health.indnatts) AS included_key(ordinal) JOIN pg_catalog.pg_attribute included ON included.attrelid = health.indrelid AND included.attnum = health.indkey[included_key.ordinal - 1] ORDER BY included_key.ordinal))::text AS included_columns FROM pg_indexes ix JOIN pg_catalog.pg_namespace ns ON ns.nspname = ix.schemaname JOIN pg_catalog.pg_class idx ON idx.relnamespace = ns.oid AND idx.relname = ix.indexname JOIN pg_catalog.pg_index health ON health.indexrelid = idx.oid LEFT JOIN pg_catalog.pg_constraint con ON con.conindid = idx.oid AND con.contype IN ('p', 'u', 'x') WHERE schemaname = ${namespace} ORDER BY tablename, indexname`; break;\n }\n return { text, values: collector.values, returning: \"none\" };\n}\n",
22
23
  "import type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport { unsupportedCapability } from \"@vibeorm/schema\";\n\n/**\n * Turn JIT compilation off for the rest of the current transaction and return\n * the previous `jit` value as `previous` (read before the change). The bulk\n * index-key read costs far above `jit_above_cost`, and compiling it takes longer\n * than running it. Transaction-local: outside a transaction block it changes nothing.\n */\nexport function renderPostgresJitSuspend(params: { dialect: SqlDialect }): RenderedQuery {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"indexOperatorClasses\" });\n return { text: \"SELECT setting.previous, pg_catalog.set_config('jit', 'off', true) AS current FROM (SELECT pg_catalog.current_setting('jit') AS previous OFFSET 0) setting\", values: [], returning: \"none\" };\n}\n\n/** Restore the transaction's `jit` value read by {@link renderPostgresJitSuspend}. */\nexport function renderPostgresJitRestore(params: { dialect: SqlDialect; previous: string }): RenderedQuery {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"indexOperatorClasses\" });\n const collector = new ParamCollector(params.dialect);\n return { text: `SELECT pg_catalog.set_config('jit', ${collector.add(params.previous)}, true) AS current`, values: collector.values, returning: \"none\" };\n}\n\n/** Physical operands and unambiguous server-default evidence for actual type/access-method pairs. */\nexport function renderPostgresIndexKeys(params: { dialect: SqlDialect; table?: QualifiedSqlName; namespaces?: readonly string[]; expressionMetadata?: boolean }): RenderedQuery {\n const { dialect } = params;\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"indexOperatorClasses\" });\n const collector = new ParamCollector(dialect);\n const scope = params.table !== undefined\n ? `${params.expressionMetadata && params.table.namespace === \"pg_temp\" ? \"n.oid = pg_catalog.pg_my_temp_schema()\" : `n.nspname = ${collector.add(params.table.namespace)}`} AND c.relname = ${collector.add(params.table.name)}`\n : params.namespaces === undefined\n ? \"n.nspname <> 'information_schema' AND n.nspname NOT LIKE 'pg\\\\_%' ESCAPE '\\\\'\"\n : params.namespaces.length === 0 ? \"false\" : `n.nspname IN (${[...new Set(params.namespaces)].map((namespace) => collector.add(namespace)).join(\", \")})`;\n // The default class is resolved for the key's INPUT type: the table column's type for a column key. The index\n // attribute stores the class's key type instead (text for GIN jsonb_ops, the element type for array_ops), so it is\n // read only for an expression key, where no table column exists (`a.atttypid` is NULL).\n const defaultResolution = `LEFT JOIN LATERAL (WITH RECURSIVE input_types AS (SELECT t.oid, t.typbasetype, t.typtype, t.typelem, t.typcategory FROM pg_catalog.pg_type t WHERE t.oid = ${params.expressionMetadata ? \"COALESCE(a.atttypid, key_attribute.atttypid)\" : \"a.atttypid\"} UNION ALL SELECT t.oid, t.typbasetype, t.typtype, t.typelem, t.typcategory FROM pg_catalog.pg_type t JOIN input_types previous ON t.oid = previous.typbasetype WHERE previous.typtype = 'd'), candidates AS (SELECT candidate.oid, CASE WHEN candidate.opcintype = input.oid THEN 0 WHEN class_input.typispreferred AND class_input.typcategory = input.typcategory THEN 1 ELSE 2 END AS priority FROM pg_catalog.pg_opclass candidate JOIN pg_catalog.pg_type class_input ON class_input.oid = candidate.opcintype CROSS JOIN input_types input WHERE input.typtype <> 'd' AND candidate.opcdefault AND candidate.opcmethod = idx.relam AND (candidate.opcintype = input.oid OR EXISTS (SELECT 1 FROM pg_catalog.pg_cast cast_entry WHERE cast_entry.castsource = input.oid AND cast_entry.casttarget = candidate.opcintype AND cast_entry.castmethod = 'b' AND cast_entry.castcontext = 'i') OR input.typtype = 'e' AND candidate.opcintype = 'pg_catalog.anyenum'::regtype OR input.typelem <> 0 AND candidate.opcintype = 'pg_catalog.anyarray'::regtype)) SELECT (array_agg(candidate.oid))[1] AS oid FROM candidates candidate WHERE candidate.priority = (SELECT min(priority) FROM candidates) HAVING count(*) = 1) resolved_default ON true`;\n const expressionColumns = params.expressionMetadata ? `, CASE WHEN k.attnum = 0 THEN pg_catalog.pg_get_indexdef(i.indexrelid, k.ordinality::integer, false) ELSE NULL END AS expression, pg_catalog.pg_get_indexdef(i.indexrelid, 0, false) AS index_definition, pg_catalog.format_type(key_attribute.atttypid, key_attribute.atttypmod) AS result_type, (i.indoption[k.ordinality - 1] & 2) <> 0 AS nulls_first, ((i.indoption[k.ordinality - 1] & 2) <> 0) = ((i.indoption[k.ordinality - 1] & 1) <> 0) AS default_null_order, i.indcollation[k.ordinality - 1] AS collation_oid, CASE WHEN k.attnum = 0 THEN NULL ELSE i.indcollation[k.ordinality - 1] = a.attcollation END AS default_collation, i.indisvalid AS valid, i.indisready AS ready, i.indimmediate AS immediate, i.indnkeyatts AS key_count, i.indnatts AS attribute_count` : \"\";\n const expressionJoins = params.expressionMetadata ? ` JOIN pg_catalog.pg_attribute key_attribute ON key_attribute.attrelid = idx.oid AND key_attribute.attnum = k.ordinality` : \"\";\n return {\n text: `SELECT n.nspname AS table_namespace, c.relname AS table_name, idx.relname AS index_name, am.amname AS method, i.indisunique AS unique, pg_catalog.pg_get_expr(i.indpred, i.indrelid, false) AS predicate, i.indnullsnotdistinct AS nulls_not_distinct, k.ordinality AS ordinal, a.attname AS column_name, (i.indoption[k.ordinality - 1] & 1) <> 0 AS descending, opn.nspname AS operator_namespace, op.opcname AS operator_name, COALESCE(op.oid = resolved_default.oid, false) AS exact_default${expressionColumns} FROM pg_catalog.pg_index i JOIN pg_catalog.pg_class c ON c.oid = i.indrelid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace JOIN pg_catalog.pg_class idx ON idx.oid = i.indexrelid JOIN pg_catalog.pg_am am ON am.oid = idx.relam CROSS JOIN LATERAL unnest(i.indkey) WITH ORDINALITY k(attnum, ordinality) LEFT JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid AND a.attnum = k.attnum${expressionJoins} JOIN pg_catalog.pg_opclass op ON op.oid = i.indclass[k.ordinality - 1] JOIN pg_catalog.pg_namespace opn ON opn.oid = op.opcnamespace ${defaultResolution} WHERE ${scope} AND k.ordinality <= i.indnkeyatts ORDER BY n.nspname, c.relname, idx.relname, k.ordinality`,\n values: collector.values,\n returning: \"none\",\n };\n}\n",
23
24
  "import { VibeError, isSqlObjectIdentity, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\n\n/** One physical migration index key, with an optional qualified PostgreSQL operator class. */\nexport type IndexColumnOperand = {\n readonly name: string;\n readonly desc?: boolean;\n readonly operatorClass?: QualifiedSqlName;\n};\n\n/** Render safe column operands; operator classes are a non-unique PostgreSQL capability. */\nexport function renderIndexColumns(params: {\n dialect: SqlDialect;\n columns: readonly IndexColumnOperand[];\n unique: boolean;\n}): string[] {\n const { dialect, columns, unique } = params;\n const hasOperatorClass = columns.some((column) => column.operatorClass !== undefined);\n if (hasOperatorClass && !dialect.capabilities.indexOperatorClasses) throw unsupportedCapability({ dialect: dialect.name, feature: \"indexOperatorClasses\" });\n if (hasOperatorClass && unique) throw unsupportedCapability({ dialect: dialect.name, feature: \"uniqueIndexOperatorClasses\", hint: \"custom unique operator classes can change client selector equality\" });\n return columns.map((column) => {\n const operatorClass = column.operatorClass;\n if (operatorClass !== undefined && !isSqlObjectIdentity({ kind: \"table\", name: operatorClass })) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Index operator class must be a qualified SQL name { namespace, name }\", meta: { rule: \"index-operator-class-identity\", column: column.name } });\n }\n const ops = operatorClass === undefined ? \"\" : ` ${dialect.quoteIdent({ name: operatorClass.namespace })}.${dialect.quoteIdent({ name: operatorClass.name })}`;\n return `${dialect.quoteIdent({ name: column.name })}${ops}${column.desc ? \" DESC\" : \"\"}`;\n });\n}\n",
24
25
  "import { VibeError, indexKeyDefinitionKey, indexKeyTerms, isExpressionIndex, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect, EnumIR, IndexIR, QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { renderIndexColumns } from \"./index-columns.ts\";\nimport { renderSchemaExpression } from \"./predicate.ts\";\nimport type { PredicateModel } from \"./predicate.ts\";\nimport type { RenderedQuery } from \"./render.ts\";\nimport { extractPostgresIndexKeys, renderPostgresIndexExpressionProbe } from \"./dialects/postgres-index-expressions.ts\";\nimport { assertMysqlIndexKeyStorage, extractMysqlIndexKeys, renderMysqlIndexExpressionProbe } from \"./dialects/mysql-index-expressions.ts\";\nimport { extractSqliteIndexKeys } from \"./dialects/sqlite-index-expressions.ts\";\n\n/** Complete ordered physical keys; expression text has no key wrapper or direction. */\nexport type IndexKeyOperand =\n | { readonly kind: \"field\"; readonly name: string; readonly desc: boolean; readonly decimal?: boolean; readonly operatorClass?: QualifiedSqlName }\n | { readonly kind: \"expression\"; readonly text: string; readonly desc: boolean };\n\n/** Scratch statements only: sessions, normalization context and cleanup belong to migrate. */\nexport type IndexExpressionProbeParams = {\n readonly dialect: SqlDialect;\n readonly operation: \"context\" | \"clone\" | \"createIndex\" | \"read\" | \"drop\";\n readonly probe: { readonly table: string; readonly index: string };\n readonly table?: QualifiedSqlName;\n readonly keys?: readonly IndexKeyOperand[];\n readonly unique?: boolean;\n readonly definition?: string;\n readonly backslashEscapes?: boolean;\n readonly where?: string;\n readonly nullsNotDistinct?: boolean;\n};\n\n/** Resolve logical terms using the shared scalar renderer, then qualify physical key storage. */\nexport function resolveIndexKeys({ index, model, dialect, enums = [], site }: {\n readonly index: IndexIR;\n readonly model: PredicateModel;\n readonly dialect: SqlDialect;\n readonly enums?: readonly EnumIR[];\n readonly site: string;\n}): readonly IndexKeyOperand[] {\n const computed = isExpressionIndex({ index });\n if (computed) indexKeyDefinitionKey({ index, model });\n const terms = indexKeyTerms({ index });\n if (computed && index.where !== undefined && !dialect.capabilities.partialIndexes) throw unsupportedCapability({ dialect: dialect.name, feature: \"partialIndexes\" });\n if (computed && index.nullsNotDistinct === true && dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"nullsNotDistinct\" });\n if (computed && !dialect.capabilities.expressionIndexes) throw unsupportedCapability({ dialect: dialect.name, feature: \"expressionIndexes\" });\n if (computed && (index.fields.length !== 0 || !terms.some((term) => term.kind !== \"field\"))) throw invalid({ site, reason: \"index-expression-terms\" });\n if (terms.length === 0) throw invalid({ site, reason: \"index-empty-keys\" });\n if (computed && (index.clientName !== undefined || index.constraintName !== undefined)) throw invalid({ site, reason: \"index-expression-selector\" });\n if (computed && (index.kind !== \"btree\" && index.kind !== \"unique\" || terms.some((term) => term.kind === \"field\" && term.field.operatorClass !== undefined))) throw unsupportedCapability({ dialect: dialect.name, feature: \"expressionIndexOperatorClasses\" });\n const keys = terms.map((term): IndexKeyOperand => {\n if (term.kind === \"field\") {\n const field = model.fields.find((candidate) => candidate.name === term.field.name);\n if (field === undefined) throw invalid({ site, reason: \"index-unknown-field\" });\n return { kind: \"field\", name: field.dbName ?? field.name, desc: term.field.sort === \"desc\", ...(dialect.name === \"sqlite\" && field.type === \"Decimal\" ? { decimal: true } : {}), ...(term.field.operatorClass === undefined ? {} : { operatorClass: term.field.operatorClass }) };\n }\n if (term.kind === \"raw\") {\n if (index.name === undefined || typeof term.sql !== \"string\" || !term.sql.trim() || term.sql.includes(\"\\0\")) throw invalid({ site, reason: \"index-raw-expression\" });\n return { kind: \"expression\", text: term.sql, desc: term.sort === \"desc\" };\n }\n const rendered = renderSchemaExpression({ expression: term.expression, model, dialect, enums, usage: \"indexExpression\", site });\n if (![\"lower\", \"upper\", \"add\", \"sub\", \"mul\"].includes(term.expression.kind)) throw invalid({ site, reason: \"index-expression-root\" });\n if (rendered.resultType.refinement !== undefined || typeof rendered.resultType.type !== \"string\" || ![\"String\", \"Int\", \"BigInt\", \"Float\", \"Decimal\"].includes(rendered.resultType.type)) throw invalid({ site, reason: \"index-expression-result\" });\n return { kind: \"expression\", text: rendered.text, desc: term.sort === \"desc\" };\n });\n if (computed && dialect.name === \"mysql\") assertMysqlIndexKeyStorage({ dialect, model, terms });\n return keys;\n}\n\n/** Render complete key fragments; the caller owns the outer CREATE/ALTER list. */\nexport function renderIndexKeys({ dialect, keys, unique }: {\n readonly dialect: SqlDialect;\n readonly keys: readonly IndexKeyOperand[];\n readonly unique: boolean;\n}): readonly string[] {\n if (keys.length === 0) throw invalid({ site: \"index\", reason: \"index-empty-keys\" });\n const computed = keys.some((key) => key.kind === \"expression\");\n if (computed && !dialect.capabilities.expressionIndexes) throw unsupportedCapability({ dialect: dialect.name, feature: \"expressionIndexes\" });\n if (computed && keys.some((key) => key.kind === \"field\" && key.operatorClass !== undefined)) throw unsupportedCapability({ dialect: dialect.name, feature: \"expressionIndexOperatorClasses\" });\n return keys.map((key) => {\n if (key.kind === \"field\") {\n if (dialect.name === \"sqlite\" && key.decimal === true) return `CAST(${dialect.quoteIdent({ name: key.name })} AS REAL)${key.desc ? \" DESC\" : \"\"}`;\n return renderIndexColumns({ dialect, columns: [key], unique })[0]!;\n }\n if (!key.text.trim() || key.text.includes(\"\\0\")) throw invalid({ site: \"index\", reason: \"index-raw-expression\" });\n const expression = dialect.name === \"sqlite\" ? key.text : `(${key.text})`;\n return `${expression}${key.desc ? \" DESC\" : \"\"}`;\n });\n}\n\n/**\n * Recover raw physical terms without inventing typed logical expressions or Decimal origin.\n * A PostgreSQL `INCLUDE (…)` clause makes the result undefined unless the caller read\n * that many included columns from the catalog itself (`included`), so a covering list\n * can never disappear behind recovered keys.\n */\nexport function extractIndexKeys({ dialect, definition, index, backslashEscapes = true, included }: {\n readonly dialect: Dialect;\n readonly definition: string;\n readonly index: string;\n readonly backslashEscapes?: boolean;\n readonly included?: number;\n}): readonly IndexKeyOperand[] | undefined {\n switch (dialect) {\n case \"postgres\": return extractPostgresIndexKeys({ definition, index, ...(included === undefined ? {} : { included }) });\n case \"sqlite\": return extractSqliteIndexKeys({ definition, index });\n case \"mysql\": return extractMysqlIndexKeys({ definition, index, backslashEscapes });\n }\n}\n\n/** Render a real expression-index normalization host, never a scalar CHECK surrogate. */\nexport function renderIndexExpressionProbe({ ...params }: IndexExpressionProbeParams): readonly RenderedQuery[] {\n if (params.operation === \"context\" && params.dialect.name === \"sqlite\") return [{ text: \"SELECT sqlite_version() AS version\", values: [], returning: \"none\" }];\n if (!params.dialect.capabilities.expressionIndexes) throw unsupportedCapability({ dialect: params.dialect.name, feature: \"expressionIndexes\" });\n switch (params.dialect.name) {\n case \"postgres\": return renderPostgresIndexExpressionProbe(params);\n case \"mysql\": return renderMysqlIndexExpressionProbe(params);\n case \"sqlite\": throw unsupportedCapability({ dialect: \"sqlite\", feature: \"indexExpressionNormalizationProbe\", hint: \"SQLite expression indexes use quote-aware source extraction, not a normalization probe\" });\n }\n}\n\n/** Version admission after a connection reveals its host, before scratch or user index DDL. */\nexport function assertIndexExpressionVersion({ dialect, version }: {\n readonly dialect: Dialect;\n readonly version: string;\n}): void {\n if (dialect === \"postgres\") return;\n const match = version.match(/^(\\d+)\\.(\\d+)\\.(\\d+)(?:[-\\s].*)?$/);\n const parts = match?.slice(1, 4).map(Number);\n const minimum = dialect === \"mysql\" ? [8, 0, 13] : [3, 9, 0];\n const admitted = parts !== undefined && !/mariadb/i.test(version) && parts.some((part, ordinal) => part > minimum[ordinal]! && parts.slice(0, ordinal).every((prefix, position) => prefix === minimum[position])) || parts !== undefined && parts.every((part, ordinal) => part === minimum[ordinal]);\n if (!admitted) throw unsupportedCapability({ dialect, feature: \"expressionIndexServerVersion\", hint: `Expression indexes require a known ${dialect} version at least ${minimum.join(\".\")}; received ${JSON.stringify(version)}` });\n}\n\nfunction invalid({ site, reason }: { readonly site: string; readonly reason: string }): VibeError {\n return new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Invalid index keys at ${site}: ${reason}`, meta: { rule: reason, site } });\n}\n",
25
26
  "/**\n * Typed schema predicates → SQL text.\n *\n * The ONE place a `PredicateIR` becomes SQL, for both of the sites that cannot\n * carry a bound parameter: a CHECK constraint body and a partial index's\n * `WHERE`. Constitution rule 4 — every SQL-text decision lives in a dialect\n * here, never in migrate, the DSL or a query builder.\n *\n * Shared scalar rendering also serves expression-index keys. The caller owns\n * expression-index DDL and its additional database-object qualification.\n *\n * What it guarantees:\n *\n * - **Logical field names resolve to physical columns.** `@map(\"qty_total\")`\n * is applied here, so renaming a mapped column cannot leave a CHECK naming a\n * column that no longer exists.\n * - **Identifiers are quoted through `dialect.quoteIdent`, literals through\n * `dialect.quoteStringLiteral`.** No value the author writes can escape its\n * literal and become SQL structure.\n * - **Operand scalars must match the expression result type.** Local dates keep\n * their distinct logical identity, shared with foreign-key pairing.\n * - **A dialect that cannot express something refuses here**, at the earliest\n * knowable moment (generate time), with a `VibeError` carrying a stable\n * `meta.rule` — never silently different SQL.\n *\n * Three-valued logic is NOT smoothed over. A comparison against NULL is\n * UNKNOWN, and a CHECK passes on TRUE **or** UNKNOWN, so nothing here inserts\n * an implicit `IS NOT NULL` guard. An author who wants all-or-none writes it\n * with `isNull`/`isNotNull`.\n */\n\nimport { VibeError, assertPredicateCapabilities, fieldTypeIdentity, isCanonicalLocalDate, isEnumType, isLocalDateField, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { EnumIR, FieldIR, ModelIR, PredicateBooleanUsage, PredicateExpression, PredicateIR, PredicateNumericType, PredicateOperand, PredicateResultType, PredicateUsage as SchemaPredicateUsage, PredicateValue } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\n\n// ─── Public API ───────────────────────────────────────────────────\n\n/**\n * Where a Boolean predicate is being rendered. Each host has different database\n * limits; scalar index-expression usage is handled by renderSchemaExpression.\n */\nexport type PredicateUsage = PredicateBooleanUsage;\n\n/**\n * The part of a model a predicate reads: its name (for error messages) and its\n * fields (for physical column names and scalar types). Narrow on purpose — a\n * predicate can never depend on relations, indexes or view-ness.\n */\nexport type PredicateModel = Pick<ModelIR, \"name\" | \"fields\">;\n\n/** Render a typed predicate as the SQL text of a CHECK body or an index `WHERE`. */\nexport function renderPredicate(params: {\n predicate: PredicateIR;\n model: PredicateModel;\n dialect: SqlDialect;\n /** Schema enums, for membership checking of enum operands. */\n enums?: readonly EnumIR[];\n usage: PredicateUsage;\n /** Human label naming the declaration, e.g. `CHECK \"order_total_nonnegative\"`. */\n site: string;\n}): string {\n assertPredicateCapabilities({ predicate: params.predicate, dialect: params.dialect.name, usage: params.usage, model: params.model });\n if (params.usage === \"exclusionPredicate\" && !params.dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: params.dialect.name, feature: \"exclusionConstraints\" });\n if (params.usage === \"indexPredicate\" && !params.dialect.capabilities.partialIndexes) {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"partialIndexes\" });\n }\n const context: RenderContext = {\n model: params.model,\n dialect: params.dialect,\n enums: params.enums ?? [],\n usage: params.usage,\n site: params.site,\n };\n return renderNode({ node: params.predicate, context });\n}\n\n/** Render a scalar schema expression. Expression-index DDL and host qualification belong to the caller. */\nexport function renderSchemaExpression({ expression, model, dialect, enums = [], usage, site }: {\n expression: PredicateExpression;\n model: PredicateModel;\n dialect: SqlDialect;\n enums?: readonly EnumIR[];\n usage: \"indexExpression\";\n site: string;\n}): { readonly text: string; readonly resultType: PredicateResultType } {\n assertPredicateCapabilities({ expression, dialect: dialect.name, usage, model });\n const context: RenderContext = { model, dialect, enums, usage, site };\n const { text, resultType } = renderExpression({ expression, context });\n return { text, resultType };\n}\n\n// ─── Internals ────────────────────────────────────────────────────\n\ntype RenderContext = {\n readonly model: PredicateModel;\n readonly dialect: SqlDialect;\n readonly enums: readonly EnumIR[];\n readonly usage: SchemaPredicateUsage;\n readonly site: string;\n};\n\n/** Operator precedence, so the renderer emits the MINIMUM parentheses. */\nconst PRECEDENCE: Readonly<Record<PredicateIR[\"kind\"], number>> = {\n or: 1,\n and: 2,\n not: 3,\n compare: 4,\n inList: 4,\n isNull: 4,\n isTrue: 4,\n};\n\nconst COMPARISON_SQL: Readonly<Record<string, string>> = {\n eq: \"=\",\n ne: \"<>\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n};\n\n/** Exact decimal integer, no exponent, no leading `+`. */\nconst EXACT_INTEGER: RegExp = /^-?(0|[1-9]\\d*)$/;\n/** Exact fixed-point decimal — the spelling `Decimal` columns store. */\nconst EXACT_DECIMAL: RegExp = /^-?(0|[1-9]\\d*)(\\.\\d+)?$/;\n\nconst INT32_MIN = -2_147_483_648n;\nconst INT32_MAX = 2_147_483_647n;\nconst INT64_MIN = -(2n ** 63n);\nconst INT64_MAX = 2n ** 63n - 1n;\n\nfunction refuse(params: {\n context: RenderContext;\n rule: string;\n message: string;\n meta?: Record<string, unknown>;\n}): never {\n const { context, rule, message } = params;\n throw new VibeError({\n code: \"VIBE_SCHEMA_INVALID\",\n message: `${context.site} on \"${context.model.name}\": ${message}`,\n meta: { rule, model: context.model.name, site: context.site, ...(params.meta ?? {}) },\n });\n}\n\n/** Wrap a child only when it binds LOOSER than its parent. */\nfunction renderChild(params: { node: PredicateIR; parent: PredicateIR[\"kind\"]; context: RenderContext }): string {\n const { node, parent, context } = params;\n // A singleton group emits its child, so its child's precedence is authoritative.\n if ((node.kind === \"and\" || node.kind === \"or\") && node.operands.length === 1) {\n return renderChild({ node: node.operands[0]!, parent, context });\n }\n const text = renderNode({ node, context });\n return PRECEDENCE[node.kind] < PRECEDENCE[parent] ? `(${text})` : text;\n}\n\nfunction renderNode(params: { node: PredicateIR; context: RenderContext }): string {\n const { node, context } = params;\n\n switch (node.kind) {\n case \"and\":\n case \"or\": {\n if (node.operands.length === 0) {\n refuse({\n context,\n rule: \"predicate-empty\",\n message: `${node.kind === \"and\" ? \"and()\" : \"or()\"} has no operands — an empty boolean group has no honest SQL spelling`,\n });\n }\n if (node.operands.length === 1) return renderNode({ node: node.operands[0]!, context });\n const separator = node.kind === \"and\" ? \" AND \" : \" OR \";\n return node.operands\n .map((operand) => renderChild({ node: operand, parent: node.kind, context }))\n .join(separator);\n }\n\n case \"not\":\n return `NOT ${renderChild({ node: node.operand, parent: \"not\", context })}`;\n\n case \"isTrue\":\n return `COALESCE(${renderNode({ node: node.operand, context })}, FALSE)`;\n\n case \"isNull\": {\n // No cast here, on any dialect: a cast of NULL is still NULL, and the\n // bare column keeps the predicate index-usable.\n const field = resolveField({ name: node.field.name, context, nullTest: true });\n return `${quoteColumn({ field, context })} IS ${node.negate === true ? \"NOT NULL\" : \"NULL\"}`;\n }\n\n case \"compare\": {\n const left = renderExpression({ expression: node.left, context });\n const right = renderOperand({ operand: node.right, left, context });\n return `${left.text} ${COMPARISON_SQL[node.op]} ${right}`;\n }\n\n case \"inList\": {\n if (node.values.length === 0) {\n refuse({\n context,\n rule: \"predicate-empty\",\n message: `inList(\"${node.field.name}\") has no values — an empty IN list is UNKNOWN on every row and never what an author means`,\n meta: { field: node.field.name },\n });\n }\n const field = resolveField({ name: node.field.name, context });\n const values = node.values\n .map((value) => renderLiteral({ value, resultType: fieldResultType({ field, context }), fieldName: field.name, context }))\n .join(\", \");\n return `${compareColumn({ field, context })} ${node.negate === true ? \"NOT IN\" : \"IN\"} (${values})`;\n }\n }\n}\n\n// ─── Fields and columns ───────────────────────────────────────────\n\n/** Resolve a LOGICAL field name to its `FieldIR`, refusing everything unusable. */\nfunction resolveField(params: { name: string; context: RenderContext; nullTest?: boolean }): FieldIR {\n const { name, context } = params;\n const field = context.model.fields.find((candidate) => candidate.name === name);\n\n if (field === undefined) {\n refuse({\n context,\n rule: \"predicate-unknown-field\",\n message: `references field \"${name}\", which the model does not declare`,\n meta: { field: name },\n });\n }\n if (field.isList) {\n refuse({\n context,\n rule: \"predicate-list-field\",\n message: `compares scalar list \"${name}\" — array operators differ per dialect; use a raw expression for them`,\n meta: { field: name },\n });\n }\n if (field.isUnsupported === true) {\n refuse({\n context,\n rule: \"predicate-unsupported-type\",\n message: `references \"${name}\", an Unsupported(\"${field.nativeType ?? \"?\"}\") column whose operators VibeORM does not model — use a raw expression`,\n meta: { field: name },\n });\n }\n if (params.nullTest !== true && (field.type === \"Json\" || field.type === \"Bytes\")) {\n refuse({\n context,\n rule: \"predicate-unsupported-type\",\n message: `references ${field.type} column \"${name}\" — ${field.type} comparison operators differ per dialect; use a raw expression`,\n meta: { field: name, type: field.type },\n });\n }\n // MySQL error 3818, reproduced on this project's mysql 8.4.11: \"Check\n // constraint 'x' cannot refer to an auto-increment column.\" Refusing while\n // generating beats emitting DDL the server rejects halfway through a\n // migration. Partial indexes never reach this — mysql has none at all.\n if (\n context.usage === \"check\" &&\n context.dialect.name === \"mysql\" &&\n field.default?.kind === \"autoincrement\"\n ) {\n throw unsupportedCapability({\n dialect: \"mysql\",\n feature: `CHECK constraint referencing auto-increment column \"${context.model.name}.${name}\"`,\n hint: \"mysql refuses this with error 3818 — enforce the rule in application code or on a non-generated column\",\n });\n }\n\n return field;\n}\n\n/** The physical, quoted column. */\nfunction quoteColumn(params: { field: FieldIR; context: RenderContext }): string {\n const { field, context } = params;\n return context.dialect.quoteIdent({ name: field.dbName ?? field.name });\n}\n\n/**\n * The column as it appears at a COMPARISON site.\n *\n * Identical to {@link quoteColumn} everywhere except sqlite Decimal: a Decimal\n * stores as exact TEXT there, so a bare comparison is lexicographic (`'9'` >\n * `'10'`). The runtime already compares those columns as `CAST(col AS REAL)`\n * (the B4 decision in `ast.ts`'s `ColRef.castReal`), and a CHECK that disagreed\n * with the query that reads the same column would be worse than either.\n */\nfunction compareColumn(params: { field: FieldIR; context: RenderContext }): string {\n const { field, context } = params;\n const quoted = quoteColumn({ field, context });\n return context.dialect.name === \"sqlite\" && field.type === \"Decimal\"\n ? `CAST(${quoted} AS REAL)`\n : quoted;\n}\n\n// ─── Operands ─────────────────────────────────────────────────────\n\ntype RenderedExpression = {\n readonly text: string;\n readonly resultType: PredicateResultType;\n /** Diagnostic provenance only. Never used as result storage metadata. */\n readonly fieldName: string;\n};\n\nfunction fieldResultType({ field, context }: { field: FieldIR; context: RenderContext }): PredicateResultType {\n if (isLocalDateField({ field })) return { type: field.type, refinement: \"localDate\" };\n if (context.dialect.name === \"postgres\" && field.type === \"String\" && field.nativeType?.trim().toLowerCase() === \"uuid\") return { type: \"String\", refinement: \"nativeUuid\" };\n return { type: field.type };\n}\n\nfunction resultIdentity({ resultType }: { resultType: PredicateResultType }): string {\n return resultType.refinement === \"localDate\" ? \"localDate\" : fieldTypeIdentity({ type: resultType.type });\n}\n\nconst ARITHMETIC_SQL: Readonly<Record<\"add\" | \"sub\" | \"mul\", string>> = {\n add: \"+\",\n sub: \"-\",\n mul: \"*\",\n};\n\n/** SQLite's native arithmetic seam. The family is supplied so any later overflow policy changes here only. */\nfunction renderSqliteArithmetic({ left, right, kind }: { left: string; right: string; kind: \"add\" | \"sub\" | \"mul\"; type: PredicateNumericType }): string {\n return `(${left} ${ARITHMETIC_SQL[kind]} ${right})`;\n}\n\nfunction renderExpression({ expression, context }: { expression: PredicateExpression; context: RenderContext }): RenderedExpression {\n switch (expression.kind) {\n case \"field\": {\n const field = resolveField({ name: expression.name, context });\n return { text: compareColumn({ field, context }), resultType: fieldResultType({ field, context }), fieldName: field.name };\n }\n case \"jsonText\": {\n const field = resolveField({ name: expression.field.name, context, nullTest: true });\n if (field.type !== \"Json\") refuse({ context, rule: \"predicate-type-mismatch\", message: `jsonText requires a scalar Json field, not \"${field.name}\"` });\n if (!Array.isArray(expression.path) || Array.from(expression.path).some((segment: unknown) => typeof segment !== \"string\" || segment.includes(\"\\u0000\"))) {\n refuse({ context, rule: \"predicate-json-path\", message: \"jsonText requires a string-only path without NUL bytes\" });\n }\n const path = expression.path.map((value) => context.dialect.quoteStringLiteral({ value })).join(\", \");\n return { text: `(${quoteColumn({ field, context })} #>> ARRAY[${path}]::text[])`, resultType: { type: \"String\" }, fieldName: field.name };\n }\n case \"length\":\n case \"lower\":\n case \"upper\": {\n const inner = renderExpression({ expression: expression.expression, context });\n if (inner.resultType.type !== \"String\" || inner.resultType.refinement === \"localDate\") {\n refuse({ context, rule: \"predicate-type-mismatch\", message: `${expression.kind} requires a text expression, not a local date or another scalar`, meta: { field: inner.fieldName } });\n }\n // PostgreSQL native types without lower()/upper() (Uuid, Inet, …) were refused by capability admission above.\n return { text: `${expression.kind}(${inner.text})`, resultType: { type: expression.kind === \"length\" ? \"Int\" : \"String\" }, fieldName: inner.fieldName };\n }\n case \"add\":\n case \"sub\":\n case \"mul\": {\n const left = renderExpression({ expression: expression.left, context });\n const type = left.resultType.type;\n if (type !== \"Int\" && type !== \"BigInt\" && type !== \"Float\" && type !== \"Decimal\") {\n refuse({ context, rule: \"predicate-type-mismatch\", message: `${expression.kind} requires Int, BigInt, Float or Decimal operands`, meta: { field: left.fieldName } });\n }\n const right = renderOperand({ operand: expression.right, left, context });\n // The admitted numeric families were checked by capability admission at the entry point (one source).\n const text = context.dialect.name === \"sqlite\"\n ? renderSqliteArithmetic({ left: left.text, right, kind: expression.kind, type })\n : `(${left.text} ${ARITHMETIC_SQL[expression.kind]} ${right})`;\n return { text, resultType: { type }, fieldName: left.fieldName };\n }\n }\n}\n\nfunction renderOperand({ operand, left, context }: {\n operand: PredicateOperand;\n left: RenderedExpression;\n context: RenderContext;\n}): string {\n if (operand.kind === \"value\") return renderLiteral({ value: operand, resultType: left.resultType, fieldName: left.fieldName, context });\n\n const other = renderExpression({ expression: operand, context });\n const leftType = resultIdentity({ resultType: left.resultType });\n const rightType = resultIdentity({ resultType: other.resultType });\n if (leftType !== rightType) {\n refuse({\n context,\n rule: \"predicate-type-mismatch\",\n message: `compares \"${left.fieldName}\" (${leftType}) with \"${other.fieldName}\" (${rightType}): both operands need the same scalar type`,\n meta: { field: left.fieldName, other: other.fieldName, fieldType: leftType, otherType: rightType },\n });\n }\n return other.text;\n}\n\n/** One literal, validated against the expression result and spelled for the dialect. */\nfunction renderLiteral(params: {\n value: PredicateValue;\n resultType: PredicateResultType;\n fieldName: string;\n context: RenderContext;\n}): string {\n const { resultType, fieldName, context } = params;\n const { value } = params.value;\n const type = resultType.type;\n\n const wrongCarrier = (expected: string): never =>\n refuse({\n context,\n rule: \"predicate-type-mismatch\",\n message: `compares ${fieldTypeIdentity({ type })} field \"${fieldName}\" with ${describe({ value })}: ${expected}`,\n meta: { field: fieldName, fieldType: fieldTypeIdentity({ type }), value },\n });\n\n if (isEnumType(type)) {\n if (typeof value !== \"string\") return wrongCarrier(`enum ${type.enum} takes one of its member names as a string`);\n const declared = context.enums.find((entry) => entry.name === type.enum);\n if (declared !== undefined && !declared.values.includes(value)) {\n refuse({\n context,\n rule: \"predicate-enum-member\",\n message: `compares \"${fieldName}\" with \"${value}\", which is not a member of enum ${type.enum} (${declared.values.join(\", \")})`,\n meta: { field: fieldName, enum: type.enum, value, members: [...declared.values] },\n });\n }\n return stringLiteral({ value, context, fieldName });\n }\n\n switch (type) {\n case \"String\":\n if (typeof value !== \"string\") return wrongCarrier(\"a String column takes a string literal\");\n if (resultType.refinement === \"localDate\" && !isCanonicalLocalDate({ value })) {\n refuse({\n context,\n rule: \"predicate-literal-invalid\",\n message: `compares local-date field \"${fieldName}\" with a noncanonical or invalid calendar date`,\n meta: { field: fieldName, value },\n });\n }\n return stringLiteral({ value, context, fieldName });\n\n case \"Boolean\":\n if (typeof value !== \"boolean\") return wrongCarrier(\"a Boolean column takes `true` or `false`\");\n return value ? context.dialect.booleanLiteral.true : context.dialect.booleanLiteral.false;\n\n case \"Int\":\n return integerLiteral({ value, fieldName, context, min: INT32_MIN, max: INT32_MAX, label: \"Int\" });\n\n case \"BigInt\":\n return integerLiteral({ value, fieldName, context, min: INT64_MIN, max: INT64_MAX, label: \"BigInt\" });\n\n case \"Float\": {\n if (typeof value !== \"number\") return wrongCarrier(\"a Float column takes a number\");\n if (!Number.isFinite(value)) {\n refuse({\n context,\n rule: \"predicate-literal-invalid\",\n message: `compares \"${fieldName}\" with ${String(value)}: a Float literal must be finite`,\n meta: { field: fieldName, value: String(value) },\n });\n }\n return String(value);\n }\n\n case \"Decimal\": {\n // Exact decimal TEXT only, mirroring `dsl.decimal({ default: \"0.00\" })`.\n // A JS number cannot carry an exact decimal — `0.1 + 0.2` is the classic\n // proof — so accepting one here would silently move the boundary of the\n // author's rule.\n if (typeof value !== \"string\") {\n return wrongCarrier(\"a Decimal column takes exact decimal TEXT (\\\"0\\\", \\\"19.99\\\") — a JS number cannot carry an exact decimal\");\n }\n if (!EXACT_DECIMAL.test(value)) {\n refuse({\n context,\n rule: \"predicate-literal-invalid\",\n message: `compares \"${fieldName}\" with \"${value}\", which is not an exact decimal literal`,\n meta: { field: fieldName, value },\n });\n }\n return value;\n }\n\n case \"DateTime\":\n // Three correct spellings across the matrix (postgres `timestamp`, mysql\n // `DATETIME(3)` in UTC, sqlite ISO-8601 TEXT with an explicit `Z`), and\n // picking the wrong one is a silent data bug rather than an error. Every\n // consumer rule this expression language exists for compares two DateTime\n // COLUMNS (\"end after start\"), which needs no literal at all.\n refuse({\n context,\n rule: \"predicate-unsupported-literal\",\n message: `compares DateTime field \"${fieldName}\" with a literal. DateTime literals are spelled differently on postgres, mysql and sqlite, so VibeORM does not guess one. Compare two DateTime columns, or write a raw expression for a fixed instant`,\n meta: { field: fieldName },\n });\n\n case \"Json\":\n case \"Bytes\":\n // Unreachable: resolveField already refused these columns. Kept so the\n // switch stays exhaustive if ScalarType grows.\n return wrongCarrier(`${type} columns take no predicate literal`);\n }\n}\n\nfunction integerLiteral(params: {\n value: string | number | boolean;\n fieldName: string;\n context: RenderContext;\n min: bigint;\n max: bigint;\n label: string;\n}): string {\n const { value, fieldName, context, min, max, label } = params;\n\n let text: string;\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value)) {\n refuse({\n context,\n rule: \"predicate-literal-invalid\",\n message: `compares \"${fieldName}\" with ${String(value)}: an ${label} literal must be an exact integer JavaScript can represent; pass a bigint or a decimal string for larger values`,\n meta: { field: fieldName, value: String(value) },\n });\n }\n text = String(value);\n } else if (typeof value === \"string\") {\n if (!EXACT_INTEGER.test(value)) {\n refuse({\n context,\n rule: \"predicate-literal-invalid\",\n message: `compares \"${fieldName}\" with \"${value}\", which is not an exact integer literal`,\n meta: { field: fieldName, value },\n });\n }\n text = value;\n } else {\n refuse({\n context,\n rule: \"predicate-type-mismatch\",\n message: `compares ${label} field \"${fieldName}\" with ${describe({ value })}: an ${label} column takes an integer`,\n meta: { field: fieldName, value },\n });\n }\n\n const parsed = BigInt(text);\n if (parsed < min || parsed > max) {\n refuse({\n context,\n rule: \"predicate-literal-invalid\",\n message: `compares \"${fieldName}\" with ${text}, which is outside the range an ${label} column can hold (${min}…${max})`,\n meta: { field: fieldName, value: text },\n });\n }\n return text;\n}\n\nfunction stringLiteral(params: { value: string; context: RenderContext; fieldName: string }): string {\n const { value, context, fieldName } = params;\n // A NUL byte terminates the string for the C-based client libraries every\n // driver here is built on, and postgres `text` cannot store one at all — so\n // it can never round-trip and must not reach DDL.\n if (value.includes(\"\\u0000\")) {\n refuse({\n context,\n rule: \"predicate-literal-invalid\",\n message: `compares \"${fieldName}\" with a string containing a NUL byte, which no dialect here can store`,\n meta: { field: fieldName },\n });\n }\n return context.dialect.quoteStringLiteral({ value });\n}\n\nfunction describe(params: { value: unknown }): string {\n const { value } = params;\n return typeof value === \"string\" ? `the string ${JSON.stringify(value)}` : `the ${typeof value} ${String(value)}`;\n}\n",
26
- "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { IndexExpressionProbeParams, IndexKeyOperand } from \"../index-expressions.ts\";\nimport { renderIndexKeys } from \"../index-expressions.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { renderPostgresIndexKeys } from \"./postgres-index-keys.ts\";\nimport { extractStandaloneIndexKeys } from \"./sqlite-index-expressions.ts\";\n\n/** CREATE INDEX extraction is conservative; structured catalog rows remain authoritative. */\nexport function extractPostgresIndexKeys({ definition, index, included }: {\n readonly definition: string;\n readonly index: string;\n /** INCLUDE columns the caller read from the catalog; an INCLUDE clause of another length is refused. */\n readonly included?: number;\n}): readonly IndexKeyOperand[] | undefined {\n return extractStandaloneIndexKeys({ definition, index, postgres: true, ...(included === undefined ? {} : { included }) });\n}\n\n/** Caller owns a fixed search_path and rollback savepoint; no populated user table is indexed. */\nexport function renderPostgresIndexExpressionProbe({ ...params }: IndexExpressionProbeParams): readonly RenderedQuery[] {\n const { dialect, operation, probe } = params;\n if (operation === \"context\") return [{ text: \"SELECT current_setting('server_version') AS version, current_setting('server_version_num') AS version_number, current_setting('search_path') AS search_path\", values: [], returning: \"none\" }];\n const table = dialect.quoteIdent({ name: probe.table });\n if (operation === \"read\") return [renderPostgresIndexKeys({ dialect, table: { namespace: \"pg_temp\", name: probe.table }, expressionMetadata: true })];\n if (operation === \"drop\") return [{ text: `DROP TABLE pg_temp.${table}`, values: [], returning: \"none\" }];\n if (operation === \"clone\") {\n if (params.table === undefined) throw unsupportedCapability({ dialect: \"postgres\", feature: \"indexExpressionProbeSource\" });\n return [{ text: `CREATE TEMP TABLE ${table} (LIKE ${dialect.quoteIdent({ name: params.table.namespace })}.${dialect.quoteIdent({ name: params.table.name })} INCLUDING DEFAULTS INCLUDING GENERATED INCLUDING IDENTITY INCLUDING STORAGE INCLUDING CONSTRAINTS)`, values: [], returning: \"none\" }];\n }\n if (params.keys === undefined) throw unsupportedCapability({ dialect: \"postgres\", feature: \"indexExpressionProbeKeys\" });\n if (params.nullsNotDistinct === true && params.unique !== true) throw unsupportedCapability({ dialect: \"postgres\", feature: \"nonUniqueNullsNotDistinct\" });\n const keys = renderIndexKeys({ dialect, keys: params.keys, unique: params.unique === true });\n return [{ text: `CREATE ${params.unique ? \"UNIQUE \" : \"\"}INDEX ${dialect.quoteIdent({ name: probe.index })} ON pg_temp.${table} (${keys.join(\", \")})${params.nullsNotDistinct ? \" NULLS NOT DISTINCT\" : \"\"}${params.where === undefined ? \"\" : ` WHERE ${params.where}`}`, values: [], returning: \"none\" }];\n}\n",
27
- "import { VibeError } from \"@vibeorm/schema\";\n\n/** One preserved column clause; expressions are never interpreted or normalized. */\nexport type SqliteColumnClause = { readonly name: string; readonly sql: string };\n/** Exact slices of a database-produced CREATE TABLE's outer definition list. */\nexport type TableDefinitionParts = { readonly clauses: readonly string[]; readonly suffix: string };\n\n/** A source token with balanced-parenthesis depth and original byte boundaries. */\nexport type TableDefinitionToken = {\n readonly value: string;\n readonly kind: \"word\" | \"quoted\" | \"literal\" | \"symbol\";\n readonly start: number;\n readonly end: number;\n readonly depth: number;\n};\n\n/** Scan SQL delimiters without looking inside quoted strings, identifiers or comments. */\nexport function tableDefinitionTokens({ sql, backslashEscapes = false }: {\n readonly sql: string;\n readonly backslashEscapes?: boolean;\n}): readonly TableDefinitionToken[] {\n const tokens: TableDefinitionToken[] = [];\n let depth = 0;\n for (let index = 0; index < sql.length;) {\n const char = sql[index]!;\n if (/\\s/.test(char)) { index++; continue; }\n if ((char === \"-\" && sql[index + 1] === \"-\") || char === \"#\") {\n const end = sql.indexOf(\"\\n\", index + 1);\n index = end < 0 ? sql.length : end + 1;\n continue;\n }\n if (char === \"/\" && sql[index + 1] === \"*\") {\n const end = sql.indexOf(\"*/\", index + 2);\n if (end < 0) throw unavailable();\n index = end + 2;\n continue;\n }\n const start = index;\n if (char === \"'\" || char === '\"' || char === \"`\" || char === \"[\") {\n const close = char === \"[\" ? \"]\" : char;\n let value = \"\";\n let closed = false;\n index++;\n while (index < sql.length) {\n const current = sql[index++]!;\n if (backslashEscapes && current === \"\\\\\" && (char === \"'\" || char === '\"')) {\n if (index >= sql.length) throw unavailable();\n value += sql[index++]!;\n } else if (current === close) {\n if (close !== \"]\" && sql[index] === close) { value += close; index++; }\n else { closed = true; break; }\n } else value += current;\n }\n if (!closed) throw unavailable();\n tokens.push({ value, kind: char === \"'\" ? \"literal\" : \"quoted\", start, end: index, depth });\n continue;\n }\n if (/[\\p{L}\\p{N}_$]/u.test(char)) {\n index++;\n while (index < sql.length && /[\\p{L}\\p{N}_$]/u.test(sql[index]!)) index++;\n tokens.push({ value: sql.slice(start, index), kind: \"word\", start, end: index, depth });\n continue;\n }\n if (char === \")\") {\n depth--;\n if (depth < 0) throw unavailable();\n }\n tokens.push({ value: char, kind: \"symbol\", start, end: ++index, depth });\n if (char === \"(\") depth++;\n }\n if (depth !== 0) throw unavailable();\n return tokens;\n}\n\n/** Extract a CREATE TABLE list with a quote/comment-aware delimiter walk. */\nexport function tableDefinitionParts({ sql, backslashEscapes }: {\n readonly sql: string;\n readonly backslashEscapes?: boolean;\n}): TableDefinitionParts {\n const tokens = tableDefinitionTokens({ sql, backslashEscapes });\n const words = tokens.filter((token) => token.depth === 0);\n if (words[0]?.kind !== \"word\" || words[0].value.toUpperCase() !== \"CREATE\") throw unavailable();\n const tablePosition = /^(TEMP|TEMPORARY)$/i.test(words[1]?.value ?? \"\") ? 2 : 1;\n if (words[tablePosition]?.kind !== \"word\" || words[tablePosition].value.toUpperCase() !== \"TABLE\") throw unavailable();\n const open = words.find((token) => token.kind === \"symbol\" && token.value === \"(\");\n if (open === undefined) throw unavailable();\n const close = words.find((token) => token.start > open.start && token.kind === \"symbol\" && token.value === \")\");\n if (close === undefined) throw unavailable();\n const delimiters = tokens.filter((token) => token.start > open.start && token.start < close.start && token.depth === 1 && token.kind === \"symbol\" && token.value === \",\");\n const clauses: string[] = [];\n let start = open.end;\n for (const delimiter of [...delimiters, close]) {\n const clause = sql.slice(start, delimiter.start).trim();\n if (clause.length === 0) throw unavailable();\n clauses.push(clause);\n start = delimiter.end;\n }\n return { clauses, suffix: sql.slice(close.end) };\n}\n\nfunction unavailable(): VibeError {\n return new VibeError({ code: \"VIBE_MIGRATION\", message: \"Cannot preserve table definition\", meta: { reason: \"table-definition-unavailable\" } });\n}\n\n/** Read column names for SQLite source and MySQL SHOW CREATE using the same lexer. */\nexport function tableColumnClauses({ sql, backslashEscapes, mysql = false }: {\n readonly sql: string;\n readonly backslashEscapes?: boolean;\n readonly mysql?: boolean;\n}): readonly SqliteColumnClause[] {\n const columns: SqliteColumnClause[] = [];\n for (const part of tableDefinitionParts({ sql, backslashEscapes }).clauses) {\n const first = tableDefinitionTokens({ sql: part, backslashEscapes })[0];\n if (first === undefined || first.kind === \"symbol\") throw unavailable();\n if (first.kind === \"word\" && /^(CONSTRAINT|PRIMARY|UNIQUE|CHECK|FOREIGN)$/i.test(first.value)) continue;\n if (mysql && first.kind === \"word\" && /^(KEY|INDEX|FULLTEXT|SPATIAL)$/i.test(first.value)) continue;\n columns.push({ name: first.value, sql: part });\n }\n return columns;\n}\n\n/** Return column clauses without rewriting any SQL inside them. */\nexport function sqliteColumnClauses({ sql }: { readonly sql: string }): readonly SqliteColumnClause[] {\n return tableColumnClauses({ sql });\n}\n",
28
- "import type { IndexKeyOperand } from \"../index-expressions.ts\";\nimport { tableDefinitionTokens } from \"./sqlite-table-definition.ts\";\nimport type { TableDefinitionToken } from \"./sqlite-table-definition.ts\";\n\n/** Exact outer-key slices shared by CREATE INDEX and MySQL table-key clauses. */\nexport function extractIndexKeyList({ sql, open, close, tokens, wrapped = false, removeWrapper = wrapped }: {\n readonly sql: string;\n readonly open: TableDefinitionToken;\n readonly close: TableDefinitionToken;\n readonly tokens: readonly TableDefinitionToken[];\n readonly wrapped?: boolean;\n readonly removeWrapper?: boolean;\n}): readonly IndexKeyOperand[] | undefined {\n const commas = tokens.filter((token) => token.start > open.start && token.start < close.start && token.depth === open.depth + 1 && token.kind === \"symbol\" && token.value === \",\");\n const keys: IndexKeyOperand[] = [];\n let start = open.end;\n for (const delimiter of [...commas, close]) {\n const termTokens = tokens.filter((token) => token.start >= start && token.end <= delimiter.start);\n if (termTokens.length === 0) return undefined;\n const last = termTokens.at(-1)!;\n const sorted = last.depth === open.depth + 1 && last.kind === \"word\" && /^(ASC|DESC)$/i.test(last.value);\n const desc = sorted && /^DESC$/i.test(last.value);\n const bodyTokens = sorted ? termTokens.slice(0, -1) : termTokens;\n const first = bodyTokens[0];\n const end = bodyTokens.at(-1);\n if (first === undefined || end === undefined) return undefined;\n if (bodyTokens.length === 1 && (first.kind === \"word\" || first.kind === \"quoted\")) {\n keys.push({ kind: \"field\", name: first.value, desc });\n } else {\n const top = bodyTokens.filter((token) => token.depth === open.depth + 1);\n // Key-level collation, NULL order and operator classes cannot disappear into scalar SQL.\n if (top.some((token) => token.kind === \"word\" && /^(COLLATE|NULLS)$/i.test(token.value))) return undefined;\n if (first.kind === \"symbol\" && first.value === \"(\" && end.kind === \"symbol\" && end.value === \")\" && end.depth === first.depth) {\n if (top.length !== 2) return undefined;\n const text = sql.slice(removeWrapper ? first.end : start, removeWrapper ? end.start : sorted ? last.start : delimiter.start).trim();\n if (!text) return undefined;\n keys.push({ kind: \"expression\", text, desc });\n } else {\n if (wrapped) return undefined;\n const text = sql.slice(start, sorted ? last.start : delimiter.start).trim();\n if (!text || bodyTokens.some((token) => token.depth === open.depth + 1 && token.kind === \"word\" && /^(ASC|DESC)$/i.test(token.value))) return undefined;\n keys.push({ kind: \"expression\", text, desc });\n }\n }\n start = delimiter.end;\n }\n return keys.length === 0 ? undefined : keys;\n}\n\n/** Parse the CREATE INDEX header without interpreting any scalar expression. */\nexport function extractStandaloneIndexKeys({ definition, index, postgres = false, included }: {\n readonly definition: string;\n readonly index: string;\n readonly postgres?: boolean;\n /** PostgreSQL INCLUDE columns the caller read from the catalog (default none). */\n readonly included?: number;\n}): readonly IndexKeyOperand[] | undefined {\n const tokens = tableDefinitionTokens({ sql: definition });\n const top = tokens.filter((token) => token.depth === 0);\n let position = 0;\n const word = ({ value }: { readonly value: string }): boolean => {\n const token = top[position];\n if (token?.kind !== \"word\" || token.value.toUpperCase() !== value) return false;\n position++;\n return true;\n };\n if (!word({ value: \"CREATE\" })) return undefined;\n word({ value: \"UNIQUE\" });\n if (!word({ value: \"INDEX\" })) return undefined;\n if (word({ value: \"IF\" }) && (!word({ value: \"NOT\" }) || !word({ value: \"EXISTS\" }))) return undefined;\n let name = top[position++];\n if (top[position]?.value === \".\") { position++; name = top[position++]; }\n if (name === undefined || ![\"quoted\", \"word\"].includes(name.kind) || name.value !== index || !word({ value: \"ON\" })) return undefined;\n const table = top[position++];\n if (table === undefined || ![\"quoted\", \"word\"].includes(table.kind)) return undefined;\n if (top[position]?.value === \".\") { position++; if (top[position++] === undefined) return undefined; }\n if (word({ value: \"USING\" })) {\n if (!postgres || !word({ value: \"BTREE\" })) return undefined;\n }\n const open = top[position++];\n const close = top[position++];\n if (open?.kind !== \"symbol\" || open.value !== \"(\" || close?.kind !== \"symbol\" || close.value !== \")\") return undefined;\n // Non-key INCLUDE columns follow the key list. Only a caller that read the same\n // number of included columns from the catalog may have the keys alone.\n let includedCount = 0;\n if (postgres && word({ value: \"INCLUDE\" })) {\n const includeOpen = top[position++];\n const includeClose = top[position++];\n if (includeOpen?.kind !== \"symbol\" || includeOpen.value !== \"(\" || includeClose?.kind !== \"symbol\" || includeClose.value !== \")\") return undefined;\n includedCount = 1 + tokens.filter((token) => token.start > includeOpen.start && token.start < includeClose.start && token.depth === 1 && token.value === \",\").length;\n }\n if (includedCount !== (included ?? 0)) return undefined;\n if (postgres && word({ value: \"NULLS\" }) && (!word({ value: \"NOT\" }) || !word({ value: \"DISTINCT\" }))) return undefined;\n const tail = top[position];\n if (tail !== undefined && !(tail.kind === \"word\" && tail.value.toUpperCase() === \"WHERE\") && !(tail.value === \";\" && position === top.length - 1)) return undefined;\n const keys = extractIndexKeyList({ sql: definition, open, close, tokens, removeWrapper: postgres });\n if (postgres && keys !== undefined) {\n const delimiters = tokens.filter((token) => token.start > open.start && token.start < close.start && token.depth === 1 && token.value === \",\");\n let start = open.end;\n for (const delimiter of [...delimiters, close]) {\n const keyTop = tokens.filter((token) => token.start >= start && token.end <= delimiter.start && token.depth === 1);\n if (keyTop.length > 1 && (keyTop[0]?.kind === \"word\" || keyTop[0]?.kind === \"quoted\") && (keyTop[1]?.kind === \"quoted\" || keyTop[1]?.kind === \"word\" && !/^(ASC|DESC)$/i.test(keyTop[1].value))) return undefined;\n start = delimiter.end;\n }\n // pg_get_indexdef can append an operator class to an otherwise valid key.\n const slices = tokens.filter((token) => token.start >= open.end && token.end <= close.start && token.depth === 1);\n if (slices.some((token, ordinal) => slices[ordinal - 1]?.value === \")\" && (token.kind === \"quoted\" || token.kind === \"word\" && !/^(ASC|DESC)$/i.test(token.value)))) return undefined;\n }\n return keys;\n}\n\n/** SQLite source spelling is the evidence; CAST alone never proves a plain Decimal key. */\nexport function extractSqliteIndexKeys({ definition, index }: {\n readonly definition: string;\n readonly index: string;\n}): readonly IndexKeyOperand[] | undefined {\n return extractStandaloneIndexKeys({ definition, index });\n}\n",
29
- "import { MYSQL_FUNCTIONAL_KEY_LIMITS, mysqlIndexKeyWidth, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { IndexKeyTermIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { IndexExpressionProbeParams, IndexKeyOperand } from \"../index-expressions.ts\";\nimport { renderIndexKeys } from \"../index-expressions.ts\";\nimport type { PredicateModel } from \"../predicate.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { renderMysqlGeneratedColumnProbe } from \"./mysql-generated-columns.ts\";\nimport { tableDefinitionParts, tableDefinitionTokens } from \"./sqlite-table-definition.ts\";\nimport { extractIndexKeyList } from \"./sqlite-index-expressions.ts\";\n\n/** Qualify only expression-bearing keys through schema's shared width rule; never impose new bounds on ordinary indexes. */\nexport function assertMysqlIndexKeyStorage({ model, terms }: {\n readonly dialect: SqlDialect;\n readonly model: PredicateModel;\n readonly terms: readonly IndexKeyTermIR[];\n}): void {\n const width = mysqlIndexKeyWidth({ terms, model });\n if (width.kind === \"refused\") throw unsupportedCapability({ dialect: \"mysql\", feature: width.feature, hint: `${model.name}.${width.field}: use bounded VARCHAR/CHAR, an explicit raw cast with intentional width/collation, or a generated column; no automatic cast is inserted` });\n if (width.kind === \"bytes\" && width.bytes > MYSQL_FUNCTIONAL_KEY_LIMITS.bytes) throw unsupportedCapability({ dialect: \"mysql\", feature: \"mysqlFunctionalKeyWidth\", hint: `The complete key needs up to ${width.bytes} bytes; modern InnoDB admits at most ${MYSQL_FUNCTIONAL_KEY_LIMITS.bytes}. Use narrower declared storage or an explicit reviewed raw key` });\n}\n\n/** Recover SHOW CREATE key interiors, including exact CAST/charset/collation bytes. */\nexport function extractMysqlIndexKeys({ definition, index, backslashEscapes }: {\n readonly definition: string;\n readonly index: string;\n readonly backslashEscapes: boolean;\n}): readonly IndexKeyOperand[] | undefined {\n const matching = tableDefinitionParts({ sql: definition, backslashEscapes }).clauses.flatMap((sql) => {\n const tokens = tableDefinitionTokens({ sql, backslashEscapes });\n const top = tokens.filter((token) => token.depth === 0);\n let position = top[0]?.kind === \"word\" && top[0].value.toUpperCase() === \"UNIQUE\" ? 1 : 0;\n const key = top[position++];\n if (key?.kind !== \"word\" || !/^(KEY|INDEX)$/i.test(key.value)) return [];\n const name = top[position++];\n if (name === undefined || ![\"word\", \"quoted\"].includes(name.kind) || name.value !== index) return [];\n if (top[position]?.kind === \"word\" && top[position]?.value.toUpperCase() === \"USING\") {\n position++;\n if (top[position++]?.value.toUpperCase() !== \"BTREE\") return [{ sql, tokens, open: undefined, close: undefined }];\n }\n const open = top[position++];\n const close = top[position++];\n const tail = top.slice(position);\n const supported = tail.length === 0 || tail.length === 1 && tail[0]?.value.toUpperCase() === \"VISIBLE\" || tail.length === 2 && tail[0]?.value.toUpperCase() === \"USING\" && tail[1]?.value.toUpperCase() === \"BTREE\";\n return [{ sql, tokens, open: supported && open?.value === \"(\" ? open : undefined, close: close?.value === \")\" ? close : undefined }];\n });\n if (matching.length !== 1) return undefined;\n const clause = matching[0]!;\n if (clause.open === undefined || clause.close === undefined) return undefined;\n return extractIndexKeyList({ ...clause, open: clause.open, close: clause.close, wrapped: true });\n}\n\n/** Reuse E's temporary-clone/read/drop operations, extending only CREATE's key replacement seam. */\nexport function renderMysqlIndexExpressionProbe({ ...params }: IndexExpressionProbeParams): readonly RenderedQuery[] {\n const { dialect, probe, operation } = params;\n if (operation === \"context\") return [{ text: \"SELECT VERSION() AS version, @@SESSION.sql_mode AS sqlMode, @@SESSION.character_set_connection AS characterSet, @@SESSION.collation_connection AS collation\", values: [], returning: \"none\" }];\n if (operation === \"clone\") {\n if (params.table === undefined) throw unsupportedCapability({ dialect: \"mysql\", feature: \"indexExpressionProbeSource\" });\n return [renderMysqlGeneratedColumnProbe({ dialect, probe: { operation: \"clone\", probe: probe.table, table: params.table } })];\n }\n if (operation === \"read\" || operation === \"drop\") return [renderMysqlGeneratedColumnProbe({ dialect, probe: { operation, probe: probe.table } })];\n if (params.definition === undefined || params.keys === undefined) throw unsupportedCapability({ dialect: \"mysql\", feature: \"indexExpressionProbeDefinition\" });\n if (params.where !== undefined || params.nullsNotDistinct === true) throw unsupportedCapability({ dialect: \"mysql\", feature: \"partialOrNullsNotDistinctExpressionIndex\" });\n if (params.backslashEscapes === undefined) throw unsupportedCapability({ dialect: \"mysql\", feature: \"indexExpressionProbeSqlMode\", hint: \"Read sqlMode on the pinned session and supply backslashEscapes explicitly\" });\n const parts = tableDefinitionParts({ sql: params.definition, backslashEscapes: params.backslashEscapes });\n const clauses = parts.clauses.filter((sql) => {\n const top = tableDefinitionTokens({ sql, backslashEscapes: params.backslashEscapes }).filter((token) => token.depth === 0);\n const position = top[0]?.kind === \"word\" && /^UNIQUE$/i.test(top[0].value) ? 1 : 0;\n return !(top[position]?.kind === \"word\" && /^(KEY|INDEX)$/i.test(top[position]!.value) && top[position + 1]?.value === probe.index);\n });\n const keys = renderIndexKeys({ dialect, keys: params.keys, unique: params.unique === true });\n clauses.push(`${params.unique ? \"UNIQUE \" : \"\"}KEY ${dialect.quoteIdent({ name: probe.index })} (${keys.join(\", \")})`);\n return [{ text: `CREATE TEMPORARY TABLE ${dialect.quoteIdent({ name: probe.table })} (\\n${clauses.join(\",\\n\")}\\n)${parts.suffix}`, values: [], returning: \"none\" }];\n}\n",
30
- "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { ExtractedGeneratedColumn, GeneratedColumnDeclaration } from \"../generated-columns.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { extractGenerationFromDefinition } from \"./sqlite-generated-columns.ts\";\nimport { tableColumnClauses, tableDefinitionParts } from \"./sqlite-table-definition.ts\";\n\n/** MySQL stored syntax, placed after complete type/charset/collation information. */\nexport function renderMysqlGeneratedColumnClause({ generated }: {\n readonly generated: GeneratedColumnDeclaration;\n}): string {\n return `GENERATED ALWAYS AS (${generated.expression}) STORED`;\n}\n\n/** Temporary CREATE/DROP operations avoid ALTER's implicit-commit boundary. */\nexport type MysqlGeneratedColumnProbe =\n | { readonly operation: \"context\" }\n | { readonly operation: \"clone\"; readonly probe: string; readonly table: QualifiedSqlName }\n | { readonly operation: \"create\"; readonly probe: string; readonly definition: string; readonly column: string; readonly columnDefinition: string; readonly backslashEscapes: boolean; readonly after?: string }\n | { readonly operation: \"read\"; readonly probe: string; readonly table?: QualifiedSqlName }\n | { readonly operation: \"drop\"; readonly probe: string };\n\n/** Render scratch SQL from independently provisioned table definitions; migrate owns cleanup. */\nexport function renderMysqlGeneratedColumnProbe({ dialect, probe }: {\n readonly dialect: SqlDialect;\n readonly probe: MysqlGeneratedColumnProbe;\n}): RenderedQuery {\n if (dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: dialect.name, feature: \"temporaryGeneratedColumnProbe\" });\n if (probe.operation === \"context\") return { text: \"SELECT @@SESSION.sql_mode AS sqlMode\", values: [], returning: \"none\" };\n const q = ({ name }: { readonly name: string }): string => dialect.quoteIdent({ name });\n const name = q({ name: probe.probe });\n let text: string;\n switch (probe.operation) {\n case \"clone\": text = `CREATE TEMPORARY TABLE ${name} LIKE ${q({ name: probe.table.namespace })}.${q({ name: probe.table.name })}`; break;\n case \"read\": text = `SHOW CREATE TABLE ${probe.table === undefined ? name : `${q({ name: probe.table.namespace })}.${q({ name: probe.table.name })}`}`; break;\n case \"drop\": text = `DROP TEMPORARY TABLE ${name}`; break;\n case \"create\": {\n const parts = tableDefinitionParts({ sql: probe.definition, backslashEscapes: probe.backslashEscapes });\n const columns = tableColumnClauses({ sql: probe.definition, backslashEscapes: probe.backslashEscapes, mysql: true });\n const targets = columns.filter((column) => column.name === probe.column);\n if (targets.length > 1) throw unavailable({ column: probe.column });\n const targetDefinition = extractMysqlGeneratedColumn({ definition: `CREATE TABLE ${name} (${probe.columnDefinition})`, column: probe.column, backslashEscapes: probe.backslashEscapes });\n if (targetDefinition?.storage !== \"stored\") throw unavailable({ column: probe.column });\n const clauses = [...parts.clauses];\n if (targets.length === 1) {\n clauses[clauses.indexOf(targets[0]!.sql)] = probe.columnDefinition;\n } else if (probe.after !== undefined) {\n const after = columns.filter((column) => column.name === probe.after);\n if (after.length !== 1) throw unavailable({ column: probe.after });\n clauses.splice(clauses.indexOf(after[0]!.sql) + 1, 0, probe.columnDefinition);\n } else {\n const last = columns.at(-1);\n if (last === undefined) throw unavailable({ column: probe.column });\n clauses.splice(clauses.indexOf(last.sql) + 1, 0, probe.columnDefinition);\n }\n text = `CREATE TEMPORARY TABLE ${name} (\\n${clauses.join(\",\\n\")}\\n)${parts.suffix}`;\n break;\n }\n }\n return { text, values: [], returning: \"none\" };\n}\n\nfunction unavailable({ column }: { readonly column: string }): VibeError {\n return new VibeError({ code: \"VIBE_MIGRATION\", message: `Cannot build temporary generated-column definition for \"${column}\"`, meta: { reason: \"generated-expression-unavailable\", column } });\n}\n\n/** SHOW CREATE's own escaping rules apply; information_schema uses a different spelling channel. */\nexport function extractMysqlGeneratedColumn({ definition, column, backslashEscapes }: {\n readonly definition: string;\n readonly column: string;\n readonly backslashEscapes: boolean;\n}): ExtractedGeneratedColumn | undefined {\n return extractGenerationFromDefinition({ definition, column, backslashEscapes, mysql: true });\n}\n",
31
- "import { VibeError } from \"@vibeorm/schema\";\nimport type { ExtractedGeneratedColumn, GeneratedColumnDeclaration } from \"../generated-columns.ts\";\nimport { tableColumnClauses, tableDefinitionTokens } from \"./sqlite-table-definition.ts\";\n\n/** SQLite stored syntax; adding a stored column still requires the migrate rebuild path. */\nexport function renderSqliteGeneratedColumnClause({ generated }: {\n readonly generated: GeneratedColumnDeclaration;\n}): string {\n return `GENERATED ALWAYS AS (${generated.expression}) STORED`;\n}\n\nfunction unavailable({ column }: { readonly column: string }): VibeError {\n return new VibeError({ code: \"VIBE_MIGRATION\", message: `Cannot inspect generated expression for column \"${column}\"`, meta: { reason: \"generated-expression-unavailable\", column } });\n}\n\n/** Shared source-slice extraction for SQLite source and MySQL SHOW CREATE, not SQL equivalence. */\nexport function extractGenerationFromDefinition({ definition, column, backslashEscapes = false, mysql = false }: {\n readonly definition: string;\n readonly column: string;\n readonly backslashEscapes?: boolean;\n readonly mysql?: boolean;\n}): ExtractedGeneratedColumn | undefined {\n const matches = tableColumnClauses({ sql: definition, backslashEscapes, mysql }).filter((clause) => clause.name === column);\n if (matches.length !== 1) throw unavailable({ column });\n const columnSql = matches[0]!.sql;\n const tokens = tableDefinitionTokens({ sql: columnSql, backslashEscapes }).filter((token) => token.depth === 0);\n const name = tokens[0]!;\n let result: ExtractedGeneratedColumn | undefined;\n for (let index = 1; index < tokens.length; index++) {\n const token = tokens[index]!;\n if (token.kind !== \"word\" || token.value.toUpperCase() !== \"AS\") continue;\n const open = tokens[index + 1];\n const close = tokens[index + 2];\n if (open?.kind !== \"symbol\" || open.value !== \"(\" || close?.kind !== \"symbol\" || close.value !== \")\") throw unavailable({ column });\n if (result !== undefined) throw unavailable({ column });\n const expression = columnSql.slice(open.end, close.start).trim();\n if (expression.length === 0 || expression.includes(\"\\0\")) throw unavailable({ column });\n const preceding = tokens[index - 1];\n const generated = preceding?.kind === \"word\" && preceding.value.toUpperCase() === \"ALWAYS\" ? tokens[index - 2] : preceding;\n const explicit = generated?.kind === \"word\" && generated.value.toUpperCase() === \"GENERATED\";\n if (preceding?.kind === \"word\" && preceding.value.toUpperCase() === \"ALWAYS\" && !explicit) throw unavailable({ column });\n const next = tokens[index + 3];\n const storage = next?.kind === \"word\" && next.value.toUpperCase() === \"STORED\" ? \"stored\" : \"virtual\";\n result = { expression, storage, columnSql, typeSql: columnSql.slice(name.end, explicit ? generated.start : token.start).trim() };\n index += 2;\n }\n if (result === undefined && tokens.some((token, index) => token.kind === \"word\" && token.value.toUpperCase() === \"GENERATED\" && tokens[index + 1]?.kind === \"word\" && tokens[index + 1]?.value.toUpperCase() === \"ALWAYS\")) throw unavailable({ column });\n return result;\n}\n\n/** Recover the exact AS interior; omitted storage means virtual, never inferred stored. */\nexport function extractSqliteGeneratedColumn({ definition, column }: {\n readonly definition: string;\n readonly column: string;\n}): ExtractedGeneratedColumn | undefined {\n return extractGenerationFromDefinition({ definition, column });\n}\n",
27
+ "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { IndexExpressionProbeParams, IndexKeyOperand } from \"../index-expressions.ts\";\nimport { renderIndexKeys } from \"../index-expressions.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { renderPostgresIndexKeys } from \"./postgres-index-keys.ts\";\nimport { extractStandaloneIndexKeys } from \"./sqlite-index-expressions.ts\";\n\n/**\n * CREATE INDEX extraction is conservative; structured catalog rows remain authoritative.\n * @internal\n */\nexport function extractPostgresIndexKeys({ definition, index, included }: {\n readonly definition: string;\n readonly index: string;\n /** INCLUDE columns the caller read from the catalog; an INCLUDE clause of another length is refused. */\n readonly included?: number;\n}): readonly IndexKeyOperand[] | undefined {\n return extractStandaloneIndexKeys({ definition, index, postgres: true, ...(included === undefined ? {} : { included }) });\n}\n\n/**\n * Caller owns a fixed search_path and rollback savepoint; no populated user table is indexed.\n * @internal\n */\nexport function renderPostgresIndexExpressionProbe({ ...params }: IndexExpressionProbeParams): readonly RenderedQuery[] {\n const { dialect, operation, probe } = params;\n if (operation === \"context\") return [{ text: \"SELECT current_setting('server_version') AS version, current_setting('server_version_num') AS version_number, current_setting('search_path') AS search_path\", values: [], returning: \"none\" }];\n const table = dialect.quoteIdent({ name: probe.table });\n if (operation === \"read\") return [renderPostgresIndexKeys({ dialect, table: { namespace: \"pg_temp\", name: probe.table }, expressionMetadata: true })];\n if (operation === \"drop\") return [{ text: `DROP TABLE pg_temp.${table}`, values: [], returning: \"none\" }];\n if (operation === \"clone\") {\n if (params.table === undefined) throw unsupportedCapability({ dialect: \"postgres\", feature: \"indexExpressionProbeSource\" });\n return [{ text: `CREATE TEMP TABLE ${table} (LIKE ${dialect.quoteIdent({ name: params.table.namespace })}.${dialect.quoteIdent({ name: params.table.name })} INCLUDING DEFAULTS INCLUDING GENERATED INCLUDING IDENTITY INCLUDING STORAGE INCLUDING CONSTRAINTS)`, values: [], returning: \"none\" }];\n }\n if (params.keys === undefined) throw unsupportedCapability({ dialect: \"postgres\", feature: \"indexExpressionProbeKeys\" });\n if (params.nullsNotDistinct === true && params.unique !== true) throw unsupportedCapability({ dialect: \"postgres\", feature: \"nonUniqueNullsNotDistinct\" });\n const keys = renderIndexKeys({ dialect, keys: params.keys, unique: params.unique === true });\n return [{ text: `CREATE ${params.unique ? \"UNIQUE \" : \"\"}INDEX ${dialect.quoteIdent({ name: probe.index })} ON pg_temp.${table} (${keys.join(\", \")})${params.nullsNotDistinct ? \" NULLS NOT DISTINCT\" : \"\"}${params.where === undefined ? \"\" : ` WHERE ${params.where}`}`, values: [], returning: \"none\" }];\n}\n",
28
+ "import { VibeError } from \"@vibeorm/schema\";\n\n/** One preserved column clause; expressions are never interpreted or normalized. */\nexport type SqliteColumnClause = { readonly name: string; readonly sql: string };\n/** Exact slices of a database-produced CREATE TABLE's outer definition list. */\nexport type TableDefinitionParts = { readonly clauses: readonly string[]; readonly suffix: string };\n\n/**\n * A source token with balanced-parenthesis depth and original byte boundaries.\n * @internal\n */\nexport type TableDefinitionToken = {\n readonly value: string;\n readonly kind: \"word\" | \"quoted\" | \"literal\" | \"symbol\";\n readonly start: number;\n readonly end: number;\n readonly depth: number;\n};\n\n/**\n * Scan SQL delimiters without looking inside quoted strings, identifiers or comments.\n * @internal\n */\nexport function tableDefinitionTokens({ sql, backslashEscapes = false }: {\n readonly sql: string;\n readonly backslashEscapes?: boolean;\n}): readonly TableDefinitionToken[] {\n const tokens: TableDefinitionToken[] = [];\n let depth = 0;\n for (let index = 0; index < sql.length;) {\n const char = sql[index]!;\n if (/\\s/.test(char)) { index++; continue; }\n if ((char === \"-\" && sql[index + 1] === \"-\") || char === \"#\") {\n const end = sql.indexOf(\"\\n\", index + 1);\n index = end < 0 ? sql.length : end + 1;\n continue;\n }\n if (char === \"/\" && sql[index + 1] === \"*\") {\n const end = sql.indexOf(\"*/\", index + 2);\n if (end < 0) throw unavailable();\n index = end + 2;\n continue;\n }\n const start = index;\n if (char === \"'\" || char === '\"' || char === \"`\" || char === \"[\") {\n const close = char === \"[\" ? \"]\" : char;\n let value = \"\";\n let closed = false;\n index++;\n while (index < sql.length) {\n const current = sql[index++]!;\n if (backslashEscapes && current === \"\\\\\" && (char === \"'\" || char === '\"')) {\n if (index >= sql.length) throw unavailable();\n value += sql[index++]!;\n } else if (current === close) {\n if (close !== \"]\" && sql[index] === close) { value += close; index++; }\n else { closed = true; break; }\n } else value += current;\n }\n if (!closed) throw unavailable();\n tokens.push({ value, kind: char === \"'\" ? \"literal\" : \"quoted\", start, end: index, depth });\n continue;\n }\n if (/[\\p{L}\\p{N}_$]/u.test(char)) {\n index++;\n while (index < sql.length && /[\\p{L}\\p{N}_$]/u.test(sql[index]!)) index++;\n tokens.push({ value: sql.slice(start, index), kind: \"word\", start, end: index, depth });\n continue;\n }\n if (char === \")\") {\n depth--;\n if (depth < 0) throw unavailable();\n }\n tokens.push({ value: char, kind: \"symbol\", start, end: ++index, depth });\n if (char === \"(\") depth++;\n }\n if (depth !== 0) throw unavailable();\n return tokens;\n}\n\n/** Extract a CREATE TABLE list with a quote/comment-aware delimiter walk. */\nexport function tableDefinitionParts({ sql, backslashEscapes }: {\n readonly sql: string;\n readonly backslashEscapes?: boolean;\n}): TableDefinitionParts {\n const tokens = tableDefinitionTokens({ sql, backslashEscapes });\n const words = tokens.filter((token) => token.depth === 0);\n if (words[0]?.kind !== \"word\" || words[0].value.toUpperCase() !== \"CREATE\") throw unavailable();\n const tablePosition = /^(TEMP|TEMPORARY)$/i.test(words[1]?.value ?? \"\") ? 2 : 1;\n if (words[tablePosition]?.kind !== \"word\" || words[tablePosition].value.toUpperCase() !== \"TABLE\") throw unavailable();\n const open = words.find((token) => token.kind === \"symbol\" && token.value === \"(\");\n if (open === undefined) throw unavailable();\n const close = words.find((token) => token.start > open.start && token.kind === \"symbol\" && token.value === \")\");\n if (close === undefined) throw unavailable();\n const delimiters = tokens.filter((token) => token.start > open.start && token.start < close.start && token.depth === 1 && token.kind === \"symbol\" && token.value === \",\");\n const clauses: string[] = [];\n let start = open.end;\n for (const delimiter of [...delimiters, close]) {\n const clause = sql.slice(start, delimiter.start).trim();\n if (clause.length === 0) throw unavailable();\n clauses.push(clause);\n start = delimiter.end;\n }\n return { clauses, suffix: sql.slice(close.end) };\n}\n\nfunction unavailable(): VibeError {\n return new VibeError({ code: \"VIBE_MIGRATION\", message: \"Cannot preserve table definition\", meta: { reason: \"table-definition-unavailable\" } });\n}\n\n/**\n * Read column names for SQLite source and MySQL SHOW CREATE using the same lexer.\n * @internal\n */\nexport function tableColumnClauses({ sql, backslashEscapes, mysql = false }: {\n readonly sql: string;\n readonly backslashEscapes?: boolean;\n readonly mysql?: boolean;\n}): readonly SqliteColumnClause[] {\n const columns: SqliteColumnClause[] = [];\n for (const part of tableDefinitionParts({ sql, backslashEscapes }).clauses) {\n const first = tableDefinitionTokens({ sql: part, backslashEscapes })[0];\n if (first === undefined || first.kind === \"symbol\") throw unavailable();\n if (first.kind === \"word\" && /^(CONSTRAINT|PRIMARY|UNIQUE|CHECK|FOREIGN)$/i.test(first.value)) continue;\n if (mysql && first.kind === \"word\" && /^(KEY|INDEX|FULLTEXT|SPATIAL)$/i.test(first.value)) continue;\n columns.push({ name: first.value, sql: part });\n }\n return columns;\n}\n\n/** Return column clauses without rewriting any SQL inside them. */\nexport function sqliteColumnClauses({ sql }: { readonly sql: string }): readonly SqliteColumnClause[] {\n return tableColumnClauses({ sql });\n}\n",
29
+ "import type { IndexKeyOperand } from \"../index-expressions.ts\";\nimport { tableDefinitionTokens } from \"./sqlite-table-definition.ts\";\nimport type { TableDefinitionToken } from \"./sqlite-table-definition.ts\";\n\n/**\n * Exact outer-key slices shared by CREATE INDEX and MySQL table-key clauses.\n * @internal\n */\nexport function extractIndexKeyList({ sql, open, close, tokens, wrapped = false, removeWrapper = wrapped }: {\n readonly sql: string;\n readonly open: TableDefinitionToken;\n readonly close: TableDefinitionToken;\n readonly tokens: readonly TableDefinitionToken[];\n readonly wrapped?: boolean;\n readonly removeWrapper?: boolean;\n}): readonly IndexKeyOperand[] | undefined {\n const commas = tokens.filter((token) => token.start > open.start && token.start < close.start && token.depth === open.depth + 1 && token.kind === \"symbol\" && token.value === \",\");\n const keys: IndexKeyOperand[] = [];\n let start = open.end;\n for (const delimiter of [...commas, close]) {\n const termTokens = tokens.filter((token) => token.start >= start && token.end <= delimiter.start);\n if (termTokens.length === 0) return undefined;\n const last = termTokens.at(-1)!;\n const sorted = last.depth === open.depth + 1 && last.kind === \"word\" && /^(ASC|DESC)$/i.test(last.value);\n const desc = sorted && /^DESC$/i.test(last.value);\n const bodyTokens = sorted ? termTokens.slice(0, -1) : termTokens;\n const first = bodyTokens[0];\n const end = bodyTokens.at(-1);\n if (first === undefined || end === undefined) return undefined;\n if (bodyTokens.length === 1 && (first.kind === \"word\" || first.kind === \"quoted\")) {\n keys.push({ kind: \"field\", name: first.value, desc });\n } else {\n const top = bodyTokens.filter((token) => token.depth === open.depth + 1);\n // Key-level collation, NULL order and operator classes cannot disappear into scalar SQL.\n if (top.some((token) => token.kind === \"word\" && /^(COLLATE|NULLS)$/i.test(token.value))) return undefined;\n if (first.kind === \"symbol\" && first.value === \"(\" && end.kind === \"symbol\" && end.value === \")\" && end.depth === first.depth) {\n if (top.length !== 2) return undefined;\n const text = sql.slice(removeWrapper ? first.end : start, removeWrapper ? end.start : sorted ? last.start : delimiter.start).trim();\n if (!text) return undefined;\n keys.push({ kind: \"expression\", text, desc });\n } else {\n if (wrapped) return undefined;\n const text = sql.slice(start, sorted ? last.start : delimiter.start).trim();\n if (!text || bodyTokens.some((token) => token.depth === open.depth + 1 && token.kind === \"word\" && /^(ASC|DESC)$/i.test(token.value))) return undefined;\n keys.push({ kind: \"expression\", text, desc });\n }\n }\n start = delimiter.end;\n }\n return keys.length === 0 ? undefined : keys;\n}\n\n/**\n * Parse the CREATE INDEX header without interpreting any scalar expression.\n * @internal\n */\nexport function extractStandaloneIndexKeys({ definition, index, postgres = false, included }: {\n readonly definition: string;\n readonly index: string;\n readonly postgres?: boolean;\n /** PostgreSQL INCLUDE columns the caller read from the catalog (default none). */\n readonly included?: number;\n}): readonly IndexKeyOperand[] | undefined {\n const tokens = tableDefinitionTokens({ sql: definition });\n const top = tokens.filter((token) => token.depth === 0);\n let position = 0;\n const word = ({ value }: { readonly value: string }): boolean => {\n const token = top[position];\n if (token?.kind !== \"word\" || token.value.toUpperCase() !== value) return false;\n position++;\n return true;\n };\n if (!word({ value: \"CREATE\" })) return undefined;\n word({ value: \"UNIQUE\" });\n if (!word({ value: \"INDEX\" })) return undefined;\n if (word({ value: \"IF\" }) && (!word({ value: \"NOT\" }) || !word({ value: \"EXISTS\" }))) return undefined;\n let name = top[position++];\n if (top[position]?.value === \".\") { position++; name = top[position++]; }\n if (name === undefined || ![\"quoted\", \"word\"].includes(name.kind) || name.value !== index || !word({ value: \"ON\" })) return undefined;\n const table = top[position++];\n if (table === undefined || ![\"quoted\", \"word\"].includes(table.kind)) return undefined;\n if (top[position]?.value === \".\") { position++; if (top[position++] === undefined) return undefined; }\n if (word({ value: \"USING\" })) {\n if (!postgres || !word({ value: \"BTREE\" })) return undefined;\n }\n const open = top[position++];\n const close = top[position++];\n if (open?.kind !== \"symbol\" || open.value !== \"(\" || close?.kind !== \"symbol\" || close.value !== \")\") return undefined;\n // Non-key INCLUDE columns follow the key list. Only a caller that read the same\n // number of included columns from the catalog may have the keys alone.\n let includedCount = 0;\n if (postgres && word({ value: \"INCLUDE\" })) {\n const includeOpen = top[position++];\n const includeClose = top[position++];\n if (includeOpen?.kind !== \"symbol\" || includeOpen.value !== \"(\" || includeClose?.kind !== \"symbol\" || includeClose.value !== \")\") return undefined;\n includedCount = 1 + tokens.filter((token) => token.start > includeOpen.start && token.start < includeClose.start && token.depth === 1 && token.value === \",\").length;\n }\n if (includedCount !== (included ?? 0)) return undefined;\n if (postgres && word({ value: \"NULLS\" }) && (!word({ value: \"NOT\" }) || !word({ value: \"DISTINCT\" }))) return undefined;\n const tail = top[position];\n if (tail !== undefined && !(tail.kind === \"word\" && tail.value.toUpperCase() === \"WHERE\") && !(tail.value === \";\" && position === top.length - 1)) return undefined;\n const keys = extractIndexKeyList({ sql: definition, open, close, tokens, removeWrapper: postgres });\n if (postgres && keys !== undefined) {\n const delimiters = tokens.filter((token) => token.start > open.start && token.start < close.start && token.depth === 1 && token.value === \",\");\n let start = open.end;\n for (const delimiter of [...delimiters, close]) {\n const keyTop = tokens.filter((token) => token.start >= start && token.end <= delimiter.start && token.depth === 1);\n if (keyTop.length > 1 && (keyTop[0]?.kind === \"word\" || keyTop[0]?.kind === \"quoted\") && (keyTop[1]?.kind === \"quoted\" || keyTop[1]?.kind === \"word\" && !/^(ASC|DESC)$/i.test(keyTop[1].value))) return undefined;\n start = delimiter.end;\n }\n // pg_get_indexdef can append an operator class to an otherwise valid key.\n const slices = tokens.filter((token) => token.start >= open.end && token.end <= close.start && token.depth === 1);\n if (slices.some((token, ordinal) => slices[ordinal - 1]?.value === \")\" && (token.kind === \"quoted\" || token.kind === \"word\" && !/^(ASC|DESC)$/i.test(token.value)))) return undefined;\n }\n return keys;\n}\n\n/**\n * SQLite source spelling is the evidence; CAST alone never proves a plain Decimal key.\n * @internal\n */\nexport function extractSqliteIndexKeys({ definition, index }: {\n readonly definition: string;\n readonly index: string;\n}): readonly IndexKeyOperand[] | undefined {\n return extractStandaloneIndexKeys({ definition, index });\n}\n",
30
+ "import { MYSQL_FUNCTIONAL_KEY_LIMITS, mysqlIndexKeyWidth, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { IndexKeyTermIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { IndexExpressionProbeParams, IndexKeyOperand } from \"../index-expressions.ts\";\nimport { renderIndexKeys } from \"../index-expressions.ts\";\nimport type { PredicateModel } from \"../predicate.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { renderMysqlGeneratedColumnProbe } from \"./mysql-generated-columns.ts\";\nimport { tableDefinitionParts, tableDefinitionTokens } from \"./sqlite-table-definition.ts\";\nimport { extractIndexKeyList } from \"./sqlite-index-expressions.ts\";\n\n/**\n * Qualify only expression-bearing keys through schema's shared width rule; never impose new bounds on ordinary indexes.\n * @internal\n */\nexport function assertMysqlIndexKeyStorage({ model, terms }: {\n readonly dialect: SqlDialect;\n readonly model: PredicateModel;\n readonly terms: readonly IndexKeyTermIR[];\n}): void {\n const width = mysqlIndexKeyWidth({ terms, model });\n if (width.kind === \"refused\") throw unsupportedCapability({ dialect: \"mysql\", feature: width.feature, hint: `${model.name}.${width.field}: use bounded VARCHAR/CHAR, an explicit raw cast with intentional width/collation, or a generated column; no automatic cast is inserted` });\n if (width.kind === \"bytes\" && width.bytes > MYSQL_FUNCTIONAL_KEY_LIMITS.bytes) throw unsupportedCapability({ dialect: \"mysql\", feature: \"mysqlFunctionalKeyWidth\", hint: `The complete key needs up to ${width.bytes} bytes; modern InnoDB admits at most ${MYSQL_FUNCTIONAL_KEY_LIMITS.bytes}. Use narrower declared storage or an explicit reviewed raw key` });\n}\n\n/**\n * Recover SHOW CREATE key interiors, including exact CAST/charset/collation bytes.\n * @internal\n */\nexport function extractMysqlIndexKeys({ definition, index, backslashEscapes }: {\n readonly definition: string;\n readonly index: string;\n readonly backslashEscapes: boolean;\n}): readonly IndexKeyOperand[] | undefined {\n const matching = tableDefinitionParts({ sql: definition, backslashEscapes }).clauses.flatMap((sql) => {\n const tokens = tableDefinitionTokens({ sql, backslashEscapes });\n const top = tokens.filter((token) => token.depth === 0);\n let position = top[0]?.kind === \"word\" && top[0].value.toUpperCase() === \"UNIQUE\" ? 1 : 0;\n const key = top[position++];\n if (key?.kind !== \"word\" || !/^(KEY|INDEX)$/i.test(key.value)) return [];\n const name = top[position++];\n if (name === undefined || ![\"word\", \"quoted\"].includes(name.kind) || name.value !== index) return [];\n if (top[position]?.kind === \"word\" && top[position]?.value.toUpperCase() === \"USING\") {\n position++;\n if (top[position++]?.value.toUpperCase() !== \"BTREE\") return [{ sql, tokens, open: undefined, close: undefined }];\n }\n const open = top[position++];\n const close = top[position++];\n const tail = top.slice(position);\n const supported = tail.length === 0 || tail.length === 1 && tail[0]?.value.toUpperCase() === \"VISIBLE\" || tail.length === 2 && tail[0]?.value.toUpperCase() === \"USING\" && tail[1]?.value.toUpperCase() === \"BTREE\";\n return [{ sql, tokens, open: supported && open?.value === \"(\" ? open : undefined, close: close?.value === \")\" ? close : undefined }];\n });\n if (matching.length !== 1) return undefined;\n const clause = matching[0]!;\n if (clause.open === undefined || clause.close === undefined) return undefined;\n return extractIndexKeyList({ ...clause, open: clause.open, close: clause.close, wrapped: true });\n}\n\n/**\n * Reuse E's temporary-clone/read/drop operations, extending only CREATE's key replacement seam.\n * @internal\n */\nexport function renderMysqlIndexExpressionProbe({ ...params }: IndexExpressionProbeParams): readonly RenderedQuery[] {\n const { dialect, probe, operation } = params;\n if (operation === \"context\") return [{ text: \"SELECT VERSION() AS version, @@SESSION.sql_mode AS sqlMode, @@SESSION.character_set_connection AS characterSet, @@SESSION.collation_connection AS collation\", values: [], returning: \"none\" }];\n if (operation === \"clone\") {\n if (params.table === undefined) throw unsupportedCapability({ dialect: \"mysql\", feature: \"indexExpressionProbeSource\" });\n return [renderMysqlGeneratedColumnProbe({ dialect, probe: { operation: \"clone\", probe: probe.table, table: params.table } })];\n }\n if (operation === \"read\" || operation === \"drop\") return [renderMysqlGeneratedColumnProbe({ dialect, probe: { operation, probe: probe.table } })];\n if (params.definition === undefined || params.keys === undefined) throw unsupportedCapability({ dialect: \"mysql\", feature: \"indexExpressionProbeDefinition\" });\n if (params.where !== undefined || params.nullsNotDistinct === true) throw unsupportedCapability({ dialect: \"mysql\", feature: \"partialOrNullsNotDistinctExpressionIndex\" });\n if (params.backslashEscapes === undefined) throw unsupportedCapability({ dialect: \"mysql\", feature: \"indexExpressionProbeSqlMode\", hint: \"Read sqlMode on the pinned session and supply backslashEscapes explicitly\" });\n const parts = tableDefinitionParts({ sql: params.definition, backslashEscapes: params.backslashEscapes });\n const clauses = parts.clauses.filter((sql) => {\n const top = tableDefinitionTokens({ sql, backslashEscapes: params.backslashEscapes }).filter((token) => token.depth === 0);\n const position = top[0]?.kind === \"word\" && /^UNIQUE$/i.test(top[0].value) ? 1 : 0;\n return !(top[position]?.kind === \"word\" && /^(KEY|INDEX)$/i.test(top[position]!.value) && top[position + 1]?.value === probe.index);\n });\n const keys = renderIndexKeys({ dialect, keys: params.keys, unique: params.unique === true });\n clauses.push(`${params.unique ? \"UNIQUE \" : \"\"}KEY ${dialect.quoteIdent({ name: probe.index })} (${keys.join(\", \")})`);\n return [{ text: `CREATE TEMPORARY TABLE ${dialect.quoteIdent({ name: probe.table })} (\\n${clauses.join(\",\\n\")}\\n)${parts.suffix}`, values: [], returning: \"none\" }];\n}\n",
31
+ "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { ExtractedGeneratedColumn, GeneratedColumnDeclaration } from \"../generated-columns.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { extractGenerationFromDefinition } from \"./sqlite-generated-columns.ts\";\nimport { tableColumnClauses, tableDefinitionParts } from \"./sqlite-table-definition.ts\";\n\n/**\n * MySQL stored syntax, placed after complete type/charset/collation information.\n * @internal\n */\nexport function renderMysqlGeneratedColumnClause({ generated }: {\n readonly generated: GeneratedColumnDeclaration;\n}): string {\n return `GENERATED ALWAYS AS (${generated.expression}) STORED`;\n}\n\n/** Temporary CREATE/DROP operations avoid ALTER's implicit-commit boundary. */\nexport type MysqlGeneratedColumnProbe =\n | { readonly operation: \"context\" }\n | { readonly operation: \"clone\"; readonly probe: string; readonly table: QualifiedSqlName }\n | { readonly operation: \"create\"; readonly probe: string; readonly definition: string; readonly column: string; readonly columnDefinition: string; readonly backslashEscapes: boolean; readonly after?: string }\n | { readonly operation: \"read\"; readonly probe: string; readonly table?: QualifiedSqlName }\n | { readonly operation: \"drop\"; readonly probe: string };\n\n/** Render scratch SQL from independently provisioned table definitions; migrate owns cleanup. */\nexport function renderMysqlGeneratedColumnProbe({ dialect, probe }: {\n readonly dialect: SqlDialect;\n readonly probe: MysqlGeneratedColumnProbe;\n}): RenderedQuery {\n if (dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: dialect.name, feature: \"temporaryGeneratedColumnProbe\" });\n if (probe.operation === \"context\") return { text: \"SELECT @@SESSION.sql_mode AS sqlMode\", values: [], returning: \"none\" };\n const q = ({ name }: { readonly name: string }): string => dialect.quoteIdent({ name });\n const name = q({ name: probe.probe });\n let text: string;\n switch (probe.operation) {\n case \"clone\": text = `CREATE TEMPORARY TABLE ${name} LIKE ${q({ name: probe.table.namespace })}.${q({ name: probe.table.name })}`; break;\n case \"read\": text = `SHOW CREATE TABLE ${probe.table === undefined ? name : `${q({ name: probe.table.namespace })}.${q({ name: probe.table.name })}`}`; break;\n case \"drop\": text = `DROP TEMPORARY TABLE ${name}`; break;\n case \"create\": {\n const parts = tableDefinitionParts({ sql: probe.definition, backslashEscapes: probe.backslashEscapes });\n const columns = tableColumnClauses({ sql: probe.definition, backslashEscapes: probe.backslashEscapes, mysql: true });\n const targets = columns.filter((column) => column.name === probe.column);\n if (targets.length > 1) throw unavailable({ column: probe.column });\n const targetDefinition = extractMysqlGeneratedColumn({ definition: `CREATE TABLE ${name} (${probe.columnDefinition})`, column: probe.column, backslashEscapes: probe.backslashEscapes });\n if (targetDefinition?.storage !== \"stored\") throw unavailable({ column: probe.column });\n const clauses = [...parts.clauses];\n if (targets.length === 1) {\n clauses[clauses.indexOf(targets[0]!.sql)] = probe.columnDefinition;\n } else if (probe.after !== undefined) {\n const after = columns.filter((column) => column.name === probe.after);\n if (after.length !== 1) throw unavailable({ column: probe.after });\n clauses.splice(clauses.indexOf(after[0]!.sql) + 1, 0, probe.columnDefinition);\n } else {\n const last = columns.at(-1);\n if (last === undefined) throw unavailable({ column: probe.column });\n clauses.splice(clauses.indexOf(last.sql) + 1, 0, probe.columnDefinition);\n }\n text = `CREATE TEMPORARY TABLE ${name} (\\n${clauses.join(\",\\n\")}\\n)${parts.suffix}`;\n break;\n }\n }\n return { text, values: [], returning: \"none\" };\n}\n\nfunction unavailable({ column }: { readonly column: string }): VibeError {\n return new VibeError({ code: \"VIBE_MIGRATION\", message: `Cannot build temporary generated-column definition for \"${column}\"`, meta: { reason: \"generated-expression-unavailable\", column } });\n}\n\n/** SHOW CREATE's own escaping rules apply; information_schema uses a different spelling channel. */\nexport function extractMysqlGeneratedColumn({ definition, column, backslashEscapes }: {\n readonly definition: string;\n readonly column: string;\n readonly backslashEscapes: boolean;\n}): ExtractedGeneratedColumn | undefined {\n return extractGenerationFromDefinition({ definition, column, backslashEscapes, mysql: true });\n}\n",
32
+ "import { VibeError } from \"@vibeorm/schema\";\nimport type { ExtractedGeneratedColumn, GeneratedColumnDeclaration } from \"../generated-columns.ts\";\nimport { tableColumnClauses, tableDefinitionTokens } from \"./sqlite-table-definition.ts\";\n\n/**\n * SQLite stored syntax; adding a stored column still requires the migrate rebuild path.\n * @internal\n */\nexport function renderSqliteGeneratedColumnClause({ generated }: {\n readonly generated: GeneratedColumnDeclaration;\n}): string {\n return `GENERATED ALWAYS AS (${generated.expression}) STORED`;\n}\n\nfunction unavailable({ column }: { readonly column: string }): VibeError {\n return new VibeError({ code: \"VIBE_MIGRATION\", message: `Cannot inspect generated expression for column \"${column}\"`, meta: { reason: \"generated-expression-unavailable\", column } });\n}\n\n/**\n * Shared source-slice extraction for SQLite source and MySQL SHOW CREATE, not SQL equivalence.\n * @internal\n */\nexport function extractGenerationFromDefinition({ definition, column, backslashEscapes = false, mysql = false }: {\n readonly definition: string;\n readonly column: string;\n readonly backslashEscapes?: boolean;\n readonly mysql?: boolean;\n}): ExtractedGeneratedColumn | undefined {\n const matches = tableColumnClauses({ sql: definition, backslashEscapes, mysql }).filter((clause) => clause.name === column);\n if (matches.length !== 1) throw unavailable({ column });\n const columnSql = matches[0]!.sql;\n const tokens = tableDefinitionTokens({ sql: columnSql, backslashEscapes }).filter((token) => token.depth === 0);\n const name = tokens[0]!;\n let result: ExtractedGeneratedColumn | undefined;\n for (let index = 1; index < tokens.length; index++) {\n const token = tokens[index]!;\n if (token.kind !== \"word\" || token.value.toUpperCase() !== \"AS\") continue;\n const open = tokens[index + 1];\n const close = tokens[index + 2];\n if (open?.kind !== \"symbol\" || open.value !== \"(\" || close?.kind !== \"symbol\" || close.value !== \")\") throw unavailable({ column });\n if (result !== undefined) throw unavailable({ column });\n const expression = columnSql.slice(open.end, close.start).trim();\n if (expression.length === 0 || expression.includes(\"\\0\")) throw unavailable({ column });\n const preceding = tokens[index - 1];\n const generated = preceding?.kind === \"word\" && preceding.value.toUpperCase() === \"ALWAYS\" ? tokens[index - 2] : preceding;\n const explicit = generated?.kind === \"word\" && generated.value.toUpperCase() === \"GENERATED\";\n if (preceding?.kind === \"word\" && preceding.value.toUpperCase() === \"ALWAYS\" && !explicit) throw unavailable({ column });\n const next = tokens[index + 3];\n const storage = next?.kind === \"word\" && next.value.toUpperCase() === \"STORED\" ? \"stored\" : \"virtual\";\n result = { expression, storage, columnSql, typeSql: columnSql.slice(name.end, explicit ? generated.start : token.start).trim() };\n index += 2;\n }\n if (result === undefined && tokens.some((token, index) => token.kind === \"word\" && token.value.toUpperCase() === \"GENERATED\" && tokens[index + 1]?.kind === \"word\" && tokens[index + 1]?.value.toUpperCase() === \"ALWAYS\")) throw unavailable({ column });\n return result;\n}\n\n/** Recover the exact AS interior; omitted storage means virtual, never inferred stored. */\nexport function extractSqliteGeneratedColumn({ definition, column }: {\n readonly definition: string;\n readonly column: string;\n}): ExtractedGeneratedColumn | undefined {\n return extractGenerationFromDefinition({ definition, column });\n}\n",
32
33
  "import type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n/** Read-only evidence needed to protect module-owned tables across namespaces. */\nexport type ModuleDependencyOperation =\n | { readonly kind: \"visibility\" }\n | { readonly kind: \"foreignKeys\"; readonly namespace: string; readonly tables: readonly string[] };\n\n/** Inspect both FK endpoints; SQLite cannot create cross-database foreign keys. */\nexport function renderModuleDependencyQuery(params: { dialect: SqlDialect; operation: ModuleDependencyOperation }): RenderedQuery | undefined {\n const { dialect, operation } = params;\n if (operation.kind === \"visibility\") return dialect.name === \"mysql\" ? { text: \"SHOW GRANTS FOR CURRENT_USER\", values: [], returning: \"none\" } : undefined;\n if (dialect.name === \"sqlite\" || operation.tables.length === 0) return undefined;\n const collector = new ParamCollector(dialect);\n const owned = operation.tables.map((table, index) => `SELECT ${collector.add(operation.namespace)}${index === 0 ? \" AS namespace\" : \"\"}, ${collector.add(table)}${index === 0 ? \" AS table_name\" : \"\"}`).join(\" UNION ALL \");\n const pg = dialect.name === \"postgres\";\n // MySQL folds identifiers only when lower_case_table_names says it does. A\n // case-insensitive catalog collation must not hide a distinct case-only peer.\n const nameKey = ({ column }: { column: string }): string => pg ? column : `CAST(IF(@@lower_case_table_names = 0, ${column}, LOWER(${column})) AS BINARY)`;\n const isOwned = ({ namespace, table }: { namespace: string; table: string }): string => `EXISTS (SELECT 1 FROM owned_tables o WHERE ${nameKey({ column: namespace })} = ${nameKey({ column: \"o.namespace\" })} AND ${nameKey({ column: table })} = ${nameKey({ column: \"o.table_name\" })})`;\n const sourceNamespace = pg ? \"sn.nspname\" : \"fk.CONSTRAINT_SCHEMA\";\n const sourceTable = pg ? \"s.relname\" : \"fk.TABLE_NAME\";\n const targetNamespace = pg ? \"tn.nspname\" : \"fk.UNIQUE_CONSTRAINT_SCHEMA\";\n const targetTable = pg ? \"t.relname\" : \"fk.REFERENCED_TABLE_NAME\";\n const from = pg\n ? \"pg_catalog.pg_constraint fk JOIN pg_catalog.pg_class s ON s.oid = fk.conrelid JOIN pg_catalog.pg_namespace sn ON sn.oid = s.relnamespace JOIN pg_catalog.pg_class t ON t.oid = fk.confrelid JOIN pg_catalog.pg_namespace tn ON tn.oid = t.relnamespace WHERE fk.contype = 'f'\"\n : \"information_schema.REFERENTIAL_CONSTRAINTS fk\";\n return {\n text: `WITH owned_tables AS (${owned})\nSELECT * FROM (SELECT ${pg ? \"fk.conname\" : \"fk.CONSTRAINT_NAME\"} AS constraint_name, ${sourceNamespace} AS source_namespace, ${sourceTable} AS source_table, ${targetNamespace} AS target_namespace, ${targetTable} AS target_table, ${isOwned({ namespace: sourceNamespace, table: sourceTable })} AS source_owned, ${isOwned({ namespace: targetNamespace, table: targetTable })} AS target_owned FROM ${from}) dependencies\nWHERE source_owned OR target_owned\nORDER BY source_namespace, source_table, constraint_name`,\n values: collector.values,\n returning: \"none\",\n };\n}\n",
33
34
  "import type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n/**\n * `deptype = 'e'`: the object was created by an extension script and is\n * dropped with the extension. Rules are never members themselves (ALTER\n * EXTENSION ADD has no RULE form); a rule belongs to the extension through\n * its relation.\n */\nconst extensionMember = (classid: string, objid: string): string =>\n `EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = '${classid}'::regclass AND d.objid = ${objid} AND d.deptype = 'e')`;\n\n/**\n * A namespace an installed extension owns: its home (`extnamespace`, which\n * CREATE EXTENSION creates for a non-relocatable extension such as pg_search)\n * or a member, holding nothing but extension members — relations and\n * sequences, routines, and standalone or composite types (a composite's\n * membership is recorded on its pg_type row, never on its pg_class row). Like\n * extension-owned types, routines and relations, it is created and dropped\n * with the extension the inventory already represents; anything a user added\n * to it keeps the gap.\n */\nconst extensionOwnedNamespace = `(EXISTS (SELECT 1 FROM pg_catalog.pg_extension e WHERE e.extnamespace = n.oid) OR ${extensionMember(\"pg_namespace\", \"n.oid\")}) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_class c WHERE c.relnamespace = n.oid AND c.relkind IN ('r', 'p', 'v', 'm', 'f', 'S') AND NOT ${extensionMember(\"pg_class\", \"c.oid\")}) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_proc p WHERE p.pronamespace = n.oid AND NOT ${extensionMember(\"pg_proc\", \"p.oid\")}) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_type t WHERE t.typnamespace = n.oid AND (t.typrelid = 0 AND t.typelem = 0 OR t.typtype = 'c' AND EXISTS (SELECT 1 FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid AND c.relkind = 'c')) AND NOT ${extensionMember(\"pg_type\", \"t.oid\")})`;\n\n/** Identify namespace objects whose definitions the migration inventory cannot yet represent. */\nexport function renderReplayCoverageGaps(params: { dialect: SqlDialect; namespace: string; privateNamespace?: string }): RenderedQuery {\n const { dialect } = params;\n const collector = new ParamCollector(dialect);\n const namespace = collector.add(params.namespace);\n if (dialect.name === \"postgres\") return { text: `SELECT 'type' AS kind, t.typname::text AS name, n.nspname::text AS namespace, NULL::text AS parent FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = ${namespace} AND (t.typtype IN ('b', 'd', 'r', 'm') AND t.typelem = 0 OR t.typtype = 'c' AND EXISTS (SELECT 1 FROM pg_catalog.pg_class c WHERE c.oid = t.typrelid AND c.relkind = 'c')) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_type'::regclass AND d.objid = t.oid AND d.deptype = 'e')\nUNION ALL SELECT 'routine', p.proname::text, n.nspname::text, NULL::text FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = ${namespace} AND p.prokind <> 'f' AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_proc'::regclass AND d.objid = p.oid AND d.deptype = 'e')\nUNION ALL SELECT 'relation-layout', c.relname::text, n.nspname::text, NULL::text FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = ${namespace} AND (c.relkind IN ('p', 'f') OR c.relispartition OR EXISTS (SELECT 1 FROM pg_catalog.pg_inherits i WHERE i.inhrelid = c.oid)) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_class'::regclass AND d.objid = c.oid AND d.deptype = 'e')\nUNION ALL SELECT 'rule', r.rulename::text, n.nspname::text, c.relname::text FROM pg_catalog.pg_rewrite r JOIN pg_catalog.pg_class c ON c.oid = r.ev_class JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = ${namespace} AND r.rulename <> '_RETURN' AND NOT ${extensionMember(\"pg_class\", \"c.oid\")}\nUNION ALL SELECT 'namespace', n.nspname::text, n.nspname::text, NULL::text FROM pg_catalog.pg_namespace n WHERE n.nspname <> ${namespace} AND n.nspname <> 'information_schema' AND n.nspname NOT LIKE 'pg\\\\_%' ESCAPE '\\\\' AND NOT (${extensionOwnedNamespace})${params.privateNamespace === undefined ? \"\" : ` AND n.nspname <> ${collector.add(params.privateNamespace)}`}`, values: collector.values, returning: \"none\" };\n if (dialect.name === \"mysql\") return { text: `SELECT 'procedure' AS kind, ROUTINE_NAME AS name, ROUTINE_SCHEMA AS namespace, NULL AS parent FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = ${namespace} AND ROUTINE_TYPE = 'PROCEDURE'\nUNION ALL SELECT 'event', EVENT_NAME, EVENT_SCHEMA, NULL FROM information_schema.EVENTS WHERE EVENT_SCHEMA = ${collector.add(params.namespace)}\nUNION ALL SELECT DISTINCT 'partition', TABLE_NAME, TABLE_SCHEMA, NULL FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA = ${collector.add(params.namespace)} AND PARTITION_NAME IS NOT NULL`, values: collector.values, returning: \"none\" };\n return { text: `SELECT 'table-options' AS kind, name, schema AS namespace, NULL AS parent FROM pragma_table_list WHERE schema = ${namespace} AND name NOT LIKE 'sqlite\\\\_%' ESCAPE '\\\\' AND (type = 'virtual' OR wr <> 0 OR strict <> 0)`, values: collector.values, returning: \"none\" };\n}\n",
34
35
  "import { assertSqlNamespace, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n/** Private scratch infrastructure; never interpret a name alone as ownership. */\nexport const SHADOW_DATABASE: Readonly<{ schema: string; table: string; lock: number; timeoutSeconds: number }> = Object.freeze({ schema: \"_vibeorm_shadow\", table: \"_vibe_shadow\", lock: 1447645267, timeoutSeconds: 60 });\n\n/** Server provisioning is unavailable on the SQLite dialect. PGlite is validated by provider. */\nexport const SHADOW_CAPABILITIES: Readonly<Record<Dialect, Readonly<{ serverProvisioning: boolean; dedicated: boolean }>>> = Object.freeze({\n postgres: Object.freeze({ serverProvisioning: true, dedicated: true }),\n mysql: Object.freeze({ serverProvisioning: true, dedicated: true }),\n sqlite: Object.freeze({ serverProvisioning: false, dedicated: false }),\n});\n\n/** SQL operations used only after the lifecycle has established ownership. */\nexport type ShadowOperation =\n | { readonly kind: \"createDatabase\" | \"dropDatabase\"; readonly name: string }\n | { readonly kind: \"identity\" | \"markerExists\" | \"markerRead\" | \"markerCreate\" | \"markerColumns\" | \"grants\" | \"inventory\" | \"journal\" }\n | { readonly kind: \"lock\" | \"unlock\"; readonly database: string }\n | { readonly kind: \"markerWrite\"; readonly value: string; readonly insert: boolean }\n | { readonly kind: \"resetPostgres\" }\n /** `ownedNamespaces` must come from a validated dedicated-shadow marker or declared package configuration for db reset, never from discovery. */\n | { readonly kind: \"resetDedicatedPostgres\"; readonly ownedNamespaces: readonly string[] }\n | { readonly kind: \"mysqlForeignKeys\"; readonly enabled: boolean }\n | { readonly kind: \"dropMysqlObject\"; readonly object: \"TABLE\" | \"VIEW\" | \"FUNCTION\" | \"PROCEDURE\" | \"EVENT\"; readonly name: string };\n\n/** Render provisioning and protected-shadow bookkeeping with dialect-owned SQL. */\nexport function renderShadowOperation(params: { dialect: SqlDialect; operation: ShadowOperation }): readonly RenderedQuery[] {\n const { dialect, operation } = params;\n if (!SHADOW_CAPABILITIES[dialect.name].serverProvisioning) throw unsupportedCapability({ dialect: dialect.name, feature: \"shadowDatabaseProvisioning\" });\n const pg = dialect.name === \"postgres\";\n const collector = new ParamCollector(dialect);\n const marker = pg ? `${dialect.quoteIdent({ name: SHADOW_DATABASE.schema })}.${dialect.quoteIdent({ name: SHADOW_DATABASE.table })}` : dialect.quoteIdent({ name: SHADOW_DATABASE.table });\n const result = (text: string): readonly RenderedQuery[] => [{ text, values: collector.values, returning: \"none\" }];\n switch (operation.kind) {\n // template0 is the pristine template: template1 carries whatever an image\n // or an operator installed into it (ParadeDB ships pg_search, postgis and\n // pg_ivm there), and a shadow inheriting an extension would replay a chain\n // that never created it — the generated migration would then omit its\n // CREATE EXTENSION and fail on any server without that pre-install.\n case \"createDatabase\": return result(`CREATE DATABASE ${dialect.quoteIdent({ name: operation.name })}${pg ? \" TEMPLATE template0\" : \"\"}`);\n case \"dropDatabase\": return result(`DROP DATABASE ${dialect.quoteIdent({ name: operation.name })}`);\n case \"identity\": return result(pg\n ? `SELECT current_database()::text AS database, (SELECT oid::text FROM pg_catalog.pg_database WHERE datname = current_database()) AS database_id, current_schema()::text AS namespace`\n : `SELECT DATABASE() AS \\`database\\`, @@lower_case_table_names AS name_folding, @@server_uuid AS server_id`);\n case \"lock\": return result(pg\n ? `SELECT pg_catalog.pg_advisory_lock(${collector.add(SHADOW_DATABASE.lock)})`\n : `SELECT GET_LOCK(${collector.add(`vibeorm_shadow:${operation.database}`)}, ${collector.add(SHADOW_DATABASE.timeoutSeconds)}) AS acquired`);\n case \"unlock\": return result(pg\n ? `SELECT pg_catalog.pg_advisory_unlock(${collector.add(SHADOW_DATABASE.lock)}) AS released`\n : `SELECT RELEASE_LOCK(${collector.add(`vibeorm_shadow:${operation.database}`)}) AS released`);\n case \"markerExists\": return result(pg\n ? `SELECT c.relname AS name FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = ${collector.add(SHADOW_DATABASE.schema)} AND c.relname = ${collector.add(SHADOW_DATABASE.table)}`\n : `SELECT TABLE_NAME AS name FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ${collector.add(SHADOW_DATABASE.table)}`);\n case \"markerRead\": return result(`SELECT payload FROM ${marker}`);\n case \"markerColumns\": return result(`SELECT column_name AS name, data_type AS type, is_nullable AS nullable FROM information_schema.columns AS marker_column WHERE table_schema = ${pg ? collector.add(SHADOW_DATABASE.schema) : \"DATABASE()\"} AND table_name = ${collector.add(SHADOW_DATABASE.table)} AND ${pg\n ? `EXISTS (SELECT 1 FROM pg_catalog.pg_class r JOIN pg_catalog.pg_namespace n ON n.oid = r.relnamespace WHERE n.nspname = marker_column.table_schema AND r.relname = marker_column.table_name AND r.relkind = 'r' AND r.relpersistence = 'p' AND NOT r.relrowsecurity AND NOT r.relforcerowsecurity AND NOT r.relhasrules AND NOT r.relhastriggers AND NOT r.relispartition AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_attrdef a WHERE a.adrelid = r.oid) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_constraint c WHERE c.conrelid = r.oid AND c.contype <> 'n') AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_index i WHERE i.indrelid = r.oid) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_inherits i WHERE i.inhrelid = r.oid OR i.inhparent = r.oid) AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_attribute a WHERE a.attrelid = r.oid AND (a.attisdropped OR a.attidentity <> '' OR a.attgenerated <> '')))`\n : `EXISTS (SELECT 1 FROM information_schema.TABLES t WHERE t.TABLE_SCHEMA = marker_column.table_schema AND t.TABLE_NAME = marker_column.table_name AND t.TABLE_TYPE = 'BASE TABLE' AND t.ENGINE = 'InnoDB') AND NOT EXISTS (SELECT 1 FROM information_schema.COLUMNS c WHERE c.TABLE_SCHEMA = marker_column.table_schema AND c.TABLE_NAME = marker_column.table_name AND (c.COLUMN_DEFAULT IS NOT NULL OR c.EXTRA <> '')) AND NOT EXISTS (SELECT 1 FROM information_schema.TRIGGERS t WHERE t.EVENT_OBJECT_SCHEMA = DATABASE() AND t.EVENT_OBJECT_TABLE = ${collector.add(SHADOW_DATABASE.table)}) AND NOT EXISTS (SELECT 1 FROM information_schema.TABLE_CONSTRAINTS c WHERE c.TABLE_SCHEMA = DATABASE() AND c.TABLE_NAME = ${collector.add(SHADOW_DATABASE.table)})`}\nORDER BY ordinal_position`);\n case \"grants\": {\n if (pg) throw unsupportedCapability({ dialect: dialect.name, feature: \"mysqlShadowPrivileges\" });\n return result(\"SHOW GRANTS FOR CURRENT_USER\");\n }\n case \"markerCreate\": return pg\n ? [{ text: `CREATE SCHEMA ${dialect.quoteIdent({ name: SHADOW_DATABASE.schema })}`, values: [], returning: \"none\" }, { text: `CREATE TABLE ${marker} (payload text NOT NULL)`, values: [], returning: \"none\" }]\n : result(`CREATE TABLE ${marker} (payload LONGTEXT NOT NULL) ENGINE=InnoDB`);\n case \"markerWrite\": return result(operation.insert ? `INSERT INTO ${marker} (payload) VALUES (${collector.add(operation.value)})` : `UPDATE ${marker} SET payload = ${collector.add(operation.value)}`);\n case \"journal\": return result(`SELECT name, checksum, statement_index, error FROM ${dialect.quoteIdent({ name: \"_vibe_migrations\" })} ORDER BY name`);\n case \"inventory\": return result(pg ? `SELECT 'namespace' AS kind, nspname::text AS name, nspname::text AS namespace FROM pg_catalog.pg_namespace WHERE nspname NOT IN ('public', 'information_schema') AND nspname NOT LIKE 'pg\\\\_%' ESCAPE '\\\\'\nUNION ALL SELECT 'relation', c.relname::text, n.nspname::text FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname <> 'information_schema' AND n.nspname NOT LIKE 'pg\\\\_%' ESCAPE '\\\\'\nUNION ALL SELECT 'routine', p.proname::text, n.nspname::text FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname <> 'information_schema' AND n.nspname NOT LIKE 'pg\\\\_%' ESCAPE '\\\\'\nUNION ALL SELECT 'type', t.typname::text, n.nspname::text FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname <> 'information_schema' AND n.nspname NOT LIKE 'pg\\\\_%' ESCAPE '\\\\' AND t.typrelid = 0 AND t.typelem = 0\nUNION ALL SELECT 'extension', e.extname::text, n.nspname::text FROM pg_catalog.pg_extension e JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace WHERE e.extname <> 'plpgsql'\nUNION ALL SELECT 'marker-dependency', d.objid::text, '${SHADOW_DATABASE.schema}' FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_class c ON d.classid = 'pg_class'::regclass AND d.objid = c.oid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = '${SHADOW_DATABASE.schema}' AND d.deptype NOT IN ('i', 'a') AND d.refclassid <> 'pg_namespace'::regclass\nUNION ALL SELECT 'marker-trigger', t.tgname::text, n.nspname::text FROM pg_catalog.pg_trigger t JOIN pg_catalog.pg_class c ON c.oid = t.tgrelid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = '${SHADOW_DATABASE.schema}'\nUNION ALL SELECT 'namespace-object', o.name::text, n.nspname::text FROM pg_catalog.pg_depend d JOIN pg_catalog.pg_namespace n ON d.refclassid = 'pg_namespace'::regclass AND d.refobjid = n.oid CROSS JOIN LATERAL pg_catalog.pg_identify_object(d.classid, d.objid, d.objsubid) o WHERE n.nspname <> 'information_schema' AND n.nspname NOT LIKE 'pg\\\\_%' ESCAPE '\\\\' AND d.classid NOT IN ('pg_class'::regclass, 'pg_proc'::regclass, 'pg_type'::regclass, 'pg_extension'::regclass)\nUNION ALL SELECT 'database-object', evtname::text, '' FROM pg_catalog.pg_event_trigger\nUNION ALL SELECT 'database-object', pubname::text, '' FROM pg_catalog.pg_publication\nUNION ALL SELECT 'database-object', subname::text, '' FROM pg_catalog.pg_subscription WHERE subdbid = (SELECT oid FROM pg_catalog.pg_database WHERE datname = current_database())\nUNION ALL SELECT 'database-object', srvname::text, '' FROM pg_catalog.pg_foreign_server\nUNION ALL SELECT 'database-object', fdwname::text, '' FROM pg_catalog.pg_foreign_data_wrapper\nUNION ALL SELECT 'database-object', c.oid::text, '' FROM pg_catalog.pg_cast c JOIN pg_catalog.pg_type s ON s.oid = c.castsource JOIN pg_catalog.pg_type t ON t.oid = c.casttarget LEFT JOIN pg_catalog.pg_proc p ON p.oid = c.castfunc WHERE s.typnamespace <> 'pg_catalog'::regnamespace OR t.typnamespace <> 'pg_catalog'::regnamespace OR p.pronamespace <> 'pg_catalog'::regnamespace`\n : `SELECT TABLE_TYPE AS kind, TABLE_NAME AS name, TABLE_SCHEMA AS namespace FROM information_schema.TABLES WHERE TABLE_SCHEMA = DATABASE()\nUNION ALL SELECT ROUTINE_TYPE, ROUTINE_NAME, ROUTINE_SCHEMA FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = DATABASE()\nUNION ALL SELECT 'EVENT', EVENT_NAME, EVENT_SCHEMA FROM information_schema.EVENTS WHERE EVENT_SCHEMA = DATABASE()\nUNION ALL SELECT 'TRIGGER', TRIGGER_NAME, TRIGGER_SCHEMA FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = DATABASE()\nUNION ALL SELECT 'EXTERNAL FOREIGN KEY', CONCAT(TABLE_NAME, '.', CONSTRAINT_NAME), CONSTRAINT_SCHEMA FROM information_schema.REFERENTIAL_CONSTRAINTS WHERE UNIQUE_CONSTRAINT_SCHEMA = DATABASE() AND CAST(CONSTRAINT_SCHEMA AS BINARY) <> CAST(DATABASE() AS BINARY)`);\n case \"resetPostgres\":\n case \"resetDedicatedPostgres\": {\n if (!pg) throw unsupportedCapability({ dialect: dialect.name, feature: \"postgresShadowReset\" });\n // A renderer cannot attest provenance, but it still refuses public, system\n // and private names before any SQL exists: the lease schema is never dropped.\n const owned = operation.kind === \"resetDedicatedPostgres\" ? operation.ownedNamespaces : [];\n for (const namespace of owned) assertSqlNamespace({ namespace, dialect: \"postgres\", allowPublic: false });\n return [\n ...owned.map((namespace): RenderedQuery => ({ text: `DROP SCHEMA IF EXISTS ${dialect.quoteIdent({ name: namespace })} CASCADE`, values: [], returning: \"none\" })),\n { text: 'DROP SCHEMA \"public\" CASCADE', values: [], returning: \"none\" },\n { text: 'CREATE SCHEMA \"public\"', values: [], returning: \"none\" },\n ];\n }\n case \"mysqlForeignKeys\": {\n if (pg) throw unsupportedCapability({ dialect: dialect.name, feature: \"mysqlShadowReset\" });\n return result(`SET FOREIGN_KEY_CHECKS = ${operation.enabled ? \"1\" : \"0\"}`);\n }\n case \"dropMysqlObject\": {\n if (pg) throw unsupportedCapability({ dialect: dialect.name, feature: \"mysqlShadowReset\" });\n return result(`DROP ${operation.object} ${dialect.quoteIdent({ name: operation.name })}`);\n }\n }\n}\n",
35
36
  "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n// ─── Automatic shadow markers ─────────────────────────────────────\n\n/**\n * Which dialects can label an automatic shadow database with its creator, so\n * a later run can tell a leaked shadow from one still in use. PostgreSQL\n * stores the label as the database comment; MySQL has no database comment,\n * and SQLite and PGlite shadows never outlive their process.\n */\nexport const SHADOW_MARKER_CAPABILITIES: Readonly<Record<Dialect, Readonly<{ databaseMarker: boolean }>>> = Object.freeze({\n postgres: Object.freeze({ databaseMarker: true }),\n mysql: Object.freeze({ databaseMarker: false }),\n sqlite: Object.freeze({ databaseMarker: false }),\n});\n\n/** Exactly the names automatic shadow provisioning generates. */\nexport const AUTOMATIC_SHADOW_NAME_PATTERN: string = \"^(vibeorm_shadow|vibeorm_test_shadow)_[0-9a-f]{32}$\";\n\n/**\n * The creator of one automatic shadow. `adminPid` and `adminStarted` identify\n * the administration session that created it and holds it for the run's whole\n * life (a backend pid with its start time never repeats); `adminStarted` is\n * null when the server did not show the session's start. Times are server\n * microseconds since the epoch, as decimal text; `host` and `pid` name the\n * creating process for people reading a prune report.\n */\nexport type AutomaticShadowMarker = {\n readonly database: string;\n readonly adminPid: number;\n readonly adminStarted: string | null;\n readonly created: string;\n readonly host: string;\n readonly pid: number;\n};\n\n/** Automatic shadow bookkeeping on the administration connection. */\nexport type AutomaticShadowOperation =\n /** The administration session's pid, its start and the server's clock, before a marker is written. */\n | { readonly kind: \"session\" }\n | { readonly kind: \"mark\"; readonly marker: AutomaticShadowMarker }\n /** Every database with an automatic shadow name: its comment, its connected sessions and the server's clock. */\n | { readonly kind: \"list\" }\n /** Every server session's pid and start. */\n | { readonly kind: \"backends\" };\n\nconst NAME = new RegExp(AUTOMATIC_SHADOW_NAME_PATTERN);\nconst MICROS = /^\\d{1,20}$/;\nconst HOST = /^[A-Za-z0-9._-]{1,253}$/;\nconst MARKER = /^\\{\"vibeorm\":\"automatic-shadow\",\"version\":1,\"database\":\"([a-z0-9_]+)\",\"adminPid\":(\\d{1,10}),\"adminStarted\":(?:\"(\\d{1,20})\"|null),\"created\":\"(\\d{1,20})\",\"host\":\"([A-Za-z0-9._-]{1,253})\",\"pid\":(\\d{1,10})\\}$/;\n\nfunction micros(expression: string): string {\n return `(extract(epoch FROM ${expression}) * 1000000)::bigint::text`;\n}\n\nfunction positiveInteger(value: number): boolean {\n return Number.isSafeInteger(value) && value > 0;\n}\n\n/**\n * The marker text. Every field is validated against a closed character set, so\n * the text is safe inside a string literal whatever `standard_conforming_strings`\n * says (COMMENT accepts no bound parameter).\n */\nexport function automaticShadowMarkerText(params: { marker: AutomaticShadowMarker }): string {\n const { marker } = params;\n if (!NAME.test(marker.database) || !positiveInteger(marker.adminPid) || !positiveInteger(marker.pid) || (marker.adminStarted !== null && !MICROS.test(marker.adminStarted)) || !MICROS.test(marker.created) || !HOST.test(marker.host)) {\n throw new VibeError({ code: \"VIBE_INTERNAL\", message: \"Automatic shadow marker fields are outside their closed format\", meta: { reason: \"shadow-marker-invalid\", database: marker.database } });\n }\n return `{\"vibeorm\":\"automatic-shadow\",\"version\":1,\"database\":\"${marker.database}\",\"adminPid\":${marker.adminPid},\"adminStarted\":${marker.adminStarted === null ? \"null\" : `\"${marker.adminStarted}\"`},\"created\":\"${marker.created}\",\"host\":\"${marker.host}\",\"pid\":${marker.pid}}`;\n}\n\n/** Read a database comment back as a marker; anything but the exact format is no marker. */\nexport function parseAutomaticShadowMarker(params: { text: unknown }): AutomaticShadowMarker | undefined {\n if (typeof params.text !== \"string\") return undefined;\n const match = MARKER.exec(params.text);\n if (match === null) return undefined;\n const marker: AutomaticShadowMarker = { database: match[1]!, adminPid: Number(match[2]), adminStarted: match[3] ?? null, created: match[4]!, host: match[5]!, pid: Number(match[6]) };\n return NAME.test(marker.database) && positiveInteger(marker.adminPid) && positiveInteger(marker.pid) ? marker : undefined;\n}\n\n/** Render marker writes and prune reads; dialects without a database marker refuse. */\nexport function renderAutomaticShadowOperation(params: { dialect: SqlDialect; operation: AutomaticShadowOperation }): RenderedQuery {\n const { dialect, operation } = params;\n if (!SHADOW_MARKER_CAPABILITIES[dialect.name].databaseMarker) throw unsupportedCapability({ dialect: dialect.name, feature: \"automaticShadowMarker\", hint: \"only PostgreSQL labels an automatic shadow database with its creator\" });\n const collector = new ParamCollector(dialect);\n const result = (text: string): RenderedQuery => ({ text, values: collector.values, returning: \"none\" });\n switch (operation.kind) {\n case \"session\": return result(`SELECT pg_catalog.pg_backend_pid() AS pid, (SELECT ${micros(\"a.backend_start\")} FROM pg_catalog.pg_stat_activity a WHERE a.pid = pg_catalog.pg_backend_pid()) AS started, ${micros(\"pg_catalog.statement_timestamp()\")} AS now`);\n case \"mark\": return result(`COMMENT ON DATABASE ${dialect.quoteIdent({ name: operation.marker.database })} IS '${automaticShadowMarkerText({ marker: operation.marker })}'`);\n case \"list\": return result(`SELECT d.datname::text AS name, pg_catalog.shobj_description(d.oid, 'pg_database') AS marker, (SELECT count(*)::int FROM pg_catalog.pg_stat_activity a WHERE a.datid = d.oid) AS sessions, ${micros(\"pg_catalog.statement_timestamp()\")} AS now FROM pg_catalog.pg_database d WHERE d.datname ~ ${collector.add(AUTOMATIC_SHADOW_NAME_PATTERN)} ORDER BY d.datname`);\n case \"backends\": return result(`SELECT a.pid, ${micros(\"a.backend_start\")} AS started FROM pg_catalog.pg_stat_activity a`);\n }\n}\n",
37
+ "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n// ─── Test databases ───────────────────────────────────────────────\n\n/**\n * Which dialects can copy a migrated database on the server. PostgreSQL clones\n * a template database (`CREATE DATABASE … TEMPLATE`). MySQL has no template\n * databases, and its only server-side copy (`CREATE TABLE … LIKE`) leaves the\n * foreign keys behind; SQLite copies files and sends no SQL for it.\n */\nexport const TEST_DATABASE_CAPABILITIES: Readonly<Record<Dialect, Readonly<{ templateDatabases: boolean }>>> = Object.freeze({\n postgres: Object.freeze({ templateDatabases: true }),\n mysql: Object.freeze({ templateDatabases: false }),\n sqlite: Object.freeze({ templateDatabases: false }),\n});\n\n/**\n * A caller's test-database prefix: lower-case, a plain identifier start, and\n * the word `test` in it, so a prefix cannot name an application's databases.\n */\nexport const TEST_DATABASE_PREFIX_PATTERN: RegExp = /^(?=[a-z0-9_]*test)[a-z][a-z0-9_]{2,39}$/;\n\n/** What a test-database name is, by its shape under one prefix. */\nexport type TestDatabaseKind = \"template\" | \"clone\";\n\nconst TEMPLATE_SUFFIX = /^_t_[0-9a-f]{16}$/;\nconst CLONE_SUFFIX = /^_c_([0-9a-z]{1,10})_[0-9a-f]{8}$/;\nconst MARKER = /^vibeorm-test-template:v1:(\\d{1,15})$/;\n\nfunction invalid(params: { message: string; meta: Record<string, unknown> }): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message: params.message, meta: params.meta });\n}\n\n/** `undefined` for a valid prefix, else why it is refused. */\nexport function testDatabasePrefixIssue(params: { prefix: unknown }): string | undefined {\n const { prefix } = params;\n if (typeof prefix !== \"string\" || !TEST_DATABASE_PREFIX_PATTERN.test(prefix)) {\n return \"a test-database prefix is 3-40 characters of [a-z0-9_], starts with a letter and contains \\\"test\\\"\";\n }\n return undefined;\n}\n\n/** The kind of a database name under `prefix`, or `undefined` for every other name. */\nexport function testDatabaseKind(params: { prefix: string; name: string }): TestDatabaseKind | undefined {\n const { prefix, name } = params;\n if (testDatabasePrefixIssue({ prefix }) !== undefined || !name.startsWith(prefix)) return undefined;\n const suffix = name.slice(prefix.length);\n if (TEMPLATE_SUFFIX.test(suffix)) return \"template\";\n if (CLONE_SUFFIX.test(suffix)) return \"clone\";\n return undefined;\n}\n\n/** When a clone was created (ms since the epoch, the creating process's clock), read from its name. */\nexport function testCloneCreatedAt(params: { prefix: string; name: string }): number | undefined {\n if (testDatabaseKind(params) !== \"clone\") return undefined;\n const match = CLONE_SUFFIX.exec(params.name.slice(params.prefix.length));\n const created = match === null ? Number.NaN : Number.parseInt(match[1]!, 36);\n return Number.isSafeInteger(created) ? created : undefined;\n}\n\n/** The template marker's creation time (server milliseconds), or `undefined` for any other comment. */\nexport function parseTestTemplateMarker(params: { text: unknown }): number | undefined {\n if (typeof params.text !== \"string\") return undefined;\n const match = MARKER.exec(params.text);\n const created = match === null ? Number.NaN : Number(match[1]);\n return Number.isSafeInteger(created) ? created : undefined;\n}\n\n/**\n * The one name guard: every statement that names a database renders only for\n * a name of the kit's shape under the caller's prefix, so nothing outside the\n * prefix can be created, altered or dropped.\n */\nfunction guarded(params: { prefix: string; name: string; kind?: TestDatabaseKind }): string {\n const { prefix, name } = params;\n const issue = testDatabasePrefixIssue({ prefix });\n if (issue !== undefined) invalid({ message: issue, meta: { reason: \"test-database-prefix-invalid\" } });\n const kind = typeof name === \"string\" ? testDatabaseKind({ prefix, name }) : undefined;\n if (kind === undefined || (params.kind !== undefined && kind !== params.kind)) {\n invalid({\n message: `Refusing a test-database statement on ${JSON.stringify(String(name).slice(0, 80))}: only ${params.kind ?? \"template or clone\"} names under the prefix \"${prefix}\" are the kit's`,\n meta: { reason: \"test-database-outside-prefix\", prefix, name: String(name).slice(0, 80) },\n });\n }\n return name;\n}\n\n/** Test-database statements on the administration connection. */\nexport type TestDatabaseOperation =\n /**\n * One row whether or not the database exists: its template flag (null when\n * absent), its comment, the sessions connected to it other than this one, and\n * the server clock in milliseconds.\n */\n | { readonly kind: \"state\"; readonly prefix: string; readonly name: string }\n /** An empty database to build a template in. */\n | { readonly kind: \"createTemplate\"; readonly prefix: string; readonly name: string }\n /** The template's creation time (server milliseconds), as its database comment. */\n | { readonly kind: \"markTemplate\"; readonly prefix: string; readonly name: string; readonly created: number }\n /**\n * Set: the build's last step and the ready signal — a template that refuses\n * connections, because one connection to it blocks every clone. Cleared before\n * a template is dropped.\n */\n | { readonly kind: \"flagTemplate\"; readonly prefix: string; readonly name: string; readonly template: boolean }\n | { readonly kind: \"clone\"; readonly prefix: string; readonly name: string; readonly template: string }\n /** `force` (PostgreSQL 13+) ends the sessions still connected; only a clone may be forced. */\n | { readonly kind: \"drop\"; readonly prefix: string; readonly name: string; readonly force?: boolean }\n /** Every database whose name starts with the prefix, its template flag, comment and other sessions, and the server clock. */\n | { readonly kind: \"list\"; readonly prefix: string };\n\n/** Render one test-database statement; dialects without template databases refuse. */\nexport function renderTestDatabaseOperation(params: { dialect: SqlDialect; operation: TestDatabaseOperation }): RenderedQuery {\n const { dialect, operation } = params;\n if (!TEST_DATABASE_CAPABILITIES[dialect.name].templateDatabases) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"testDatabaseTemplates\", hint: \"only PostgreSQL clones a migrated template database; MySQL has none and CREATE TABLE … LIKE drops foreign keys\" });\n }\n const collector = new ParamCollector(dialect);\n const result = (text: string): RenderedQuery => ({ text, values: collector.values, returning: \"none\" });\n const quote = (name: string, kind?: TestDatabaseKind): string => dialect.quoteIdent({ name: guarded({ prefix: operation.prefix, name, ...(kind === undefined ? {} : { kind }) }) });\n const sessions = \"(SELECT count(*)::int FROM pg_catalog.pg_stat_activity a WHERE a.datid = d.oid AND a.pid <> pg_catalog.pg_backend_pid()) AS sessions\";\n const now = \"(extract(epoch FROM pg_catalog.statement_timestamp()) * 1000)::bigint::text AS now\";\n switch (operation.kind) {\n case \"state\": return result(`SELECT d.datistemplate AS is_template, pg_catalog.shobj_description(d.oid, 'pg_database') AS marker, ${sessions}, ${now} FROM (SELECT 1) AS one LEFT JOIN pg_catalog.pg_database d ON d.datname = ${collector.add(guarded({ prefix: operation.prefix, name: operation.name }))}`);\n case \"createTemplate\": return result(`CREATE DATABASE ${quote(operation.name, \"template\")} TEMPLATE template0`);\n case \"markTemplate\": {\n if (!Number.isSafeInteger(operation.created) || operation.created < 0) invalid({ message: \"A test template's creation time must be whole milliseconds\", meta: { reason: \"test-template-marker-invalid\" } });\n return result(`COMMENT ON DATABASE ${quote(operation.name, \"template\")} IS 'vibeorm-test-template:v1:${operation.created}'`);\n }\n case \"flagTemplate\": return result(`ALTER DATABASE ${quote(operation.name, \"template\")} WITH ${operation.template ? \"IS_TEMPLATE true ALLOW_CONNECTIONS false\" : \"IS_TEMPLATE false\"}`);\n case \"clone\": return result(`CREATE DATABASE ${quote(operation.name, \"clone\")} TEMPLATE ${quote(operation.template, \"template\")}`);\n case \"drop\": return result(`DROP DATABASE ${quote(operation.name, operation.force === true ? \"clone\" : undefined)}${operation.force === true ? \" WITH (FORCE)\" : \"\"}`);\n case \"list\": {\n const issue = testDatabasePrefixIssue({ prefix: operation.prefix });\n if (issue !== undefined) invalid({ message: issue, meta: { reason: \"test-database-prefix-invalid\" } });\n return result(`SELECT d.datname::text AS name, d.datistemplate AS is_template, pg_catalog.shobj_description(d.oid, 'pg_database') AS marker, ${sessions}, ${now} FROM pg_catalog.pg_database d WHERE starts_with(d.datname::text, ${collector.add(operation.prefix)}) ORDER BY d.datname`);\n }\n }\n}\n",
36
38
  "import type { SqlDialect } from \"./dialect.ts\";\nimport { ParamCollector } from \"./params.ts\";\n\n/** Optional provenance storage on the existing migration journal. */\nexport const MODULE_JOURNAL_COLUMN: string = \"module_origin\";\n\n/** Journal operations use bound values; only dialects choose SQL spelling. */\nexport function renderModuleJournal(params: {\n dialect: SqlDialect;\n table: string;\n operation:\n | { kind: \"columns\" | \"addColumn\" | \"read\" }\n | { kind: \"insert\"; name: string; checksum: string; index: number; entry: string }\n | { kind: \"complete\"; name: string; entry: string };\n}): { text: string; values: unknown[] } {\n const { dialect, operation } = params;\n const q = (name: string): string => dialect.quoteIdent({ name });\n const table = q(params.table);\n const column = q(MODULE_JOURNAL_COLUMN);\n const collector = new ParamCollector(dialect);\n let text: string;\n switch (operation.kind) {\n case \"columns\":\n text = dialect.name === \"sqlite\" ? `PRAGMA table_info(${table})`\n : `SELECT column_name AS name FROM information_schema.columns WHERE table_schema = ${dialect.name === \"postgres\" ? \"current_schema()\" : \"DATABASE()\"} AND table_name = ${collector.add(params.table)}`;\n break;\n case \"addColumn\":\n text = `ALTER TABLE ${table} ADD COLUMN ${column} ${dialect.name === \"mysql\" ? \"LONGTEXT\" : \"TEXT\"}`;\n break;\n case \"read\": text = `SELECT * FROM ${table} ORDER BY ${q(\"id\")}`; break;\n case \"insert\":\n text = `INSERT INTO ${table} (${[\"name\", \"checksum\", \"statement_index\", MODULE_JOURNAL_COLUMN].map(q).join(\", \")}) VALUES (${collector.addMany([operation.name, operation.checksum, operation.index, operation.entry]).join(\", \")})`;\n break;\n case \"complete\": text = `UPDATE ${table} SET ${column} = ${collector.add(operation.entry)} WHERE ${q(\"name\")} = ${collector.add(operation.name)}`; break;\n }\n return { text, values: collector.values };\n}\n",
37
39
  "/** Same capability objects as schema validation, with no schema → SQL cycle. */\nexport {\n DIALECT_CAPABILITIES,\n POSTGRES_CAPABILITIES,\n SQLITE_CAPABILITIES,\n MYSQL_CAPABILITIES,\n} from \"@vibeorm/schema\";\n",
38
- "/**\n * Identifier hygiene shared by every dialect's `quoteIdent`.\n *\n * Quoting doubles the quote character, which is the whole grammar for every\n * other byte — except NUL: C-string servers stop reading an identifier at the\n * first NUL, so `\"users\\0x\"` would address `users`, and a quoted identifier\n * containing one is not an identifier at all. Refused at render time, the\n * earliest point every path (IR, raw `sql.ident`, extension DDL) shares.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\n\n/** Return `name` unchanged, or throw `VIBE_VALIDATION` when it contains a NUL. */\nexport function assertNoNul(params: { name: string }): string {\n if (params.name.includes(\"\\u0000\")) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: \"an SQL identifier cannot contain a NUL character — the server would stop reading it there and address a different object\",\n meta: { name: params.name.replaceAll(\"\\u0000\", \"\\\\0\") },\n });\n }\n return params.name;\n}\n",
39
- "/**\n * SQLite dialect (bun:sqlite adapter lands in P4).\n *\n * Notes pinned by catalog cases:\n * - OFFSET requires LIMIT → `LIMIT -1 OFFSET n`.\n * - LIKE has no default escape character → explicit ` ESCAPE '\\'` clause.\n * - Case-insensitive matching uses LOWER()/LOWER() (default LIKE is only\n * ASCII-case-insensitive, and we want deterministic semantics).\n */\n\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { SQLITE_CAPABILITIES } from \"../capabilities.ts\";\nimport { assertNoNul } from \"../identifiers.ts\";\n\nexport const sqliteDialect: SqlDialect = {\n name: \"sqlite\",\n capabilities: SQLITE_CAPABILITIES,\n\n inArrayStrategy: \"expand\",\n tupleInStrategy: \"rowValue\",\n keyListStrategy: \"values\",\n keysetSeekStrategy: \"rowValue\",\n keyPageStrategy: \"inLimit\",\n lateralJson: null,\n relationStrategyDefault: \"query\",\n relationFilterStrategy: \"inSelect\",\n // Fix lane Q2 (DB-02/DB-07): measured no gain worth a second shape (3.51 walks the\n // index for either NULL placement; deep OFFSET is an index walk plus rowid lookups).\n deferredJoinPage: null,\n nativeNullsOrder: \"low\",\n nullsUnionPage: false,\n timeOfDayInStrategy: \"in\",\n upsertForm: \"onConflict\",\n // Measured on sqlite 3.51 (notes-B.md): a batch proposing one conflict key\n // twice is applied row by row, so the second row UPDATES the first and the\n // statement reports no error — true even for byte-identical keys, and\n // `changes()` does not reveal the collapse (3 submitted rows, 3 changes,\n // 2 rows stored). Text compares as BINARY unless the column declares a\n // collation, and every scalar lands in TEXT/INTEGER/REAL/BLOB with no\n // scale or precision of its own, so Decimal ('1.0' vs '1.00') and DateTime\n // stay byte-comparable here.\n conflictKeyEquality: {\n foldingScalars: [],\n textIsBinaryByDefault: true,\n // Sqlite ships three collating sequences and only BINARY compares bytes:\n // NOCASE folds ASCII case, and RTRIM is case-SENSITIVE and still equates\n // 'x' with 'x ' (both measured in tests/catalog/conflict-key-equality.test.ts).\n duplicatesInOneStatement: \"lastWriteWins\",\n },\n excludedRowRef: { form: \"keyword\", name: \"excluded\" },\n doNothingForm: \"onConflictDoNothing\",\n insensitiveLike: \"lower\",\n // LIKE is ASCII-case-insensitive here — strict pattern matching rides GLOB\n // (byte-exact; its `*`/`?`/`[` metachars get their own escaping, like.ts).\n strictMatchStrategy: \"glob\",\n greatestForm: \"frame\",\n orderByNullsMode: \"native\",\n offsetRequiresLimit: { limitText: \"-1\" },\n likeEscapeClause: \" ESCAPE '\\\\'\",\n // json_extract covers scalar extraction + LIKE over extracted text; the\n // expressible array subset (N6, board #21) is wired: `$[0]` / `$[#-1]` path\n // elements for array_starts_with/array_ends_with (sqlite ≥3.31; bun:sqlite\n // bundles far newer) and json_each() EXISTS for SCALAR-element\n // array_contains. Deep structural jsonb-style containment (object/array/\n // null members) has no cheap faithful form — the renderer refuses those\n // ELEMENT shapes with VIBE_UNSUPPORTED_CAPABILITY even though the op itself\n // is listed here.\n jsonPathMode: \"sqliteExtract\",\n supportedJsonOps: [\n \"equals\",\n \"exists\",\n \"string_contains\",\n \"string_starts_with\",\n \"string_ends_with\",\n \"array_contains\",\n \"array_starts_with\",\n \"array_ends_with\",\n ],\n // Json transport is already plain text here — no param cast needed.\n jsonParamCast: \"\",\n valueCastTypes: Object.freeze({ String: \"TEXT\", Boolean: \"INTEGER\", Int: \"INTEGER\", BigInt: \"INTEGER\", Float: \"REAL\", Decimal: \"TEXT\", DateTime: \"TEXT\", Json: \"TEXT\", Bytes: \"BLOB\" }),\n lastInsertIdSql: null,\n // No locking-read clause in sqlite: `SELECT … FOR UPDATE` is a syntax error\n // (verified on sqlite 3.51.0). None is needed for the overlays either — a\n // write transaction holds the single writer lock, so a read inside it cannot\n // race another writer.\n rowLockSyntax: null,\n advisoryLockFunctions: null,\n // No per-row DEFAULT keyword in VALUES — heterogeneous createMany rows are\n // grouped by column set into separate statements (M4).\n rowDefaultKeyword: false,\n bulkInsertForm: \"values\",\n emptyInsert: { form: \"defaultValues\", conflictClause: false },\n // WITH accepts only SELECT here — no data-modifying steps.\n statementChain: null,\n paramBudget: 900,\n\n // No boolean type: the Boolean codec stores 0/1 in an INTEGER column, so a\n // DDL literal that must compare against stored values spells it the same way.\n booleanLiteral: { true: \"1\", false: \"0\" },\n\n quoteIdent({ name }) {\n return `\"${assertNoNul({ name }).replaceAll('\"', '\"\"')}\"`;\n },\n // Sqlite has no escape character inside a string literal at all: doubling the\n // quote is the whole grammar, and a backslash is an ordinary byte.\n quoteStringLiteral({ value }) {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n },\n renderEnumOrdinal({ column }) {\n return column;\n },\n renderEnumMinMax({ fn, column }) {\n return `${fn === \"min\" ? \"MIN\" : \"MAX\"}(${column})`;\n },\n placeholder() {\n return \"?\";\n },\n jsonTextProjection({ expression }): string {\n return expression;\n },\n renderDbNow({ offsetSeconds, collector }) {\n // The format string mirrors Date#toISOString() (`%f` = SS.SSS), which is\n // exactly what the DateTime codec stores — lexicographic comparisons\n // against stored text stay correct. The offset rides sqlite's relative\n // modifier syntax (`'300 seconds'` / `'-300 seconds'`).\n if (offsetSeconds === 0) return `strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n return `strftime('%Y-%m-%dT%H:%M:%fZ', 'now', ${collector.add(offsetSeconds)} || ' seconds')`;\n },\n};\n",
40
- "import { sqliteDialect } from \"./sqlite.ts\";\nimport { sqliteColumnClauses } from \"./sqlite-table-definition.ts\";\n\nfunction updateStatements(params: { table: string; ftsTable: string; columns: readonly string[] }): { create: string; definition: string; legacyDefinition: string } {\n const quote = (name: string): string => sqliteDialect.quoteIdent({ name });\n const columns = params.columns.map((column) => quote(column)).join(\", \");\n const oldValues = params.columns.map((column) => `old.${quote(column)}`).join(\", \");\n const newValues = params.columns.map((column) => `new.${quote(column)}`).join(\", \");\n const changes = [\n \"old.rowid IS NOT new.rowid\",\n ...params.columns.map((column) => `old.${quote(column)} COLLATE BINARY IS NOT new.${quote(column)} COLLATE BINARY`),\n ].join(\" OR \");\n const target = `${quote(`${params.ftsTable}_au`)} AFTER UPDATE ON ${quote(params.table)}`;\n const body = `BEGIN\\n INSERT INTO ${quote(params.ftsTable)}(${quote(params.ftsTable)}, rowid, ${columns}) VALUES ('delete', old.rowid, ${oldValues});\\n INSERT INTO ${quote(params.ftsTable)}(rowid, ${columns}) VALUES (new.rowid, ${newValues});\\nEND`;\n const tail = `${target} WHEN (${changes}) ${body}`;\n return {\n create: `CREATE TRIGGER IF NOT EXISTS ${tail};`,\n definition: `CREATE TRIGGER ${tail}`,\n legacyDefinition: `CREATE TRIGGER ${target} ${body}`,\n };\n}\n\n/** @internal SQLite FTS synchronization SQL and its independently verifiable catalog spelling. */\nexport function renderSqliteFtsUpdateTrigger(params: {\n table: string;\n ftsTable: string;\n columns: readonly string[];\n}): { readonly create: string; readonly definition: string } {\n const { create, definition } = updateStatements(params);\n return { create, definition };\n}\n\n/** @internal Recognize only complete generated legacy/current triggers and their external-content FTS5 table. */\nexport function sqliteFtsUpdateUpgrade(params: {\n create: string;\n installed: string;\n table: string;\n name: string;\n tableDefinition?: string;\n}): undefined | { readonly kind: \"tableRequired\"; readonly ftsTable: string } | {\n readonly kind: \"recognized\";\n readonly ftsTable: string;\n readonly legacyDefinition: string;\n readonly currentDefinition: string;\n readonly drop: string;\n readonly installed: \"legacy\" | \"current\";\n} {\n const quoted = '\"(?:[^\"]|\"\")+\"';\n // This only extracts candidates. Complete reconstruction equality below is\n // mandatory, so SQL text inside a quoted identifier cannot authorize a match.\n const body = new RegExp(`BEGIN\\\\n INSERT INTO (${quoted})\\\\((${quoted}), rowid, (${quoted}(?:, ${quoted})*)\\\\) VALUES \\\\('delete', old\\\\.rowid, `, \"g\");\n for (const match of params.create.matchAll(body)) {\n const ftsTable = sqliteColumnClauses({ sql: `CREATE TABLE x (${match[1]})` })[0]!.name;\n const columns = sqliteColumnClauses({ sql: `CREATE TABLE x (${match[3]})` }).map((column) => column.name);\n if (params.name !== `${ftsTable}_au`) continue;\n const statements = updateStatements({ table: params.table, ftsTable, columns });\n if (params.create !== statements.create) continue;\n const installed = params.installed === statements.legacyDefinition ? \"legacy\"\n : params.installed === statements.definition ? \"current\" : undefined;\n if (installed === undefined) continue;\n if (params.tableDefinition === undefined) return { kind: \"tableRequired\", ftsTable };\n const tableTail = `${sqliteDialect.quoteIdent({ name: ftsTable })} USING fts5(${columns.map((name) => sqliteDialect.quoteIdent({ name })).join(\", \")}, content=${sqliteDialect.quoteStringLiteral({ value: params.table })})`;\n if (params.tableDefinition !== `CREATE VIRTUAL TABLE ${tableTail}` && params.tableDefinition !== `CREATE VIRTUAL TABLE IF NOT EXISTS ${tableTail};`) continue;\n return { kind: \"recognized\", ftsTable, legacyDefinition: statements.legacyDefinition, currentDefinition: statements.definition, drop: `DROP TRIGGER IF EXISTS ${sqliteDialect.quoteIdent({ name: `${ftsTable}_au` })};`, installed };\n }\n return undefined;\n}\n",
40
+ "/**\n * Identifier hygiene shared by every dialect's `quoteIdent`.\n *\n * Quoting doubles the quote character, which is the whole grammar for every\n * other byte — except NUL: C-string servers stop reading an identifier at the\n * first NUL, so `\"users\\0x\"` would address `users`, and a quoted identifier\n * containing one is not an identifier at all. Refused at render time, the\n * earliest point every path (IR, raw `sql.ident`, extension DDL) shares.\n */\n\nimport { VibeError } from \"@vibeorm/schema\";\n\n/**\n * Return `name` unchanged, or throw `VIBE_VALIDATION` when it contains a NUL.\n * @internal\n */\nexport function assertNoNul(params: { name: string }): string {\n if (params.name.includes(\"\\u0000\")) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: \"an SQL identifier cannot contain a NUL character — the server would stop reading it there and address a different object\",\n meta: { name: params.name.replaceAll(\"\\u0000\", \"\\\\0\") },\n });\n }\n return params.name;\n}\n",
41
+ "/**\n * SQLite dialect (bun:sqlite adapter lands in P4).\n *\n * Notes pinned by catalog cases:\n * - OFFSET requires LIMIT → `LIMIT -1 OFFSET n`.\n * - LIKE has no default escape character → explicit ` ESCAPE '\\'` clause.\n * - Case-insensitive matching uses LOWER()/LOWER() (default LIKE is only\n * ASCII-case-insensitive, and we want deterministic semantics).\n */\n\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { SQLITE_CAPABILITIES } from \"../capabilities.ts\";\nimport { assertNoNul } from \"../identifiers.ts\";\n\nexport const sqliteDialect: SqlDialect = {\n name: \"sqlite\",\n capabilities: SQLITE_CAPABILITIES,\n\n inArrayStrategy: \"expand\",\n tupleInStrategy: \"rowValue\",\n keyListStrategy: \"values\",\n keysetSeekStrategy: \"rowValue\",\n keyPageStrategy: \"inLimit\",\n lateralJson: null,\n relationStrategyDefault: \"query\",\n relationFilterStrategy: \"inSelect\",\n // Fix lane Q2 (DB-02/DB-07): measured no gain worth a second shape (3.51 walks the\n // index for either NULL placement; deep OFFSET is an index walk plus rowid lookups).\n deferredJoinPage: null,\n nativeNullsOrder: \"low\",\n nullsUnionPage: false,\n timeOfDayInStrategy: \"in\",\n upsertForm: \"onConflict\",\n // Measured on sqlite 3.51 (notes-B.md): a batch proposing one conflict key\n // twice is applied row by row, so the second row UPDATES the first and the\n // statement reports no error — true even for byte-identical keys, and\n // `changes()` does not reveal the collapse (3 submitted rows, 3 changes,\n // 2 rows stored). Text compares as BINARY unless the column declares a\n // collation, and every scalar lands in TEXT/INTEGER/REAL/BLOB with no\n // scale or precision of its own, so Decimal ('1.0' vs '1.00') and DateTime\n // stay byte-comparable here.\n conflictKeyEquality: {\n foldingScalars: [],\n textIsBinaryByDefault: true,\n // Sqlite ships three collating sequences and only BINARY compares bytes:\n // NOCASE folds ASCII case, and RTRIM is case-SENSITIVE and still equates\n // 'x' with 'x ' (both measured in tests/catalog/conflict-key-equality.test.ts).\n duplicatesInOneStatement: \"lastWriteWins\",\n },\n excludedRowRef: { form: \"keyword\", name: \"excluded\" },\n doNothingForm: \"onConflictDoNothing\",\n insensitiveLike: \"lower\",\n // LIKE is ASCII-case-insensitive here — strict pattern matching rides GLOB\n // (byte-exact; its `*`/`?`/`[` metachars get their own escaping, like.ts).\n strictMatchStrategy: \"glob\",\n greatestForm: \"frame\",\n orderByNullsMode: \"native\",\n offsetRequiresLimit: { limitText: \"-1\" },\n likeEscapeClause: \" ESCAPE '\\\\'\",\n // json_extract covers scalar extraction + LIKE over extracted text; the\n // expressible array subset (N6, board #21) is wired: `$[0]` / `$[#-1]` path\n // elements for array_starts_with/array_ends_with (sqlite ≥3.31; bun:sqlite\n // bundles far newer) and json_each() EXISTS for SCALAR-element\n // array_contains. Deep structural jsonb-style containment (object/array/\n // null members) has no cheap faithful form — the renderer refuses those\n // ELEMENT shapes with VIBE_UNSUPPORTED_CAPABILITY even though the op itself\n // is listed here.\n jsonPathMode: \"sqliteExtract\",\n supportedJsonOps: [\n \"equals\",\n \"exists\",\n \"string_contains\",\n \"string_starts_with\",\n \"string_ends_with\",\n \"array_contains\",\n \"array_starts_with\",\n \"array_ends_with\",\n ],\n // Json transport is already plain text here — no param cast needed.\n jsonParamCast: \"\",\n valueCastTypes: Object.freeze({ String: \"TEXT\", Boolean: \"INTEGER\", Int: \"INTEGER\", BigInt: \"INTEGER\", Float: \"REAL\", Decimal: \"TEXT\", DateTime: \"TEXT\", Json: \"TEXT\", Bytes: \"BLOB\" }),\n lastInsertIdSql: null,\n // No locking-read clause in sqlite: `SELECT … FOR UPDATE` is a syntax error\n // (verified on sqlite 3.51.0). None is needed for the overlays either — a\n // write transaction holds the single writer lock, so a read inside it cannot\n // race another writer.\n rowLockSyntax: null,\n advisoryLockFunctions: null,\n // No per-row DEFAULT keyword in VALUES — heterogeneous createMany rows are\n // grouped by column set into separate statements (M4).\n rowDefaultKeyword: false,\n bulkInsertForm: \"values\",\n emptyInsert: { form: \"defaultValues\", conflictClause: false },\n // WITH accepts only SELECT here — no data-modifying steps.\n statementChain: null,\n paramBudget: 900,\n\n // No boolean type: the Boolean codec stores 0/1 in an INTEGER column, so a\n // DDL literal that must compare against stored values spells it the same way.\n booleanLiteral: { true: \"1\", false: \"0\" },\n\n quoteIdent({ name }) {\n return `\"${assertNoNul({ name }).replaceAll('\"', '\"\"')}\"`;\n },\n // Sqlite has no escape character inside a string literal at all: doubling the\n // quote is the whole grammar, and a backslash is an ordinary byte.\n quoteStringLiteral({ value }) {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n },\n renderEnumOrdinal({ column }) {\n return column;\n },\n renderEnumMinMax({ fn, column }) {\n return `${fn === \"min\" ? \"MIN\" : \"MAX\"}(${column})`;\n },\n placeholder() {\n return \"?\";\n },\n jsonTextProjection({ expression }): string {\n return expression;\n },\n renderDbNow({ offsetSeconds, collector }) {\n // The format string mirrors Date#toISOString() (`%f` = SS.SSS), which is\n // exactly what the DateTime codec stores — lexicographic comparisons\n // against stored text stay correct. The offset rides sqlite's relative\n // modifier syntax (`'300 seconds'` / `'-300 seconds'`).\n if (offsetSeconds === 0) return `strftime('%Y-%m-%dT%H:%M:%fZ', 'now')`;\n return `strftime('%Y-%m-%dT%H:%M:%fZ', 'now', ${collector.add(offsetSeconds)} || ' seconds')`;\n },\n renderRowsDiffer({ left, right }) {\n const row = (items: readonly string[]): string => (items.length === 1 ? (items[0] as string) : `(${items.join(\", \")})`);\n return `${row(left)} IS NOT ${row(right)}`;\n },\n};\n",
42
+ "import { sqliteDialect } from \"./sqlite.ts\";\nimport { sqliteColumnClauses } from \"./sqlite-table-definition.ts\";\n\nfunction updateStatements(params: { table: string; ftsTable: string; columns: readonly string[] }): { create: string; definition: string; legacyDefinition: string } {\n const quote = (name: string): string => sqliteDialect.quoteIdent({ name });\n const columns = params.columns.map((column) => quote(column)).join(\", \");\n const oldValues = params.columns.map((column) => `old.${quote(column)}`).join(\", \");\n const newValues = params.columns.map((column) => `new.${quote(column)}`).join(\", \");\n const changes = [\n \"old.rowid IS NOT new.rowid\",\n ...params.columns.map((column) => `old.${quote(column)} COLLATE BINARY IS NOT new.${quote(column)} COLLATE BINARY`),\n ].join(\" OR \");\n const target = `${quote(`${params.ftsTable}_au`)} AFTER UPDATE ON ${quote(params.table)}`;\n const body = `BEGIN\\n INSERT INTO ${quote(params.ftsTable)}(${quote(params.ftsTable)}, rowid, ${columns}) VALUES ('delete', old.rowid, ${oldValues});\\n INSERT INTO ${quote(params.ftsTable)}(rowid, ${columns}) VALUES (new.rowid, ${newValues});\\nEND`;\n const tail = `${target} WHEN (${changes}) ${body}`;\n return {\n create: `CREATE TRIGGER IF NOT EXISTS ${tail};`,\n definition: `CREATE TRIGGER ${tail}`,\n legacyDefinition: `CREATE TRIGGER ${target} ${body}`,\n };\n}\n\n/** SQLite FTS synchronization SQL and its independently verifiable catalog spelling. */\nexport function renderSqliteFtsUpdateTrigger(params: {\n table: string;\n ftsTable: string;\n columns: readonly string[];\n}): { readonly create: string; readonly definition: string } {\n const { create, definition } = updateStatements(params);\n return { create, definition };\n}\n\n/** Recognize only complete generated legacy/current triggers and their external-content FTS5 table. */\nexport function sqliteFtsUpdateUpgrade(params: {\n create: string;\n installed: string;\n table: string;\n name: string;\n tableDefinition?: string;\n}): undefined | { readonly kind: \"tableRequired\"; readonly ftsTable: string } | {\n readonly kind: \"recognized\";\n readonly ftsTable: string;\n readonly legacyDefinition: string;\n readonly currentDefinition: string;\n readonly drop: string;\n readonly installed: \"legacy\" | \"current\";\n} {\n const quoted = '\"(?:[^\"]|\"\")+\"';\n // This only extracts candidates. Complete reconstruction equality below is\n // mandatory, so SQL text inside a quoted identifier cannot authorize a match.\n const body = new RegExp(`BEGIN\\\\n INSERT INTO (${quoted})\\\\((${quoted}), rowid, (${quoted}(?:, ${quoted})*)\\\\) VALUES \\\\('delete', old\\\\.rowid, `, \"g\");\n for (const match of params.create.matchAll(body)) {\n const ftsTable = sqliteColumnClauses({ sql: `CREATE TABLE x (${match[1]})` })[0]!.name;\n const columns = sqliteColumnClauses({ sql: `CREATE TABLE x (${match[3]})` }).map((column) => column.name);\n if (params.name !== `${ftsTable}_au`) continue;\n const statements = updateStatements({ table: params.table, ftsTable, columns });\n if (params.create !== statements.create) continue;\n const installed = params.installed === statements.legacyDefinition ? \"legacy\"\n : params.installed === statements.definition ? \"current\" : undefined;\n if (installed === undefined) continue;\n if (params.tableDefinition === undefined) return { kind: \"tableRequired\", ftsTable };\n const tableTail = `${sqliteDialect.quoteIdent({ name: ftsTable })} USING fts5(${columns.map((name) => sqliteDialect.quoteIdent({ name })).join(\", \")}, content=${sqliteDialect.quoteStringLiteral({ value: params.table })})`;\n if (params.tableDefinition !== `CREATE VIRTUAL TABLE ${tableTail}` && params.tableDefinition !== `CREATE VIRTUAL TABLE IF NOT EXISTS ${tableTail};`) continue;\n return { kind: \"recognized\", ftsTable, legacyDefinition: statements.legacyDefinition, currentDefinition: statements.definition, drop: `DROP TRIGGER IF EXISTS ${sqliteDialect.quoteIdent({ name: `${ftsTable}_au` })};`, installed };\n }\n return undefined;\n}\n",
41
43
  "/** SQLite session-control text shared by both native adapters. */\nexport const SQLITE_SESSION_SQL: Readonly<{\n lockingMode: string;\n exclusive: string;\n normal: string;\n acquire: string;\n commit: string;\n rollback: string;\n touch: string;\n foreignKeysOn: string;\n}> = Object.freeze({\n lockingMode: \"PRAGMA main.locking_mode\",\n exclusive: \"PRAGMA main.locking_mode = EXCLUSIVE\",\n normal: \"PRAGMA main.locking_mode = NORMAL\",\n acquire: \"BEGIN EXCLUSIVE\",\n commit: \"COMMIT\",\n rollback: \"ROLLBACK\",\n touch: \"SELECT name FROM main.sqlite_schema LIMIT 1\",\n foreignKeysOn: \"PRAGMA foreign_keys = ON\",\n});\n",
42
- "import { VibeError } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { snapshotSqlValue } from \"./parameter-snapshot.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport { registerSqlHandleCheck } from \"./sql-handles.ts\";\nimport { isSqlBindingCollector, recordSqlBinding, recordSqlBindingCheck, sqlParameterTransport } from \"./sql-bindings.ts\";\nimport { resultScalarContract } from \"./result-decoder.ts\";\nimport type { ResultDecoder } from \"./result-decoder.ts\";\n\ndeclare const fragmentBrand: unique symbol;\n/** Opaque executable SQL, constructed by sql, never by casting an object. */\nexport type SqlFragment = { readonly [fragmentBrand]: true };\n\ntype Part =\n | string\n | { readonly value: unknown; readonly decoder?: ResultDecoder<unknown> }\n | { readonly ident: readonly string[] }\n | { readonly row: \"existing\" | \"incoming\"; readonly column: string }\n | { readonly greatest: readonly SqlFragment[] };\nconst fragments = new WeakMap<object, readonly Part[]>();\nregisterSqlHandleCheck({ check: (value) => fragments.has(value) });\n\nfunction invalid(message: string): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message });\n}\n\nfunction construct(parts: readonly Part[]): SqlFragment {\n const snapshot = Object.freeze([...parts]);\n const fragment = Object.freeze(Object.defineProperty(Object.create(null), \"toJSON\", {\n value: (): { parts: readonly Part[] } => ({ parts: snapshot }),\n })) as SqlFragment;\n fragments.set(fragment, snapshot);\n return fragment;\n}\n\n/** Runtime authenticity check; structural copies are not executable. */\nexport function isSqlFragment(value: unknown): value is SqlFragment {\n return typeof value === \"object\" && value !== null && fragments.has(value);\n}\n\nfunction partsOf(value: SqlFragment): readonly Part[] {\n return fragments.get(value) ?? invalid(\"Expected a constructed SQL fragment\");\n}\n\n/** Whether a fragment holds a greatest node (template interpolation flattens parts). */\nfunction containsGreatest(fragment: SqlFragment): boolean {\n return partsOf(fragment).some((part) => typeof part !== \"string\" && \"greatest\" in part);\n}\n\nfunction identifier(parts: readonly string[]): void {\n if (!Array.isArray(parts) || parts.length === 0 || parts.some((part) => typeof part !== \"string\" || part.length === 0 || part.includes(\"\\0\"))) {\n invalid(\"SQL identifiers require non-empty, NUL-free name components\");\n }\n}\n\n/** The public composition helpers. text is trusted SQL; interpolated strings are values. */\nexport type SqlTag = {\n (strings: TemplateStringsArray, ...values: readonly unknown[]): SqlFragment;\n readonly text: (params: { text: string }) => SqlFragment;\n readonly ident: (params: { parts: readonly string[] }) => SqlFragment;\n readonly value: <T>(params: { value: NoInfer<T>; decoder?: ResultDecoder<T> }) => SqlFragment;\n readonly join: (params: { items: readonly unknown[]; separator?: SqlFragment }) => SqlFragment;\n readonly existing: (params: { column: string }) => SqlFragment;\n readonly incoming: (params: { column: string }) => SqlFragment;\n /** Portable scalar maximum, with NULL ignored (all NULL produces NULL). */\n readonly greatest: (params: { values: readonly [SqlFragment, SqlFragment] }) => SqlFragment;\n};\n\nfunction template(strings: TemplateStringsArray, ...values: readonly unknown[]): SqlFragment {\n if (!Array.isArray(strings) || !Array.isArray(strings.raw) || strings.length !== values.length + 1 || strings.some((text) => typeof text !== \"string\")) {\n invalid(\"Use sql as a template tag\");\n }\n const parts: Part[] = [];\n for (let index = 0; index < strings.length; index++) {\n parts.push(strings[index]!);\n if (index < values.length) {\n const value = values[index];\n if (isSqlFragment(value)) parts.push(...partsOf(value));\n else parts.push(Object.freeze({ value: snapshotSqlValue(value) }));\n }\n }\n return construct(parts);\n}\n\n/** Compose SQL without parameter-offset arithmetic. */\nexport const sql: SqlTag = Object.freeze(Object.assign(template, {\n text: ({ text }: { text: string }): SqlFragment => {\n if (typeof text !== \"string\" || text.includes(\"\\0\")) invalid(\"SQL text must be a NUL-free string\");\n return construct([text]);\n },\n ident: ({ parts }: { parts: readonly string[] }): SqlFragment => {\n identifier(parts);\n return construct([Object.freeze({ ident: Object.freeze([...parts]) })]);\n },\n value: <T>({ value, decoder }: { value: NoInfer<T>; decoder?: ResultDecoder<T> }): SqlFragment =>\n construct([Object.freeze({ value: snapshotSqlValue(value), ...(decoder === undefined ? {} : { decoder }) })]),\n join: ({ items, separator }: { items: readonly unknown[]; separator?: SqlFragment }): SqlFragment => {\n if (!Array.isArray(items)) invalid(\"sql.join requires an array\");\n const between = separator === undefined ? [\", \"] : partsOf(separator);\n const parts: Part[] = [];\n items.forEach((value, index) => {\n if (index > 0) parts.push(...between);\n parts.push(...(isSqlFragment(value) ? partsOf(value) : [Object.freeze({ value: snapshotSqlValue(value) })]));\n });\n return construct(parts);\n },\n existing: ({ column }: { column: string }): SqlFragment => {\n identifier([column]);\n return construct([Object.freeze({ row: \"existing\", column })]);\n },\n incoming: ({ column }: { column: string }): SqlFragment => {\n identifier([column]);\n return construct([Object.freeze({ row: \"incoming\", column })]);\n },\n greatest: ({ values }: { values: readonly SqlFragment[] }): SqlFragment => {\n if (!Array.isArray(values) || values.length !== 2 || values.some((value) => !isSqlFragment(value))) invalid(\"sql.greatest requires two SQL fragments\");\n return construct([Object.freeze({ greatest: Object.freeze([...values]) })]);\n },\n}));\n\n/** Render opaque fragments with the enclosing statement's parameter collector. */\nexport function renderSqlFragment(params: {\n dialect: SqlDialect;\n fragment: SqlFragment;\n collector: ParamCollector;\n /** Available only in a conflict update; maps logical names to physical names. */\n conflict?: { readonly table: string; readonly columns?: Readonly<Record<string, string>> };\n}): string {\n const { dialect, collector, conflict } = params;\n const render = (fragment: SqlFragment): string => renderSqlFragment({ ...params, fragment });\n const encode = (part: { readonly value: unknown; readonly decoder?: ResultDecoder<unknown> }): unknown => {\n if (part.value === undefined) invalid(\"SQL parameters cannot be undefined; use null explicitly\");\n // Never expose a fragment's captured values (or an encoder's mutable output)\n // to the driver. This isolation belongs here, not in the shared collector.\n return snapshotSqlValue(part.decoder === undefined ? part.value : part.decoder.encode({ value: snapshotSqlValue(part.value), dialect: dialect.name }));\n };\n const recording = isSqlBindingCollector({ collector });\n const recordValue = (part: { readonly value: unknown; readonly decoder?: ResultDecoder<unknown> }): string => recordSqlBinding({\n collector, source: { kind: \"literal\", value: part.value },\n transport: part.decoder === undefined ? sqlParameterTransport({ value: part.value }) : { kind: \"plain\" },\n encode: ({ value, dialect: target }) => part.decoder === undefined ? value : part.decoder.encode({ value, dialect: target.name }),\n });\n // A frame operand becomes a derived-table column. MySQL types a NULL-bound\n // parameter there as text, which turns the whole maximum into text (\"7\" for\n // 7), so a bare NULL value renders as the NULL literal. MySQL 8.4 also refuses\n // a derived-table select list that holds a nested frame beside a direct outer\n // column reference (ER_ILLEGAL_REFERENCE 1247), so `wrapped-frame` puts every\n // non-NULL operand in its own scalar subquery.\n const frameOperand = (fragment: SqlFragment): string => {\n const parts = partsOf(fragment).filter((part) => part !== \"\");\n const only = parts.length === 1 ? parts[0] : undefined;\n if (recording && only !== undefined && typeof only !== \"string\" && \"value\" in only) {\n if (only.decoder !== undefined && resultScalarContract({ decoder: only.decoder }) === undefined) throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Reusable SQL cannot compile an opaque encoder whose output controls a greatest NULL frame\" });\n if (only.value === null) {\n if (only.decoder !== undefined) recordSqlBindingCheck({ collector, check: () => {\n if (encode({ ...only, value: snapshotSqlValue(only.value) }) !== null) throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Reusable SQL NULL frame encoding changed its declared structure\" });\n } });\n return \"NULL\";\n }\n const text = recordValue(only);\n return dialect.greatestForm === \"wrapped-frame\" ? `(SELECT ${text})` : text;\n }\n const value = only !== undefined && typeof only !== \"string\" && \"value\" in only ? { encoded: encode(only) } : undefined;\n if (value !== undefined && value.encoded === null) return \"NULL\";\n const text = value === undefined ? render(fragment) : collector.add(value.encoded);\n return dialect.greatestForm === \"wrapped-frame\" ? `(SELECT ${text})` : text;\n };\n return partsOf(params.fragment).map((part) => {\n if (typeof part === \"string\") return part;\n if (\"value\" in part) return recording ? recordValue(part) : collector.add(encode(part));\n if (\"ident\" in part) return part.ident.map((name) => dialect.quoteIdent({ name })).join(\".\");\n if (\"row\" in part) {\n if (conflict === undefined) invalid(\"Existing/incoming row references require a conflict update\");\n const name = conflict.columns === undefined ? part.column : conflict.columns[part.column];\n if (name === undefined) invalid(`Unknown conflict-expression field \"${part.column}\"`);\n const ref = dialect.excludedRowRef;\n const qualifier = part.row === \"existing\" ? dialect.quoteIdent({ name: conflict.table })\n : ref.form === \"keyword\" ? ref.name : dialect.quoteIdent({ name: ref.alias });\n return `${qualifier}.${dialect.quoteIdent({ name })}`;\n }\n // Each operand renders once, so nesting stays linear in text and parameters.\n if (dialect.greatestForm === \"native\") return `GREATEST(${part.greatest.map(render).join(\", \")})`;\n // A node whose operands hold no greatest keeps the 2.x CASE form byte for\n // byte (its semantics, result type, collation precedence and aggregate\n // scope). Its repetitions re-render so anonymous placeholders still bind\n // one value each; only these innermost nodes repeat, so nesting stays linear.\n if (!part.greatest.some(containsGreatest)) {\n return render(part.greatest.reduce((left, right) => sql`(CASE WHEN ${left} IS NULL THEN ${right} WHEN ${right} IS NULL THEN ${left} WHEN ${left} >= ${right} THEN ${left} ELSE ${right} END)`));\n }\n const [left, right] = part.greatest.map(frameOperand) as [string, string];\n // The frame binds each operand to a column once; CASE then gives PostgreSQL's\n // NULL-ignoring maximum semantics without repeating operand SQL or values.\n const [a, b, frame] = [\"a\", \"b\", \"g\"].map((name) => dialect.quoteIdent({ name })) as [string, string, string];\n return `(SELECT CASE WHEN ${a} IS NULL THEN ${b} WHEN ${b} IS NULL THEN ${a} WHEN ${a} >= ${b} THEN ${a} ELSE ${b} END FROM (SELECT ${left} AS ${a}, ${right} AS ${b}) AS ${frame})`;\n }).join(\"\");\n}\n\n/** Resolve logical conflict references once, before rendering or executing any row. */\nexport function mapConflictColumns(params: { fragment: SqlFragment; columns: Readonly<Record<string, string>> }): SqlFragment {\n return construct(partsOf(params.fragment).map((part): Part => {\n if (typeof part === \"string\") return part;\n if (\"row\" in part) {\n const column = Object.hasOwn(params.columns, part.column) ? params.columns[part.column] : undefined;\n if (column === undefined) invalid(`Unknown conflict-expression field \"${part.column}\"`);\n return Object.freeze({ ...part, column });\n }\n if (\"greatest\" in part) return Object.freeze({ greatest: Object.freeze(part.greatest.map((fragment) => mapConflictColumns({ ...params, fragment }))) });\n return part;\n }));\n}\n\n/** Render a complete constructed query. */\nexport function compileSql(params: { dialect: SqlDialect; query: SqlFragment }): { text: string; values: unknown[] } {\n const collector = new ParamCollector(params.dialect);\n const text = renderSqlFragment({ dialect: params.dialect, fragment: params.query, collector });\n return { text, values: collector.values };\n}\n\n/** Whether a nested SQL fragment reads the incoming row (MySQL alias declaration). */\nexport function sqlUsesIncoming(params: { fragment: SqlFragment }): boolean {\n return partsOf(params.fragment).some((part) => typeof part !== \"string\" &&\n ((\"row\" in part && part.row === \"incoming\") || (\"greatest\" in part && part.greatest.some((fragment) => sqlUsesIncoming({ fragment })))));\n}\n",
43
- "import { VibeError } from \"@vibeorm/schema\";\nimport { isSqlFragment } from \"./composable.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport { registerSqlHandleCheck } from \"./sql-handles.ts\";\nimport type { ResultReadDecoder } from \"./result-decoder.ts\";\nimport { bindSqlBindingProgram, finishSqlBindingCollection, startSqlBindingCollection } from \"./sql-bindings.ts\";\nimport type { SqlBindingProgram } from \"./sql-bindings.ts\";\nimport { isSqlInput, sqlInputScopeHandle, sqlInputScopeKeys } from \"./sql-input.ts\";\nimport type { SqlInputScope } from \"./sql-input.ts\";\n\ndeclare const queryBrand: unique symbol;\ndeclare const commandBrand: unique symbol;\n/** Authentic row-returning SQL plan, independent of a client or transaction. */\nexport type SqlQuery<Row> = { readonly [queryBrand]: Row };\n/** Authentic affected-count SQL plan; never a row-returning contract. */\nexport type SqlCommand = { readonly [commandBrand]: true };\n/** Render into the enclosing collector, preserving parameter order in compositions. */\nexport type SqlPlanRender = (params: { dialect: SqlDialect; collector: ParamCollector }) => string;\n/** Compiled row query and its captured runtime result contract. */\nexport type CompiledSqlQuery<Row> = { readonly text: string; readonly values: unknown[]; readonly decoder: ResultReadDecoder<Row> };\n\ntype QueryState = { readonly render: SqlPlanRender; readonly decoder: ResultReadDecoder<unknown> };\nconst queries = new WeakMap<object, QueryState>();\nconst commands = new WeakMap<object, SqlPlanRender>();\n\ndeclare const reusableQueryBrand: unique symbol;\ndeclare const reusableCommandBrand: unique symbol;\n/** Ownerless fixed SQL with required execution inputs and its own result decoder. */\nexport type ReusableSqlQuery<Params extends object, Row> = { readonly [reusableQueryBrand]: { readonly params: Params; readonly row: Row } };\n/** Ownerless fixed affected-count SQL with required execution inputs. */\nexport type ReusableSqlCommand<Params extends object> = { readonly [reusableCommandBrand]: Params };\n/** A fresh bound command, ready for the existing raw execution route. */\nexport type CompiledSqlCommand = { readonly text: string; readonly values: unknown[] };\ntype CompiledTemplate = { readonly text: string; readonly program: SqlBindingProgram };\ntype TemplateState = { readonly render: SqlPlanRender; readonly scope: SqlInputScope; readonly decoder?: ResultReadDecoder<unknown>; readonly cache: WeakMap<SqlDialect, CompiledTemplate> };\nconst reusableQueries = new WeakMap<object, TemplateState>();\nconst reusableCommands = new WeakMap<object, TemplateState>();\nregisterSqlHandleCheck({ check: (value) => queries.has(value) || commands.has(value) || reusableQueries.has(value) || reusableCommands.has(value) });\n\nfunction invalid(message: string): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message });\n}\n\n/** Capture a renderer and decoder without opening any execution resource. */\nexport function createSqlQuery<Row>(params: { render: SqlPlanRender; decoder: ResultReadDecoder<Row> }): SqlQuery<Row> {\n if (typeof params.render !== \"function\" || typeof params.decoder?.decode !== \"function\") invalid(\"SQL queries require a renderer and result decoder\");\n const query = Object.freeze(Object.create(null)) as SqlQuery<Row>;\n queries.set(query, Object.freeze({ render: params.render, decoder: params.decoder }));\n return query;\n}\n\n/** Capture a command renderer without inventing a result-row contract. */\nexport function createSqlCommand(params: { render: SqlPlanRender }): SqlCommand {\n if (typeof params.render !== \"function\") invalid(\"SQL commands require a renderer\");\n const command = Object.freeze(Object.create(null)) as SqlCommand;\n commands.set(command, params.render);\n return command;\n}\n\n/** Structural copies and assertions are not executable row plans. */\nexport function isSqlQuery(value: unknown): value is SqlQuery<unknown> {\n return typeof value === \"object\" && value !== null && queries.has(value);\n}\n\n/** Structural copies and row plans are not executable commands. */\nexport function isSqlCommand(value: unknown): value is SqlCommand {\n return typeof value === \"object\" && value !== null && commands.has(value);\n}\n\n/** Authentic reusable row plans are distinct from ordinary composable plans. */\nexport function isReusableSqlQuery(value: unknown): value is ReusableSqlQuery<object, unknown> {\n return typeof value === \"object\" && value !== null && reusableQueries.has(value);\n}\n\n/** Authentic reusable commands never masquerade as row queries. */\nexport function isReusableSqlCommand(value: unknown): value is ReusableSqlCommand<object> {\n return typeof value === \"object\" && value !== null && reusableCommands.has(value);\n}\n\n/** @internal Query-bundle provenance is checked by qb.reusable before this bridge. */\nexport function createReusableSqlQuery<P extends object, Row>(params: { query: SqlQuery<Row>; scope: SqlInputScope }): ReusableSqlQuery<P, Row> {\n const state = queries.get(params.query) ?? invalid(\"Expected an authentic SQL row query\");\n sqlInputScopeKeys({ scope: params.scope });\n const query = Object.freeze(Object.create(null)) as ReusableSqlQuery<P, Row>;\n reusableQueries.set(query, { ...state, scope: params.scope, cache: new WeakMap() });\n return query;\n}\n\n/** @internal Wrap an admitted builder command without capturing an execution owner. */\nexport function createReusableSqlCommand<P extends object>(params: { query: SqlCommand; scope: SqlInputScope }): ReusableSqlCommand<P> {\n const render = commands.get(params.query) ?? invalid(\"Expected an authentic SQL command\");\n sqlInputScopeKeys({ scope: params.scope });\n const query = Object.freeze(Object.create(null)) as ReusableSqlCommand<P>;\n reusableCommands.set(query, { render, scope: params.scope, cache: new WeakMap() });\n return query;\n}\n\nfunction compiledTemplate(params: { dialect: SqlDialect; state: TemplateState }): CompiledTemplate {\n const cached = params.state.cache.get(params.dialect);\n if (cached !== undefined) return cached;\n const collector = new ParamCollector(params.dialect);\n startSqlBindingCollection({ collector, dialect: params.dialect, scope: params.state.scope });\n const text = params.state.render({ dialect: params.dialect, collector });\n if (collector.count() > params.dialect.paramBudget) invalid(\"SQL query exceeds this dialect's parameter budget; statements are never split implicitly\");\n const program = finishSqlBindingCollection({ collector });\n const compiled = Object.freeze({ text, program });\n params.state.cache.set(params.dialect, compiled);\n return compiled;\n}\n\n/** Core and builder handles are SQL code, never execution data, at any depth of an input bag. */\nfunction executionHandle(params: { scope: SqlInputScope; value: object }): boolean {\n const { value } = params;\n return queries.has(value) || commands.has(value) || reusableQueries.has(value) || reusableCommands.has(value)\n || isSqlFragment(value) || isSqlInput(value) || sqlInputScopeHandle(params);\n}\n\nfunction bindTemplate(params: { compiled: CompiledTemplate; state: TemplateState; inputs: unknown }): unknown[] {\n const { scope } = params.state;\n return bindSqlBindingProgram({ program: params.compiled.program, params: params.inputs, isHandle: (value) => executionHandle({ scope, value }) });\n}\n\n/** Compile structure once per dialect and synchronously snapshot/bind this invocation. */\nexport function compileReusableSqlQuery<P extends object, Row>(params: { readonly dialect: SqlDialect; readonly query: ReusableSqlQuery<P, Row>; readonly params?: unknown }): CompiledSqlQuery<Row> {\n const state = reusableQueries.get(params.query) ?? invalid(\"Expected an authentic reusable SQL row query\");\n const compiled = compiledTemplate({ dialect: params.dialect, state });\n return { text: compiled.text, values: bindTemplate({ compiled, state, inputs: params.params }), decoder: state.decoder as ResultReadDecoder<Row> };\n}\n\n/** Compile structure once per dialect and bind a fresh affected-count command. */\nexport function compileReusableSqlCommand<P extends object>(params: { readonly dialect: SqlDialect; readonly query: ReusableSqlCommand<P>; readonly params?: unknown }): CompiledSqlCommand {\n const state = reusableCommands.get(params.query) ?? invalid(\"Expected an authentic reusable SQL command\");\n const compiled = compiledTemplate({ dialect: params.dialect, state });\n return { text: compiled.text, values: bindTemplate({ compiled, state, inputs: params.params }) };\n}\n\n/** Compile a row plan once the execution dialect is known. */\nexport function compileSqlQuery<Row>(params: { dialect: SqlDialect; query: SqlQuery<Row> }): CompiledSqlQuery<Row> {\n const state = queries.get(params.query) ?? invalid(\"Expected an authentic SQL row query\");\n const collector = new ParamCollector(params.dialect);\n const text = state.render({ dialect: params.dialect, collector });\n if (collector.values.length > params.dialect.paramBudget) invalid(\"SQL query exceeds this dialect's parameter budget; statements are never split implicitly\");\n return { text, values: collector.values, decoder: state.decoder as ResultReadDecoder<Row> };\n}\n\n/** Compile an affected-count plan; row terminals are refused. */\nexport function compileSqlCommand(params: { dialect: SqlDialect; query: SqlCommand }): { text: string; values: unknown[] } {\n const render = commands.get(params.query) ?? invalid(\"Expected an authentic SQL command\");\n const collector = new ParamCollector(params.dialect);\n const text = render({ dialect: params.dialect, collector });\n if (collector.values.length > params.dialect.paramBudget) invalid(\"SQL command exceeds this dialect's parameter budget; statements are never split implicitly\");\n return { text, values: collector.values };\n}\n",
44
- "import { VibeError, fieldTypeIdentity, isEnumType, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { ExclusionEndpoint, ExclusionIR, ExclusionSpec, FieldIR, ModelIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { renderPredicate } from \"./predicate.ts\";\n\nfunction invalid(rule: string): never {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Invalid exclusion constraint: ${rule}`, meta: { rule: `exclusion-${rule}` } });\n}\n\n/** Compile immutable range construction and equality operands using physical column names. */\nexport function compileExclusion(params: { exclusion: ExclusionSpec; model: Pick<ModelIR, \"name\" | \"fields\">; dialect: SqlDialect }): ExclusionIR {\n const { exclusion: spec, model, dialect } = params;\n if (!dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: dialect.name, feature: \"exclusionConstraints\" });\n if (!spec.name || spec.name.includes(\"\\0\")) invalid(\"name\");\n if (![\"int8range\", \"tsrange\", \"tstzrange\"].includes(spec.range.type)) invalid(\"range-type\");\n if (![\"[)\", \"[]\", \"()\", \"(]\"].includes(spec.range.bounds)) invalid(\"bounds\");\n const field = (name: string): FieldIR => {\n const value = model.fields.find((entry) => entry.name === name);\n if (value === undefined || value.isList || value.isUnsupported) invalid(\"field\");\n return value;\n };\n const endpoint = (value: ExclusionEndpoint): string => {\n if (\"unbounded\" in value) return \"NULL\";\n const infinity = \"infinity\" in value ? value.infinity : value.nullAs;\n if (infinity !== undefined && (spec.range.type === \"int8range\" || ![\"infinity\", \"-infinity\"].includes(infinity))) invalid(\"infinity\");\n const literal = infinity === undefined ? undefined : `${dialect.quoteStringLiteral({ value: infinity })}::${spec.range.type === \"tsrange\" ? \"timestamp\" : \"timestamptz\"}`;\n if (\"infinity\" in value) return literal!;\n const column = field(value.field);\n if (fieldTypeIdentity({ type: column.type }) !== (spec.range.type === \"int8range\" ? \"BigInt\" : \"DateTime\")) invalid(\"range-field-type\");\n if (column.type === \"DateTime\") {\n const timezone = /timestamptz|timestamp.*with time zone/i.test(column.nativeType ?? \"timestamptz\");\n if (timezone !== (spec.range.type === \"tstzrange\")) invalid(\"range-timezone\");\n }\n const sql = dialect.quoteIdent({ name: column.dbName ?? column.name });\n return literal === undefined ? sql : `COALESCE(${sql}, ${literal})`;\n };\n const keys = spec.keys.map((key) => {\n if (\"expression\" in key) {\n if (!key.expression.trim() || key.expression.includes(\"\\0\") || key.fields.length === 0) invalid(\"expression\");\n key.fields.forEach(field);\n return `(${key.expression}) WITH =`;\n }\n const column = field(key.field);\n if (column.isOptional) invalid(\"nullable-key-requires-expression\");\n if (!isEnumType(column.type) && ![\"String\", \"Int\", \"BigInt\", \"Float\", \"Decimal\", \"Boolean\", \"DateTime\"].includes(fieldTypeIdentity({ type: column.type }))) invalid(\"key-type\");\n return `${dialect.quoteIdent({ name: column.dbName ?? column.name })} WITH =`;\n });\n keys.push(`${spec.range.type}(${endpoint(spec.range.lower)}, ${endpoint(spec.range.upper)}, ${dialect.quoteStringLiteral({ value: spec.range.bounds })}) WITH &&`);\n const where = spec.where === undefined ? \"\" : ` WHERE (${renderPredicate({ predicate: spec.where, model, dialect, usage: \"exclusionPredicate\", site: spec.name })})`;\n return { name: spec.name, definition: `EXCLUDE USING gist (${keys.join(\", \")})${where}`, source: spec, requiredExtensions: spec.keys.length === 0 ? [] : dialect.capabilities.exclusionExtensions };\n}\n\n/** Exclusion DDL is a constraint operation, never an index operation. */\nexport function renderExclusionSetup(params: { dialect: SqlDialect; exclusion: ExclusionIR }): string[] {\n if (!params.dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: params.dialect.name, feature: \"exclusionConstraints\" });\n return params.exclusion.requiredExtensions.map((name) => `CREATE EXTENSION IF NOT EXISTS ${params.dialect.quoteIdent({ name })};`);\n}\n\nexport function renderExclusionDdl(params: { dialect: SqlDialect; table: string; exclusion: ExclusionIR; operation: \"add\" | \"drop\" }): string[] {\n const { dialect, table, exclusion, operation } = params;\n if (!dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: dialect.name, feature: \"exclusionConstraints\" });\n const target = `ALTER TABLE ${dialect.quoteIdent({ name: table })}`;\n if (operation === \"drop\") return [`${target} DROP CONSTRAINT ${dialect.quoteIdent({ name: exclusion.name })};`];\n return [...renderExclusionSetup({ dialect, exclusion }), `${target} ADD CONSTRAINT ${dialect.quoteIdent({ name: exclusion.name })} ${exclusion.definition};`];\n}\n\n/** Read catalog exclusion definitions, including index health; optional private probe table. */\nexport function renderExclusionCatalog(params: { dialect: SqlDialect; probe?: string; namespace?: string }): string {\n const { dialect, probe } = params;\n if (!dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: dialect.name, feature: \"exclusionConstraints\" });\n const scope = probe === undefined ? `n.nspname = ${dialect.quoteStringLiteral({ value: params.namespace ?? \"public\" })}` : `t.oid = ${dialect.quoteStringLiteral({ value: probe })}::regclass`;\n return `SELECT t.relname AS table_name, c.conname AS constraint_name, pg_catalog.pg_get_constraintdef(c.oid, true) AS definition, c.convalidated AS validated, i.indisvalid AS valid, i.indisready AS ready FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class t ON t.oid = c.conrelid JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace JOIN pg_catalog.pg_index i ON i.indexrelid = c.conindid WHERE c.contype = 'x' AND ${scope} ORDER BY t.relname, c.conname`;\n}\n\n/** Empty private clone for server normalization; no existing row is scanned or changed. */\nexport function renderExclusionProbe(params: { dialect: SqlDialect; table: string; namespace?: string; probe: string; definition: string }): string[] {\n const { dialect, table, probe, definition } = params;\n if (!dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: dialect.name, feature: \"exclusionConstraints\" });\n return [`CREATE TEMP TABLE ${dialect.quoteIdent({ name: probe })} (LIKE ${dialect.quoteIdent({ name: params.namespace ?? \"public\" })}.${dialect.quoteIdent({ name: table })})`, `ALTER TABLE ${dialect.quoteIdent({ name: probe })} ADD CONSTRAINT ${dialect.quoteIdent({ name: `${probe}_x` })} ${definition}`];\n}\n",
45
- "/**\n * Lock SQL: the row-locking clause appended to a SELECT, and the\n * transaction-scoped advisory-lock statement.\n *\n * Both are pure text decisions, so both live here rather than in the runtime —\n * and both REFUSE rather than degrade. A dialect that cannot express a strength\n * or a wait policy has no text for it (`SqlDialect.rowLockSyntax`), and the\n * refusal is a `VIBE_UNSUPPORTED_CAPABILITY`, never a weaker clause: silently\n * turning `skipLocked` into a blocking read hands two workers the same job.\n */\n\nimport { internalError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { AdvisoryLockMode, RowLockStrength, RowLockWaitPolicy } from \"@vibeorm/schema\";\nimport type { AdvisoryLockKey, AdvisoryLockStatement, RowLock } from \"./ast.ts\";\nimport { ADVISORY_LOCK_RESULT_COLUMN } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport type { RenderedQuery } from \"./render.ts\";\n\n// ─── Row locks ────────────────────────────────────────────────────\n\n/**\n * How each strength and wait policy READS in a refusal message. Typed as a\n * total record, so adding a member to either union fails to compile until this\n * table names it — an error message can never silently describe the wrong lock.\n */\nconst ROW_LOCK_PROSE: {\n readonly strengths: Readonly<Record<RowLockStrength, string>>;\n readonly wait: Readonly<Record<RowLockWaitPolicy, string>>;\n} = Object.freeze({\n strengths: Object.freeze({\n update: \"FOR UPDATE\",\n noKeyUpdate: \"FOR NO KEY UPDATE\",\n share: \"FOR SHARE\",\n keyShare: \"FOR KEY SHARE\",\n }),\n wait: Object.freeze({ wait: \"\", nowait: \" NOWAIT\", skipLocked: \" SKIP LOCKED\" }),\n});\n\n/** How a lock request reads in a refusal message (`FOR UPDATE SKIP LOCKED`). */\nexport function describeRowLock(params: { lock: RowLock }): string {\n const { strength, wait } = params.lock;\n return `${ROW_LOCK_PROSE.strengths[strength]}${ROW_LOCK_PROSE.wait[wait]}`;\n}\n\n/**\n * The clause for one row lock, or `null` when this dialect has NO locking-read\n * clause at all and the request is the historical `FOR UPDATE` no-op.\n *\n * sqlite is that case: it has no clause, and its write transactions are\n * mutually exclusive, so `lock: \"update\"` there is a documented no-op kept for\n * compatibility. Anything else on such a dialect — a different strength, or a\n * wait policy that changes behaviour — is refused by the caller BEFORE this\n * point (the query builder), and refused again here as a backstop.\n */\nexport function renderRowLockClause(params: { dialect: SqlDialect; lock: RowLock }): string | null {\n const { dialect, lock } = params;\n const syntax = dialect.rowLockSyntax;\n if (syntax === null) {\n if (lock.strength === \"update\" && lock.wait === \"wait\") return null;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `a ${describeRowLock({ lock })} locking read`,\n hint: `${dialect.name} has no locking-read clause at all`,\n });\n }\n const strengthText = syntax.strengths[lock.strength];\n if (strengthText === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `the ${describeRowLock({ lock: { ...lock, wait: \"wait\" } })} row-lock strength`,\n hint: `${dialect.name} can express: ${Object.keys(syntax.strengths).join(\", \")}`,\n });\n }\n const waitText = syntax.wait[lock.wait];\n if (waitText === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `the \"${lock.wait}\" lock wait policy`,\n hint: `${dialect.name} can express: ${Object.keys(syntax.wait).join(\", \")}`,\n });\n }\n // `OF <table>` sits between the strength and the wait policy on both\n // dialects that have the clause (postgres, mysql 8.0.1+).\n if (lock.of !== undefined) {\n if (lock.of.length === 0) throw internalError({ message: \"a row lock's `of` list cannot be empty\" });\n const tables = lock.of.map((name) => dialect.quoteIdent({ name })).join(\", \");\n return `${strengthText} OF ${tables}${waitText}`;\n }\n return `${strengthText}${waitText}`;\n}\n\n// ─── Advisory locks ───────────────────────────────────────────────\n\n/** Largest/smallest value each advisory key part may carry, per PostgreSQL's types. */\nexport const ADVISORY_KEY_BOUNDS: {\n readonly single: { readonly min: bigint; readonly max: bigint };\n readonly pair: { readonly min: number; readonly max: number };\n} = Object.freeze({\n single: Object.freeze({ min: -(2n ** 63n), max: 2n ** 63n - 1n }),\n pair: Object.freeze({ min: -(2 ** 31), max: 2 ** 31 - 1 }),\n});\n\n/** Is this key the single 64-bit form? (The alternative is the two 32-bit form.) */\nfunction isSingleKey(key: AdvisoryLockKey): key is { readonly key: bigint } {\n return \"key\" in key;\n}\n\n/**\n * `SELECT pg_advisory_xact_lock($1::bigint)` and friends.\n *\n * The key binds as TEXT with an explicit cast: PostgreSQL overloads these\n * functions on `(bigint)` and `(int4, int4)`, and an OID-typed driver resolves\n * a bound parameter's type itself — the trap `jsonParamCast` already exists for.\n * Casting in the SQL makes every driver send the same bytes.\n */\nexport function renderAdvisoryLock(params: {\n dialect: SqlDialect;\n statement: AdvisoryLockStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n const functions = dialect.advisoryLockFunctions;\n if (functions === null) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"advisory locks\",\n hint:\n dialect.name === \"mysql\"\n ? \"mysql's GET_LOCK is SESSION-scoped — it survives a rollback, so it cannot be released with the transaction\"\n : `${dialect.name} has no advisory-lock functions`,\n });\n }\n const mode: AdvisoryLockMode = statement.mode;\n const fn = (mode === \"exclusive\" ? functions.exclusive : functions.shared)[statement.wait];\n const key = statement.key;\n const args = isSingleKey(key)\n ? `${collector.add(key.key.toString())}${functions.keyCast.single}`\n : `${collector.add(String(assertInt32({ value: key.classId, part: \"classId\" })))}${functions.keyCast.pair}, ` +\n `${collector.add(String(assertInt32({ value: key.objectId, part: \"objectId\" })))}${functions.keyCast.pair}`;\n // The try-lock's boolean IS the result, so it is projected under a stable\n // name; the blocking form returns void and needs no alias.\n const projection =\n statement.wait === \"nowait\"\n ? ` AS ${dialect.quoteIdent({ name: ADVISORY_LOCK_RESULT_COLUMN })}`\n : \"\";\n return {\n text: `SELECT ${fn}(${args})${projection}`,\n values: collector.values,\n returning: \"none\",\n };\n}\n\n/**\n * Take already sorted, deduplicated bigint transaction locks in their input\n * order. The volatile lock call runs after the ordinality sort. This is a\n * separate statement: a following read obtains its snapshot after lock waits.\n */\nexport function renderAdvisoryLocks(params: { readonly dialect: SqlDialect; readonly keys: readonly bigint[]; readonly mode: AdvisoryLockMode }): RenderedQuery {\n const { dialect, keys, mode } = params;\n const functions = dialect.advisoryLockFunctions;\n if (functions === null) throw unsupportedCapability({ dialect: dialect.name, feature: \"advisory locks\" });\n if (mode !== \"exclusive\" && mode !== \"shared\") throw internalError({ message: \"advisory lock mode must be exclusive or shared\" });\n if (keys.some((key) => typeof key !== \"bigint\" || key < ADVISORY_KEY_BOUNDS.single.min || key > ADVISORY_KEY_BOUNDS.single.max)) {\n throw internalError({ message: \"advisory lock keys must be signed 64-bit integers\" });\n }\n const collector = new ParamCollector(dialect);\n const binding = collector.add(JSON.stringify(keys.map((key) => key.toString())));\n const fn = (mode === \"exclusive\" ? functions.exclusive : functions.shared).wait;\n const table = dialect.quoteIdent({ name: \"__vibe_locks\" });\n const key = dialect.quoteIdent({ name: \"key\" });\n const order = dialect.quoteIdent({ name: \"ordinal\" });\n return {\n text: `SELECT ${fn}(${table}.${key}${functions.keyCast.single}) FROM jsonb_array_elements_text(${binding}::text::jsonb) WITH ORDINALITY AS ${table}(${key}, ${order}) ORDER BY ${table}.${order}`,\n values: collector.values,\n returning: \"none\",\n };\n}\n\n/** The AST is built by VibeORM code, so an out-of-range part is our bug. */\nfunction assertInt32(params: { value: number; part: string }): number {\n const { value, part } = params;\n if (\n !Number.isInteger(value) ||\n value < ADVISORY_KEY_BOUNDS.pair.min ||\n value > ADVISORY_KEY_BOUNDS.pair.max\n ) {\n throw internalError({\n message: `advisory lock ${part} must be a 32-bit integer, got ${String(value)}`,\n meta: { part, value },\n });\n }\n return value;\n}\n",
44
+ "import { VibeError } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { snapshotSqlValue } from \"./parameter-snapshot.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport { registerSqlHandleCheck } from \"./sql-handles.ts\";\nimport { isSqlBindingCollector, recordSqlBinding, recordSqlBindingCheck, sqlParameterTransport } from \"./sql-bindings.ts\";\nimport { resultScalarContract } from \"./result-decoder.ts\";\nimport type { ResultDecoder } from \"./result-decoder.ts\";\n\ndeclare const fragmentBrand: unique symbol;\n/** Opaque executable SQL, constructed by sql, never by casting an object. */\nexport type SqlFragment = { readonly [fragmentBrand]: true };\n\ntype Part =\n | string\n | { readonly value: unknown; readonly decoder?: ResultDecoder<unknown> }\n | { readonly ident: readonly string[] }\n | { readonly row: \"existing\" | \"incoming\"; readonly column: string }\n | { readonly greatest: readonly SqlFragment[] };\nconst fragments = new WeakMap<object, readonly Part[]>();\nregisterSqlHandleCheck({ check: (value) => fragments.has(value) });\n\nfunction invalid(message: string): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message });\n}\n\nfunction construct(parts: readonly Part[]): SqlFragment {\n const snapshot = Object.freeze([...parts]);\n const fragment = Object.freeze(Object.defineProperty(Object.create(null), \"toJSON\", {\n value: (): { parts: readonly Part[] } => ({ parts: snapshot }),\n })) as SqlFragment;\n fragments.set(fragment, snapshot);\n return fragment;\n}\n\n/** Runtime authenticity check; structural copies are not executable. */\nexport function isSqlFragment(value: unknown): value is SqlFragment {\n return typeof value === \"object\" && value !== null && fragments.has(value);\n}\n\nfunction partsOf(value: SqlFragment): readonly Part[] {\n return fragments.get(value) ?? invalid(\"Expected a constructed SQL fragment\");\n}\n\n/** Whether a fragment holds a greatest node (template interpolation flattens parts). */\nfunction containsGreatest(fragment: SqlFragment): boolean {\n return partsOf(fragment).some((part) => typeof part !== \"string\" && \"greatest\" in part);\n}\n\nfunction identifier(parts: readonly string[]): void {\n if (!Array.isArray(parts) || parts.length === 0 || parts.some((part) => typeof part !== \"string\" || part.length === 0 || part.includes(\"\\0\"))) {\n invalid(\"SQL identifiers require non-empty, NUL-free name components\");\n }\n}\n\n/** The public composition helpers. text is trusted SQL; interpolated strings are values. */\nexport type SqlTag = {\n (strings: TemplateStringsArray, ...values: readonly unknown[]): SqlFragment;\n readonly text: (params: { text: string }) => SqlFragment;\n readonly ident: (params: { parts: readonly string[] }) => SqlFragment;\n readonly value: <T>(params: { value: NoInfer<T>; decoder?: ResultDecoder<T> }) => SqlFragment;\n /**\n * A list: fragments spliced, anything else bound as one value each, joined\n * by `separator` (default `, `). `sql.join(items, separator)` and\n * `sql.join({ items, separator })` are the same call.\n */\n readonly join: {\n (items: readonly unknown[], separator?: SqlFragment): SqlFragment;\n (params: { items: readonly unknown[]; separator?: SqlFragment }): SqlFragment;\n };\n /** Every condition must hold: `(a) AND (b)`, each part in parentheses; `undefined` parts are skipped, and none left is `TRUE`. */\n readonly and: (parts: readonly (SqlFragment | undefined)[]) => SqlFragment;\n /** Any condition may hold: `(a) OR (b)`, each part in parentheses; `undefined` parts are skipped, and none left is `FALSE`. */\n readonly or: (parts: readonly (SqlFragment | undefined)[]) => SqlFragment;\n readonly existing: (params: { column: string }) => SqlFragment;\n readonly incoming: (params: { column: string }) => SqlFragment;\n /** Portable scalar maximum, with NULL ignored (all NULL produces NULL). */\n readonly greatest: (params: { values: readonly [SqlFragment, SqlFragment] }) => SqlFragment;\n};\n\nfunction template(strings: TemplateStringsArray, ...values: readonly unknown[]): SqlFragment {\n if (!Array.isArray(strings) || !Array.isArray(strings.raw) || strings.length !== values.length + 1 || strings.some((text) => typeof text !== \"string\")) {\n invalid(\"Use sql as a template tag\");\n }\n const parts: Part[] = [];\n for (let index = 0; index < strings.length; index++) {\n parts.push(strings[index]!);\n if (index < values.length) {\n const value = values[index];\n if (isSqlFragment(value)) parts.push(...partsOf(value));\n else parts.push(Object.freeze({ value: snapshotSqlValue(value) }));\n }\n }\n return construct(parts);\n}\n\n/** Compose SQL without parameter-offset arithmetic. */\nexport const sql: SqlTag = Object.freeze(Object.assign(template, {\n text: ({ text }: { text: string }): SqlFragment => {\n if (typeof text !== \"string\" || text.includes(\"\\0\")) invalid(\"SQL text must be a NUL-free string\");\n return construct([text]);\n },\n ident: ({ parts }: { parts: readonly string[] }): SqlFragment => {\n identifier(parts);\n return construct([Object.freeze({ ident: Object.freeze([...parts]) })]);\n },\n value: <T>({ value, decoder }: { value: NoInfer<T>; decoder?: ResultDecoder<T> }): SqlFragment =>\n construct([Object.freeze({ value: snapshotSqlValue(value), ...(decoder === undefined ? {} : { decoder }) })]),\n join: (first: readonly unknown[] | { items: readonly unknown[]; separator?: SqlFragment }, second?: SqlFragment): SqlFragment => {\n const positional = Array.isArray(first);\n const items = positional ? first : (first as { items?: unknown } | null | undefined)?.items;\n const separator = positional ? second : (first as { separator?: SqlFragment }).separator;\n if (!Array.isArray(items)) invalid(\"sql.join requires an array: sql.join(items, separator) or sql.join({ items, separator })\");\n if (!positional && second !== undefined) invalid(\"sql.join({ items, separator }) takes the separator inside the object\");\n if (separator !== undefined && !isSqlFragment(separator)) invalid(\"sql.join requires a sql`…` fragment as its separator\");\n const between = separator === undefined ? [\", \"] : partsOf(separator);\n const parts: Part[] = [];\n items.forEach((value, index) => {\n if (index > 0) parts.push(...between);\n parts.push(...(isSqlFragment(value) ? partsOf(value) : [Object.freeze({ value: snapshotSqlValue(value) })]));\n });\n return construct(parts);\n },\n and: (parts: readonly (SqlFragment | undefined)[]): SqlFragment => conditions({ parts, helper: \"sql.and\", operator: \" AND \", empty: \"TRUE\" }),\n or: (parts: readonly (SqlFragment | undefined)[]): SqlFragment => conditions({ parts, helper: \"sql.or\", operator: \" OR \", empty: \"FALSE\" }),\n existing: ({ column }: { column: string }): SqlFragment => {\n identifier([column]);\n return construct([Object.freeze({ row: \"existing\", column })]);\n },\n incoming: ({ column }: { column: string }): SqlFragment => {\n identifier([column]);\n return construct([Object.freeze({ row: \"incoming\", column })]);\n },\n greatest: ({ values }: { values: readonly SqlFragment[] }): SqlFragment => {\n if (!Array.isArray(values) || values.length !== 2 || values.some((value) => !isSqlFragment(value))) invalid(\"sql.greatest requires two SQL fragments\");\n return construct([Object.freeze({ greatest: Object.freeze([...values]) })]);\n },\n}));\n\n/** `sql.and` / `sql.or`: the present parts, each in parentheses, joined by the operator; the identity element when none is present. */\nfunction conditions(params: { parts: unknown; helper: string; operator: string; empty: string }): SqlFragment {\n const { parts, helper } = params;\n if (!Array.isArray(parts)) invalid(`${helper} requires an array of sql\\`…\\` fragments`);\n const present = (parts as readonly unknown[]).filter((part) => part !== undefined);\n if (present.some((part) => !isSqlFragment(part))) invalid(`${helper} takes sql\\`…\\` fragments (or undefined, which is skipped); bind a value inside a fragment`);\n if (present.length === 0) return construct([params.empty]);\n const out: Part[] = [];\n present.forEach((part, index) => {\n out.push(index === 0 ? \"(\" : `)${params.operator}(`, ...partsOf(part as SqlFragment));\n });\n out.push(\")\");\n return construct(out);\n}\n\n/** Render opaque fragments with the enclosing statement's parameter collector. */\nexport function renderSqlFragment(params: {\n dialect: SqlDialect;\n fragment: SqlFragment;\n collector: ParamCollector;\n /** Available only in a conflict update; maps logical names to physical names. */\n conflict?: { readonly table: string; readonly columns?: Readonly<Record<string, string>> };\n}): string {\n const { dialect, collector, conflict } = params;\n const render = (fragment: SqlFragment): string => renderSqlFragment({ ...params, fragment });\n const encode = (part: { readonly value: unknown; readonly decoder?: ResultDecoder<unknown> }): unknown => {\n if (part.value === undefined) invalid(\"SQL parameters cannot be undefined; use null explicitly\");\n // Never expose a fragment's captured values (or an encoder's mutable output)\n // to the driver. This isolation belongs here, not in the shared collector.\n return snapshotSqlValue(part.decoder === undefined ? part.value : part.decoder.encode({ value: snapshotSqlValue(part.value), dialect: dialect.name }));\n };\n const recording = isSqlBindingCollector({ collector });\n const recordValue = (part: { readonly value: unknown; readonly decoder?: ResultDecoder<unknown> }): string => recordSqlBinding({\n collector, source: { kind: \"literal\", value: part.value },\n transport: part.decoder === undefined ? sqlParameterTransport({ value: part.value }) : { kind: \"plain\" },\n encode: ({ value, dialect: target }) => part.decoder === undefined ? value : part.decoder.encode({ value, dialect: target.name }),\n });\n // A frame operand becomes a derived-table column. MySQL types a NULL-bound\n // parameter there as text, which turns the whole maximum into text (\"7\" for\n // 7), so a bare NULL value renders as the NULL literal. MySQL 8.4 also refuses\n // a derived-table select list that holds a nested frame beside a direct outer\n // column reference (ER_ILLEGAL_REFERENCE 1247), so `wrapped-frame` puts every\n // non-NULL operand in its own scalar subquery.\n const frameOperand = (fragment: SqlFragment): string => {\n const parts = partsOf(fragment).filter((part) => part !== \"\");\n const only = parts.length === 1 ? parts[0] : undefined;\n if (recording && only !== undefined && typeof only !== \"string\" && \"value\" in only) {\n if (only.decoder !== undefined && resultScalarContract({ decoder: only.decoder }) === undefined) throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Reusable SQL cannot compile an opaque encoder whose output controls a greatest NULL frame\" });\n if (only.value === null) {\n if (only.decoder !== undefined) recordSqlBindingCheck({ collector, check: () => {\n if (encode({ ...only, value: snapshotSqlValue(only.value) }) !== null) throw new VibeError({ code: \"VIBE_UNSUPPORTED_CAPABILITY\", message: \"Reusable SQL NULL frame encoding changed its declared structure\" });\n } });\n return \"NULL\";\n }\n const text = recordValue(only);\n return dialect.greatestForm === \"wrapped-frame\" ? `(SELECT ${text})` : text;\n }\n const value = only !== undefined && typeof only !== \"string\" && \"value\" in only ? { encoded: encode(only) } : undefined;\n if (value !== undefined && value.encoded === null) return \"NULL\";\n const text = value === undefined ? render(fragment) : collector.add(value.encoded);\n return dialect.greatestForm === \"wrapped-frame\" ? `(SELECT ${text})` : text;\n };\n return partsOf(params.fragment).map((part) => {\n if (typeof part === \"string\") return part;\n if (\"value\" in part) return recording ? recordValue(part) : collector.add(encode(part));\n if (\"ident\" in part) return part.ident.map((name) => dialect.quoteIdent({ name })).join(\".\");\n if (\"row\" in part) {\n if (conflict === undefined) invalid(\"Existing/incoming row references require a conflict update\");\n const name = conflict.columns === undefined ? part.column : conflict.columns[part.column];\n if (name === undefined) invalid(`Unknown conflict-expression field \"${part.column}\"`);\n const ref = dialect.excludedRowRef;\n const qualifier = part.row === \"existing\" ? dialect.quoteIdent({ name: conflict.table })\n : ref.form === \"keyword\" ? ref.name : dialect.quoteIdent({ name: ref.alias });\n return `${qualifier}.${dialect.quoteIdent({ name })}`;\n }\n // Each operand renders once, so nesting stays linear in text and parameters.\n if (dialect.greatestForm === \"native\") return `GREATEST(${part.greatest.map(render).join(\", \")})`;\n // A node whose operands hold no greatest keeps the 2.x CASE form byte for\n // byte (its semantics, result type, collation precedence and aggregate\n // scope). Its repetitions re-render so anonymous placeholders still bind\n // one value each; only these innermost nodes repeat, so nesting stays linear.\n if (!part.greatest.some(containsGreatest)) {\n return render(part.greatest.reduce((left, right) => sql`(CASE WHEN ${left} IS NULL THEN ${right} WHEN ${right} IS NULL THEN ${left} WHEN ${left} >= ${right} THEN ${left} ELSE ${right} END)`));\n }\n const [left, right] = part.greatest.map(frameOperand) as [string, string];\n // The frame binds each operand to a column once; CASE then gives PostgreSQL's\n // NULL-ignoring maximum semantics without repeating operand SQL or values.\n const [a, b, frame] = [\"a\", \"b\", \"g\"].map((name) => dialect.quoteIdent({ name })) as [string, string, string];\n return `(SELECT CASE WHEN ${a} IS NULL THEN ${b} WHEN ${b} IS NULL THEN ${a} WHEN ${a} >= ${b} THEN ${a} ELSE ${b} END FROM (SELECT ${left} AS ${a}, ${right} AS ${b}) AS ${frame})`;\n }).join(\"\");\n}\n\n/** Resolve logical conflict references once, before rendering or executing any row. */\nexport function mapConflictColumns(params: { fragment: SqlFragment; columns: Readonly<Record<string, string>> }): SqlFragment {\n return construct(partsOf(params.fragment).map((part): Part => {\n if (typeof part === \"string\") return part;\n if (\"row\" in part) {\n const column = Object.hasOwn(params.columns, part.column) ? params.columns[part.column] : undefined;\n if (column === undefined) invalid(`Unknown conflict-expression field \"${part.column}\"`);\n return Object.freeze({ ...part, column });\n }\n if (\"greatest\" in part) return Object.freeze({ greatest: Object.freeze(part.greatest.map((fragment) => mapConflictColumns({ ...params, fragment }))) });\n return part;\n }));\n}\n\n/** Render a complete constructed query. */\nexport function compileSql(params: { dialect: SqlDialect; query: SqlFragment }): { text: string; values: unknown[] } {\n const collector = new ParamCollector(params.dialect);\n const text = renderSqlFragment({ dialect: params.dialect, fragment: params.query, collector });\n return { text, values: collector.values };\n}\n\n// ─── Plain templates ────────────────────────────────────────────────\n\n/**\n * A tagged template whose every interpolated value binds as one plain\n * parameter (no fragment, no typed array or JSON-list parameter), captured\n * without building a fragment. Its values are snapshotted when captured, as\n * `sql` snapshots them; `compileSqlTemplate` renders it.\n */\nexport class PlainSqlTemplate {\n readonly strings: TemplateStringsArray;\n readonly values: readonly unknown[];\n constructor(strings: TemplateStringsArray, values: readonly unknown[]) {\n this.strings = strings;\n this.values = values;\n }\n}\n\n/**\n * A plain template's text by strings array, then dialect. Only a frozen\n * strings array is a key: a template literal's is frozen and one object per\n * call site, so its text with plain placeholders never changes; a hand-built\n * array could be edited between calls and is rendered every time.\n */\nconst plainTemplateTexts = new WeakMap<TemplateStringsArray, WeakMap<SqlDialect, string>>();\n\nfunction assertTemplate(strings: TemplateStringsArray, values: readonly unknown[]): void {\n if (!Array.isArray(strings) || !Array.isArray(strings.raw) || strings.length !== values.length + 1 || strings.some((text) => typeof text !== \"string\")) {\n invalid(\"Use sql as a template tag\");\n }\n}\n\n/**\n * What `sql` builds for a template, except that a template whose\n * values all bind as plain parameters comes back as a `PlainSqlTemplate`:\n * the same text and values once compiled, without a fragment per call.\n */\nexport function captureSqlTemplate(params: { strings: TemplateStringsArray; values: readonly unknown[] }): SqlFragment | PlainSqlTemplate {\n const { strings, values } = params;\n for (const value of values) if (isSqlFragment(value)) return template(strings, ...values);\n // A cached text proves its frozen strings array was checked; the value count is checked on every call.\n if (!plainTemplateTexts.has(strings) || strings.length !== values.length + 1) assertTemplate(strings, values);\n const snapshots = values.map((value) => snapshotSqlValue(value));\n let plain = true;\n for (const value of snapshots) if (sqlParameterTransport({ value }).kind !== \"plain\") plain = false;\n if (plain) return new PlainSqlTemplate(strings, snapshots);\n const parts: Part[] = [];\n for (let index = 0; index < strings.length; index++) {\n parts.push(strings[index]!);\n if (index < snapshots.length) parts.push(Object.freeze({ value: snapshots[index] }));\n }\n return construct(parts);\n}\n\n/** `compileSql` over what `captureSqlTemplate` returned. */\nexport function compileSqlTemplate(params: { dialect: SqlDialect; query: SqlFragment | PlainSqlTemplate }): { text: string; values: unknown[] } {\n const { dialect, query } = params;\n if (!(query instanceof PlainSqlTemplate)) return compileSql({ dialect, query });\n const { strings } = query;\n // A fresh copy per compile, as `renderSqlFragment` encodes each value: the\n // driver never holds the captured values.\n const values = query.values.map((value) => snapshotSqlValue(value));\n // Cached only while frozen, and a frozen array stays frozen: a hit needs no check.\n const cached = plainTemplateTexts.get(strings)?.get(dialect);\n if (cached !== undefined) return { text: cached, values };\n const frozen = Object.isFrozen(strings);\n if (!frozen) assertTemplate(strings, query.values);\n let text = strings[0]!;\n for (let index = 1; index < strings.length; index++) text += dialect.placeholder({ index }) + strings[index]!;\n if (frozen) {\n let byDialect = plainTemplateTexts.get(strings);\n if (byDialect === undefined) {\n byDialect = new WeakMap();\n plainTemplateTexts.set(strings, byDialect);\n }\n byDialect.set(dialect, text);\n }\n return { text, values };\n}\n\n/** Whether a nested SQL fragment reads the incoming row (MySQL alias declaration). */\nexport function sqlUsesIncoming(params: { fragment: SqlFragment }): boolean {\n return partsOf(params.fragment).some((part) => typeof part !== \"string\" &&\n ((\"row\" in part && part.row === \"incoming\") || (\"greatest\" in part && part.greatest.some((fragment) => sqlUsesIncoming({ fragment })))));\n}\n",
45
+ "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlExpr } from \"./ast.ts\";\nimport { sql } from \"./composable.ts\";\nimport type { SqlFragment } from \"./composable.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport { renderExpr } from \"./render.ts\";\nimport { renderSqlParameterTransport, sqlParameterTransport, sqlParameterWireValue } from \"./sql-bindings.ts\";\n\n// NUL never appears in rendered SQL text (`sql.text` refuses it), so it can\n// delimit the slots without colliding with the statement's own characters.\nconst SLOT: RegExp = /\\0(\\d+)\\0/;\n\n/**\n * Hands out a NUL-delimited slot per value instead of a dialect placeholder;\n * a value's transport suffix (an enum-array or JSON-list cast) stays text.\n */\nclass SlotCollector extends ParamCollector {\n private readonly target: SqlDialect;\n readonly slots: unknown[] = [];\n\n constructor(dialect: SqlDialect) {\n super(dialect);\n this.target = dialect;\n }\n\n override add(value: unknown): string {\n const transport = sqlParameterTransport({ value });\n if (transport.kind !== \"plain\" && !this.target.capabilities.scalarArrays) throw unsupportedCapability({ dialect: this.target.name, feature: \"scalarArrays\" });\n const wire = sqlParameterWireValue({ value });\n this.slots.push(Array.isArray(wire) && this.target.capabilities.scalarArrays ? arrayLiteral({ values: wire }) : wire);\n return renderSqlParameterTransport({ dialect: this.target, placeholder: `\\0${this.slots.length - 1}\\0`, transport });\n }\n}\n\nfunction quoteElement(text: string): string {\n return `\"${text.replace(/[\"\\\\]/g, (char) => `\\\\${char}`)}\"`;\n}\n\n/**\n * A scalar list as the PostgreSQL array literal every adapter's ORM path binds\n * (`formatArrayParam`): a raw statement hands a JS array to the driver as it\n * is, and not every driver can spell it for the slot's type (an enum list).\n */\nfunction arrayLiteral(params: { values: readonly unknown[] }): string {\n const elements = params.values.map((value) => {\n if (value === null || value === undefined) return \"NULL\";\n if (typeof value === \"number\" || typeof value === \"bigint\" || typeof value === \"boolean\") return String(value);\n if (value instanceof Date) return quoteElement(value.toISOString());\n if (value instanceof Uint8Array) return quoteElement(`\\\\x${Array.from(value, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\")}`);\n if (typeof value === \"string\") return quoteElement(value);\n return quoteElement(JSON.stringify(value));\n });\n return `{${elements.join(\",\")}}`;\n}\n\n/**\n * A compiled boolean expression as an opaque fragment for the caller's own\n * statement: the text the dialect renders, every bound value a fragment\n * value, so the enclosing statement numbers the placeholders.\n */\nexport function exprToFragment(params: { dialect: SqlDialect; expr: SqlExpr }): SqlFragment {\n const collector = new SlotCollector(params.dialect);\n const text = renderExpr({ dialect: params.dialect, expr: params.expr, collector });\n const pieces = text.split(SLOT);\n const strings: string[] = [];\n const values: unknown[] = [];\n for (let index = 0; index < pieces.length; index++) {\n const piece = pieces[index] as string;\n if (index % 2 === 0) strings.push(piece);\n else values.push(collector.slots[Number(piece)]);\n }\n const template = Object.assign([...strings], { raw: [...strings] }) as unknown as TemplateStringsArray;\n return sql(template, ...values);\n}\n",
46
+ "import type { SqlDialect } from \"../dialect.ts\";\n\n/**\n * Compare both JSON trees by decoded key/index paths, node type and atomic value.\n * Object order and JSON escape spelling do not matter; array positions do.\n * Container nodes retain empty-object/array distinctions, and multiplicity stops\n * duplicate object members from disappearing as they would in a set difference.\n * SQL NULL remains unknown. The tree input is guarded against non-JSON scalar\n * text even when SQLite evaluates this expression before the outer type guard.\n * @internal\n */\nexport function renderSqliteJsonEquality(params: { dialect: SqlDialect; left: string; right: string }): string {\n const q = (name: string): string => params.dialect.quoteIdent({ name });\n const values = q(\"__vibe_json_values\");\n const tree = q(\"__vibe_json_tree\");\n const paths = q(\"__vibe_json_paths\");\n const child = q(\"__vibe_json_child\");\n const parent = q(\"__vibe_json_parent\");\n const [side, id, parentId, key, type, atom, path] = [\"side\", \"id\", \"parent\", \"key\", \"type\", \"atom\", \"path\"].map(q);\n const left = `${values}.${q(\"left\")}`;\n const right = `${values}.${q(\"right\")}`;\n return `(SELECT CASE WHEN ${left} IS NULL THEN NULL ELSE NOT EXISTS (`\n + `WITH RECURSIVE ${tree} AS (`\n + `SELECT 1 AS ${side}, ${id}, ${parentId}, ${key}, ${type}, ${atom} FROM json_tree(CASE WHEN json_valid(${left}) THEN ${left} ELSE 'null' END) `\n + `UNION ALL SELECT -1 AS ${side}, ${id}, ${parentId}, ${key}, ${type}, ${atom} FROM json_tree(${right})`\n + `), ${paths} (${side}, ${id}, ${path}, ${type}, ${atom}) AS (`\n + `SELECT ${side}, ${id}, json_array(), ${type}, ${atom} FROM ${tree} WHERE ${parentId} IS NULL `\n + `UNION ALL SELECT ${child}.${side}, ${child}.${id}, json_insert(${parent}.${path}, '$[#]', ${child}.${key}), ${child}.${type}, ${child}.${atom} `\n + `FROM ${tree} AS ${child} JOIN ${paths} AS ${parent} ON ${child}.${side} = ${parent}.${side} AND ${child}.${parentId} = ${parent}.${id}`\n + `) SELECT 1 FROM ${paths} GROUP BY ${path}, CASE WHEN ${type} IN ('integer', 'real') THEN 'number' ELSE ${type} END, ${atom} HAVING SUM(${side}) <> 0`\n + `) END FROM (SELECT ${params.left} AS ${q(\"left\")}, ${params.right} AS ${q(\"right\")}) AS ${values})`;\n}\n",
46
47
  "import type { ColRef } from \"./ast.ts\";\n\n/** PostgreSQL FUNC_MAX_ARGS: each json_build_array call accepts at most 100 values. */\nexport const JSON_TRANSPORT: Readonly<{ chunkSize: number }> = Object.freeze({ chunkSize: 100 });\n\n/** The name visible through a subselect, matching the projection renderer's alias rules. */\nexport function projectionOutputName(params: { column: ColRef }): string {\n const { column } = params;\n return column.alias ?? column.name;\n}\n",
47
- "/**\n * PostgreSQL dialect. Also serves PGlite — the differences are adapter-level\n * (single connection, bundled extension set), not SQL-text-level.\n */\n\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { POSTGRES_CAPABILITIES } from \"../capabilities.ts\";\nimport { assertNoNul } from \"../identifiers.ts\";\n\nexport const postgresDialect: SqlDialect = {\n name: \"postgres\",\n capabilities: POSTGRES_CAPABILITIES,\n\n inArrayStrategy: \"any\",\n tupleInStrategy: \"rowValue\",\n keyListStrategy: \"unnest\",\n keysetSeekStrategy: \"rowValue\",\n keyPageStrategy: \"lateral\",\n lateralJson: { rowArray: \"json_build_array\", arrayAgg: \"json_agg\", emptyArray: \"'[]'::json\", order: \"inAggregate\", timeOfDayAsText: false, requiresUtcDateTimeWire: false },\n relationStrategyDefault: \"join\",\n relationFilterStrategy: \"exists\",\n // Fix lane Q2 (DB-02/DB-07): the key page gains only as an index-only scan;\n // a btree stores NULLs last on ASC, so `desc nulls last` / `asc nulls first` sort the table.\n deferredJoinPage: { minSkip: 1000, requiresCoveringIndex: true },\n nativeNullsOrder: \"high\",\n nullsUnionPage: true,\n timeOfDayInStrategy: \"in\",\n upsertForm: \"onConflict\",\n // Measured on postgres 16.14 (notes-B.md): a batch proposing one conflict key\n // twice raises SQLSTATE 21000 (\"ON CONFLICT DO UPDATE command cannot affect\n // row a second time\") — including when the two keys are only equal under a\n // nondeterministic ICU collation, a char(n) trailing-space pad, `numeric`\n // scale or `uuid` case. The engine compares every proposed pair itself.\n // Text is byte-comparable by default because every collation postgres\n // creates is deterministic unless it was explicitly built with\n // `deterministic = false`: 'e' and 'E' stayed two rows on a default-collation\n // column. `numeric` is the exception the ORM cannot see from the encoded\n // value: '1.0' and '1.00' are one row.\n conflictKeyEquality: {\n foldingScalars: [\"Decimal\"],\n textIsBinaryByDefault: true,\n duplicatesInOneStatement: \"reject\",\n },\n excludedRowRef: { form: \"keyword\", name: \"excluded\" },\n doNothingForm: \"onConflictDoNothing\",\n insensitiveLike: \"ilike\",\n // Postgres `=`/`LIKE` are already byte-sensitive — strict mode is a no-op.\n strictMatchStrategy: \"native\",\n greatestForm: \"native\",\n orderByNullsMode: \"native\",\n offsetRequiresLimit: null,\n likeEscapeClause: null,\n jsonPathMode: \"operators\",\n supportedJsonOps: [\n \"equals\",\n \"exists\",\n \"string_contains\",\n \"string_starts_with\",\n \"string_ends_with\",\n \"array_contains\",\n \"array_starts_with\",\n \"array_ends_with\",\n ],\n // Json params bind as TEXT and the server parses (`$n::text::jsonb`):\n // OID-typed drivers (bun:sql) would re-serialize a bare jsonb-slot param\n // and double-encode the document (JsonParamCell, ast.ts).\n jsonParamCast: \"::text::jsonb\",\n valueCastTypes: Object.freeze({ String: \"TEXT\", Boolean: \"BOOLEAN\", Int: \"INTEGER\", BigInt: \"BIGINT\", Float: \"DOUBLE PRECISION\", Decimal: \"NUMERIC\", DateTime: \"TIMESTAMPTZ\", Json: \"JSONB\", Bytes: \"BYTEA\" }),\n lastInsertIdSql: null,\n // All four strengths and all three wait policies parse and behave on\n // PostgreSQL 18.6 and on PGlite 0.5.4 (PostgreSQL 18.3) — probed, not assumed.\n rowLockSyntax: {\n strengths: Object.freeze({\n update: \"FOR UPDATE\",\n noKeyUpdate: \"FOR NO KEY UPDATE\",\n share: \"FOR SHARE\",\n keyShare: \"FOR KEY SHARE\",\n }),\n wait: Object.freeze({ wait: \"\", nowait: \" NOWAIT\", skipLocked: \" SKIP LOCKED\" }),\n },\n // Transaction-scoped only. The session-scoped family (pg_advisory_lock) is\n // deliberately absent: on a pooled connection its lock outlives the caller.\n advisoryLockFunctions: {\n exclusive: Object.freeze({\n wait: \"pg_catalog.pg_advisory_xact_lock\",\n nowait: \"pg_catalog.pg_try_advisory_xact_lock\",\n }),\n shared: Object.freeze({\n wait: \"pg_catalog.pg_advisory_xact_lock_shared\",\n nowait: \"pg_catalog.pg_try_advisory_xact_lock_shared\",\n }),\n keyCast: Object.freeze({ single: \"::bigint\", pair: \"::int4\" }),\n },\n rowDefaultKeyword: true,\n bulkInsertForm: \"unnest\",\n emptyInsert: { form: \"defaultValues\", conflictClause: true },\n // Data-modifying CTEs (`WITH s AS (UPDATE … RETURNING …) SELECT …`) — one\n // snapshot, one atomic statement; PGlite runs the same engine.\n statementChain: \"dataModifyingCte\",\n paramBudget: 30000,\n\n // A real `boolean` type — `true`/`false` are the literals it stores.\n booleanLiteral: { true: \"true\", false: \"false\" },\n\n quoteIdent({ name }) {\n return `\"${assertNoNul({ name }).replaceAll('\"', '\"\"')}\"`;\n },\n // `standard_conforming_strings` has been on by default since postgres 9.1,\n // so a backslash is an ordinary character and only the quote is doubled.\n quoteStringLiteral({ value }) {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n },\n renderEnumOrdinal({ column }) {\n return column;\n },\n renderEnumMinMax({ fn, column }) {\n return `${fn === \"min\" ? \"MIN\" : \"MAX\"}(${column})`;\n },\n placeholder({ index }) {\n return `$${index}`;\n },\n jsonTextProjection({ expression }): string {\n return `${expression}::text`;\n },\n renderDbNow({ offsetSeconds, collector }) {\n if (offsetSeconds === 0) return \"now()\";\n return `(now() + make_interval(secs => ${collector.add(offsetSeconds)}))`;\n },\n};\n",
48
- "/**\n * MySQL dialect (mysql2 adapter lands in P4).\n *\n * Notes pinned by catalog cases:\n * - No RETURNING → renderer omits it and flags `returning: \"omitted\"`; the\n * runtime re-selects by PK (app-generated ids) or insertId.\n * - Upserts use ON DUPLICATE KEY UPDATE (no conflict-target refinement).\n * - OFFSET requires LIMIT → the documented huge-limit idiom.\n * - No NULLS FIRST/LAST → `col IS NULL` emulation terms.\n * - No `ON CONFLICT ... DO NOTHING` → `ON DUPLICATE KEY UPDATE k = t.k` (a\n * no-op self-assignment on ANY duplicate key). Never `INSERT IGNORE`, which\n * also downgrades NOT NULL, range and foreign-key errors to warnings.\n */\n\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { MYSQL_CAPABILITIES } from \"../capabilities.ts\";\nimport { assertNoNul } from \"../identifiers.ts\";\n\nexport const mysqlDialect: SqlDialect = {\n name: \"mysql\",\n capabilities: MYSQL_CAPABILITIES,\n\n inArrayStrategy: \"expand\",\n tupleInStrategy: \"rowValue\",\n keyListStrategy: \"rowValue\",\n // D-01: the OR is already index ranges here; a row-value inequality scans.\n keysetSeekStrategy: \"or\",\n // Fix lane Q1 (DB-01/DB-03): a lateral page still read every child; EXISTS is a semi-join.\n keyPageStrategy: \"window\",\n // Lane J (wave 3): MySQL 8.0.14+ LATERAL + JSON_ARRAYAGG. JSON_ARRAYAGG has\n // no ORDER BY, so ordered levels carry a ROW_NUMBER() position slot.\n lateralJson: { rowArray: \"JSON_ARRAY\", arrayAgg: \"JSON_ARRAYAGG\", emptyArray: \"JSON_ARRAY()\", order: \"positionSlot\", timeOfDayAsText: true, requiresUtcDateTimeWire: true },\n relationStrategyDefault: \"join\",\n relationFilterStrategy: \"exists\",\n // Fix lane Q2 (DB-02/DB-07): deep OFFSET flips to a table scan from skip ≈ 5 000;\n // the `IS NULL` pre-term of a non-native placement is an expression no index serves.\n deferredJoinPage: { minSkip: 1000, requiresCoveringIndex: false },\n nativeNullsOrder: \"low\",\n nullsUnionPage: true,\n // 8.4.11: `time3_col IN (?, ?)` matches nothing; `=` per value works (26.7 both).\n timeOfDayInStrategy: \"equalities\",\n upsertForm: \"onDuplicateKey\",\n // Measured on mysql 8.4.11, server collation utf8mb4_0900_ai_ci (notes-B.md):\n // a batch proposing 'e' and 'E' stores ONE row and keeps the last one, with\n // no error. The same fold hits accents; `utf8mb4_general_ci` folds a trailing\n // space too (PAD SPACE), and a `DECIMAL(65,30)` key folds '1.0' into '1.00'.\n // A column declaring a `_bin` collation is byte-comparable again: 'e' and 'E'\n // stayed two rows there.\n conflictKeyEquality: {\n foldingScalars: [\"Decimal\"],\n defaultStringMaxLength: 191,\n textIsBinaryByDefault: false,\n // A declared `@collation` can make it byte-comparable again, but only a\n // measured NO PAD one: `SELECT COLLATION_NAME, PAD_ATTRIBUTE FROM\n // information_schema.COLLATIONS` reports 'NO PAD' for exactly `binary` and\n // `utf8mb4_0900_bin`, and 'PAD SPACE' for `utf8mb4_bin` and the 39 other\n // legacy `_bin` collations. Under PAD SPACE the ORM's own upsert statement\n // stored ONE row for a batch proposing 'x' and 'x '. The list the runtime\n // checks against lives in packages/runtime/src/bulk-upsert.ts.\n duplicatesInOneStatement: \"lastWriteWins\",\n },\n // 8.0.19+ row alias. The older `VALUES(col)` function answers with\n // deprecation warning 1287 on this project's 8.4.11 container.\n excludedRowRef: { form: \"rowAlias\", alias: \"new\" },\n doNothingForm: \"duplicateKeyKeep\",\n insensitiveLike: \"lower\",\n // `_ci` collations fold `=` and `LIKE` — strict mode casts the OPERAND to\n // BINARY (byte-wise comparison; CAST form, the unary BINARY operator is\n // deprecated since 8.0.27). Operand-side: no assumption about the column's\n // charset, and the cost (index defeat) is documented in dialect-notes.md.\n strictMatchStrategy: \"binary\",\n // Correlated derived tables need MySQL 8.0.14+ (outer references); 8.4\n // needs each operand in its own scalar subquery (dialect.ts).\n greatestForm: \"wrapped-frame\",\n orderByNullsMode: \"emulate\",\n offsetRequiresLimit: { limitText: \"18446744073709551615\" },\n likeEscapeClause: null,\n // JSON_EXTRACT/JSON_UNQUOTE for scalars and strings; JSON_CONTAINS for\n // array containment; `$[0]` / `$[last]` path elements for the edge ops.\n jsonPathMode: \"mysqlExtract\",\n supportedJsonOps: [\n \"equals\",\n \"exists\",\n \"string_contains\",\n \"string_starts_with\",\n \"string_ends_with\",\n \"array_contains\",\n \"array_starts_with\",\n \"array_ends_with\",\n ],\n // Json transport is already plain text here — no param cast needed.\n jsonParamCast: \"\",\n valueCastTypes: Object.freeze({ String: \"CHAR\", Boolean: \"UNSIGNED\", Int: \"SIGNED\", BigInt: \"SIGNED\", Float: \"DOUBLE\", Decimal: \"DECIMAL(65, 30)\", DateTime: \"DATETIME(3)\", Json: \"JSON\", Bytes: \"BINARY\" }),\n lastInsertIdSql: \"SELECT LAST_INSERT_ID() AS `id`\",\n // Probed on mysql 26.7.0: FOR UPDATE / FOR SHARE, each with NOWAIT or SKIP\n // LOCKED. `FOR NO KEY UPDATE` and `FOR KEY SHARE` are PostgreSQL-only and\n // fail to parse here (errno 1064), so they are absent rather than aliased\n // onto a stronger lock.\n rowLockSyntax: {\n strengths: Object.freeze({ update: \"FOR UPDATE\", share: \"FOR SHARE\" }),\n wait: Object.freeze({ wait: \"\", nowait: \" NOWAIT\", skipLocked: \" SKIP LOCKED\" }),\n },\n // `GET_LOCK` is SESSION-scoped: the probe held one, rolled the transaction\n // back, and the lock was still held. It cannot deliver a transaction-scoped\n // advisory lock, so mysql declares none.\n advisoryLockFunctions: null,\n rowDefaultKeyword: true,\n bulkInsertForm: \"values\",\n emptyInsert: { form: \"emptyRow\" },\n // MySQL CTEs are read-only — no data-modifying steps.\n statementChain: null,\n paramBudget: 10000,\n\n // Booleans store as TINYINT(1); 1/0 is what a comparison against stored rows\n // actually meets, and `TRUE`/`FALSE` are only aliases for them.\n booleanLiteral: { true: \"1\", false: \"0\" },\n\n quoteIdent({ name }) {\n return `\\`${assertNoNul({ name }).replaceAll(\"`\", \"``\")}\\``;\n },\n // Mysql treats BOTH the doubled quote and the backslash as escapes unless the\n // server runs `NO_BACKSLASH_ESCAPES`, which VibeORM never assumes. Verified on\n // mysql 8.4.11: inserting the literal `'a\\\\b'` stores bytes `61 5C 62`, so a\n // single authored backslash MUST be doubled or it eats the next character.\n quoteStringLiteral({ value }) {\n return `'${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"'\", \"''\")}'`;\n },\n renderEnumOrdinal({ column }) {\n return `${column} + 0`;\n },\n renderEnumMinMax({ fn, column, result, when }) {\n const aggregate = fn === \"min\" ? \"MIN\" : \"MAX\";\n const only = (value: string): string => when === undefined ? value : `CASE WHEN ${when} THEN ${value} END`;\n if (result === \"ordinal\") return `${aggregate}(${only(`${column} + 0`)})`;\n // Five digits cover all 65,535 member indexes. Keep the database's own label\n // after the sortable prefix, without schema labels or SQL-mode-dependent escapes.\n return `SUBSTRING(${aggregate}(${only(`CONCAT(LPAD(${column} + 0, 5, '0'), ${column})`)}), 6)`;\n },\n placeholder() {\n return \"?\";\n },\n jsonTextProjection({ expression }): string {\n return `CAST(${expression} AS CHAR)`;\n },\n renderDbNow({ offsetSeconds, collector }) {\n // NOW(6): microsecond precision — assignment to a lower-precision column\n // truncates, matching the driver's own Date serialization precision.\n if (offsetSeconds === 0) return \"NOW(6)\";\n return `DATE_ADD(NOW(6), INTERVAL ${collector.add(offsetSeconds)} SECOND)`;\n },\n};\n",
49
- "/**\n * Dialect registry: the one place a `Dialect` name becomes a `SqlDialect`.\n *\n * Runtime and adapters resolve through this map so nobody re-implements the\n * lookup (and nobody can quietly forget a dialect — the Record type is total).\n */\n\nimport type { Dialect } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { postgresDialect } from \"./postgres.ts\";\nimport { sqliteDialect } from \"./sqlite.ts\";\nimport { mysqlDialect } from \"./mysql.ts\";\n\nexport const SQL_DIALECTS: Readonly<Record<Dialect, SqlDialect>> = {\n postgres: postgresDialect,\n sqlite: sqliteDialect,\n mysql: mysqlDialect,\n};\n\n/** The SQL dialect a dialect name selects. */\nexport function getSqlDialect(params: { dialect: Dialect }): SqlDialect {\n return SQL_DIALECTS[params.dialect];\n}\n",
50
- "/**\n * Key-list membership (`SqlExpr` `keyList`, the public `where: { IN }`):\n * the postgres element type each member's array binds as.\n *\n * Postgres compares `\"col\" = $n` with the parameter typed as the column's\n * type WITHOUT its modifier (measured on postgres 18.6: `timestamptz(3) =\n * '…00.1234'` matches nothing, `numeric(10,2) = '1.234'` matches nothing,\n * `varchar(3) = 'abcd'` matches nothing). The unnest form must compare the\n * same way, so every member binds as `$n::<base type>[]`: a `timestamptz(3)[]`\n * cast would round `.1234` onto the stored `.123` and match a row `=` does not.\n * The base type also keeps the column's own operator and index: `bpchar` for\n * `char(n)` (pad-insensitive like `=`), `citext` (case-insensitive like `=`;\n * a `text[]` member would compare case-sensitively), the native enum's own\n * type, and text collations resolve to the column's collation, as for `=`.\n */\n\nimport { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { ScalarType } from \"@vibeorm/schema\";\nimport type { KeyListMember } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\n\n/** Canonical element type per scalar (the column type when no `@db.*` type is declared). */\nconst SCALAR_ELEMENT_TYPES: Readonly<Record<ScalarType, string | null>> = Object.freeze({\n String: \"text\",\n Boolean: \"bool\",\n Int: \"int4\",\n BigInt: \"int8\",\n Float: \"float8\",\n Decimal: \"numeric\",\n DateTime: \"timestamptz\",\n // Json has no equality operator a key can use; the runtime refuses it first.\n Json: null,\n Bytes: \"bytea\",\n});\n\n/**\n * Declared native base name (lowercase, spaces and modifier removed) → element\n * type. Every Prisma postgres `@db.*` type a key field can carry, plus the\n * catalog spellings `db pull` and hand-written schemas use.\n */\nconst NATIVE_ELEMENT_TYPES: Readonly<Record<string, string>> = Object.freeze({\n text: \"text\",\n varchar: \"varchar\",\n charactervarying: \"varchar\",\n char: \"bpchar\",\n character: \"bpchar\",\n bpchar: \"bpchar\",\n uuid: \"uuid\",\n citext: \"citext\",\n xml: \"xml\",\n inet: \"inet\",\n money: \"money\",\n // Quoted: an unquoted `bit` is the SQL-standard `bit(1)` and refuses `101`.\n bit: \"\\\"bit\\\"\",\n varbit: \"varbit\",\n bitvarying: \"varbit\",\n smallint: \"int2\",\n int2: \"int2\",\n integer: \"int4\",\n int: \"int4\",\n int4: \"int4\",\n bigint: \"int8\",\n int8: \"int8\",\n oid: \"oid\",\n real: \"float4\",\n float4: \"float4\",\n doubleprecision: \"float8\",\n double: \"float8\",\n float8: \"float8\",\n decimal: \"numeric\",\n numeric: \"numeric\",\n boolean: \"bool\",\n bool: \"bool\",\n timestamp: \"timestamp\",\n timestampwithouttimezone: \"timestamp\",\n timestamptz: \"timestamptz\",\n timestampwithtimezone: \"timestamptz\",\n date: \"date\",\n time: \"time\",\n timewithouttimezone: \"time\",\n timetz: \"timetz\",\n timewithtimezone: \"timetz\",\n bytea: \"bytea\",\n});\n\n/**\n * The postgres element type a key-list member's array binds as, or\n * `undefined` when the member has none (Json, or a native type this list does\n * not know). Never throws: a caller deciding whether a key list CAN carry a\n * member (the automatic OR rewrite) asks here; {@link postgresKeyListElementType}\n * is the throwing form the renderer uses.\n */\nexport function postgresKeyListElementTypeOf(params: { dialect: SqlDialect; member: KeyListMember }): string | undefined {\n const { dialect, member } = params;\n if (member.type === \"Enum\") {\n if (member.enumType === undefined) return \"text\";\n const name = dialect.quoteIdent({ name: member.enumType.name });\n return member.enumType.namespace === undefined ? name : `${dialect.quoteIdent({ name: member.enumType.namespace })}.${name}`;\n }\n const native = member.nativeType === undefined\n ? undefined\n : NATIVE_ELEMENT_TYPES[member.nativeType.toLowerCase().replace(/\\([^)]*\\)/g, \"\").replace(/\\s+/g, \"\")];\n const type = member.nativeType === undefined ? SCALAR_ELEMENT_TYPES[member.type] : native;\n return type === null ? undefined : type;\n}\n\n/**\n * The postgres element type a key-list member's array binds as\n * (`$n::<type>[]`), derived from the column's declared type facts.\n *\n * @throws VibeError `VIBE_UNSUPPORTED_CAPABILITY` for a member whose type has\n * no equality a key can use (Json) or a native type this list does not know.\n */\nexport function postgresKeyListElementType(params: { dialect: SqlDialect; member: KeyListMember }): string {\n const { dialect, member } = params;\n const type = postgresKeyListElementTypeOf({ dialect, member });\n if (type === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `the key-list filter (IN) on a ${member.type}${member.nativeType === undefined ? \"\" : ` @db.${member.nativeType}`} member`,\n hint: \"IN binds every member as a typed array; filter this field with equality inside OR instead\",\n });\n }\n return type;\n}\n\n/**\n * Whether a key list must bind its rows as a row-value list of UNTYPED\n * parameters, `(a, b) IN (($1, $2), …)`, instead of typed arrays on the\n * `unnest` strategy: some member is a `DateTime` without a declared native\n * type. Its element type would be `timestamptz`, but such a field may sit on\n * a zone-less `timestamp(3)` column (a Prisma-created database;\n * docs/dialect-notes.md \"DateTime without time zone on postgres\"), where\n * `timestamp = timestamptz` converts the column through the session TimeZone\n * and matches other rows than `\"col\" = $n` (an untyped parameter the server\n * types from the column). The row-value list keeps that typing; PostgreSQL\n * plans it like the OR of conjunctions, so its planning grows with the list.\n * Shared by the renderer and the runtime's render-cache walk.\n */\nexport function keyListBindsUntypedRows(params: { members: readonly KeyListMember[] }): boolean {\n return params.members.some((member) => member.type === \"DateTime\" && member.nativeType === undefined);\n}\n\n// ─── Bulk insert (`InsertStatement.unnest`) ───────────────────────────\n\n/**\n * The cast after a bulk-insert column's array placeholder (`$n::<cast>[]`),\n * or `undefined` when the column has none and the insert must keep VALUES.\n * Never throws: the query builder asks here while deciding admission.\n *\n * Every type the key list knows binds its BASE type, exactly as above — the\n * INSERT's assignment then applies the column's modifier (length, precision,\n * rounding) the way it does for a VALUES parameter. Json is the one addition:\n * it binds through a text slot, `text::jsonb` (`text::json` for `@db.Json`),\n * because PostgreSQL has no assignment cast from text to jsonb and bun:sql's\n * named statements would JSON-encode pre-encoded text bound to a jsonb slot\n * (the `JsonParamCell` rule, per element).\n */\nexport function postgresBulkInsertArrayCastOf(params: { dialect: SqlDialect; member: KeyListMember }): string | undefined {\n const { dialect, member } = params;\n if (member.type === \"Json\") return member.nativeType?.trim().toLowerCase() === \"json\" ? \"text::json\" : \"text::jsonb\";\n return postgresKeyListElementTypeOf({ dialect, member });\n}\n\n/**\n * The throwing form of {@link postgresBulkInsertArrayCastOf}, for the renderer.\n *\n * @throws VibeError `VIBE_UNSUPPORTED_CAPABILITY` for a native type the\n * bulk-insert form does not know.\n */\nexport function postgresBulkInsertArrayCast(params: { dialect: SqlDialect; member: KeyListMember }): string {\n const { dialect, member } = params;\n const cast = postgresBulkInsertArrayCastOf({ dialect, member });\n if (cast === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `a bulk insert binding a ${member.type}${member.nativeType === undefined ? \"\" : ` @db.${member.nativeType}`} column as a typed array`,\n hint: \"the query builder keeps VALUES for this column type\",\n });\n }\n return cast;\n}\n",
51
- "import { localDateCheckName } from \"@vibeorm/schema\";\nimport type { CheckIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\n\n/** The single owned SQLite calendar/domain CHECK; native DATE dialects need no marker. */\nexport function renderLocalDateCheck({ dialect, table, column }: {\n readonly dialect: SqlDialect;\n readonly table: string;\n readonly column: string;\n}): CheckIR | undefined {\n if (dialect.name !== \"sqlite\") return undefined;\n const quoted = dialect.quoteIdent({ name: column });\n // The lower bound is NULL-safe and refuses SQLite's otherwise valid year zero.\n return {\n name: localDateCheckName({ table, column }),\n expression: `${quoted} IS date(${quoted}) AND (${quoted} IS NULL OR ${quoted} >= ${dialect.quoteStringLiteral({ value: \"0001-01-01\" })})`,\n };\n}\n",
52
- "import { DATE_TRUNCATION_UNITS, VibeError, internalError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { DateTruncation } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\n\n// ─── Calendar truncation (groupBy date keys) ──────────────────────\n\n/**\n * The characters a time-zone name may hold: a leading letter, then letters,\n * digits, `_`, `+`, `-` and `/`, at most 64 characters in all. Every IANA name\n * (`Europe/Oslo`, `America/Argentina/Buenos_Aires`, `Etc/GMT+1`) and `UTC`\n * fit. The name renders as an SQL string literal (a bind parameter inside a\n * GROUP BY key would not match the projection's), so this guard is what keeps\n * caller text out of the SQL grammar. Whether the zone EXISTS is the server's\n * decision: PostgreSQL refuses an unknown name with SQLSTATE 22023 (`time zone\n * \"…\" not recognized`) when the statement runs. JavaScript's `Intl` list is\n * not consulted, because its aliases differ from PostgreSQL's.\n */\nconst TIME_ZONE_NAME: RegExp = /^[A-Za-z][A-Za-z0-9_+\\-/]{0,63}$/;\n\n/** Is this value a time-zone name the renderer will spell as a literal? (See {@link TIME_ZONE_NAME}.) */\nexport function isTimeZoneName(params: { readonly value: unknown }): params is { readonly value: string } {\n return typeof params.value === \"string\" && TIME_ZONE_NAME.test(params.value);\n}\n\n/**\n * The start of the period that holds `reference`'s value, in the column's own\n * SQL type, so the field's codec decodes it unchanged:\n *\n * - `timestamptz` → `date_trunc('day', \"col\", 'Europe/Oslo')` — the 3-argument\n * form (PostgreSQL 12 or later) truncates in the named zone, never in the\n * session's `TimeZone`;\n * - `timestamp` (zone-less, UTC wall-clock by contract) →\n * `(date_trunc('day', \"col\" AT TIME ZONE 'UTC', 'Europe/Oslo') AT TIME ZONE 'UTC')`.\n *\n * The unit and the zone are literals, so every site of one key (projection,\n * GROUP BY, ORDER BY) repeats the identical text and binds no parameter.\n */\nexport function renderDateTruncation(params: { readonly dialect: SqlDialect; readonly reference: string; readonly truncation: DateTruncation }): string {\n const { dialect, reference, truncation } = params;\n if (!dialect.capabilities.dateTruncation) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a truncated groupBy key ({ field, truncate, timeZone })\",\n hint: \"only PostgreSQL and PGlite truncate a timestamp in a named time zone — group by the plain field and bucket the rows in code instead\",\n });\n }\n if (!DATE_TRUNCATION_UNITS.includes(truncation.unit)) {\n throw internalError({ message: `unknown date truncation unit ${JSON.stringify(truncation.unit)}` });\n }\n if (!isTimeZoneName({ value: truncation.timeZone })) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `time zone ${JSON.stringify(truncation.timeZone)} is not a time-zone name — use an IANA name such as \"Europe/Oslo\" or \"UTC\"`,\n meta: { timeZone: truncation.timeZone },\n });\n }\n const unit = dialect.quoteStringLiteral({ value: truncation.unit });\n const zone = dialect.quoteStringLiteral({ value: truncation.timeZone });\n switch (truncation.storage) {\n case \"timestamptz\":\n return `date_trunc(${unit}, ${reference}, ${zone})`;\n case \"timestamp\":\n return `(date_trunc(${unit}, ${reference} AT TIME ZONE 'UTC', ${zone}) AT TIME ZONE 'UTC')`;\n default:\n throw internalError({ message: `unknown date truncation storage ${JSON.stringify(truncation.storage)}` });\n }\n}\n",
53
- "/**\n * Column types per dialect: the type migrate creates for a scalar field, in\n * the spelling it compares types by. ONE rule, read by migrate's differ and by\n * the runtime's `describeSchema`, so two fields that describe the same type\n * are two columns migrate would never ALTER into each other.\n *\n * A field without a native type gets its scalar's column type\n * (dialect-matrix §2). A declared `@db.*` type replaces it on PostgreSQL and\n * MySQL unless it IS that type spelled another way. SQLite stores every column\n * by its scalar's storage class and ignores native types.\n */\n\nimport type { Dialect, ScalarType } from \"@vibeorm/schema\";\nimport { mysqlDialect } from \"./dialects/mysql.ts\";\n\n// ─── Scalar column types ──────────────────────────────────────────\n\n/** IR scalar → the PostgreSQL column type migrate creates. */\nexport const POSTGRES_SCALAR_COLUMN_TYPES: Readonly<Record<ScalarType, string>> = Object.freeze({\n String: \"text\",\n Boolean: \"boolean\",\n Int: \"integer\",\n BigInt: \"bigint\",\n Float: \"double precision\",\n Decimal: \"numeric\",\n DateTime: \"timestamptz\",\n Json: \"jsonb\",\n Bytes: \"bytea\",\n});\n\n/** IR scalar → the MySQL column type migrate creates (information_schema spelling). */\nexport const MYSQL_SCALAR_COLUMN_TYPES: Readonly<Record<ScalarType, string>> = Object.freeze({\n String: `varchar(${mysqlDialect.conflictKeyEquality.defaultStringMaxLength})`,\n Boolean: \"tinyint(1)\",\n Int: \"int\",\n BigInt: \"bigint\",\n Float: \"double\",\n Decimal: \"decimal(65,30)\",\n DateTime: \"datetime(3)\",\n Json: \"json\",\n Bytes: \"longblob\",\n});\n\n/** IR scalar → the SQLite storage class migrate declares. */\nexport const SQLITE_SCALAR_STORAGE_CLASSES: Readonly<Record<ScalarType, string>> = Object.freeze({\n String: \"TEXT\",\n Boolean: \"INTEGER\",\n Int: \"INTEGER\",\n BigInt: \"INTEGER\",\n Float: \"REAL\",\n Decimal: \"TEXT\",\n DateTime: \"TEXT\",\n Json: \"TEXT\",\n Bytes: \"BLOB\",\n});\n\n// ─── PostgreSQL spelling ──────────────────────────────────────────\n\n/**\n * Alias map applied to the base name of a native type (everything before the\n * parenthesized modifier) so that schema-declared `@db.*` spellings and\n * catalog-reported names compare equal.\n */\nexport const POSTGRES_NATIVE_ALIASES: Readonly<Record<string, string>> = Object.freeze({\n charactervarying: \"varchar\",\n character: \"char\",\n bpchar: \"char\",\n int: \"integer\",\n int4: \"integer\",\n int2: \"smallint\",\n int8: \"bigint\",\n serial: \"integer\",\n bigserial: \"bigint\",\n bool: \"boolean\",\n float4: \"real\",\n float8: \"doubleprecision\",\n double: \"doubleprecision\",\n doubleprecision: \"doubleprecision\",\n decimal: \"numeric\",\n timestampwithtimezone: \"timestamptz\",\n timestampwithouttimezone: \"timestamp\",\n timewithtimezone: \"timetz\",\n timewithouttimezone: \"time\",\n bitvarying: \"varbit\",\n});\n\n/** Modifiers PostgreSQL applies when none is declared, so the declared and the catalog spelling compare equal (`bit` IS `bit(1)`). */\nconst POSTGRES_IMPLICIT_MODIFIERS: Readonly<Record<string, string>> = Object.freeze({\n bit: \"(1)\",\n});\n\n/**\n * Temporal types whose bare spelling already means precision 6, so an explicit\n * `(6)` is the same type and normalizes to the bare name. `timestamptz` is not\n * here: migrate grandfathers its precisions per scalar\n * ({@link POSTGRES_EXACT_EQUIVALENTS} and its own looser class).\n */\nconst POSTGRES_DEFAULT_PRECISION_SIX: ReadonlySet<string> = new Set([\"timestamp\", \"time\", \"timetz\"]);\n\n/**\n * Normalize a PostgreSQL type string for comparison: lowercase, whitespace\n * stripped, base name de-aliased. `\"VarChar(191)\"` and `\"character\n * varying(191)\"` both become `\"varchar(191)\"`.\n */\nexport function normalizePostgresNativeType(params: { readonly raw: string }): string {\n const compact = params.raw.toLowerCase().replace(/\\s+/g, \"\");\n const match = compact.match(/^([a-z_0-9]+)(\\(.*\\))?(\\[\\])?$/);\n if (match === null) return compact;\n const base = POSTGRES_NATIVE_ALIASES[match[1] as string] ?? (match[1] as string);\n const modifier = POSTGRES_DEFAULT_PRECISION_SIX.has(base) && match[2] === \"(6)\" ? \"\" : match[2] ?? POSTGRES_IMPLICIT_MODIFIERS[base] ?? \"\";\n return `${base}${modifier}${match[3] ?? \"\"}`;\n}\n\n/**\n * Native spellings an explicit declaration compares EQUAL to its scalar's\n * column type without being it: `@db.Timestamptz(6)` is bare `timestamptz`\n * spelled out. Nothing grandfathered: `timestamptz(3)` stays its own type.\n */\nexport const POSTGRES_EXACT_EQUIVALENTS: Readonly<Partial<Record<ScalarType, readonly string[]>>> = Object.freeze({\n DateTime: Object.freeze([\"timestamptz(6)\"]),\n});\n\n// ─── MySQL spelling ───────────────────────────────────────────────\n\nconst MYSQL_NATIVE_ALIASES: Readonly<Record<string, string>> = Object.freeze({\n integer: \"int\",\n dec: \"decimal\",\n numeric: \"decimal\",\n bool: \"tinyint(1)\",\n boolean: \"tinyint(1)\",\n character: \"char\",\n});\n\n/**\n * Normalize a MySQL type string for comparison: lowercase, whitespace\n * stripped, base de-aliased, integer display widths dropped (MySQL 8.0.19+\n * omits them; older catalogs report `int(11)`) — EXCEPT `tinyint(1)`, which is\n * the Boolean marker and must survive normalization.\n */\nexport function normalizeMysqlNativeType(params: { readonly raw: string }): string {\n const compact = params.raw.toLowerCase().replace(/\\s+/g, \"\");\n if (compact === \"tinyint(1)\" || compact === \"bool\" || compact === \"boolean\") return \"tinyint(1)\";\n const match = compact.match(/^([a-z_0-9]+)(\\(.*\\))?(.*)$/);\n if (match === null) return compact;\n const base = MYSQL_NATIVE_ALIASES[match[1] as string] ?? (match[1] as string);\n let modifier = match[2] ?? \"\";\n if (/^(tinyint|smallint|mediumint|int|bigint)$/.test(base)) modifier = \"\";\n return `${base}${modifier}${match[3] ?? \"\"}`;\n}\n\n// ─── The column type ──────────────────────────────────────────────\n\n/**\n * The column type migrate creates for a scalar field on `dialect`, in the\n * spelling it compares types by (an explicit declaration's exact comparison):\n * the same answer for two fields means the same column type. `nativeType` is\n * the field's declared `@db.*` text; for a list field the answer is the\n * element type.\n *\n * - PostgreSQL: `String` and `String @db.Text` are `\"text\"`; `Int`,\n * `@db.Int4` and `@db.Integer` are `\"integer\"`; `Float` and\n * `@db.DoublePrecision` are `\"doubleprecision\"`; `DateTime` and\n * `@db.Timestamptz(6)` are `\"timestamptz\"`, while `@db.Timestamptz(3)` is\n * `\"timestamptz(3)\"`.\n * - MySQL: `String` is `\"varchar(191)\"`, `Boolean` `\"tinyint(1)\"`, display\n * widths dropped (`int(11)` is `\"int\"`).\n * - SQLite: the storage class (`\"TEXT\"`, `\"INTEGER\"`, `\"REAL\"`, `\"BLOB\"`);\n * a native type changes nothing there.\n */\nexport function canonicalColumnType(params: { readonly dialect: Dialect; readonly scalar: ScalarType; readonly nativeType?: string | undefined }): string {\n const { dialect, scalar, nativeType } = params;\n switch (dialect) {\n case \"postgres\": {\n const canonical = normalizePostgresNativeType({ raw: POSTGRES_SCALAR_COLUMN_TYPES[scalar] });\n if (nativeType === undefined) return canonical;\n const declared = normalizePostgresNativeType({ raw: nativeType });\n return declared === canonical || POSTGRES_EXACT_EQUIVALENTS[scalar]?.includes(declared) === true ? canonical : declared;\n }\n case \"mysql\":\n return normalizeMysqlNativeType({ raw: nativeType ?? MYSQL_SCALAR_COLUMN_TYPES[scalar] });\n case \"sqlite\":\n return SQLITE_SCALAR_STORAGE_CLASSES[scalar];\n }\n}\n",
54
- "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { GeneratedColumnIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { renderPostgresGeneratedColumnClause } from \"./dialects/postgres-generated-columns.ts\";\nimport { renderMysqlGeneratedColumnClause } from \"./dialects/mysql-generated-columns.ts\";\nimport { renderSqliteGeneratedColumnClause } from \"./dialects/sqlite-generated-columns.ts\";\n\n/** SQL helper name for the canonical stored generation declaration. */\nexport type GeneratedColumnDeclaration = GeneratedColumnIR;\n\n/** Source evidence; virtual storage is reported for the caller's admission check. */\nexport type ExtractedGeneratedColumn = {\n readonly expression: string;\n readonly storage: \"stored\" | \"virtual\";\n readonly columnSql: string;\n /** Declaration prefix, including any type/charset/collation/nullability qualifiers. */\n readonly typeSql: string;\n};\n\n/** Render trusted physical SQL without interpreting or rewriting its expression. */\nexport function renderGeneratedColumnClause({ dialect, generated }: {\n readonly dialect: SqlDialect;\n readonly generated: GeneratedColumnDeclaration;\n}): string {\n if (!(\"generatedColumns\" in dialect.capabilities) || dialect.capabilities.generatedColumns !== true) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"generatedColumns\" });\n }\n if (generated.storage !== \"stored\") {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"virtualGeneratedColumns\" });\n }\n if (typeof generated.expression !== \"string\" || generated.expression.trim().length === 0 || generated.expression.includes(\"\\0\")) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A generated column requires non-empty, NUL-free SQL\", meta: { reason: \"generated-expression-invalid\" } });\n }\n switch (dialect.name) {\n case \"postgres\": return renderPostgresGeneratedColumnClause({ generated });\n case \"mysql\": return renderMysqlGeneratedColumnClause({ generated });\n case \"sqlite\": return renderSqliteGeneratedColumnClause({ generated });\n }\n}\n",
55
- "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { GeneratedColumnDeclaration } from \"../generated-columns.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/** PostgreSQL stored syntax; the public dispatcher performs declaration admission. */\nexport function renderPostgresGeneratedColumnClause({ generated }: {\n readonly generated: GeneratedColumnDeclaration;\n}): string {\n return `GENERATED ALWAYS AS (${generated.expression}) STORED`;\n}\n\n/** The migration owner creates the desired base context inside the private savepoint. */\nexport type PostgresGeneratedColumnProbe =\n | { readonly operation: \"savepoint\" | \"rollback\" | \"release\"; readonly savepoint: string }\n | { readonly operation: \"add\"; readonly table: QualifiedSqlName; readonly column: string; readonly definition: string };\n\n/** Render pinned-session scratch statements; this helper never executes or manages a session. */\nexport function renderPostgresGeneratedColumnProbe({ dialect, probe }: {\n readonly dialect: SqlDialect;\n readonly probe: PostgresGeneratedColumnProbe;\n}): RenderedQuery {\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"rollbackGeneratedColumnProbe\" });\n const q = ({ name }: { readonly name: string }): string => dialect.quoteIdent({ name });\n let text: string;\n switch (probe.operation) {\n case \"savepoint\": text = `SAVEPOINT ${q({ name: probe.savepoint })}`; break;\n case \"rollback\": text = `ROLLBACK TO SAVEPOINT ${q({ name: probe.savepoint })}`; break;\n case \"release\": text = `RELEASE SAVEPOINT ${q({ name: probe.savepoint })}`; break;\n case \"add\": text = `ALTER TABLE ${q({ name: probe.table.namespace })}.${q({ name: probe.table.name })} ADD COLUMN ${q({ name: probe.column })} ${probe.definition}`; break;\n }\n return { text, values: [], returning: \"none\" };\n}\n\n/** Approved stored-generated to ordinary conversion, retaining the present stored values. */\nexport function renderPostgresDropGeneratedExpression({ dialect, table, column }: {\n readonly dialect: SqlDialect;\n readonly table: QualifiedSqlName;\n readonly column: string;\n}): RenderedQuery {\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"dropGeneratedExpression\" });\n return { text: `ALTER TABLE ${dialect.quoteIdent({ name: table.namespace })}.${dialect.quoteIdent({ name: table.name })} ALTER COLUMN ${dialect.quoteIdent({ name: column })} DROP EXPRESSION`, values: [], returning: \"none\" };\n}\n",
56
- "import { VibeError, internalError, normalizeRowRules, rowRuleGateField, rowRuleIdentities, rowRuleProtectedFields, rowRuleShapeIssue, rowRuleTriggerName, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { FieldIR, ModelIR, QualifiedSqlName, RowRuleEvent, RowRuleIR, SchemaIR, SqlObjectIdentity } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { renderPostgresRowRule } from \"./dialects/postgres-row-rules.ts\";\nimport { renderSqliteRowRule } from \"./dialects/sqlite-row-rules.ts\";\nimport { renderMysqlRowRule } from \"./dialects/mysql-row-rules.ts\";\n\n/** Finalized row-only inputs for the two per-event trigger renderers; not a SQL root export. */\nexport type EventRowRuleContext = {\n readonly model: string;\n readonly table: QualifiedSqlName;\n readonly rule: RowRuleIR;\n readonly triggers: readonly {\n readonly event: RowRuleEvent;\n readonly identity: { readonly kind: \"trigger\"; readonly table: QualifiedSqlName; readonly name: string };\n }[];\n readonly protectedFields: readonly FieldIR[];\n readonly gateField?: FieldIR;\n /** MySQL only: keep a re-created trigger at its earlier action-order position. */\n readonly placement?: Readonly<Record<string, RowRuleTriggerPlacement>>;\n};\n\n/**\n * MySQL `FOLLOWS`/`PRECEDES` position for one rule trigger, keyed by its event\n * trigger name. Disposable references use it to re-create a trigger where it was,\n * so a verification replay never changes the action order it then compares.\n */\nexport type RowRuleTriggerPlacement = { readonly follows: string } | { readonly precedes: string };\n\n/** Parameter-free rule DDL; each function body remains one complete statement. */\nexport type RowRuleStatement = {\n readonly text: string;\n readonly values: readonly unknown[];\n};\n\n/** Dialect-neutral physical output; later dialects may emit several triggers and no function. */\nexport type RenderedRowRule = {\n readonly identities: readonly SqlObjectIdentity[];\n /** Create objects after the final table shape exists, in dependency order. */\n readonly create: readonly RowRuleStatement[];\n /** Drop objects before invalidating table changes, in reverse dependency order. */\n readonly drop: readonly RowRuleStatement[];\n /** Logical fields, not observed catalog dependencies; generated fields are excluded. */\n readonly protectedFields: readonly string[];\n /** OLD's non-NULL activation field; it is also protected against later changes. */\n readonly gateField?: string;\n};\n\n/** Render a canonical declaration against the complete finalized model and authored generated-column evidence. */\nexport function renderRowRule({ schema, model, rule, dialect, placement }: {\n readonly schema: SchemaIR;\n readonly model: ModelIR;\n readonly rule: RowRuleIR;\n readonly dialect: SqlDialect;\n /** MySQL only; other engines have no trigger-order clause. */\n readonly placement?: Readonly<Record<string, RowRuleTriggerPlacement>>;\n}): RenderedRowRule {\n const issue = rowRuleShapeIssue({ value: rule });\n if (issue !== undefined) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: issue, meta: { model: model.name } });\n }\n if (placement !== undefined && Object.keys(placement).length > 0 && dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: dialect.name, feature: \"rowRuleTriggerPlacement\" });\n const normalized = normalizeRowRules({ schema, model, rules: [rule], dialect: dialect.name })[0]!;\n switch (dialect.name) {\n case \"postgres\": {\n const objects = rowRuleIdentities({ schema, model, rule: normalized, dialect: dialect.name });\n const functionIdentity = objects.find((object) => object.role === \"function\")?.identity;\n const triggerIdentity = objects.find((object) => object.role === \"trigger\")?.identity;\n if (functionIdentity?.kind !== \"function\" || triggerIdentity?.kind !== \"trigger\") throw internalError({ message: \"PostgreSQL row rules own one function and one trigger\", meta: { model: model.name, rule: normalized.name } });\n const gate = rowRuleGateField({ rule: normalized });\n const gateField = gate === undefined ? undefined : model.fields.find((field) => field.name === gate);\n return renderPostgresRowRule({\n dialect,\n context: {\n model: model.name, table: triggerIdentity.table, rule: normalized,\n functionIdentity, triggerIdentity: { kind: \"trigger\", table: triggerIdentity.table, name: triggerIdentity.name },\n protectedFields: rowRuleProtectedFields({ schema, model, rule: normalized }),\n ...(gateField === undefined ? {} : { gateField }),\n },\n });\n }\n case \"sqlite\":\n case \"mysql\": {\n const objects = rowRuleIdentities({ schema, model, rule: normalized, dialect: dialect.name });\n const triggers = objects.map(({ role, identity }): EventRowRuleContext[\"triggers\"][number] => {\n if (role !== \"trigger\" || identity.kind !== \"trigger\") throw internalError({ message: \"Event row rules own only triggers\", meta: { model: model.name, rule: normalized.name } });\n const event = ([\"update\", \"delete\"] as const).find((event) => identity.name === rowRuleTriggerName({ rule: normalized, event }));\n if (event === undefined) throw internalError({ message: \"Row-rule identity has no declared event\", meta: { model: model.name, rule: normalized.name, trigger: identity.name } });\n return { event, identity: { kind: \"trigger\", table: identity.table, name: identity.name } };\n });\n const table = triggers[0]?.identity.table;\n if (table === undefined) throw internalError({ message: \"Event row rules require at least one trigger\", meta: { model: model.name, rule: normalized.name } });\n const gate = rowRuleGateField({ rule: normalized });\n const gateField = gate === undefined ? undefined : model.fields.find((field) => field.name === gate);\n const context: EventRowRuleContext = {\n model: model.name, table, rule: normalized, triggers,\n protectedFields: rowRuleProtectedFields({ schema, model, rule: normalized }),\n ...(gateField === undefined ? {} : { gateField }),\n ...(placement === undefined ? {} : { placement }),\n };\n return dialect.name === \"sqlite\" ? renderSqliteRowRule({ dialect, context }) : renderMysqlRowRule({ dialect, context });\n }\n }\n}\n",
57
- "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { FieldIR, QualifiedSqlName, RowRuleIR, SqlObjectIdentity } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedRowRule } from \"../row-rules.ts\";\n\n// ─── Stored-value equality ────────────────────────────────────────\n\nfunction comparison({ dialect, field }: { readonly dialect: SqlDialect; readonly field: FieldIR }): string {\n const column = dialect.quoteIdent({ name: field.dbName ?? field.name });\n const cast = field.type === \"Json\" ? `::pg_catalog.jsonb${field.isList ? \"[]\" : \"\"}` : \"\";\n return `OLD.${column}${cast} IS DISTINCT FROM NEW.${column}${cast}`;\n}\n\n// ─── PostgreSQL physical objects ──────────────────────────────────\n\n/** A finalized PostgreSQL comparison context, supplied by the canonical schema collector. */\nexport type PostgresRowRuleContext = {\n readonly model: string;\n readonly table: QualifiedSqlName;\n readonly rule: RowRuleIR;\n readonly functionIdentity: Extract<SqlObjectIdentity, { readonly kind: \"function\" }>;\n readonly triggerIdentity: { readonly kind: \"trigger\"; readonly table: QualifiedSqlName; readonly name: string };\n readonly protectedFields: readonly FieldIR[];\n readonly gateField?: FieldIR;\n};\n\n/** Emit one ordinary invoker function and an unfiltered BEFORE row trigger; no live objects are taken over. */\nexport function renderPostgresRowRule({ dialect, context }: {\n readonly dialect: SqlDialect;\n readonly context: PostgresRowRuleContext;\n}): RenderedRowRule {\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"postgresRowRules\" });\n const { rule, table, functionIdentity, triggerIdentity, protectedFields, gateField } = context;\n const qualify = ({ name }: { readonly name: QualifiedSqlName }): string => `${dialect.quoteIdent({ name: name.namespace })}.${dialect.quoteIdent({ name: name.name })}`;\n const functionName = qualify({ name: functionIdentity.name });\n const tableName = qualify({ name: table });\n const triggerName = dialect.quoteIdent({ name: triggerIdentity.name });\n const constraint = dialect.quoteStringLiteral({ value: triggerIdentity.name });\n const raise = `RAISE EXCEPTION 'VibeORM row rule refused mutation'\\n${rule.kind === \"appendOnly\" ? \" \" : \" \"}USING ERRCODE = 'check_violation', CONSTRAINT = ${constraint};`;\n let body: string;\n if (rule.kind === \"appendOnly\") {\n body = `BEGIN\\n ${raise}\\nEND;`;\n } else {\n const terms = protectedFields.map((field) => comparison({ dialect, field }));\n if (terms.length === 0) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row rule ${rule.name} has no protected fields`, meta: { model: context.model, rule: rule.name } });\n }\n const condition = gateField === undefined\n ? terms.join(\"\\n OR \")\n : `OLD.${dialect.quoteIdent({ name: gateField.dbName ?? gateField.name })} IS NOT NULL AND (\\n ${terms.join(\"\\n OR \")}\\n )`;\n body = `BEGIN\\n IF ${condition} THEN\\n ${raise}\\n END IF;\\n RETURN NEW;\\nEND;`;\n }\n let marker = \"$vibe_row_rule$\";\n for (let suffix = 1; body.includes(marker); suffix += 1) marker = `$vibe_row_rule_${suffix}$`;\n const createFunction = `CREATE FUNCTION ${functionName}() RETURNS pg_catalog.trigger\\nLANGUAGE plpgsql VOLATILE CALLED ON NULL INPUT SECURITY INVOKER\\nSET search_path = pg_catalog\\nAS ${marker}\\n${body}\\n${marker};`;\n const createTrigger = `CREATE TRIGGER ${triggerName} BEFORE UPDATE${rule.kind === \"appendOnly\" ? \" OR DELETE\" : \"\"} ON ${tableName}\\nFOR EACH ROW EXECUTE FUNCTION ${functionName}();`;\n return {\n identities: [functionIdentity, triggerIdentity],\n create: [{ text: createFunction, values: [] }, { text: createTrigger, values: [] }],\n drop: [{ text: `DROP TRIGGER ${triggerName} ON ${tableName};`, values: [] }, { text: `DROP FUNCTION ${functionName}();`, values: [] }],\n protectedFields: protectedFields.map((field) => field.name),\n ...(gateField === undefined ? {} : { gateField: gateField.name }),\n };\n}\n",
58
- "import { SQLITE_ROW_RULE_ERROR_PREFIX, VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { EventRowRuleContext, RenderedRowRule } from \"../row-rules.ts\";\n\n/** Emit literal-only ABORT diagnostics and one unfiltered BEFORE trigger per event. */\nexport function renderSqliteRowRule({ dialect, context }: {\n readonly dialect: SqlDialect;\n readonly context: EventRowRuleContext;\n}): RenderedRowRule {\n if (dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: dialect.name, feature: \"sqliteRowRules\" });\n const { rule, table, triggers, protectedFields, gateField } = context;\n if (table.namespace !== \"main\") throw unsupportedCapability({ dialect: dialect.name, feature: \"fixedNamespaces\" });\n const terms = protectedFields.map((field) => {\n const column = dialect.quoteIdent({ name: field.dbName ?? field.name });\n return `OLD.${column} IS NOT NEW.${column}`;\n });\n if (rule.kind !== \"appendOnly\" && terms.length === 0) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row rule ${rule.name} has no protected fields`, meta: { model: context.model, rule: rule.name } });\n const condition = rule.kind === \"appendOnly\" ? \"\" : gateField === undefined\n ? `WHEN ${terms.join(\"\\n OR \")}\\n`\n : `WHEN OLD.${dialect.quoteIdent({ name: gateField.dbName ?? gateField.name })} IS NOT NULL AND (\\n ${terms.join(\"\\n OR \")}\\n)\\n`;\n return {\n identities: triggers.map(({ identity }) => identity),\n create: triggers.map(({ event, identity }) => ({\n text: `CREATE TRIGGER ${dialect.quoteIdent({ name: identity.name })} BEFORE ${event.toUpperCase()} ON ${dialect.quoteIdent({ name: table.name })}\\nFOR EACH ROW\\n${condition}BEGIN\\n SELECT RAISE(ABORT, ${dialect.quoteStringLiteral({ value: `${SQLITE_ROW_RULE_ERROR_PREFIX}${identity.name}` })});\\nEND;`,\n values: [],\n })),\n drop: [...triggers].reverse().map(({ identity }) => ({ text: `DROP TRIGGER ${dialect.quoteIdent({ name: identity.name })};`, values: [] })),\n protectedFields: protectedFields.map((field) => field.name),\n ...(gateField === undefined ? {} : { gateField: gateField.name }),\n };\n}\n",
59
- "import { MYSQL_ROW_RULE_MESSAGE_MAX_BYTES, VibeError, mysqlRowRuleMessageByteLength, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { EventRowRuleContext, RenderedRowRule } from \"../row-rules.ts\";\n\nfunction diagnosticLiteral({ name, context, dialect }: {\n readonly name: string;\n readonly context: EventRowRuleContext;\n readonly dialect: SqlDialect;\n}): string {\n const message = `Check constraint '${name}' is violated.`;\n // SIGNAL has a decoded MESSAGE_TEXT bound, not an encoded SQL-literal bound.\n if (mysqlRowRuleMessageByteLength({ triggerName: name }) > MYSQL_ROW_RULE_MESSAGE_MAX_BYTES) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row rule ${context.rule.name} exceeds MySQL's ${MYSQL_ROW_RULE_MESSAGE_MAX_BYTES}-byte diagnostic limit; supply a shorter name stem`, meta: { model: context.model, rule: context.rule.name } });\n // A backslash is data under both ordinary mode and NO_BACKSLASH_ESCAPES.\n if (message.includes(\"\\\\\")) {\n const hex = Array.from(new TextEncoder().encode(message), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n return `_utf8mb4 X'${hex}'`;\n }\n return dialect.quoteStringLiteral({ value: message });\n}\n\n/** Emit mode-safe SIGNAL diagnostics and one unfiltered BEFORE trigger per event. */\nexport function renderMysqlRowRule({ dialect, context }: {\n readonly dialect: SqlDialect;\n readonly context: EventRowRuleContext;\n}): RenderedRowRule {\n if (dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: dialect.name, feature: \"mysqlRowRules\" });\n const { rule, table, triggers, protectedFields, gateField, placement } = context;\n for (const name of Object.keys(placement ?? {})) if (!triggers.some(({ identity }) => identity.name === name)) throw new VibeError({ code: \"VIBE_INTERNAL\", message: \"A MySQL trigger placement names a trigger this rule does not own\", meta: { model: context.model, rule: rule.name, trigger: name } });\n const position = ({ name }: { readonly name: string }): string => {\n const entry = placement?.[name];\n if (entry === undefined) return \"\";\n return \"follows\" in entry ? ` FOLLOWS ${dialect.quoteIdent({ name: entry.follows })}` : ` PRECEDES ${dialect.quoteIdent({ name: entry.precedes })}`;\n };\n const qualify = ({ name }: { readonly name: string }): string => table.namespace === \"public\"\n ? dialect.quoteIdent({ name })\n : `${dialect.quoteIdent({ name: table.namespace })}.${dialect.quoteIdent({ name })}`;\n const terms = protectedFields.map((field) => {\n const column = dialect.quoteIdent({ name: field.dbName ?? field.name });\n return `NOT (OLD.${column} <=> NEW.${column})`;\n });\n if (rule.kind !== \"appendOnly\" && terms.length === 0) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row rule ${rule.name} has no protected fields`, meta: { model: context.model, rule: rule.name } });\n const condition = gateField === undefined ? terms.join(\"\\n OR \")\n : `OLD.${dialect.quoteIdent({ name: gateField.dbName ?? gateField.name })} IS NOT NULL AND (\\n ${terms.join(\"\\n OR \")}\\n )`;\n return {\n identities: triggers.map(({ identity }) => identity),\n create: triggers.map(({ event, identity }) => {\n const signal = `SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO = 3819, MESSAGE_TEXT = ${diagnosticLiteral({ name: identity.name, context, dialect })};`;\n const body = rule.kind === \"appendOnly\" ? ` ${signal}` : ` IF ${condition} THEN\\n ${signal}\\n END IF;`;\n return { text: `CREATE TRIGGER ${qualify({ name: identity.name })} BEFORE ${event.toUpperCase()} ON ${qualify({ name: table.name })}\\nFOR EACH ROW${position({ name: identity.name })}\\nBEGIN\\n${body}\\nEND;`, values: [] };\n }),\n drop: [...triggers].reverse().map(({ identity }) => ({ text: `DROP TRIGGER ${qualify({ name: identity.name })};`, values: [] })),\n protectedFields: protectedFields.map((field) => field.name),\n ...(gateField === undefined ? {} : { gateField: gateField.name }),\n };\n}\n",
60
- "import type { SqlDialect } from \"../dialect.ts\";\n\n/**\n * Compare both JSON trees by decoded key/index paths, node type and atomic value.\n * Object order and JSON escape spelling do not matter; array positions do.\n * Container nodes retain empty-object/array distinctions, and multiplicity stops\n * duplicate object members from disappearing as they would in a set difference.\n * SQL NULL remains unknown. The tree input is guarded against non-JSON scalar\n * text even when SQLite evaluates this expression before the outer type guard.\n */\nexport function renderSqliteJsonEquality(params: { dialect: SqlDialect; left: string; right: string }): string {\n const q = (name: string): string => params.dialect.quoteIdent({ name });\n const values = q(\"__vibe_json_values\");\n const tree = q(\"__vibe_json_tree\");\n const paths = q(\"__vibe_json_paths\");\n const child = q(\"__vibe_json_child\");\n const parent = q(\"__vibe_json_parent\");\n const [side, id, parentId, key, type, atom, path] = [\"side\", \"id\", \"parent\", \"key\", \"type\", \"atom\", \"path\"].map(q);\n const left = `${values}.${q(\"left\")}`;\n const right = `${values}.${q(\"right\")}`;\n return `(SELECT CASE WHEN ${left} IS NULL THEN NULL ELSE NOT EXISTS (`\n + `WITH RECURSIVE ${tree} AS (`\n + `SELECT 1 AS ${side}, ${id}, ${parentId}, ${key}, ${type}, ${atom} FROM json_tree(CASE WHEN json_valid(${left}) THEN ${left} ELSE 'null' END) `\n + `UNION ALL SELECT -1 AS ${side}, ${id}, ${parentId}, ${key}, ${type}, ${atom} FROM json_tree(${right})`\n + `), ${paths} (${side}, ${id}, ${path}, ${type}, ${atom}) AS (`\n + `SELECT ${side}, ${id}, json_array(), ${type}, ${atom} FROM ${tree} WHERE ${parentId} IS NULL `\n + `UNION ALL SELECT ${child}.${side}, ${child}.${id}, json_insert(${parent}.${path}, '$[#]', ${child}.${key}), ${child}.${type}, ${child}.${atom} `\n + `FROM ${tree} AS ${child} JOIN ${paths} AS ${parent} ON ${child}.${side} = ${parent}.${side} AND ${child}.${parentId} = ${parent}.${id}`\n + `) SELECT 1 FROM ${paths} GROUP BY ${path}, CASE WHEN ${type} IN ('integer', 'real') THEN 'number' ELSE ${type} END, ${atom} HAVING SUM(${side}) <> 0`\n + `) END FROM (SELECT ${params.left} AS ${q(\"left\")}, ${params.right} AS ${q(\"right\")}) AS ${values})`;\n}\n",
61
48
  "import { assertSqlNamespace, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { Dialect } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport type { SqlStatement, TableRef } from \"../ast.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport type { PostgresExplainOptions, PostgresWorkloadQuery } from \"./postgres-diagnostics.ts\";\n\n/** Fixed, parameterless diagnostics whose text never varies. */\nexport type FixedDiagnosticQuery = \"postgresJsonWire\" | \"postgresServerVersion\" | \"sqliteTriggers\";\n\n/** One table of row capture's readiness read: the table as write statements name it, and the columns capture returns. */\nexport type CaptureReadinessTable = { readonly table: TableRef; readonly columns: readonly string[] };\n\n/**\n * Fixed diagnostic queries; execution and result interpretation belong to callers.\n *\n * Four variants, discriminated by `query`:\n * - a fixed transport/catalog probe,\n * - row capture's readiness read over the tables of one spec,\n * - `postgresExplain`, which wraps another statement (EPIC 5),\n * - a read-only PostgreSQL workload/catalog read (EPIC 5).\n */\nexport type DiagnosticStatement =\n | { readonly kind: \"diagnostic\"; readonly query: FixedDiagnosticQuery }\n | { readonly kind: \"diagnostic\"; readonly query: \"postgresCaptureReadiness\"; readonly tables: readonly CaptureReadinessTable[] }\n | {\n readonly kind: \"diagnostic\";\n readonly query: \"postgresExplain\";\n readonly statement: SqlStatement;\n readonly options?: PostgresExplainOptions;\n }\n | {\n readonly kind: \"diagnostic\";\n readonly query: PostgresWorkloadQuery;\n readonly schema?: string;\n readonly table?: string;\n readonly limit?: number;\n readonly key?: string;\n readonly value?: string | null;\n };\n\nconst QUERIES: Readonly<Record<FixedDiagnosticQuery, { readonly dialect: Dialect; readonly text: string }>> = Object.freeze({\n postgresJsonWire: { dialect: \"postgres\", text: `SELECT '{\"__vibeorm\":1}'::jsonb AS \"probe\"` },\n postgresServerVersion: { dialect: \"postgres\", text: `SELECT pg_catalog.current_setting('server_version_num') AS \"serverVersionNum\"` },\n sqliteTriggers: { dialect: \"sqlite\", text: \"SELECT name, tbl_name, sql FROM sqlite_master WHERE type = 'trigger'\" },\n});\n\n/** Render a diagnostic only on the dialect whose transport or catalog it describes. */\nexport function renderDiagnostic(params: { dialect: SqlDialect; query: FixedDiagnosticQuery }): RenderedQuery {\n const query = QUERIES[params.query];\n if (params.dialect.name !== query.dialect) {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: params.query, hint: `this diagnostic requires ${query.dialect}` });\n }\n return { text: query.text, values: [], returning: \"none\" };\n}\n\n/** True for the fixed probes; everything else is the capture readiness read or an EPIC 5 PostgreSQL diagnostic. */\nexport function isFixedDiagnostic(params: { query: DiagnosticStatement[\"query\"] }): params is { query: FixedDiagnosticQuery } {\n return Object.hasOwn(QUERIES, params.query);\n}\n\n// ─── Row capture readiness ────────────────────────────────────────\n\n/**\n * One row per requested table, in request order. `rules`: a rewrite rule on\n * the table (read from `pg_rewrite`: `pg_class.relhasrules` stays true after\n * the last rule is dropped). `rowSecurity`: row-level security applies to the\n * current role (`row_security_active`). `missing` / `unreadable`: requested\n * columns the table lacks, and those the current role may not SELECT, as text\n * array literals (NULL when none).\n */\nconst CAPTURE_READINESS_SQL = `SELECT pg_catalog.current_setting('server_version_num') AS \"serverVersionNum\", t.\"entry\" AS \"entry\", c.oid IS NOT NULL AS \"found\", EXISTS (SELECT 1 FROM pg_catalog.pg_rewrite r WHERE r.ev_class = c.oid) AS \"rules\", COALESCE(pg_catalog.row_security_active(c.oid), false) AS \"rowSecurity\", (SELECT pg_catalog.array_agg(k.name)::text FROM pg_catalog.json_array_elements_text(t.\"columns\") AS k(name) WHERE NOT EXISTS (SELECT 1 FROM pg_catalog.pg_attribute a WHERE a.attrelid = c.oid AND a.attname = k.name AND a.attnum > 0 AND NOT a.attisdropped)) AS \"missing\", (SELECT pg_catalog.array_agg(k.name)::text FROM pg_catalog.json_array_elements_text(t.\"columns\") AS k(name) JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid AND a.attname = k.name AND a.attnum > 0 AND NOT a.attisdropped WHERE NOT pg_catalog.has_column_privilege(c.oid, a.attnum, 'SELECT')) AS \"unreadable\" FROM pg_catalog.json_to_recordset(%TABLES%::text::json) AS t(\"entry\" integer, \"table\" text, \"columns\" json) LEFT JOIN pg_catalog.pg_class c ON c.oid = pg_catalog.to_regclass(t.\"table\") ORDER BY t.\"entry\"`;\n\n/**\n * Row capture's readiness read (PostgreSQL): the server version, and for each\n * captured table what would make its `RETURNING` change a write's outcome.\n * One statement with one JSON parameter, bound as text and cast by the server\n * (bun:sql re-encodes a parameter it resolves as JSON); `to_regclass` resolves\n * each table from the same quoted name the write statements use\n * (schema-qualified when the model has a namespace, else through `search_path`).\n */\nexport function renderCaptureReadiness(params: { dialect: SqlDialect; tables: readonly CaptureReadinessTable[] }): RenderedQuery {\n const { dialect, tables } = params;\n if (dialect.name !== \"postgres\") {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"postgresCaptureReadiness\", hint: \"row capture reads RETURNING old/new, PostgreSQL 18 or newer\" });\n }\n const entries = tables.map((entry, index) => {\n const { name, namespace } = entry.table;\n if (namespace !== undefined) assertSqlNamespace({ namespace, dialect: dialect.name });\n const relation = dialect.quoteIdent({ name });\n return { entry: index, table: namespace === undefined ? relation : `${dialect.quoteIdent({ name: namespace })}.${relation}`, columns: [...entry.columns] };\n });\n const collector = new ParamCollector(dialect);\n return { text: CAPTURE_READINESS_SQL.replace(\"%TABLES%\", collector.add(JSON.stringify(entries))), values: collector.values, returning: \"none\" };\n}\n",
62
49
  "/**\n * PostgreSQL query-diagnostic SQL (EPIC 5).\n *\n * Two kinds of text live here and nowhere else:\n *\n * - the `EXPLAIN` wrapper, which prefixes an already-rendered statement and\n * keeps its placeholders and its parameters intact — a plan is never taken\n * over SQL with values inlined into the text;\n * - read-only catalog and statistics reads used to interpret a plan.\n *\n * What this module deliberately cannot express: `CREATE EXTENSION`,\n * `pg_stat_statements_reset()`, `ALTER SYSTEM`, `SET` outside a caller's own\n * transaction, and `CREATE INDEX`. Diagnostics observe a server; they never\n * change one.\n */\n\nimport { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n// ─── EXPLAIN ──────────────────────────────────────────────────────\n\n/**\n * `EXPLAIN` options. `analyze` EXECUTES the statement — the runtime gates it\n * behind an explicit confirmation, refuses writes and multi-statement text,\n * and warns; the renderer only writes the text it is asked for.\n */\nexport type PostgresExplainOptions = {\n /** Run the statement and report observed rows and milliseconds. EXECUTES SQL. */\n readonly analyze?: boolean;\n /** Buffer accounting; only meaningful once the statement actually ran. */\n readonly buffers?: boolean;\n readonly verbose?: boolean;\n readonly settings?: boolean;\n};\n\n/**\n * Wrap a rendered statement in `EXPLAIN (…)`. Option order is fixed so the\n * text is stable and reviewable; `FORMAT JSON` is always present because the\n * parser reads the structured form, never the human text.\n */\nexport function renderPostgresExplain(params: {\n dialect: SqlDialect;\n query: RenderedQuery;\n options?: PostgresExplainOptions;\n}): RenderedQuery {\n const { dialect, query, options } = params;\n requirePostgres({ dialect, feature: \"query plan inspection (EXPLAIN)\" });\n const parts: string[] = [];\n if (options?.analyze === true) parts.push(\"ANALYZE\");\n parts.push(\"FORMAT JSON\");\n if (options?.verbose === true) parts.push(\"VERBOSE\");\n if (options?.buffers === true) parts.push(\"BUFFERS\");\n if (options?.settings === true) parts.push(\"SETTINGS\");\n return { text: `EXPLAIN (${parts.join(\", \")}) ${query.text}`, values: [...query.values], returning: \"none\" };\n}\n\n// ─── Read-only workload and catalog reads ─────────────────────────\n\n/** The closed set of read-only diagnostic reads. Every one of them is a SELECT. */\nexport type PostgresWorkloadQuery =\n | \"planContext\"\n | \"statementExtension\"\n | \"statementInfo\"\n | \"statementSnapshot\"\n | \"indexes\"\n | \"tableStats\"\n | \"sessionBegin\"\n | \"sessionReadOnly\"\n | \"sessionCommit\"\n | \"sessionRollback\"\n | \"setContext\";\n\n/** The exact SQL text of every read-only diagnostic read, for statement-level routing in tests. */\nexport const POSTGRES_DIAGNOSTIC_SQL: Readonly<Record<PostgresWorkloadQuery, string>> = Object.freeze({\n planContext: `SELECT current_user::text AS \"currentUser\", session_user::text AS \"sessionUser\", r.rolsuper AS \"superuser\", r.rolbypassrls AS \"bypassRls\", pg_catalog.current_setting('server_version_num') AS \"serverVersionNum\", pg_catalog.current_database()::text AS \"database\" FROM pg_catalog.pg_roles r WHERE r.rolname = current_user`,\n\n statementExtension: `SELECT (SELECT e.extversion FROM pg_catalog.pg_extension e WHERE e.extname = 'pg_stat_statements') AS \"installedVersion\", EXISTS (SELECT 1 FROM pg_catalog.pg_available_extensions a WHERE a.name = 'pg_stat_statements') AS \"available\", (SELECT n.nspname::text FROM pg_catalog.pg_extension e JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace WHERE e.extname = 'pg_stat_statements') AS \"schema\", pg_catalog.current_setting('server_version_num') AS \"serverVersionNum\", pg_catalog.pg_has_role(current_user, 'pg_read_all_stats', 'MEMBER') AS \"readAllStats\", current_user::text AS \"currentUser\"`,\n\n // %SCHEMA% is substituted with dialect.quoteIdent — never with a parameter:\n // the extension's schema is an identifier, and PostgreSQL takes no parameter\n // in a FROM clause.\n statementInfo: `SELECT i.stats_reset::text AS \"statsReset\" FROM %SCHEMA%.pg_stat_statements_info i`,\n\n statementSnapshot: `SELECT s.queryid::text AS \"queryId\", s.query AS \"query\", s.calls AS \"calls\", s.total_exec_time AS \"totalExecTimeMs\", s.mean_exec_time AS \"meanExecTimeMs\", s.min_exec_time AS \"minExecTimeMs\", s.max_exec_time AS \"maxExecTimeMs\", s.rows AS \"rows\", s.shared_blks_hit AS \"sharedBlocksHit\", s.shared_blks_read AS \"sharedBlocksRead\", s.temp_blks_read AS \"tempBlocksRead\", s.temp_blks_written AS \"tempBlocksWritten\" FROM %SCHEMA%.pg_stat_statements s JOIN pg_catalog.pg_database d ON d.oid = s.dbid WHERE d.datname = pg_catalog.current_database() ORDER BY s.total_exec_time DESC LIMIT %LIMIT%`,\n\n indexes: `SELECT i.relname::text AS \"index\", pg_catalog.pg_get_indexdef(x.indexrelid) AS \"definition\", x.indisunique AS \"unique\", x.indisprimary AS \"primary\", x.indisvalid AS \"valid\", pg_catalog.pg_relation_size(x.indexrelid) AS \"indexBytes\" FROM pg_catalog.pg_index x JOIN pg_catalog.pg_class c ON c.oid = x.indrelid JOIN pg_catalog.pg_class i ON i.oid = x.indexrelid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = %SCHEMA_PARAM% AND c.relname = %TABLE_PARAM% ORDER BY i.relname`,\n\n // Transaction control for a diagnostic session. The plan and the context that\n // shapes it must sit in ONE transaction, and the executing mode runs inside a\n // read-only transaction — defence in depth, NOT a proof of safety (a SELECT\n // can still call a function with side effects).\n sessionBegin: \"BEGIN\",\n sessionReadOnly: \"SET TRANSACTION READ ONLY\",\n sessionCommit: \"COMMIT\",\n sessionRollback: \"ROLLBACK\",\n\n // The same transaction-local settings the client binds for native RLS, with\n // the same `vibeorm.` prefix and the same `is_local = true`: a plan taken\n // under different settings is a plan of a different query.\n setContext: `SELECT pg_catalog.set_config(%KEY%, %VALUE%, true)`,\n\n tableStats: `SELECT c.reltuples::float8 AS \"estimatedRows\", c.relpages::bigint AS \"pages\", pg_catalog.pg_table_size(c.oid) AS \"tableBytes\", c.relrowsecurity AS \"rlsEnabled\", c.relforcerowsecurity AS \"rlsForced\", (SELECT s.last_analyze::text FROM pg_catalog.pg_stat_all_tables s WHERE s.relid = c.oid) AS \"lastAnalyze\", (SELECT s.last_autoanalyze::text FROM pg_catalog.pg_stat_all_tables s WHERE s.relid = c.oid) AS \"lastAutoAnalyze\" FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = %SCHEMA_PARAM% AND c.relname = %TABLE_PARAM%`,\n});\n\n/** Bounds on the workload snapshot; an unbounded diagnostic read is not a diagnostic. */\nexport const POSTGRES_WORKLOAD_LIMITS: { readonly minLimit: number; readonly maxLimit: number } = Object.freeze({\n minLimit: 1,\n maxLimit: 1000,\n});\n\nfunction requirePostgres(params: { dialect: SqlDialect; feature: string }): void {\n if (params.dialect.name !== \"postgres\") {\n throw unsupportedCapability({\n dialect: params.dialect.name,\n feature: params.feature,\n hint: \"plan inspection and workload statistics are PostgreSQL-shaped; portable operation tracing works on every dialect\",\n });\n }\n}\n\n/**\n * Render one read-only diagnostic read. Identifiers (the extension's schema)\n * go through `dialect.quoteIdent`; every value goes through a\n * {@link ParamCollector}, so no caller string is ever concatenated into SQL.\n */\nexport function renderPostgresWorkload(params: {\n dialect: SqlDialect;\n query: PostgresWorkloadQuery;\n /** Extension schema (statementInfo/statementSnapshot) or table schema (indexes/tableStats). */\n schema?: string;\n table?: string;\n limit?: number;\n /** Fully-qualified setting name for `setContext` (the caller applies the prefix). */\n key?: string;\n /** Setting value for `setContext`; `null` binds the empty string, which reads as absent. */\n value?: string | null;\n}): RenderedQuery {\n const { dialect, query, schema, table, limit } = params;\n requirePostgres({ dialect, feature: `the \"${query}\" diagnostic read` });\n const collector = new ParamCollector(dialect);\n let text = POSTGRES_DIAGNOSTIC_SQL[query];\n\n if (query === \"statementInfo\" || query === \"statementSnapshot\") {\n text = text.replace(\"%SCHEMA%\", dialect.quoteIdent({ name: requireArg({ value: schema, name: \"schema\", query }) }));\n }\n if (query === \"statementSnapshot\") {\n const bounded = limit ?? 20;\n if (!Number.isInteger(bounded) || bounded < POSTGRES_WORKLOAD_LIMITS.minLimit || bounded > POSTGRES_WORKLOAD_LIMITS.maxLimit) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `workload snapshot limit must be an integer between ${POSTGRES_WORKLOAD_LIMITS.minLimit} and ${POSTGRES_WORKLOAD_LIMITS.maxLimit}, got ${String(limit)}`,\n meta: { limit },\n });\n }\n text = text.replace(\"%LIMIT%\", collector.add(bounded));\n }\n if (query === \"setContext\") {\n text = text\n .replace(\"%KEY%\", collector.add(requireArg({ value: params.key, name: \"key\", query })))\n .replace(\"%VALUE%\", collector.add(params.value ?? \"\"));\n }\n if (query === \"indexes\" || query === \"tableStats\") {\n text = text\n .replace(\"%SCHEMA_PARAM%\", collector.add(requireArg({ value: schema, name: \"schema\", query })))\n .replace(\"%TABLE_PARAM%\", collector.add(requireArg({ value: table, name: \"table\", query })));\n }\n return { text, values: collector.values, returning: \"none\" };\n}\n\nfunction requireArg(params: { value: string | undefined; name: string; query: PostgresWorkloadQuery }): string {\n const { value, name, query } = params;\n if (value === undefined || value.length === 0) {\n throw new VibeError({\n code: \"VIBE_CONFIG\",\n message: `the \"${query}\" diagnostic read requires a ${name}`,\n meta: { query, argument: name },\n });\n }\n return value;\n}\n",
63
- "/** PostgreSQL readiness catalog reads and temporary-clone DDL. Runtime owns execution order. */\nimport { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport { NATIVE_RLS } from \"./postgres-rls.ts\";\n\n/** Throwaway policy identity; never installed on a live table by readiness. */\nexport const NATIVE_RLS_PROBE_POLICY: \"vibeorm_probe\" = \"vibeorm_probe\";\n\n/** The eight independent catalog reads, folded into one statement by `catalog`. */\nconst CATALOG_READS: {\n readonly identity: string;\n readonly elevatedRoles: string;\n readonly schemaControl: string;\n readonly tables: string;\n readonly policies: string;\n readonly views: string;\n readonly routines: string;\n readonly triggers: string;\n} = Object.freeze({\n identity: `SELECT current_user::text AS \"currentUser\",\n session_user::text AS \"sessionUser\",\n r.rolsuper AS \"super\",\n r.rolbypassrls AS \"bypassRls\",\n r.rolcreatedb AS \"createDb\",\n r.rolcreaterole AS \"createRole\",\n pg_catalog.current_setting('server_version_num') AS \"serverVersionNum\",\n pg_catalog.pg_backend_pid()::text AS \"backendPid\",\n pg_catalog.pg_postmaster_start_time()::text AS \"instanceStart\",\n (SELECT a.backend_start::text FROM pg_catalog.pg_stat_activity a WHERE a.pid = pg_catalog.pg_backend_pid()) AS \"backendStart\",\n pg_catalog.has_database_privilege(current_user, pg_catalog.current_database(), 'TEMP') AS \"tempPrivilege\"\nFROM pg_catalog.pg_roles r\nWHERE r.rolname = current_user`,\n\n // Membership is the RECURSIVE role graph: pg_has_role(..., 'MEMBER') is true\n // for indirect membership and for NOINHERIT roles the runtime could SET ROLE\n // into. Predefined pg_* roles are flagged wholesale — pg_execute_server_program,\n // pg_read_server_files and pg_write_server_files reach the host even with\n // rolbypassrls = false, and pg_database_owner owns the public schema.\n elevatedRoles: `SELECT r.rolname::text AS \"role\",\n r.rolsuper AS \"super\",\n r.rolbypassrls AS \"bypassRls\",\n r.rolcreaterole AS \"createRole\",\n r.rolcreatedb AS \"createDb\"\nFROM pg_catalog.pg_roles r\nWHERE r.rolname <> current_user\n AND pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND (r.rolsuper OR r.rolbypassrls OR r.rolcreaterole OR r.rolcreatedb OR r.rolname LIKE 'pg\\\\_%')\nORDER BY r.rolname`,\n\n // Owning the schema means DROP SCHEMA ... CASCADE reaches every protected\n // table inside it; owning the database reaches the schema.\n schemaControl: `SELECT n.nspname::text AS \"schema\",\n pg_catalog.pg_get_userbyid(n.nspowner)::text AS \"owner\",\n pg_catalog.pg_has_role(current_user, n.nspowner, 'MEMBER') AS \"ownerAccess\",\n EXISTS (\n SELECT 1 FROM pg_catalog.pg_roles r\n WHERE pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND pg_catalog.has_schema_privilege(r.oid, n.oid, 'CREATE')\n ) AS \"create\",\n pg_catalog.current_database()::text AS \"database\",\n pg_catalog.pg_get_userbyid(d.datdba)::text AS \"databaseOwner\",\n pg_catalog.pg_has_role(current_user, d.datdba, 'MEMBER') AS \"databaseOwnerAccess\"\nFROM pg_catalog.pg_namespace n\nJOIN pg_catalog.pg_database d ON d.datname = pg_catalog.current_database()\nWHERE n.nspname = $1`,\n\n // ownerAccess covers direct ownership, inherited membership and SET ROLE\n // reach alike. TRUNCATE is checked for every role the runtime can reach,\n // because has_table_privilege(current_user, ...) alone misses a privilege\n // held by a NOINHERIT role the runtime may SET ROLE into.\n tables: `SELECT c.relname::text AS \"table\",\n c.relrowsecurity AS \"rlsEnabled\",\n c.relforcerowsecurity AS \"rlsForced\",\n pg_catalog.pg_get_userbyid(c.relowner)::text AS \"owner\",\n pg_catalog.pg_has_role(current_user, c.relowner, 'MEMBER') AS \"ownerAccess\",\n EXISTS (\n SELECT 1 FROM pg_catalog.pg_roles r\n WHERE pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND pg_catalog.has_table_privilege(r.oid, c.oid, 'TRUNCATE')\n ) AS \"truncate\"\nFROM pg_catalog.pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname = $1 AND c.relkind IN ('r', 'p')\nORDER BY c.relname`,\n\n policies: `SELECT c.relname::text AS \"table\",\n p.polname::text AS \"name\",\n p.polpermissive AS \"permissive\",\n p.polcmd::text AS \"command\",\n (p.polroles = '{0}'::oid[]) AS \"toPublic\",\n (p.polqual IS NOT NULL) AS \"hasUsing\",\n (p.polwithcheck IS NOT NULL) AS \"hasWithCheck\"\nFROM pg_catalog.pg_policy p\nJOIN pg_catalog.pg_class c ON c.oid = p.polrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname = $1\nORDER BY c.relname, p.polname`,\n\n // Only objects this role can actually reach are reported.\n views: `SELECT n.nspname::text AS \"schema\",\n c.relname::text AS \"name\",\n pg_catalog.pg_get_userbyid(c.relowner)::text AS \"owner\",\n (c.relkind = 'm') AS \"materialized\",\n (COALESCE((\n SELECT o.option_value FROM pg_catalog.pg_options_to_table(c.reloptions) AS o\n WHERE o.option_name = 'security_invoker'\n ), 'false') = 'true') AS \"securityInvoker\"\nFROM pg_catalog.pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname NOT IN ('pg_catalog', 'information_schema')\n AND c.relkind IN ('v', 'm')\n AND EXISTS (\n SELECT 1 FROM pg_catalog.pg_roles r\n WHERE pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND pg_catalog.has_schema_privilege(r.oid, n.oid, 'USAGE')\n AND (pg_catalog.has_table_privilege(r.oid, c.oid, 'SELECT')\n OR pg_catalog.has_any_column_privilege(r.oid, c.oid, 'SELECT'))\n )\nORDER BY n.nspname, c.relname`,\n\n routines: `SELECT n.nspname::text AS \"schema\",\n p.proname::text AS \"name\",\n pg_catalog.pg_get_userbyid(p.proowner)::text AS \"owner\"\nFROM pg_catalog.pg_proc p\nJOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\nWHERE n.nspname NOT IN ('pg_catalog', 'information_schema')\n AND p.prosecdef\n AND EXISTS (\n SELECT 1 FROM pg_catalog.pg_roles r\n WHERE pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND pg_catalog.has_schema_privilege(r.oid, n.oid, 'USAGE')\n AND pg_catalog.has_function_privilege(r.oid, p.oid, 'EXECUTE')\n )\nORDER BY n.nspname, p.proname`,\n\n triggers: `SELECT c.relname::text AS \"table\",\n t.tgname::text AS \"name\",\n f.proname::text AS \"function\",\n pg_catalog.pg_get_userbyid(f.proowner)::text AS \"owner\",\n f.prosecdef AS \"securityDefiner\"\nFROM pg_catalog.pg_trigger t\nJOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nJOIN pg_catalog.pg_proc f ON f.oid = t.tgfoid\nWHERE n.nspname = $1\n AND NOT t.tgisinternal\n AND f.prosecdef\nORDER BY c.relname, t.tgname`,\n});\n\n/** The reads `catalog` folds, in the order their JSON columns appear. */\nexport const RLS_READINESS_CATALOG_KEYS: readonly (\"identity\" | \"elevatedRoles\" | \"schemaControl\" | \"tables\" | \"policies\" | \"views\" | \"routines\" | \"triggers\")[] =\n Object.freeze([\"identity\", \"elevatedRoles\", \"schemaControl\", \"tables\", \"policies\", \"views\", \"routines\", \"triggers\"] as const);\n\n/**\n * One statement, eight result sets. Each subquery body is the single-read SQL\n * VERBATIM: same predicates, same privileges, same live catalog, read on the\n * same connection under the same role. Only the transport changes.\n *\n * `json_agg(...)::text` is deliberate. Drivers disagree about `json` (node-pg\n * parses it into JS values, others hand back the text), and a security flag\n * that arrives as the STRING \"false\" is truthy. Casting to text gives one\n * shape everywhere, which the reader parses itself — so a boolean stays a\n * boolean. `json_agg` over zero rows is NULL, which the reader can tell apart\n * from a value it could not read.\n *\n * A second, free property: the eight facts now share ONE snapshot. Under READ\n * COMMITTED eight separate statements each take their own.\n */\nconst COMPOSITE_CATALOG: string = `SELECT\\n${RLS_READINESS_CATALOG_KEYS.map(\n (key) => ` (SELECT json_agg(t)::text FROM (\\n${CATALOG_READS[key]}\\n ) t) AS \"${key}\"`,\n).join(\",\\n\")}`;\n\n/** Read-only catalog SQL; exported for exact statement routing in adapter tests. */\nexport const RLS_READINESS_SQL: {\n readonly identity: string;\n readonly elevatedRoles: string;\n readonly schemaControl: string;\n readonly tables: string;\n readonly policies: string;\n readonly expressions: string;\n readonly views: string;\n readonly routines: string;\n readonly triggers: string;\n readonly catalog: string;\n readonly readSearchPath: string;\n readonly setSearchPath: string;\n} = Object.freeze({\n identity: CATALOG_READS.identity,\n elevatedRoles: CATALOG_READS.elevatedRoles,\n schemaControl: CATALOG_READS.schemaControl,\n tables: CATALOG_READS.tables,\n policies: CATALOG_READS.policies,\n\n // Both sides of the comparison are deparsed by THIS server, in ONE\n // statement, in one transaction, under the same empty search_path.\n expressions: `SELECT c.relname::text AS \"table\",\n p.polname::text AS \"name\",\n (n.nspname <> $1) AS \"probe\",\n pg_catalog.pg_get_expr(p.polqual, p.polrelid) AS \"using\",\n pg_catalog.pg_get_expr(p.polwithcheck, p.polrelid) AS \"withCheck\"\nFROM pg_catalog.pg_policy p\nJOIN pg_catalog.pg_class c ON c.oid = p.polrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE (n.nspname = $1 AND p.polname = $2)\n OR (c.relnamespace = pg_catalog.pg_my_temp_schema() AND p.polname = $3)\nORDER BY c.relname, p.polname`,\n\n views: CATALOG_READS.views,\n routines: CATALOG_READS.routines,\n triggers: CATALOG_READS.triggers,\n catalog: COMPOSITE_CATALOG,\n\n readSearchPath: `SELECT pg_catalog.current_setting('search_path') AS \"searchPath\"`,\n setSearchPath: `SELECT pg_catalog.set_config('search_path', $1, true)`,\n});\n\n/** The closed set of catalog queries used by readiness. */\nexport type RlsReadinessQuery = keyof typeof RLS_READINESS_SQL;\n\nfunction requireRls(params: { dialect: SqlDialect }): void {\n if (!params.dialect.capabilities.nativeRowLevelSecurity) {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"nativeRowLevelSecurity\" });\n }\n}\n\n/** Parameterized catalog read, or transaction-local search-path setting. */\nexport function renderRlsReadinessQuery(params: {\n dialect: SqlDialect;\n query: RlsReadinessQuery;\n searchPath?: string;\n}): RenderedQuery {\n requireRls(params);\n const values = params.query === \"setSearchPath\" ? [params.searchPath ?? \"\"]\n : [NATIVE_RLS.tableSchema, NATIVE_RLS.policyName, NATIVE_RLS_PROBE_POLICY];\n const collector = new ParamCollector(params.dialect);\n const slots = new Map<string, string>();\n const text = RLS_READINESS_SQL[params.query].replace(/\\$(\\d+)/g, (slot, index: string) => {\n let placeholder = slots.get(slot);\n if (placeholder === undefined) {\n placeholder = collector.add(values[Number(index) - 1]);\n slots.set(slot, placeholder);\n }\n return placeholder;\n });\n return { text, values: collector.values, returning: \"none\" };\n}\n\n/** Clone only physical columns/types, on the same backend and with the same table name. */\nexport function renderRlsProbeTable(params: { dialect: SqlDialect; table: string; action: \"create\" | \"drop\" }): RenderedQuery {\n requireRls(params);\n const name = params.dialect.quoteIdent({ name: params.table });\n const schema = params.dialect.quoteIdent({ name: params.action === \"create\" ? NATIVE_RLS.tableSchema : \"pg_temp\" });\n const text = params.action === \"create\"\n ? `CREATE TEMP TABLE ${name} (LIKE ${schema}.${name}) ON COMMIT DROP`\n : `DROP TABLE ${schema}.${name}`;\n return { text, values: [], returning: \"none\" };\n}\n\n/** Save/empty/restore around migration policy DDL without replacing the operator's path. */\nexport function renderRlsPolicyPath(params: { dialect: SqlDialect; stage: \"save\" | \"empty\" | \"restore\" }): RenderedQuery {\n requireRls(params);\n const text = params.stage === \"save\"\n ? \"SELECT pg_catalog.set_config('vibeorm.rls_saved_search_path', pg_catalog.current_setting('search_path'), true)\"\n : params.stage === \"empty\"\n ? \"SELECT pg_catalog.set_config('search_path', '', true)\"\n : \"SELECT pg_catalog.set_config('search_path', pg_catalog.current_setting('vibeorm.rls_saved_search_path'), true)\";\n return { text, values: [], returning: \"none\" };\n}\n",
64
- "/** Native RLS text contract. PostgreSQL/PGlite only, with no rewriting fallback. */\nimport { RlsContextError, VibeError, assertNativeRlsAdmission, assertValidSchemaIR, unsupportedCapability, validateRlsContextIR } from \"@vibeorm/schema\";\nimport type { FieldIR, ModelIR, RlsContextIR, RlsContextScalar, SchemaIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/** Managed identity and namespace, shared by migration and readiness checks. */\nexport const NATIVE_RLS: {\n readonly policyName: \"vibeorm_managed\";\n readonly tableSchema: \"public\";\n readonly settingPrefix: \"vibeorm.\";\n readonly parentAlias: \"parent\";\n} = Object.freeze({ policyName: \"vibeorm_managed\", tableSchema: \"public\", settingPrefix: \"vibeorm.\", parentAlias: \"parent\" });\n\nconst COLUMN_TYPES: Readonly<Record<RlsContextScalar, { readonly default: string; readonly native: Readonly<Record<string, string>> }>> = {\n String: { default: \"text\", native: { text: \"text\", varchar: \"varchar\", charactervarying: \"varchar\", uuid: \"uuid\" } },\n Boolean: { default: \"boolean\", native: { boolean: \"boolean\", bool: \"boolean\" } },\n Int: { default: \"integer\", native: { integer: \"integer\", int: \"integer\", int4: \"integer\", smallint: \"smallint\", int2: \"smallint\" } },\n BigInt: { default: \"bigint\", native: { bigint: \"bigint\", int8: \"bigint\" } },\n Float: { default: \"double precision\", native: { doubleprecision: \"double precision\", float8: \"double precision\", real: \"real\", float4: \"real\" } },\n Decimal: { default: \"numeric\", native: { numeric: \"numeric\", decimal: \"numeric\" } },\n DateTime: { default: \"timestamptz\", native: { timestamptz: \"timestamptz\", timestampwithtimezone: \"timestamptz\", timestamp: \"timestamp\", timestampwithouttimezone: \"timestamp\", date: \"date\" } },\n};\n\nfunction requireRls(params: { dialect: SqlDialect }): void {\n if (!params.dialect.capabilities.nativeRowLevelSecurity) {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"nativeRowLevelSecurity\" });\n }\n}\n\nfunction identifier(params: { dialect: SqlDialect; name: string }): string {\n if (typeof params.name !== \"string\" || params.name.length === 0 || params.name.includes(\"\\0\") || new TextEncoder().encode(params.name).length > 63) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Native RLS identifiers must be nonempty PostgreSQL identifiers of at most 63 bytes\" });\n }\n return params.dialect.quoteIdent({ name: params.name });\n}\n\nfunction tableRef(params: { dialect: SqlDialect; table: string; schema?: \"public\" | \"pg_temp\" }): string {\n if (params.schema !== undefined && params.schema !== \"public\" && params.schema !== \"pg_temp\") {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"nativeRowLevelSecurity\", hint: \"Only public tables and temporary policy probes are supported\" });\n }\n return `${identifier({ dialect: params.dialect, name: params.schema ?? NATIVE_RLS.tableSchema })}.${identifier({ dialect: params.dialect, name: params.table })}`;\n}\n\nfunction query(params: { text: string; values?: unknown[] }): RenderedQuery {\n return { text: params.text, values: params.values ?? [], returning: \"none\" };\n}\n\n/** ENABLE is one statement; migrate owns transaction/order and pairs it with FORCE. */\nexport function renderRlsEnable(params: { dialect: SqlDialect; table: string }): RenderedQuery {\n requireRls(params);\n return query({ text: `ALTER TABLE ${tableRef(params)} ENABLE ROW LEVEL SECURITY` });\n}\n\n/** FORCE is separate so migration step ordering stays explicit. */\nexport function renderRlsForce(params: { dialect: SqlDialect; table: string }): RenderedQuery {\n requireRls(params);\n return query({ text: `ALTER TABLE ${tableRef(params)} FORCE ROW LEVEL SECURITY` });\n}\n\n/** DISABLE is separate; migrate owns acknowledgement and teardown ordering. */\nexport function renderRlsDisable({ dialect, table }: { dialect: SqlDialect; table: string }): RenderedQuery {\n requireRls({ dialect });\n return query({ text: `ALTER TABLE ${tableRef({ dialect, table })} DISABLE ROW LEVEL SECURITY` });\n}\n\n/** NO FORCE precedes DISABLE when migrate deliberately removes protection. */\nexport function renderRlsNoForce({ dialect, table }: { dialect: SqlDialect; table: string }): RenderedQuery {\n requireRls({ dialect });\n return query({ text: `ALTER TABLE ${tableRef({ dialect, table })} NO FORCE ROW LEVEL SECURITY` });\n}\n\n/** Drop one named policy; migrate owns child-first dependency ordering. */\nexport function renderRlsDropPolicy({ dialect, table, policyName }: {\n dialect: SqlDialect;\n table: string;\n policyName?: string;\n}): RenderedQuery {\n requireRls({ dialect });\n const name = identifier({ dialect, name: policyName ?? NATIVE_RLS.policyName });\n return query({ text: `DROP POLICY ${name} ON ${tableRef({ dialect, table })}` });\n}\n\n/**\n * Context casts use the physical base type, NOT typmods: varchar(n), numeric(p,s)\n * and timestamp(p) casts can truncate/round another identity into an allowed one.\n * Unknown/user-defined casts refuse rather than splice raw nativeType into SQL.\n */\nexport function renderRlsColumnType(params: { dialect: SqlDialect; field: FieldIR }): string {\n requireRls(params);\n const { field } = params;\n const mapping = typeof field.type === \"string\" && Object.hasOwn(COLUMN_TYPES, field.type)\n ? COLUMN_TYPES[field.type as RlsContextScalar] : undefined;\n if (mapping !== undefined && !field.isList && !field.isUnsupported) {\n if (field.nativeType === undefined) return mapping.default;\n const match = /^([a-z][a-z0-9 ]*)(?:\\(\\s*\\d+(?:\\s*,\\s*\\d+)?\\s*\\))?$/i.exec(field.nativeType.trim());\n const base = match?.[1]?.toLowerCase().replace(/\\s+/g, \"\");\n const native = base !== undefined && Object.hasOwn(mapping.native, base) ? mapping.native[base] : undefined;\n if (native !== undefined) return native;\n }\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"nativeRowLevelSecurity\", hint: `Unsupported physical ownership type on field ${field.name}` });\n}\n\nfunction protectedModel(params: { dialect: SqlDialect; schema: SchemaIR; model: string }): ModelIR {\n requireRls(params);\n assertNativeRlsAdmission({ schema: params.schema, dialect: params.dialect.name });\n assertValidSchemaIR({ schema: params.schema });\n const model = params.schema.models.find((entry) => entry.name === params.model);\n if (model === undefined || model.rls === undefined || model.rls === \"unprotected\") {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Native RLS policy rendering requires a protected model\", meta: { model: params.model } });\n }\n return model;\n}\n\n/** Desired predicate only, for drift probes; it is NOT server-canonical deparse. */\nexport function renderRlsPredicate(params: { dialect: SqlDialect; schema: SchemaIR; model: string }): string {\n const model = protectedModel(params);\n return predicate({ dialect: params.dialect, schema: params.schema, model });\n}\n\nfunction predicate(params: { dialect: SqlDialect; schema: SchemaIR; model: ModelIR }): string {\n const { dialect, schema, model } = params;\n const rule = model.rls;\n if (rule === \"deny\") return \"false\";\n if (typeof rule === \"object\" && \"where\" in rule) {\n return Object.entries(rule.where).map(([name, ref]) => {\n const field = model.fields.find((entry) => entry.name === name)!;\n const column = identifier({ dialect, name: field.dbName ?? field.name });\n const physicalType = renderRlsColumnType({ dialect, field });\n // Context keys passed structural validation; SQL literals are declarations,\n // never request values. The empty reset sentinel MUST become SQL NULL.\n return `(${column} = NULLIF(current_setting('${NATIVE_RLS.settingPrefix}${ref.context}', true), '')::${physicalType})`;\n }).join(\" AND \");\n }\n if (typeof rule === \"object\" && \"through\" in rule) {\n const relation = model.relations.find((entry) => entry.name === rule.through)!;\n const parent = schema.models.find((entry) => entry.name === relation.targetModel)!;\n const alias = identifier({ dialect, name: NATIVE_RLS.parentAlias });\n const child = identifier({ dialect, name: model.dbName ?? model.name });\n const join = relation.fields!.map((name, index) => {\n const childField = model.fields.find((field) => field.name === name)!;\n const parentField = parent.fields.find((field) => field.name === relation.references![index])!;\n return `(${alias}.${identifier({ dialect, name: parentField.dbName ?? parentField.name })} = ${child}.${identifier({ dialect, name: childField.dbName ?? childField.name })})`;\n }).join(\" AND \");\n return `EXISTS (SELECT 1 FROM ${tableRef({ dialect, table: parent.dbName ?? parent.name })} AS ${alias} WHERE ${join})`;\n }\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Native RLS requires a protected policy rule\" });\n}\n\n/** One PERMISSIVE ALL/PUBLIC policy with equal existing/proposed-row checks. */\nexport function renderRlsPolicy(params: {\n dialect: SqlDialect;\n schema: SchemaIR;\n model: string;\n policyName?: string;\n targetSchema?: \"public\" | \"pg_temp\";\n}): RenderedQuery {\n const model = protectedModel(params);\n const expression = predicate({ dialect: params.dialect, schema: params.schema, model });\n const name = identifier({ dialect: params.dialect, name: params.policyName ?? NATIVE_RLS.policyName });\n const table = tableRef({ dialect: params.dialect, table: model.dbName ?? model.name, schema: params.targetSchema });\n return query({ text: `CREATE POLICY ${name} ON ${table} AS PERMISSIVE FOR ALL TO PUBLIC USING (${expression}) WITH CHECK (${expression})` });\n}\n\n/**\n * Every declared setting, parameterized in declaration order and transaction-local.\n *\n * Optional parts travel in the SAME statement (statement-count pass, EPIC 1-2);\n * without them the text is exactly the claims statement:\n * - `role` (PGlite): binds the trusted runtime role FIRST, as {@link renderRlsRole} does;\n * - `readOnly`: switches the transaction to READ ONLY after the claims (`$all` on a\n * verified connection; PostgreSQL accepts this switch at any point of a transaction);\n * - `backend`: reports the backend as `\"backendPid\"` / `\"backendStart\"` text columns,\n * the readiness catalog read's own expressions (adapters that name no connection object).\n *\n * A context with zero keys is accepted only when one of these parts is present.\n */\nexport function renderRlsContext(params: {\n dialect: SqlDialect;\n context: RlsContextIR;\n values: Readonly<Record<string, string | null>>;\n role?: string;\n readOnly?: boolean;\n backend?: boolean;\n}): RenderedQuery {\n requireRls(params);\n const extra = params.role !== undefined || params.readOnly === true || params.backend === true;\n if (validateRlsContextIR({ context: params.context }).length !== 0 || (Object.keys(params.context).length === 0 && !extra) ||\n typeof params.values !== \"object\" || params.values === null || Array.isArray(params.values)) {\n throw new RlsContextError({ reason: \"invalid\" });\n }\n const collector = new ParamCollector(params.dialect);\n const parts: string[] = [];\n if (params.role !== undefined) parts.push(`set_config('role', ${collector.add(runtimeRoleOf({ role: params.role }))}, true)`);\n for (const [key, slot] of Object.entries(params.context)) {\n if (!Object.hasOwn(params.values, key)) throw new RlsContextError({ reason: \"missing\", key });\n const value = params.values[key];\n if ((value === null && !slot.nullable) || (value !== null && (typeof value !== \"string\" || value.length === 0 || value.includes(\"\\0\")))) {\n throw new RlsContextError({ reason: \"invalid\", key });\n }\n parts.push(`set_config(${collector.add(`${NATIVE_RLS.settingPrefix}${key}`)}, ${collector.add(value ?? \"\")}, true)`);\n }\n for (const key of Reflect.ownKeys(params.values)) {\n if (typeof key !== \"string\" || !Object.hasOwn(params.context, key)) throw new RlsContextError({ reason: \"invalid\" });\n }\n if (params.readOnly === true) parts.push(\"set_config('transaction_read_only', 'on', true)\");\n if (params.backend === true) {\n parts.push(\n `pg_catalog.pg_backend_pid()::text AS ${identifier({ dialect: params.dialect, name: \"backendPid\" })}`,\n `(SELECT a.backend_start::text FROM pg_catalog.pg_stat_activity a WHERE a.pid = pg_catalog.pg_backend_pid()) AS ${identifier({ dialect: params.dialect, name: \"backendStart\" })}`,\n );\n }\n return query({ text: `SELECT ${parts.join(\", \")}`, values: collector.values });\n}\n\nfunction runtimeRoleOf(params: { role: string }): string {\n if (typeof params.role !== \"string\" || params.role.trim().length === 0 || params.role.includes(\"\\0\")) {\n throw new VibeError({ code: \"VIBE_CONFIG\", message: \"PGlite native RLS requires a trusted nonempty runtime role name\" });\n }\n return params.role;\n}\n\n/** First transaction statement on eligible PGlite only; server roles are login roles. */\nexport function renderRlsRole(params: { dialect: SqlDialect; role: string }): RenderedQuery {\n requireRls(params);\n const role = runtimeRoleOf({ role: params.role });\n const collector = new ParamCollector(params.dialect);\n return query({ text: `SELECT set_config('role', ${collector.add(role)}, true)`, values: collector.values });\n}\n",
65
- "import { renderSqliteJsonEquality } from \"./dialects/sqlite-json-equality.ts\";\nimport { JSON_TRANSPORT, projectionOutputName } from \"./json-transport.ts\";\nimport { isFixedDiagnostic, renderCaptureReadiness, renderDiagnostic } from \"./dialects/diagnostics.ts\";\nimport type { DiagnosticStatement } from \"./dialects/diagnostics.ts\";\nimport { renderPostgresExplain, renderPostgresWorkload } from \"./dialects/postgres-diagnostics.ts\";\nimport { renderRlsReadinessQuery, renderRlsProbeTable, renderRlsPolicyPath } from \"./dialects/postgres-rls-readiness.ts\";\n/**\n * Statement renderer: SQL AST × dialect → { text, values, returning }.\n *\n * The shared grammar lives here; every dialect divergence goes through an\n * explicit SqlDialect strategy field. Malformed ASTs throw VIBE_INTERNAL —\n * the AST is built by VibeORM code, so a bad shape is always our bug.\n */\n\nimport { assertSqlNamespace, internalError, unsupportedCapability } from \"@vibeorm/schema\";\nimport { isSqlFragment, renderSqlFragment, sqlUsesIncoming } from \"./composable.ts\";\nimport type { SqlFragmentSpec } from \"@vibeorm/schema\";\nimport type { ColRef, JsonParamCell, KeyTableJoin, KeyTableMember, OrderTerm, SqlStatement, RlsReadinessStatement, RlsProbeTableStatement, RlsPolicyPathStatement, SqlExpr, TableRef } from \"./ast.ts\";\nimport type {\n AggFn,\n AggRef,\n ChainResult,\n ChainCapture,\n CaptureCascade,\n CaptureCell,\n CaptureReturningColumn,\n OtherRowReturningColumn,\n ChainRowSource,\n ChainStatement,\n ChainStepStatement,\n DeleteStatement,\n GroupKeyExpression,\n GroupingSets,\n InsertSelectStatement,\n InsertStatement,\n KeyListMember,\n KeyPage,\n KeyRows,\n OrderByColumn,\n LateralJoin,\n LeftJoin,\n CountSubquery,\n ReturningColumn,\n SelectExpr,\n SelectStatement,\n SetOperator,\n UpdateStatement,\n} from \"./ast.ts\";\nimport { CHAIN_VETO_PREFIX, CHAIN_VETO_TOKEN_PATTERN, isCaptureReturningColumn, isOtherRowReturningColumn, isDbNowMarker, isExcludedRef, isJsonParamCell, isListSetOperation, isSetOperation, isSqlDefaultCell, isSqlKeepCell, isSourceColumnRef, isStepColumnRef } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { containsPattern, endsWithPattern, startsWithPattern, strictMatchCollationPrefilter, strictMatchPattern } from \"./like.ts\";\nimport { renderAdvisoryLock, renderAdvisoryLocks, renderRowLockClause } from \"./locks.ts\";\nimport { renderDateTruncation } from \"./date-truncation.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport { isJsonListParameter, jsonListParameter } from \"./json-list-parameter.ts\";\nimport { jsonPathString } from \"./json-path.ts\";\nimport { isJsonPatchOperation, renderJsonPatch } from \"./json-patch.ts\";\nimport { keyListBindsUntypedRows, postgresBulkInsertArrayCast, postgresKeyListElementType } from \"./key-list.ts\";\nimport { renderRlsContext, renderRlsDisable, renderRlsDropPolicy, renderRlsEnable, renderRlsForce, renderRlsNoForce, renderRlsPolicy, renderRlsRole } from \"./dialects/postgres-rls.ts\";\n\n// ─── Result shape ─────────────────────────────────────────────────\n\nexport type RenderedQuery = {\n readonly text: string;\n readonly values: unknown[];\n /**\n * RETURNING status: \"native\" (rendered), \"omitted\" (requested but the dialect\n * lacks it — caller must re-select), \"none\" (not requested).\n */\n readonly returning: \"native\" | \"omitted\" | \"none\";\n};\n\n// ─── Entry point ──────────────────────────────────────────────────\n\nexport function renderStatement(params: { dialect: SqlDialect; statement: DiagnosticStatement | SqlStatement | RlsReadinessStatement | RlsProbeTableStatement | RlsPolicyPathStatement }): RenderedQuery {\n const { dialect, statement } = params;\n const collector = new ParamCollector(dialect);\n switch (statement.kind) {\n case \"diagnostic\": {\n // EPIC 5: `postgresExplain` wraps another statement, so it renders that\n // one first and keeps its parameters; the read-only workload reads take\n // their own identifiers and bounds. Everything else is a fixed probe.\n if (isFixedDiagnostic(statement)) return renderDiagnostic({ dialect, query: statement.query });\n if (statement.query === \"postgresCaptureReadiness\") return renderCaptureReadiness({ dialect, tables: statement.tables });\n if (statement.query === \"postgresExplain\") {\n return renderPostgresExplain({\n dialect,\n query: renderStatement({ dialect, statement: statement.statement }),\n ...(statement.options === undefined ? {} : { options: statement.options }),\n });\n }\n return renderPostgresWorkload({ dialect, ...statement });\n }\n case \"select\":\n return renderSelect({ dialect, statement, collector });\n case \"advisoryLocks\":\n return renderAdvisoryLocks({ dialect, keys: statement.keys, mode: statement.mode });\n case \"advisoryLock\":\n return renderAdvisoryLock({ dialect, statement, collector });\n case \"insert\":\n return renderInsert({ dialect, statement, collector });\n case \"update\":\n return renderUpdate({ dialect, statement, collector });\n case \"delete\":\n return renderDelete({ dialect, statement, collector });\n case \"chain\":\n return renderChain({ dialect, statement, collector });\n case \"rlsReadiness\": return renderRlsReadinessQuery({ dialect, ...statement });\n case \"rlsProbeTable\": return renderRlsProbeTable({ dialect, ...statement });\n case \"rlsPolicyPath\": return renderRlsPolicyPath({ dialect, ...statement });\n case \"rlsEnable\":\n return renderRlsEnable({ dialect, table: statement.table });\n case \"rlsForce\":\n return renderRlsForce({ dialect, table: statement.table });\n case \"rlsDisable\":\n return renderRlsDisable({ dialect, table: statement.table });\n case \"rlsNoForce\":\n return renderRlsNoForce({ dialect, table: statement.table });\n case \"rlsDropPolicy\":\n return renderRlsDropPolicy({ dialect, table: statement.table, policyName: statement.policyName });\n case \"rlsPolicy\":\n return renderRlsPolicy({ dialect, ...statement });\n case \"rlsContext\":\n return renderRlsContext({ dialect, ...statement });\n case \"rlsRole\":\n return renderRlsRole({ dialect, role: statement.role });\n }\n}\n\n// ─── Shared pieces ────────────────────────────────────────────────\n\nfunction quoteCol(dialect: SqlDialect, column: ColRef): string {\n if (column.coalesce !== undefined) {\n if (column.coalesce.length < 2 || column.coalesce.some((member) => member.coalesce !== undefined)) {\n throw internalError({ message: \"ColRef.coalesce needs two or more plain member references\" });\n }\n return `COALESCE(${column.coalesce.map((member) => quoteCol(dialect, member)).join(\", \")})`;\n }\n const name = dialect.quoteIdent({ name: column.name });\n const ref = column.table === undefined ? name : `${dialect.quoteIdent({ name: column.table })}.${name}`;\n // groupBy date keys: the start of the period, rendered identically at the\n // projection, GROUP BY and ORDER BY sites (refused without the capability).\n if (column.truncate !== undefined) return renderDateTruncation({ dialect, reference: ref, truncation: column.truncate });\n if (column.groupKey !== undefined) return renderGroupKey({ dialect, reference: ref, key: column.groupKey });\n if (column.enumOrdinal === true) return dialect.renderEnumOrdinal({ column: ref });\n // B4: sqlite Decimal compare/order/aggregate sites read the TEXT column as\n // REAL — the builder sets this only there, never on projections.\n if (column.castReal === true) {\n if (dialect.name !== \"sqlite\") {\n throw internalError({ message: \"ColRef.castReal is a sqlite Decimal construct\" });\n }\n return `CAST(${ref} AS REAL)`;\n }\n // D3: postgres `json` order/distinct/compare sites read the column as jsonb.\n if (column.castJsonb !== undefined) {\n if (dialect.name !== \"postgres\") {\n throw internalError({ message: \"ColRef.castJsonb is a postgres json construct\" });\n }\n return `${ref}::${column.castJsonb}`;\n }\n return ref;\n}\n\n/**\n * An ORDER BY / DISTINCT ON column of a SELECT, protected from binding to an\n * OUTPUT column. Postgres, MySQL and SQLite all resolve a bare name in ORDER\n * BY (postgres: DISTINCT ON too) to an output column of that name FIRST. When\n * the projection renames something else to the column's name — a postgres\n * `Float[]`/`Json[]` list read as `\"col\"::text AS \"col\"`, or a projection\n * alias — the bare name would order the TEXT, not the typed column\n * (`{10}` < `{1e-07}` < `{9}`). Such a reference is qualified with the\n * select's FROM name (its alias, or the derived-table name), which only ever\n * names the input column. Qualified references, casts and truncations\n * (`castReal`, `castJsonb`, `truncate` — expressions read input columns, and a\n * truncated key must repeat its GROUP BY text) and plain projections render\n * unchanged. Window ORDER BY (ROW_NUMBER) never sees output names, so it is\n * not passed through here.\n */\nfunction typedOrderRef(params: { statement: SelectStatement; column: ColRef }): ColRef {\n const { statement, column } = params;\n // MySQL and SQLite resolve an output name inside an ORDER BY expression too.\n if (column.coalesce !== undefined) return { ...column, coalesce: column.coalesce.map((member) => typedOrderRef({ statement, column: member })) };\n if (column.table !== undefined || column.castReal === true || column.castJsonb !== undefined || column.truncate !== undefined || column.groupKey !== undefined) return column;\n const renamed = statement.columns.some(\n (projected) => (projected.alias ?? projected.name) === column.name && (projected.transform !== undefined || projected.alias !== undefined),\n );\n return renamed ? { ...column, table: statement.table.alias ?? statement.table.name } : column;\n}\n\n/**\n * The cast a {@link JsonParamCell} renders after its placeholder: the\n * dialect's json param cast (`::text::jsonb` on postgres, empty elsewhere),\n * or `::text::json` for a cell bound for a postgres `json` column — the\n * server parses the text as `json` and stores it as written (D3).\n */\nfunction jsonCellCast(dialect: SqlDialect, cell: JsonParamCell): string {\n if (cell.storage !== \"json\" || dialect.jsonParamCast === \"\") return dialect.jsonParamCast;\n if (dialect.name !== \"postgres\") {\n throw internalError({ message: \"JsonParamCell storage json is a postgres construct\" });\n }\n return \"::text::json\";\n}\n\n/**\n * Projection rendering: a plain reference or its wire transform. JSON text\n * projections use the dialect primitive and keep explicit aliases. Text casts\n * preserve lossless transport on every dialect; both base64 forms remain\n * postgres-only.\n */\nfunction quoteProjection(dialect: SqlDialect, column: ColRef): string {\n if (column.transform === undefined) {\n const base = quoteCol(dialect, column);\n // A truncated key is an expression: it keeps the column's name as output name.\n const alias = column.alias ?? (column.truncate === undefined && column.groupKey === undefined ? undefined : column.name);\n if (alias === undefined) return base;\n return `${base} AS ${dialect.quoteIdent({ name: alias })}`;\n }\n if (column.transform === \"jsonText\") {\n const ref = quoteCol(dialect, column);\n const alias = dialect.quoteIdent({ name: column.alias ?? column.name });\n return `${dialect.jsonTextProjection({ expression: ref })} AS ${alias}`;\n }\n const ref = quoteCol(dialect, column);\n const alias = dialect.quoteIdent({ name: column.alias ?? column.name });\n if (column.transform === \"castText\") return `${textProjection({ dialect, expression: ref })} AS ${alias}`;\n // Lane J: MySQL's lateral subselect ships Bytes as `TO_BASE64` (a newline\n // every 76 characters, which the base64 decoder skips).\n if (column.transform === \"encodeBase64\" && dialect.name === \"mysql\") return `TO_BASE64(${ref}) AS ${alias}`;\n if (dialect.name !== \"postgres\") {\n throw internalError({ message: `${column.transform} is a postgres construct` });\n }\n if (column.transform === \"encodeArrayBase64\") return `encode(array_send(${ref}), 'base64') AS ${alias}`;\n return `encode(${ref}, 'base64') AS ${alias}`;\n}\n\nfunction textProjection(params: { dialect: SqlDialect; expression: string }): string {\n return params.dialect.name === \"postgres\" ? `${params.expression}::text`\n : `CAST(${params.expression} AS ${params.dialect.name === \"mysql\" ? \"CHAR\" : \"TEXT\"})`;\n}\n\n/**\n * A SELECT list rendered exactly as a {@link SelectStatement}'s columns are —\n * plain references and their wire transforms (`\"t\".\"scores\"::text AS\n * \"scores\"`) — for SQL assembled outside the AST (extension statements), so\n * its rows reach the driver in the same formats as `findMany`'s.\n */\nexport function renderProjection(params: { dialect: SqlDialect; columns: readonly ColRef[] }): string {\n const { dialect, columns } = params;\n return columns.map((column) => quoteProjection(dialect, column)).join(\", \");\n}\n\nfunction renderTable(dialect: SqlDialect, table: TableRef): string {\n if (table.namespace !== undefined) assertSqlNamespace({ namespace: table.namespace, dialect: dialect.name });\n const relation = dialect.quoteIdent({ name: table.name });\n const name = table.namespace === undefined ? relation : `${dialect.quoteIdent({ name: table.namespace })}.${relation}`;\n if (table.alias === undefined) return name;\n return `${name} AS ${dialect.quoteIdent({ name: table.alias })}`;\n}\n\nfunction assertCount(value: number, what: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw internalError({ message: `${what} must be a non-negative integer, got ${value}` });\n }\n}\n\nconst COMPARISON_SQL: Readonly<Record<string, string>> = {\n eq: \"=\",\n ne: \"<>\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n};\n\n/**\n * Atomic SET arithmetic. `divide` is plain `/`: integer columns therefore\n * follow each dialect's own integer-division rule (pg/sqlite truncate, mysql\n * promotes to decimal) — pinned by the update-atomic-ops catalog case.\n */\nconst SET_OPERATION_SQL: Readonly<Record<SetOperator, string>> = {\n increment: \"+\",\n decrement: \"-\",\n multiply: \"*\",\n divide: \"/\",\n};\n\nconst AGG_FN_SQL: Readonly<Record<AggFn, string>> = {\n count: \"COUNT\",\n avg: \"AVG\",\n sum: \"SUM\",\n min: \"MIN\",\n max: \"MAX\",\n};\n\n/**\n * `COUNT(*)` / `FN(\"col\")` — shared by projections, HAVING and ORDER BY. A\n * filtered aggregate renders its predicate where it stands, so its parameters\n * bind at every site, in text order.\n */\nfunction renderAggRef(dialect: SqlDialect, agg: AggRef, collector: ParamCollector): string {\n if (agg.filter !== undefined) return renderFilteredAggregate({ dialect, agg, filter: agg.filter, collector });\n if (agg.fn === \"countAll\") return \"COUNT(*)\";\n const column = quoteCol(dialect, agg.column);\n if ((agg.fn === \"min\" || agg.fn === \"max\") && agg.enumOrder !== undefined) {\n return dialect.renderEnumMinMax({ fn: agg.fn, column, result: agg.enumOrder });\n }\n return `${AGG_FN_SQL[agg.fn]}(${column})`;\n}\n\n/**\n * `AGG(x) FILTER (WHERE …)`, or on a `caseWhen` dialect `AGG(CASE WHEN … THEN\n * x END)` — `COUNT(*)` counts `CASE WHEN … THEN 1 END` there. A row the\n * predicate leaves unknown is left out by both forms.\n */\nfunction renderFilteredAggregate(params: { dialect: SqlDialect; agg: AggRef; filter: SqlExpr; collector: ParamCollector }): string {\n const { dialect, agg, filter, collector } = params;\n if (dialect.capabilities.filteredAggregates === \"filterClause\") {\n const { filter: _filter, ...plain } = agg;\n const aggregate = renderAggRef(dialect, plain, collector);\n return `${aggregate} FILTER (WHERE ${renderExpr({ dialect, expr: filter, collector })})`;\n }\n const when = renderExpr({ dialect, expr: filter, collector });\n if (agg.fn === \"countAll\") return `COUNT(CASE WHEN ${when} THEN 1 END)`;\n const column = quoteCol(dialect, agg.column);\n if ((agg.fn === \"min\" || agg.fn === \"max\") && agg.enumOrder !== undefined) {\n return dialect.renderEnumMinMax({ fn: agg.fn, column, result: agg.enumOrder, when });\n }\n return `${AGG_FN_SQL[agg.fn]}(CASE WHEN ${when} THEN ${column} END)`;\n}\n\n/** The longest string prefix a `groupBy` prefix key takes. */\nconst MAX_GROUP_KEY_PREFIX = 1000;\n\n/**\n * A {@link GroupKeyExpression} over `reference`. The path steps and the prefix\n * length render as literals (each site of one key must repeat the identical\n * text), so they are checked again here.\n *\n * - postgres: `(\"col\" -> 'a' ->> 'b')` — `->` with a text key reads an object\n * member only, as the other dialects' quoted paths do; a `json` column\n * converts the extracted value to jsonb (`((\"col\" -> 'a' -> 'b')::jsonb #>>\n * '{}')`) so numbers and objects print as a jsonb column's do;\n * - sqlite: `json_extract` returns JSON booleans as 1/0 and numbers as\n * numbers, so a CASE over `json_type` spells each type as JSON text;\n * - mysql: `JSON_UNQUOTE` of a JSON `null` is the string `'null'`, so a CASE\n * over `JSON_TYPE` maps it to SQL NULL first.\n */\nfunction renderGroupKey(params: { dialect: SqlDialect; reference: string; key: GroupKeyExpression }): string {\n const { dialect, reference, key } = params;\n if (key.kind === \"prefix\") {\n if (!Number.isSafeInteger(key.length) || key.length < 1 || key.length > MAX_GROUP_KEY_PREFIX) {\n throw internalError({ message: `a groupBy prefix length must be an integer from 1 to ${MAX_GROUP_KEY_PREFIX}, got ${String(key.length)}` });\n }\n if (dialect.name === \"sqlite\") return `substr(${reference}, 1, ${key.length})`;\n return `${dialect.name === \"mysql\" ? \"LEFT\" : \"left\"}(${reference}, ${key.length})`;\n }\n if (key.path.length === 0 || key.path.some((step) => typeof step !== \"string\" || step.length === 0 || step.includes(\"\\u0000\"))) {\n throw internalError({ message: \"a groupBy JSON path needs one or more non-empty object keys without NUL characters\" });\n }\n switch (dialect.jsonPathMode) {\n case \"operators\": {\n const steps = key.path.map((step) => dialect.quoteStringLiteral({ value: step }));\n if (key.storage === \"json\") return `((${reference} -> ${steps.join(\" -> \")})::jsonb #>> '{}')`;\n const last = steps.length - 1;\n return `(${reference}${steps.map((step, index) => `${index === last ? \" ->> \" : \" -> \"}${step}`).join(\"\")})`;\n }\n case \"sqliteExtract\": {\n const path = dialect.quoteStringLiteral({ value: jsonPathString(key.path) });\n const extracted = `json_extract(${reference}, ${path})`;\n return `CASE json_type(${reference}, ${path}) WHEN 'text' THEN ${extracted} WHEN 'true' THEN 'true' WHEN 'false' THEN 'false' WHEN 'null' THEN NULL ELSE CAST(${extracted} AS TEXT) END`;\n }\n case \"mysqlExtract\": {\n const extracted = `JSON_EXTRACT(${reference}, ${dialect.quoteStringLiteral({ value: jsonPathString(key.path) })})`;\n return `CASE WHEN JSON_TYPE(${extracted}) = 'NULL' THEN NULL ELSE JSON_UNQUOTE(${extracted}) END`;\n }\n }\n}\n\n/**\n * `GROUP BY …` over grouping sets: `GROUPING SETS ((a, b), (a), ())`, or on a\n * `rollup` dialect `a, b WITH ROLLUP` when the sets are exactly the rollup\n * chain of the keys in order. Anything else is refused.\n */\nfunction renderGroupingSets(params: { dialect: SqlDialect; keys: readonly string[]; grouping: GroupingSets }): string {\n const { dialect, keys, grouping } = params;\n const sets = groupingSetIndexes({ keys, grouping });\n const mode = dialect.capabilities.groupingSets;\n if (mode === \"groupingSets\") {\n return `GROUPING SETS (${sets.map((set) => `(${set.map((index) => keys[index]).join(\", \")})`).join(\", \")})`;\n }\n if (mode === \"rollup\" && isRollupChain({ count: keys.length, sets })) return `${keys.join(\", \")} WITH ROLLUP`;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: mode === \"rollup\" ? \"groupBy grouping sets other than the rollup of `by` in order\" : \"groupBy grouping sets\",\n hint: mode === \"rollup\"\n ? \"MySQL groups by `WITH ROLLUP` only: list the sets [[a, b], [a], []] for by [a, b], or run one groupBy per set\"\n : \"run one groupBy per grouping set instead\",\n });\n}\n\n/** The sets' member indexes, checked against the key count. */\nfunction groupingSetIndexes(params: { keys: readonly string[]; grouping: GroupingSets }): readonly (readonly number[])[] {\n const { keys, grouping } = params;\n if (grouping.sets.length === 0 || keys.length === 0 || keys.length > 31) {\n throw internalError({ message: \"grouping sets need one or more sets over 1 to 31 groupBy keys\" });\n }\n for (const set of grouping.sets) {\n if (set.some((index) => !Number.isSafeInteger(index) || index < 0 || index >= keys.length)) {\n throw internalError({ message: \"a grouping set names a groupBy key that does not exist\" });\n }\n }\n return grouping.sets;\n}\n\n/**\n * Are `sets` (indexes into `count` grouping keys) exactly the rollup chain\n * `[0..n-1], [0..n-2], …, []`, in any order and with members in any order?\n * The one shape a `rollup` dialect can group by (`GROUP BY … WITH ROLLUP`).\n */\nexport function isRollupChain(params: { count: number; sets: readonly (readonly number[])[] }): boolean {\n const { count, sets } = params;\n if (sets.length !== count + 1) return false;\n const lengths = new Set<number>();\n for (const set of sets) {\n const sorted = [...set].sort((left, right) => left - right);\n if (!sorted.every((index, position) => index === position)) return false;\n lengths.add(set.length);\n }\n return lengths.size === count + 1;\n}\n\n/**\n * `CASE GROUPING(k0, k1, …) WHEN <mask> THEN <set index> … END`: GROUPING sets\n * a key's bit (the rightmost key is the lowest bit) when the row's set leaves\n * the key out, so each set has one mask.\n */\nfunction renderGroupingSetIndex(params: { keys: readonly string[]; grouping: GroupingSets }): string {\n const { keys } = params;\n const sets = groupingSetIndexes(params);\n const branches = sets.map((set, position) => {\n let mask = 0;\n for (let index = 0; index < keys.length; index++) {\n if (!set.includes(index)) mask += 2 ** (keys.length - 1 - index);\n }\n return `WHEN ${mask} THEN ${position}`;\n });\n return `CASE GROUPING(${keys.join(\", \")}) ${branches.join(\" \")} END`;\n}\n\nfunction assertScalarArrays(dialect: SqlDialect, feature: string): void {\n if (dialect.capabilities.scalarArrays) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature,\n hint: \"only postgres has native array columns — model the list as a related table instead\",\n });\n}\n\n// ─── Expressions ──────────────────────────────────────────────────\n\n/**\n * Render one boolean expression into SQL text, collecting parameters into the\n * shared collector. Public so extension delegates can AND user `where` trees\n * (compiled by the runtime) into their own statements.\n */\nexport function renderExpr(params: { dialect: SqlDialect; expr: SqlExpr; collector: ParamCollector }): string {\n const { dialect, expr, collector } = params;\n\n switch (expr.kind) {\n case \"cmp\": {\n const op = COMPARISON_SQL[expr.op];\n if (op === undefined) {\n throw internalError({ message: `unknown comparison operator \"${expr.op}\"` });\n }\n // Database-clock operand: the dialect's now() expression, never a param.\n if (isDbNowMarker(expr.value)) {\n return `${quoteCol(dialect, expr.column)} ${op} ${dialect.renderDbNow({ offsetSeconds: expr.value.offsetSeconds, collector })}`;\n }\n const compared = listComparison({ dialect, column: expr.column, value: expr.value, collector });\n return `${compared.column} ${op} ${compared.operand}`;\n }\n\n case \"cmpCol\": {\n const op = COMPARISON_SQL[expr.op];\n if (op === undefined) {\n throw internalError({ message: `unknown comparison operator \"${expr.op}\"` });\n }\n return `${quoteCol(dialect, expr.left)} ${op} ${quoteCol(dialect, expr.right)}`;\n }\n\n case \"isNull\":\n return `${quoteCol(dialect, expr.column)} IS ${expr.negate === true ? \"NOT NULL\" : \"NULL\"}`;\n\n case \"inArray\": {\n if (expr.values.length === 0) {\n // Empty IN matches nothing; empty NOT IN matches everything.\n return expr.negate === true ? \"1 = 1\" : \"1 = 0\";\n }\n const column = quoteCol(dialect, expr.column);\n if (expr.timeOfDay === true && dialect.timeOfDayInStrategy === \"equalities\") {\n const equalities = collector.addMany(expr.values).map((placeholder) => `${column} = ${placeholder}`);\n return `${expr.negate === true ? \"NOT \" : \"\"}(${equalities.join(\" OR \")})`;\n }\n if (dialect.inArrayStrategy === \"any\") {\n const base = `${column} = ANY(${collector.add(Array.isArray(expr.values) ? [...expr.values] : expr.values)})`;\n return expr.negate === true ? `NOT (${base})` : base;\n }\n const placeholders = collector.addMany(expr.values);\n return `${column} ${expr.negate === true ? \"NOT IN\" : \"IN\"} (${placeholders.join(\", \")})`;\n }\n\n case \"tupleIn\": {\n if (expr.columns.length === 0) {\n throw internalError({ message: \"tupleIn needs at least one column\" });\n }\n for (const row of expr.rows) {\n if (row.length !== expr.columns.length) {\n throw internalError({\n message: `tupleIn row has ${row.length} values for ${expr.columns.length} columns`,\n });\n }\n }\n if (expr.rows.length === 0) {\n // Same honesty as inArray: an empty membership matches nothing.\n return expr.negate === true ? \"1 = 1\" : \"1 = 0\";\n }\n const columns = expr.columns.map((column) => quoteCol(dialect, column));\n if (dialect.tupleInStrategy === \"rowValue\") {\n const tuples = expr.rows.map((row) => `(${collector.addMany(row).join(\", \")})`);\n const base = `(${columns.join(\", \")}) IN (${tuples.join(\", \")})`;\n return expr.negate === true ? `NOT (${base})` : base;\n }\n // No row constructors: an OR of COMPLETE conjunctions, never a per-column\n // IN (which would match the Cartesian product of the members).\n const conjunctions = expr.rows.map((row) => {\n const terms = row.map((value, index) => `${columns[index] as string} = ${collector.add(value)}`);\n return terms.length === 1 ? (terms[0] as string) : `(${terms.join(\" AND \")})`;\n });\n const base = conjunctions.length === 1 ? (conjunctions[0] as string) : `(${conjunctions.join(\" OR \")})`;\n return expr.negate === true ? `NOT ${base.startsWith(\"(\") ? base : `(${base})`}` : base;\n }\n\n case \"keyList\":\n return renderKeyList({ dialect, expr, collector });\n\n case \"rowCompare\": {\n // D-01: one row-value comparison; values bind in member order.\n const op = COMPARISON_SQL[expr.op];\n if (op === undefined || expr.columns.length === 0 || expr.values.length !== expr.columns.length) {\n throw internalError({ message: `rowCompare needs a range operator and one value per column (${expr.columns.length} columns, ${expr.values.length} values)` });\n }\n const columns = expr.columns.map((column) => quoteCol(dialect, column));\n const placeholders = expr.values.map((value) => collector.add(value));\n return `(${columns.join(\", \")}) ${op} (${placeholders.join(\", \")})`;\n }\n\n case \"inSelect\": {\n // D-04: the subquery shares the collector, like EXISTS.\n if (expr.columns.length === 0) throw internalError({ message: \"inSelect needs at least one column\" });\n if (dialect.name === \"mysql\" && (expr.select.limit !== undefined || expr.select.offset !== undefined)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"LIMIT inside an IN subquery\",\n hint: \"mysql refuses LIMIT directly inside an IN subquery (error 1235); wrap the limited select in a derived table\",\n });\n }\n const columns = expr.columns.map((column) => quoteCol(dialect, column));\n const tested = columns.length === 1 ? (columns[0] as string) : `(${columns.join(\", \")})`;\n const sub = renderSelect({ dialect, statement: expr.select, collector });\n return `${tested} IN (${sub.text})`;\n }\n\n case \"like\": {\n const column = quoteCol(dialect, expr.column);\n const placeholder = collector.add(expr.pattern);\n let base: string;\n if (expr.insensitive === true) {\n base =\n dialect.insensitiveLike === \"ilike\"\n ? `${column} ILIKE ${placeholder}`\n : expr.ciCollation === true\n ? // #36: the column's declared `_ci` collation already folds case —\n // plain LIKE keeps the index usable.\n `${column} LIKE ${placeholder}`\n : `LOWER(${column}) LIKE LOWER(${placeholder})`;\n } else {\n base = `${column} LIKE ${placeholder}`;\n }\n if (dialect.likeEscapeClause !== null) {\n base = `${base}${dialect.likeEscapeClause}`;\n }\n return expr.negate === true ? `NOT (${base})` : base;\n }\n\n case \"strictMatch\": {\n const column = quoteCol(dialect, expr.column);\n let base: string;\n if (expr.op === \"equals\") {\n // pg and sqlite `=` are already byte-exact; only mysql's `_ci`\n // collations fold equality and need the BINARY cast.\n base =\n dialect.strictMatchStrategy === \"binary\"\n ? `${column} = CAST(${collector.add(expr.value)} AS BINARY)`\n : `${column} = ${collector.add(expr.value)}`;\n } else {\n const pattern = strictMatchPattern({\n strategy: dialect.strictMatchStrategy,\n op: expr.op,\n value: expr.value,\n });\n if (dialect.strictMatchStrategy === \"glob\") {\n base = `${column} GLOB ${collector.add(pattern)}`;\n } else {\n // Fix lane Q2 (D-06): mysql strict startsWith ANDs the collation\n // LIKE first (same pattern, bound first) — an index-boundable\n // superset of the byte-exact test, so the rows are unchanged.\n const prefilter = strictMatchCollationPrefilter({\n strategy: dialect.strictMatchStrategy,\n op: expr.op,\n negate: expr.negate === true,\n })\n ? `${column} LIKE ${collector.add(pattern)}${dialect.likeEscapeClause ?? \"\"}`\n : null;\n const placeholder = collector.add(pattern);\n base =\n dialect.strictMatchStrategy === \"binary\"\n ? `${column} LIKE CAST(${placeholder} AS BINARY)`\n : `${column} LIKE ${placeholder}`;\n if (dialect.likeEscapeClause !== null) base = `${base}${dialect.likeEscapeClause}`;\n if (prefilter !== null) base = `(${prefilter} AND ${base})`;\n }\n }\n return expr.negate === true ? `NOT (${base})` : base;\n }\n\n case \"and\":\n case \"or\": {\n if (expr.operands.length === 0) {\n // Neutral elements: empty AND is always-true, empty OR always-false.\n return expr.kind === \"and\" ? \"1 = 1\" : \"1 = 0\";\n }\n if (expr.operands.length === 1) {\n return renderExpr({ dialect, expr: expr.operands[0]!, collector });\n }\n const joiner = expr.kind === \"and\" ? \" AND \" : \" OR \";\n const rendered = expr.operands.map((operand) => renderExpr({ dialect, expr: operand, collector }));\n return `(${rendered.join(joiner)})`;\n }\n\n case \"not\":\n return `NOT (${renderExpr({ dialect, expr: expr.operand, collector })})`;\n\n case \"aggCmp\": {\n const op = COMPARISON_SQL[expr.op];\n if (op === undefined) {\n throw internalError({ message: `unknown comparison operator \"${expr.op}\"` });\n }\n return `${renderAggRef(dialect, expr.agg, collector)} ${op} ${collector.add(expr.value)}`;\n }\n\n case \"arrayHas\": {\n assertScalarArrays(dialect, \"the scalar-list filter \\\"has\\\"\");\n const compared = listComparison({ dialect, column: expr.column, value: expr.value, collector });\n const base = `${compared.operand} = ANY(${compared.column})`;\n return expr.negate === true ? `NOT (${base})` : base;\n }\n\n case \"arrayContainsAll\": {\n assertScalarArrays(dialect, \"the scalar-list filter \\\"hasEvery\\\"\");\n const values = Array.isArray(expr.values) ? [...expr.values] : expr.values;\n const compared = listComparison({ dialect, column: expr.column, value: values, collector });\n return `${compared.column} @> ${compared.operand}`;\n }\n\n case \"arrayOverlaps\": {\n assertScalarArrays(dialect, \"the scalar-list filter \\\"hasSome\\\"\");\n const values = Array.isArray(expr.values) ? [...expr.values] : expr.values;\n const compared = listComparison({ dialect, column: expr.column, value: values, collector });\n return `${compared.column} && ${compared.operand}`;\n }\n\n case \"arrayIsEmpty\": {\n assertScalarArrays(dialect, \"the scalar-list filter \\\"isEmpty\\\"\");\n // v1 semantics kept: array_length of NULL and of '{}' are both NULL, so\n // `isEmpty: true` matches NULL **and** empty lists.\n const column = quoteCol(dialect, expr.column);\n return `array_length(${column}, 1) IS ${expr.empty ? \"NULL\" : \"NOT NULL\"}`;\n }\n\n case \"jsonFilter\":\n return renderJsonFilter({ dialect, expr, collector });\n\n case \"exists\": {\n // The subquery shares the statement's collector, so its parameters land\n // in the single sequence exactly where they appear in the text.\n const sub = renderSelect({ dialect, statement: expr.select, collector });\n return `${expr.negate === true ? \"NOT \" : \"\"}EXISTS (${sub.text})`;\n }\n\n case \"composed\":\n return `(${renderSqlFragment({ dialect, fragment: expr.fragment, collector })})`;\n\n case \"fragment\":\n return renderFragment({ dialect, fragment: expr.fragment, collector });\n\n case \"raw\":\n return expr.text;\n }\n}\n\n// ─── Bound fragments (extension SQL plane) ───────────────────\n\n/**\n * Render a neutral bound fragment (extensions.md §3): literal text verbatim,\n * `{ param }` through the collector (single placeholder sequence), `{ ident }`\n * paths through dialect.quoteIdent. Exported so extension delegates can build\n * full statements sharing one collector with core-compiled WHERE trees.\n */\nexport function renderFragment(params: {\n dialect: SqlDialect;\n fragment: SqlFragmentSpec;\n collector: ParamCollector;\n}): string {\n const { dialect, fragment, collector } = params;\n let text = \"\";\n for (const part of fragment.parts) {\n if (typeof part === \"string\") {\n text += part;\n } else if (\"param\" in part) {\n text += collector.add(part.param);\n } else {\n text += part.ident.map((name) => dialect.quoteIdent({ name })).join(\".\");\n }\n }\n return text;\n}\n\n/**\n * Column and operand of a comparison (`cmp`, `has`, `hasEvery`, `hasSome`).\n * A Json-list operand of a `json[]` column (`Json[] @db.Json`) compares as\n * jsonb on both sides — `\"col\"::jsonb[]` against `$n::text::jsonb[]` (or\n * `$n::text::jsonb` for one element) — because `json` has no equality\n * operator at all (\"could not identify an equality operator for type json\").\n * Write sites (`push`) keep the `json` operand. Everything else renders as\n * before. The column side is added first only in text: it binds nothing.\n */\nfunction listComparison(params: {\n dialect: SqlDialect;\n column: ColRef;\n value: unknown;\n collector: ParamCollector;\n}): { readonly column: string; readonly operand: string } {\n const { dialect, column, value, collector } = params;\n if (isJsonListParameter(value) && value.storage === \"json\") {\n return {\n column: `${quoteCol(dialect, column)}::jsonb[]`,\n operand: collector.add(jsonListParameter({ value: value.value, storage: \"jsonb\" })),\n };\n }\n return { column: quoteCol(dialect, column), operand: collector.add(value) };\n}\n\ntype KeyListExpr = Extract<SqlExpr, { kind: \"keyList\" }>;\n\n/**\n * Key-list membership per `SqlDialect.keyListStrategy` (see the `keyList`\n * node): postgres binds one typed array per member and unnests them in a\n * semi-join subquery — except when a member is a `DateTime` without a\n * declared native type ({@link keyListBindsUntypedRows}): then it renders the\n * row-constructor list of untyped parameters, so each member is typed from\n * its column like `\"col\" = $n`; mysql renders the row-constructor list (an OR\n * of complete conjunctions when a member is a time of day and the dialect\n * declares `equalities` for it); sqlite renders `IN (VALUES …)`.\n */\nfunction renderKeyList(params: { dialect: SqlDialect; expr: KeyListExpr; collector: ParamCollector }): string {\n const { dialect, expr, collector } = params;\n const arity = expr.columns.length;\n if (arity === 0) throw internalError({ message: \"keyList needs at least one column\" });\n if (expr.members.length !== arity) {\n throw internalError({ message: `keyList has ${expr.members.length} members for ${arity} columns` });\n }\n for (const row of expr.rows) {\n if (row.length !== arity) throw internalError({ message: `keyList row has ${row.length} values for ${arity} columns` });\n }\n // Same honesty as inArray: an empty key list matches nothing.\n if (expr.rows.length === 0) return \"1 = 0\";\n const columns = expr.columns.map((column) => quoteCol(dialect, column));\n const tuple = arity === 1 ? (columns[0] as string) : `(${columns.join(\", \")})`;\n if (dialect.keyListStrategy === \"unnest\") {\n // Every member's element type first: a member without one (Json, an\n // unknown native type) is refused in either form.\n const types = expr.members.map((member) => postgresKeyListElementType({ dialect, member }));\n if (!keyListBindsUntypedRows({ members: expr.members })) {\n const arrays = types.map((type, index) => `${collector.add(expr.rows.map((row) => row[index]))}::${type}[]`);\n return `${tuple} IN (SELECT * FROM unnest(${arrays.join(\", \")}))`;\n }\n }\n if (dialect.timeOfDayInStrategy === \"equalities\" && expr.members.some((member) => member.timeOfDay === true)) {\n const conjunctions = expr.rows.map((row) => {\n const terms = row.map((value, index) => `${columns[index] as string} = ${collector.add(value)}`);\n return terms.length === 1 ? (terms[0] as string) : `(${terms.join(\" AND \")})`;\n });\n return conjunctions.length === 1 ? (conjunctions[0] as string) : `(${conjunctions.join(\" OR \")})`;\n }\n const tuples = expr.rows.map((row) => `(${collector.addMany(row).join(\", \")})`);\n return dialect.keyListStrategy === \"values\"\n ? `${tuple} IN (VALUES ${tuples.join(\", \")})`\n : `${tuple} IN (${tuples.join(\", \")})`;\n}\n\n// ─── Fix lane Q1 (round 3, DB-01): per-key page ─────────────────────────\n\n/** Key-list source alias of a per-key page; its members are `__vibe_k<i>` on postgres. */\nconst KEY_PAGE_KEYS = \"__vibe_keys\";\n/** Postgres: the lateral page of identity keys. */\nconst KEY_PAGE_IDS = \"__vibe_ids\";\n/** The child table re-read by identity. */\nconst KEY_PAGE_ROWS = \"__vibe_page\";\n\n/** Members of a {@link KeyPage}'s `select` the per-key page renders; any other is a malformed node. */\nconst KEY_PAGE_SELECT_MEMBERS: ReadonlySet<string> = new Set([\"kind\", \"table\", \"columns\", \"where\", \"orderBy\", \"limit\", \"offset\"]);\n\n/**\n * The per-key page (`SelectStatement.keyPage`) per `SqlDialect.keyPageStrategy`\n * — see {@link KeyPage}. Parameters join the shared sequence in text order:\n * the key tuples (FROM), then the page's own `where`.\n */\nfunction renderKeyPage(params: { dialect: SqlDialect; page: KeyPage; collector: ParamCollector }): string {\n const { dialect, page, collector } = params;\n const { select } = page;\n const arity = page.keyColumns.length;\n if (arity === 0 || page.members.length !== arity) {\n throw internalError({ message: `keyPage has ${page.members.length} members for ${arity} key columns` });\n }\n if (page.rows.length === 0) throw internalError({ message: \"keyPage needs at least one key\" });\n for (const row of page.rows) {\n if (row.length !== arity) throw internalError({ message: `keyPage row has ${row.length} values for ${arity} key columns` });\n }\n if (page.identity.length === 0) throw internalError({ message: \"keyPage needs the child's identity columns\" });\n const order = select.orderBy ?? [];\n if (order.length === 0 || order.some((term) => !(\"column\" in term))) {\n throw internalError({ message: \"keyPage needs a non-empty order of plain column terms\" });\n }\n if (select.table.alias !== undefined || Object.keys(select).some((member) => !KEY_PAGE_SELECT_MEMBERS.has(member))) {\n throw internalError({ message: \"keyPage select carries a member the per-key page cannot render\" });\n }\n if (dialect.keyPageStrategy === \"window\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a per-key page (keyPage)\",\n hint: \"the runtime keeps the ROW_NUMBER window on this dialect\",\n });\n }\n const pageRef = (column: ColRef): ColRef => ({ ...column, table: KEY_PAGE_ROWS });\n const projection = select.columns.map((column) => quoteProjection(dialect, pageRef(column)));\n const withKey = (keyRef: (index: number) => ColRef): SqlExpr => {\n const equalities: SqlExpr[] = page.keyColumns.map((column, index) => ({ kind: \"cmpCol\", op: \"eq\", left: column, right: keyRef(index) }));\n const operands = select.where === undefined ? equalities : [...equalities, select.where];\n return operands.length === 1 ? (operands[0] as SqlExpr) : { kind: \"and\", operands };\n };\n const keyPage = (where: SqlExpr, rank: boolean): SelectStatement => ({\n kind: \"select\",\n table: select.table,\n columns: page.identity,\n ...(rank ? { rowNumber: { partitionBy: page.keyColumns, orderBy: order, alias: page.rankAlias } } : {}),\n where,\n orderBy: order,\n ...(select.limit === undefined ? {} : { limit: select.limit }),\n ...(select.offset === undefined ? {} : { offset: select.offset }),\n });\n const rows = renderTable(dialect, { ...select.table, alias: KEY_PAGE_ROWS });\n const keyAlias = select.table.name === KEY_PAGE_KEYS ? `${KEY_PAGE_KEYS}_1` : KEY_PAGE_KEYS;\n const keys = dialect.quoteIdent({ name: keyAlias });\n\n if (dialect.keyPageStrategy === \"lateral\") {\n // One typed array per member, exactly the key-list filter's element types.\n if (keyListBindsUntypedRows({ members: page.members })) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a per-key page over a DateTime key without a declared native type\",\n hint: \"the runtime keeps the ROW_NUMBER window for such keys\",\n });\n }\n const types = page.members.map((member) => postgresKeyListElementType({ dialect, member }));\n const arrays = types.map((type, index) => `${collector.add(page.rows.map((row) => row[index]))}::${type}[]`);\n const names = page.keyColumns.map((_, index) => dialect.quoteIdent({ name: `__vibe_k${index}` }));\n const ids = renderSelect({ dialect, statement: keyPage(withKey((index) => ({ table: keyAlias, name: `__vibe_k${index}` })), true), collector });\n const on = page.identity.map((column) => `${quoteCol(dialect, pageRef(column))} = ${quoteCol(dialect, { table: KEY_PAGE_IDS, name: column.name })}`).join(\" AND \");\n const rank = quoteCol(dialect, { table: KEY_PAGE_IDS, name: page.rankAlias });\n return `SELECT ${[...projection, rank].join(\", \")} FROM unnest(${arrays.join(\", \")}) AS ${keys} (${names.join(\", \")}) CROSS JOIN LATERAL (${ids.text}) AS ${dialect.quoteIdent({ name: KEY_PAGE_IDS })} INNER JOIN ${rows} ON ${on}`;\n }\n\n // inLimit: the rank is re-derived over the fetched page — rendered first,\n // it is text order; plain column terms bind nothing.\n const partition = page.keyColumns.map((column) => quoteCol(dialect, pageRef(column))).join(\", \");\n const rankOrder = order.map((term) => renderOrderTerm({ dialect, term: { ...term, column: pageRef((term as OrderByColumn).column) }, collector })).join(\", \");\n const rank = `ROW_NUMBER() OVER (PARTITION BY ${partition} ORDER BY ${rankOrder}) AS ${dialect.quoteIdent({ name: page.rankAlias })}`;\n const tuples = page.rows.map((row) => `(${collector.addMany(row).join(\", \")})`);\n // SQLite names a VALUES clause's columns column1, column2, … (documented).\n const membership = renderExpr({\n dialect,\n expr: { kind: \"inSelect\", columns: page.identity.map(pageRef), select: keyPage(withKey((index) => ({ table: keyAlias, name: `column${index + 1}` })), false) },\n collector,\n });\n return `SELECT ${[...projection, rank].join(\", \")} FROM (VALUES ${tuples.join(\", \")}) AS ${keys} INNER JOIN ${rows} ON ${membership}`;\n}\n\n// ─── Statement-count pass EPIC 4 (ST-07): key rows ───\n\n/**\n * The derived table of `SelectStatement.fromKeys` (see {@link KeyRows}):\n * `unnest($1::<type>[], …) AS \"<name>\" (\"<column>\", …)` — one typed array per\n * column, bound at the FROM position of the shared parameter sequence.\n *\n * @throws VibeError `VIBE_UNSUPPORTED_CAPABILITY` on a dialect without the\n * typed-array key list (`keyListStrategy` other than `unnest`), for a\n * `DateTime` member without a declared native type, and for a member type\n * the key list does not know.\n */\nfunction renderKeyRows(params: { dialect: SqlDialect; statement: SelectStatement; keys: KeyRows; collector: ParamCollector }): string {\n const { dialect, statement, keys, collector } = params;\n if (statement.fromSelect !== undefined || statement.keyPage !== undefined || statement.fromUnion !== undefined || statement.table.alias !== undefined) {\n throw internalError({ message: \"fromKeys uses table.name as the derived-table alias — fromSelect, keyPage, fromUnion and table.alias must be unset\" });\n }\n // A lock over bound key rows would lock nothing.\n if (statement.rowLock !== undefined) throw internalError({ message: \"a locking read cannot read from key rows\" });\n const arity = keys.columns.length;\n if (arity === 0 || keys.members.length !== arity) {\n throw internalError({ message: `fromKeys has ${keys.members.length} members for ${arity} columns` });\n }\n if (keys.rows.length === 0) throw internalError({ message: \"fromKeys needs at least one key row\" });\n for (const row of keys.rows) {\n if (row.length !== arity) throw internalError({ message: `fromKeys row has ${row.length} values for ${arity} columns` });\n }\n if (dialect.keyListStrategy !== \"unnest\" || keyListBindsUntypedRows({ members: keys.members })) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: dialect.keyListStrategy !== \"unnest\" ? \"a key-rows FROM (fromKeys)\" : \"a key-rows FROM over a DateTime key without a declared native type\",\n hint: \"the runtime keeps the per-relation loads for this write\",\n });\n }\n const types = keys.members.map((member) => postgresKeyListElementType({ dialect, member }));\n const arrays = types.map((type, index) => `${collector.add(keys.rows.map((row) => row[index]))}::${type}[]`);\n const names = keys.columns.map((name) => dialect.quoteIdent({ name }));\n return `unnest(${arrays.join(\", \")}) AS ${dialect.quoteIdent({ name: statement.table.name })} (${names.join(\", \")})`;\n}\n\n// ─── Fix lane Q2 (round 3, DB-07): union page ───\n\n/** Members a {@link SelectStatement.fromUnion} branch may carry; any other is a malformed node. */\nconst UNION_BRANCH_MEMBERS: ReadonlySet<string> = new Set([\"kind\", \"table\", \"columns\", \"where\", \"orderBy\", \"limit\"]);\n\n/**\n * The `UNION ALL` of a union page (`SelectStatement.fromUnion`), each branch\n * in its own derived table `\"__vibe_u<i>\"` — see the field's docs. Branches\n * render (and bind) in order.\n */\nfunction renderUnionPage(params: { dialect: SqlDialect; statement: SelectStatement; collector: ParamCollector }): string {\n const { dialect, statement, collector } = params;\n const branches = statement.fromUnion ?? [];\n if (branches.length < 2) throw internalError({ message: \"fromUnion needs at least two branches\" });\n if (statement.fromSelect !== undefined || statement.keyPage !== undefined || statement.table.alias !== undefined) {\n throw internalError({ message: \"fromUnion uses table.name as the derived-table alias — fromSelect, keyPage and table.alias must be unset\" });\n }\n // A lock over a derived union would not lock the base rows the branches read.\n if (statement.rowLock !== undefined) throw internalError({ message: \"a locking read cannot read from a union page\" });\n const outputNames = (branch: SelectStatement): string => branch.columns.map((column) => column.alias ?? column.name).join(\"\\u0000\");\n const names = outputNames(branches[0] as SelectStatement);\n return branches\n .map((branch, index) => {\n if (branch.columns.length === 0 || Object.keys(branch).some((member) => !UNION_BRANCH_MEMBERS.has(member))) {\n throw internalError({ message: \"a fromUnion branch must be a plain SELECT <columns> FROM <table> [WHERE] [ORDER BY] [LIMIT]\" });\n }\n if (outputNames(branch) !== names) throw internalError({ message: \"fromUnion branches must project the same output names in the same order\" });\n const inner = renderSelect({ dialect, statement: branch, collector });\n return `SELECT * FROM (${inner.text}) AS ${dialect.quoteIdent({ name: `__vibe_u${index}` })}`;\n })\n .join(\" UNION ALL \");\n}\n\ntype JsonFilterExpr = Extract<SqlExpr, { kind: \"jsonFilter\" }>;\n\nfunction jsonStringPattern(params: { expr: JsonFilterExpr }): string {\n const { expr } = params;\n if (typeof expr.value !== \"string\") {\n throw internalError({ message: `json ${expr.op} expects a string operand` });\n }\n if (expr.op === \"string_contains\") return containsPattern({ raw: expr.value });\n if (expr.op === \"string_starts_with\") return startsWithPattern({ raw: expr.value });\n return endsWithPattern({ raw: expr.value });\n}\n\n/** Case-[in]sensitive LIKE over an extracted-text expression, per dialect. */\nfunction renderJsonLike(params: {\n dialect: SqlDialect;\n target: string;\n expr: JsonFilterExpr;\n collector: ParamCollector;\n}): string {\n const { dialect, target, expr, collector } = params;\n const placeholder = collector.add(jsonStringPattern({ expr }));\n let base: string;\n if (expr.insensitive === true) {\n base =\n dialect.insensitiveLike === \"ilike\"\n ? `${target} ILIKE ${placeholder}`\n : `LOWER(${target}) LIKE LOWER(${placeholder})`;\n } else {\n base = `${target} LIKE ${placeholder}`;\n }\n if (dialect.likeEscapeClause !== null) base = `${base}${dialect.likeEscapeClause}`;\n return expr.negate === true ? `NOT (${base})` : base;\n}\n\n/**\n * Member presence as a three-valued predicate: TRUE or FALSE for a present\n * document, NULL for a SQL NULL column, so `NOT` keeps NULL columns out (the\n * rule every other path filter follows).\n */\nfunction renderJsonExists(params: { present: string; column: string; exists: boolean }): string {\n const { present, column, exists } = params;\n return `CASE WHEN ${present} THEN ${exists ? \"TRUE\" : \"FALSE\"} WHEN ${column} IS NOT NULL THEN ${exists ? \"FALSE\" : \"TRUE\"} END`;\n}\n\n/**\n * One JSON path predicate, per dialect strategy. The path is BOUND: a `text[]`\n * parameter on postgres (cast so string-literal array forms work too), a\n * `$.a.b` path string elsewhere. Values bind as JSON text for json/jsonb\n * comparisons and as LIKE patterns for the string ops.\n */\nfunction renderJsonFilter(params: {\n dialect: SqlDialect;\n expr: JsonFilterExpr;\n collector: ParamCollector;\n}): string {\n const { dialect, expr, collector } = params;\n if (!dialect.supportedJsonOps.includes(expr.op)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `the json filter \"${expr.op}\"`,\n hint: `this dialect can express: ${dialect.supportedJsonOps.join(\", \")}`,\n });\n }\n const cmp = expr.negate === true ? \"<>\" : \"=\";\n\n if (dialect.jsonPathMode === \"operators\") {\n const column = quoteCol(dialect, expr.column);\n const pathParam = `${collector.add(expr.path.map(String))}::text[]`;\n // A `json` column (`Json @db.Json`) has no `=`, `<>` or `@>` — postgres\n // defines them for jsonb only (SQLSTATE 42883 `json = jsonb`). The\n // value-comparing ops cast the EXTRACTED value, not the column: the\n // result is jsonb equality and containment, a jsonb column's semantics\n // (json navigation also takes the LAST of duplicate keys), and only the\n // sub-value is converted — ~40% faster than casting the whole document\n // on 20,000 4-KB rows (PostgreSQL 18.6). The string ops read the same\n // jsonb value as text (`#>> '{}'`): json's own `#>>` returns the STORED\n // spelling of a non-string value (`1e2`, `[1, 2]`, both duplicate keys)\n // where a jsonb column reads `100`, `[1, 2]` and the last key. For a\n // string value both forms return the same unescaped text.\n const extracted = expr.storage === \"json\" ? `(${column} #> ${pathParam})::jsonb` : `(${column} #> ${pathParam})`;\n switch (expr.op) {\n case \"exists\": {\n // `#>` reads a key PostgreSQL can parse as an integer (`\"0\"`, ` 1`,\n // `+1`) as an index into an array, so such a step also requires its\n // container to be an object. Presence needs no jsonb cast on a `json`\n // column: json's own `#>` and `json_typeof` give the same answer.\n const typeOf = expr.storage === \"json\" ? \"json_typeof\" : \"jsonb_typeof\";\n const guards = expr.path.flatMap((segment, index) => {\n if (typeof segment !== \"string\" || !/^\\s*[+-]?\\d/.test(segment)) return [];\n const container = index === 0 ? column : `${column} #> ${collector.add(expr.path.slice(0, index).map(String))}::text[]`;\n return [` AND ${typeOf}(${container}) = 'object'`];\n });\n return renderJsonExists({ present: `(${column} #> ${pathParam}) IS NOT NULL${guards.join(\"\")}`, column, exists: expr.value === true });\n }\n case \"equals\":\n return `${extracted} ${cmp} ${collector.add(JSON.stringify(expr.value))}${dialect.jsonParamCast}`;\n case \"string_contains\":\n case \"string_starts_with\":\n case \"string_ends_with\": {\n const target = expr.storage === \"json\" ? `(${extracted} #>> '{}')` : `(${column} #>> ${pathParam})`;\n return renderJsonLike({ dialect, target, expr, collector });\n }\n case \"array_contains\":\n return `${extracted} @> ${collector.add(JSON.stringify(expr.value))}${dialect.jsonParamCast}`;\n case \"array_starts_with\":\n return `${extracted} -> 0 = ${collector.add(JSON.stringify(expr.value))}${dialect.jsonParamCast}`;\n case \"array_ends_with\":\n return `${extracted} -> -1 = ${collector.add(JSON.stringify(expr.value))}${dialect.jsonParamCast}`;\n }\n }\n\n if (dialect.jsonPathMode === \"sqliteExtract\") {\n const column = quoteCol(dialect, expr.column);\n // JSON booleans surface as SQL 0/1, so value equality alone loses type.\n const typeMatches = (type: string, value: unknown): string => {\n if (typeof value === \"number\") return `${type} IN ('integer', 'real')`;\n const tag = typeof value === \"boolean\" ? String(value)\n : value === null ? \"null\" : Array.isArray(value) ? \"array\"\n : typeof value === \"object\" ? \"object\" : \"text\";\n return `${type} = '${tag}'`;\n };\n const compareExtracted = (path: string, value: unknown): string => {\n const type = `json_type(${column}, ${collector.add(path)})`;\n const guard = typeMatches(type, value);\n let base = guard;\n if (value !== null) {\n const target = `json_extract(${column}, ${collector.add(path)})`;\n const bound = typeof value === \"boolean\" ? (value ? 1 : 0) : value;\n const comparison = typeof value === \"object\"\n ? renderSqliteJsonEquality({ dialect, left: target, right: collector.add(JSON.stringify(value)) })\n : `${target} = ${collector.add(bound)}`;\n base = `(${guard} AND ${comparison})`;\n }\n return expr.negate === true ? `NOT (${base})` : base;\n };\n switch (expr.op) {\n case \"exists\":\n return renderJsonExists({ present: `json_type(${column}, ${collector.add(jsonPathString(expr.path))}) IS NOT NULL`, column, exists: expr.value === true });\n case \"equals\":\n return compareExtracted(jsonPathString(expr.path), expr.value);\n case \"string_contains\":\n case \"string_starts_with\":\n case \"string_ends_with\": {\n const target = `json_extract(${column}, ${collector.add(jsonPathString(expr.path))})`;\n return renderJsonLike({ dialect, target, expr, collector });\n }\n case \"array_starts_with\":\n case \"array_ends_with\": {\n // Edge-element access: `$[0]` / `$[#-1]` path elements (sqlite ≥3.31;\n // bun:sqlite bundles far newer) — N6/board #21.\n const edge = expr.op === \"array_starts_with\" ? \"[0]\" : \"[#-1]\";\n return compareExtracted(`${jsonPathString(expr.path)}${edge}`, expr.value);\n }\n case \"array_contains\": {\n // Scalar-needle containment via json_each() EXISTS — one EXISTS per\n // element, ANDed (jsonb `@>` semantics for scalar members). Deep\n // structural containment (object/array members) has no cheap faithful\n // sqlite form and stays refused; JSON null members compare through\n // json_each's 'null' type tag, not SQL NULL, so they are refused too.\n //\n // Haystack type guard (wave-C review): json_each() over a path holding\n // a SCALAR yields one row carrying that scalar, so an unguarded EXISTS\n // matched `{ tags: \"a\" }` against needle `[\"a\"]` where postgres (`@>`\n // with an array needle) and mysql (JSON_CONTAINS against an array\n // literal) are false. json_type() is NULL for a missing path, so\n // missing paths and NULL columns stay non-matches — and an empty\n // needle reduces to the guard alone: contained in every ARRAY (pg's\n // `@> '[]'` truth) and in nothing else.\n const guard = `json_type(${column}, ${collector.add(jsonPathString(expr.path))}) = 'array'`;\n const elements = Array.isArray(expr.value) ? expr.value : [expr.value];\n const tests = elements.map((element) => {\n if (element === null || (typeof element === \"object\" && element !== null)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"json array_contains with object/array/null elements\",\n hint: \"sqlite expresses scalar-element containment only — deep structural containment needs postgres or mysql\",\n });\n }\n const bound = typeof element === \"boolean\" ? (element ? 1 : 0) : element;\n const path = collector.add(jsonPathString(expr.path));\n const type = `${dialect.quoteIdent({ name: \"json_each\" })}.${dialect.quoteIdent({ name: \"type\" })}`;\n return `EXISTS (SELECT 1 FROM json_each(${column}, ${path}) WHERE ${typeMatches(type, element)} AND ${dialect.quoteIdent({ name: \"json_each\" })}.${dialect.quoteIdent({ name: \"value\" })} = ${collector.add(bound)})`;\n });\n return tests.length === 0 ? guard : `(${[guard, ...tests].join(\" AND \")})`;\n }\n default:\n throw internalError({ message: `json op \"${expr.op}\" leaked past supportedJsonOps on sqlite` });\n }\n }\n\n // mysqlExtract\n const column = quoteCol(dialect, expr.column);\n const pathString = jsonPathString(expr.path);\n switch (expr.op) {\n case \"exists\": {\n // NULL for a SQL NULL document, so `NOT` keeps such rows out as it does on the other dialects.\n const present = `JSON_CONTAINS_PATH(${column}, 'one', ${collector.add(pathString)})`;\n return expr.value === true ? present : `NOT ${present}`;\n }\n case \"equals\":\n return `JSON_EXTRACT(${column}, ${collector.add(pathString)}) ${cmp} CAST(${collector.add(JSON.stringify(expr.value))} AS JSON)`;\n case \"string_contains\":\n case \"string_starts_with\":\n case \"string_ends_with\": {\n const target = `JSON_UNQUOTE(JSON_EXTRACT(${column}, ${collector.add(pathString)}))`;\n return renderJsonLike({ dialect, target, expr, collector });\n }\n case \"array_contains\":\n return `JSON_CONTAINS(JSON_EXTRACT(${column}, ${collector.add(pathString)}), CAST(${collector.add(JSON.stringify(expr.value))} AS JSON))`;\n case \"array_starts_with\":\n return `JSON_EXTRACT(${column}, ${collector.add(`${pathString}[0]`)}) ${cmp} CAST(${collector.add(JSON.stringify(expr.value))} AS JSON)`;\n case \"array_ends_with\":\n return `JSON_EXTRACT(${column}, ${collector.add(`${pathString}[last]`)}) ${cmp} CAST(${collector.add(JSON.stringify(expr.value))} AS JSON)`;\n }\n}\n\n// ─── Ordering ─────────────────────────────────────────────────────\n\n/**\n * The output name a groupBy expression key's ORDER BY term reads in its\n * emulated null placement. MySQL's ONLY_FULL_GROUP_BY admits a GROUP BY\n * expression as a whole ORDER BY term, but inside `<expression> IS NULL` it\n * reads the expression's column as ungrouped (ER_WRONG_FIELD_WITH_GROUP);\n * MySQL resolves an output name inside an ORDER BY expression, and a key's\n * output name is never a column of its table (the runtime refuses such an\n * `as`). A truncated key keeps its column's name, so it never qualifies.\n */\nfunction groupKeyOutputName(params: { dialect: SqlDialect; statement: SelectStatement; column: ColRef }): string | undefined {\n const { dialect, statement, column } = params;\n if (column.groupKey === undefined) return undefined;\n const text = quoteCol(dialect, column);\n const projected = statement.columns.find((candidate) =>\n candidate.groupKey !== undefined && candidate.transform === undefined && candidate.alias !== undefined && quoteCol(dialect, candidate) === text);\n return projected?.alias;\n}\n\nfunction renderOrderTerm(params: { dialect: SqlDialect; term: OrderTerm; collector: ParamCollector; nullsOutputName?: string }): string {\n const { dialect, term, collector, nullsOutputName } = params;\n if (\"agg\" in term) {\n return `${renderAggRef(dialect, term.agg, collector)} ${term.direction === \"asc\" ? \"ASC\" : \"DESC\"}`;\n }\n // Relation orderBy: a correlated scalar subquery — its parameters merge into\n // the shared sequence exactly where they appear in the text (twice when the\n // NULL emulation below repeats the subquery).\n const expression = \"select\" in term\n ? (): string => renderScalarSubquery({ dialect, subquery: term, collector })\n : (): string => quoteCol(dialect, term.column);\n const direction = term.direction === \"asc\" ? \"ASC\" : \"DESC\";\n if (term.nulls === undefined) {\n return `${expression()} ${direction}`;\n }\n if (dialect.orderByNullsMode === \"native\") {\n return `${expression()} ${direction} NULLS ${term.nulls === \"first\" ? \"FIRST\" : \"LAST\"}`;\n }\n // Emulation (mysql): the engine's native order already places NULLs FIRST on\n // ASC and LAST on DESC — those pairings render the bare term (the redundant\n // boolean pre-term cost a per-row evaluation and could defeat index-order\n // scans, #14). Only the diverging pairings need the `IS NULL` pre-term:\n // false(0) sorts first, so plain `IS NULL` pushes nulls last and\n // `IS NULL DESC` pulls them first.\n if ((term.nulls === \"first\") === (term.direction === \"asc\")) {\n return `${expression()} ${direction}`;\n }\n const tested = nullsOutputName === undefined ? expression() : dialect.quoteIdent({ name: nullsOutputName });\n const nullsTerm = term.nulls === \"first\" ? `${tested} IS NULL DESC` : `${tested} IS NULL`;\n return `${nullsTerm}, ${expression()} ${direction}`;\n}\n\n// ─── Projections ──────────────────────────────────────────────────\n\nfunction renderSelectExpr(params: { dialect: SqlDialect; expr: SelectExpr }): string {\n const { dialect, expr } = params;\n if (expr.kind === \"one\") return \"1\";\n const alias = expr.alias === undefined ? \"\" : ` AS ${dialect.quoteIdent({ name: expr.alias })}`;\n return `COUNT(*)${alias}`;\n}\n\n// ─── Lateral JSON joins ───────────────────────────────────\n\n/**\n * `LEFT JOIN LATERAL (… to_json …) AS alias ON true`. Postgres SQL, and MySQL\n * 8.0.14+ through `SqlDialect.lateralJson` (lane J: `JSON_ARRAY` rows,\n * `JSON_ARRAYAGG`, an ordered level's `ROW_NUMBER()` position slot) — the\n * runtime gates the \"join\" strategy on `capabilities.lateralJoin` at build\n * time, and this renderer refuses too (dialect honesty, rule 4).\n *\n * `json`, not `jsonb`: the payload is transport — parsed by the driver and\n * never touched by a JSON operator on the server. `jsonb_agg(to_jsonb(…))`\n * builds postgres's binary JSON (sorted, de-duplicated keys) and then\n * serializes it straight back to text for the wire, which measured at 2–3.7×\n * the server time of `json_agg(to_json(…))` for identical decoded values\n * (`.ai/plans/26.09.08 - performance-join-strategy.md` §1.2). The observable\n * differences are textual only: `json` keeps construction key order and `-0`,\n * `jsonb` normalizes both; every scalar still rides the B3 transforms.\n */\nfunction renderPositionalRow(params: { dialect: SqlDialect; join: LateralJoin; subAlias: string }): string {\n const { dialect, join, subAlias } = params;\n const json = lateralJsonOf({ dialect });\n // Lane J: a `positionSlot` dialect's ordered list level carries its\n // ROW_NUMBER() position as the LAST slot (the runtime sorts by it).\n const position = join.select.rowNumber;\n const positioned = position !== undefined && json.order === \"positionSlot\" && join.agg === \"jsonArray\" &&\n position.partitionBy.length === 0 && position.orderBy.length > 0;\n if (join.select.columns.length === 0 || join.select.selectExpr !== undefined ||\n (join.select.aggregates?.length ?? 0) > 0 || (position !== undefined && !positioned)) {\n throw internalError({ message: \"positional lateral rows require an explicit column-only projection\" });\n }\n const names = [...join.select.columns.map((column) => projectionOutputName({ column })), ...(positioned ? [position.alias] : [])];\n if (new Set(names).size !== names.length) {\n throw internalError({ message: \"positional lateral projection has duplicate output names\" });\n }\n const values = names.map((name) => `${subAlias}.${dialect.quoteIdent({ name })}`);\n const chunks: string[] = [];\n for (let index = 0; index < values.length; index += JSON_TRANSPORT.chunkSize) {\n chunks.push(`${json.rowArray}(${values.slice(index, index + JSON_TRANSPORT.chunkSize).join(\", \")})`);\n }\n if (chunks.length > JSON_TRANSPORT.chunkSize) {\n throw internalError({ message: \"positional lateral projection exceeds the transport width limit\" });\n }\n return chunks.length === 1 ? chunks[0] as string : `${json.rowArray}(${chunks.join(\", \")})`;\n}\n\n/** The dialect's lateral JSON functions; callers already refused a dialect without them. */\nfunction lateralJsonOf(params: { dialect: SqlDialect }): NonNullable<SqlDialect[\"lateralJson\"]> {\n const json = params.dialect.lateralJson;\n if (json === null) throw internalError({ message: \"lateral JSON rendering on a dialect without LATERAL\" });\n return json;\n}\n\nfunction renderLateralJoin(params: {\n dialect: SqlDialect;\n join: LateralJoin;\n collector: ParamCollector;\n}): string {\n const { dialect, join, collector } = params;\n const inner = renderSelect({ dialect, statement: join.select, collector });\n if (join.agg === \"count\") {\n if (join.rowFormat === \"positional\" || join.select.columns.length !== 0 ||\n join.select.selectExpr?.kind !== \"countAll\" || join.select.selectExpr.alias !== join.columnAlias ||\n join.select.groupBy !== undefined || join.select.having !== undefined ||\n join.select.limit !== undefined || join.select.offset !== undefined || join.select.distinctOn !== undefined ||\n join.select.distinct !== undefined) {\n throw internalError({ message: \"count lateral must return one ungrouped COUNT(*) under its column alias\" });\n }\n return `LEFT JOIN LATERAL (${inner.text}) AS ${dialect.quoteIdent({ name: join.alias })} ON true`;\n }\n const columnAlias = dialect.quoteIdent({ name: join.columnAlias });\n const subAlias = dialect.quoteIdent({ name: \"__sub\" });\n const json = lateralJsonOf({ dialect });\n // N2 (SQL review): json_agg over a subquery only \"usually\" preserves the\n // subquery's order — pin it with an explicit ORDER BY inside the aggregate\n // (the subquery keeps its own ORDER BY for LIMIT). Only column terms that\n // are PROJECTED (and untransformed — a B3 ::text cast would re-sort\n // lexicographically) can be referenced through `__sub`; anything else keeps\n // the old behavior. A `positionSlot` dialect (MySQL) orders through the\n // position slot instead ({@link renderPositionalRow}).\n let aggOrder = \"\";\n if (json.order === \"inAggregate\" && join.agg === \"jsonArray\" && join.select.orderBy !== undefined && join.select.orderBy.length > 0) {\n const projected = new Set(\n join.select.columns\n .filter((column) => column.transform === undefined && column.castReal !== true)\n .map((column) => column.name)\n .concat((join.select.scalarSubqueries ?? []).map((subquery) => subquery.alias)),\n );\n const terms = join.select.orderBy;\n const columnTerms = terms.filter(\n (term): term is Extract<OrderTerm, { column: ColRef }> => \"column\" in term,\n );\n const subRef = (column: ColRef): ColRef => ({ table: \"__sub\", name: column.name, ...(column.castJsonb === undefined ? {} : { castJsonb: column.castJsonb }) });\n const readable = (column: ColRef): boolean =>\n column.coalesce === undefined ? projected.has(column.name) : column.coalesce.every((member) => projected.has(member.name));\n if (columnTerms.length === terms.length && columnTerms.every((term) => readable(term.column))) {\n const rendered = columnTerms.map((term) =>\n renderOrderTerm({\n dialect,\n term: {\n ...term,\n column: term.column.coalesce === undefined ? subRef(term.column) : { ...term.column, coalesce: term.column.coalesce.map(subRef) },\n },\n collector,\n }),\n );\n aggOrder = ` ORDER BY ${rendered.join(\", \")}`;\n }\n }\n if (join.rowFormat !== \"positional\" && json.order !== \"inAggregate\") {\n // `to_json(\"__sub\".*)` names the columns itself; the runtime always sends\n // positional rows, so object rows stay a postgres construct.\n throw unsupportedCapability({ dialect: dialect.name, feature: \"object-format lateral rows\", hint: \"lateral relation rows render positional (rowFormat \\\"positional\\\") on this dialect\" });\n }\n const rowJson = join.rowFormat === \"positional\"\n ? renderPositionalRow({ dialect, join, subAlias })\n : `to_json(${subAlias}.*)`;\n const projection =\n join.agg === \"jsonArray\"\n ? `COALESCE(${json.arrayAgg}(${rowJson}${aggOrder}), ${json.emptyArray}) AS ${columnAlias}`\n : `${rowJson} AS ${columnAlias}`;\n const alias = dialect.quoteIdent({ name: join.alias });\n return `LEFT JOIN LATERAL (SELECT ${projection} FROM (${inner.text}) AS ${subAlias}) AS ${alias} ON true`;\n}\n\n/**\n * `(SELECT COUNT(*) FROM … WHERE …) AS \"alias\"` — one scalar per output row\n * ({@link CountSubquery}). Refuses anything but one ungrouped COUNT(*), so a\n * builder bug can never project a multi-row or multi-column subquery.\n */\nfunction renderCountSubquery(params: {\n dialect: SqlDialect;\n subquery: CountSubquery;\n collector: ParamCollector;\n}): string {\n const { dialect, subquery, collector } = params;\n const select = subquery.select;\n if (select.columns.length !== 0 || select.selectExpr?.kind !== \"countAll\" ||\n (select.aggregates?.length ?? 0) > 0 || select.rowNumber !== undefined ||\n select.groupBy !== undefined || select.having !== undefined ||\n select.limit !== undefined || select.offset !== undefined ||\n select.distinctOn !== undefined || select.distinct !== undefined || select.rowLock !== undefined ||\n select.countSubqueries !== undefined || select.scalarSubqueries !== undefined) {\n throw internalError({ message: \"count subquery must be one ungrouped COUNT(*)\" });\n }\n const inner = renderSelect({ dialect, statement: select, collector });\n return `(${inner.text}) AS ${dialect.quoteIdent({ name: subquery.alias })}`;\n}\n\n/** Render a scalar value without its projection alias. */\nfunction renderScalarSubquery(params: {\n dialect: SqlDialect;\n subquery: { readonly select: SelectStatement; readonly coalesce?: 0 };\n collector: ParamCollector;\n}): string {\n const { dialect, subquery, collector } = params;\n const value = `(${renderSelect({ dialect, statement: subquery.select, collector }).text})`;\n return subquery.coalesce === 0 ? `COALESCE(${value}, 0)` : value;\n}\n\n// ─── RETURNING ────────────────────────────────────────────────────\n\nfunction applyReturning(params: {\n dialect: SqlDialect;\n requested: readonly ReturningColumn[] | undefined;\n /**\n * The quoted target alias of an `UPDATE … FROM`, whose joined relation may\n * share a column name with the target (PostgreSQL only: SQLite's RETURNING\n * sees the target table alone).\n */\n qualify?: string;\n /** Binds a row-capture cascade column's limit. */\n collector?: ParamCollector;\n}): { suffix: string; status: \"native\" | \"omitted\" | \"none\" } {\n const { dialect, requested } = params;\n if (requested === undefined || requested.length === 0) {\n return { suffix: \"\", status: \"none\" };\n }\n if (!dialect.capabilities.returning) {\n // Dropping a row-capture column with the omitted RETURNING would lose the capture without a word.\n const capture = requested.find(isCaptureReturningColumn);\n if (capture !== undefined) renderCaptureReturning({ dialect, column: capture, collector: params.collector });\n const other = requested.find(isOtherRowReturningColumn);\n if (other !== undefined) renderOtherRowReturning({ dialect, column: other });\n return { suffix: \"\", status: \"omitted\" };\n }\n const read = (name: string): string => (params.qualify === undefined ? name : `${params.qualify}.${name}`);\n const columns = requested\n .map((column) => {\n if (typeof column === \"string\") return read(dialect.quoteIdent({ name: column }));\n if (\"capture\" in column) return renderCaptureReturning({ dialect, column, collector: params.collector });\n if (\"from\" in column) return renderOtherRowReturning({ dialect, column });\n if (\"transform\" in column) {\n const name = dialect.quoteIdent({ name: column.name });\n return `${dialect.jsonTextProjection({ expression: read(name) })} AS ${name}`;\n }\n const name = dialect.quoteIdent({ name: column.name });\n return `${textProjection({ dialect, expression: read(name) })} AS ${name}`;\n })\n .join(\", \");\n return { suffix: ` RETURNING ${columns}`, status: \"native\" };\n}\n\n/**\n * `old.\"col\"::text AS \"alias\"`, `new.\"col\"::text AS \"alias\"` or `(old.\"col\" IS\n * NULL) AS \"alias\"` — see {@link CaptureReturningColumn}. Only a dialect with\n * the `rowCapture` capability names the row before and after the statement\n * in RETURNING; elsewhere the runtime refuses `capture` before it builds one.\n */\nfunction renderCaptureReturning(params: { dialect: SqlDialect; column: CaptureReturningColumn; collector?: ParamCollector | undefined }): string {\n const { dialect, column } = params;\n if (!dialect.capabilities.rowCapture) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"row capture (RETURNING old./new.)\", hint: \"row capture needs PostgreSQL 18 or later; the runtime refuses $transaction({ capture }) on this dialect\" });\n }\n const alias = dialect.quoteIdent({ name: column.alias });\n if (column.capture === \"cascade\") {\n if (params.collector === undefined) throw internalError({ message: `capture cascade column \"${column.alias}\" rendered without a parameter collector` });\n const child = dialect.quoteIdent({ name: CAPTURE_CHILD_ALIAS });\n const match = column.cascade.on.map((pair) => `${child}.${dialect.quoteIdent({ name: pair.child })} = old.${dialect.quoteIdent({ name: pair.parent })}`).join(\" AND \");\n return `${renderCascadeImages({ dialect, cascade: column.cascade, match, collector: params.collector })} AS ${alias}`;\n }\n const name = dialect.quoteIdent({ name: column.name });\n if (column.capture === \"inserted\") return `(old.${name} IS NULL) AS ${alias}`;\n if (column.capture === \"key\") return `old.${name} AS ${alias}`;\n return `${renderCaptureCell({ dialect, row: column.capture, cell: column })} AS ${alias}`;\n}\n\nconst CAPTURE_CHILD_ALIAS = \"__vibe_c\";\nconst CAPTURE_HOP_ALIAS = \"__vibe_h\";\n\n/**\n * One capture cell as text, read from `row` (`old`, `new` or a quoted alias):\n * `row.\"col\"::text`, or through a {@link CaptureCell.hop} the related row's\n * column, `(SELECT \"__vibe_h\".\"col\"::text FROM \"Related\" AS \"__vibe_h\" WHERE\n * \"__vibe_h\".\"id\" = row.\"relatedId\")`.\n */\nfunction renderCaptureCell(params: { dialect: SqlDialect; row: string; cell: CaptureCell }): string {\n const { dialect, row, cell } = params;\n const name = dialect.quoteIdent({ name: cell.name });\n if (cell.hop === undefined) return textProjection({ dialect, expression: `${row}.${name}` });\n if (cell.hop.on.length === 0) throw internalError({ message: `capture hop to \"${cell.hop.table.name}\" needs at least one key column` });\n const related = dialect.quoteIdent({ name: CAPTURE_HOP_ALIAS });\n const match = cell.hop.on.map((pair) => `${related}.${dialect.quoteIdent({ name: pair.target })} = ${row}.${dialect.quoteIdent({ name: pair.source })}`).join(\" AND \");\n return `(SELECT ${textProjection({ dialect, expression: `${related}.${name}` })} FROM ${renderTable(dialect, cell.hop.table)} AS ${related} WHERE ${match})`;\n}\n\n/** A {@link CaptureCascade}'s bounded distinct image aggregate over the child rows `match` admits. */\nfunction renderCascadeImages(params: { dialect: SqlDialect; cascade: CaptureCascade; match: string; collector: ParamCollector }): string {\n const { dialect, cascade, match, collector } = params;\n if (cascade.cells.length === 0 || cascade.on.length === 0) throw internalError({ message: `capture cascade into \"${cascade.table.name}\" needs at least one cell and one key column` });\n if (!Number.isSafeInteger(cascade.limit) || cascade.limit < 1) throw internalError({ message: `capture cascade into \"${cascade.table.name}\" needs a positive integer limit` });\n const child = dialect.quoteIdent({ name: CAPTURE_CHILD_ALIAS });\n const item = dialect.quoteIdent({ name: \"__vibe_i\" });\n const cells = cascade.cells.map((cell) => renderCaptureCell({ dialect, row: child, cell })).join(\", \");\n return `(SELECT array_agg(${item})::text FROM (SELECT DISTINCT ARRAY[${cells}] AS ${item} FROM ${renderTable(dialect, cascade.table)} AS ${child} WHERE ${match} LIMIT ${collector.add(cascade.limit)}) AS ${dialect.quoteIdent({ name: \"__vibe_d\" })})`;\n}\n\n/**\n * `old.\"col\" AS \"alias\"` or `\"source\".\"col\" AS \"alias\"`, projected like the\n * written row's own column — see {@link OtherRowReturningColumn}. Refused\n * where the dialect cannot name that row in RETURNING, so a caller never gets\n * a write whose previous values were silently dropped.\n */\nfunction renderOtherRowReturning(params: { dialect: SqlDialect; column: OtherRowReturningColumn }): string {\n const { dialect, column } = params;\n const fromOld = column.from === \"old\";\n if (fromOld ? !dialect.capabilities.rowCapture : !dialect.capabilities.returningReadsJoinedSource) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: fromOld ? \"RETURNING old.… (the row before the write)\" : \"RETURNING a joined source's columns\",\n hint: fromOld ? \"needs PostgreSQL 18 or later\" : \"read the row inside the write's transaction first, then write it\",\n });\n }\n const name = dialect.quoteIdent({ name: column.name });\n const expression = column.from === \"old\" ? `old.${name}` : `${dialect.quoteIdent({ name: column.from.source })}.${name}`;\n const projected = column.projection === \"castText\" ? textProjection({ dialect, expression })\n : column.projection === \"jsonText\" ? dialect.jsonTextProjection({ expression })\n : expression;\n return `${projected} AS ${dialect.quoteIdent({ name: column.alias })}`;\n}\n\n// ─── SELECT ───────────────────────────────────────────────────────\n\n/**\n * {@link KeyTableJoin}: `INNER JOIN (VALUES ROW(?, 0), …) AS alias (…) ON …`.\n * Mysql only — the one dialect whose default text equality is not byte\n * equality, and the shape was measured there (8.0.19+ `VALUES ROW`, already\n * this project's floor for the upsert row alias). Postgres needs a typed\n * parameter per member, so it renders only `citext` / `text` / `integer`\n * members (`CAST($n AS citext | text | bigint)`, plain `(…)` rows) — the\n * runtime emits it for a key tuple with a citext member; every other postgres\n * member refuses, and sqlite has no derived-table column list, so it refuses\n * rather than render an untested form.\n *\n * Ordinals are literal integers (row `i` → `i`): a statement-local index, not\n * data, so a key costs exactly the parameters its members bind — the same\n * budget as `col IN (?, …)`. Text members bind bare so the column's collation\n * decides; numeric members that travel as strings are CAST (see\n * {@link KeyTableMember}).\n *\n * The runtime emits a key table wherever `conflictKeyEquality.textIsBinaryByDefault`\n * is false (packages/runtime/src/relation-loader.ts, `associatesInDatabase`);\n * this refusal is by NAME, so a new dialect declaring that fact must also be\n * measured and admitted here.\n */\nfunction renderKeyTableJoin(params: { dialect: SqlDialect; join: KeyTableJoin; collector: ParamCollector }): string {\n const { dialect, join, collector } = params;\n // Postgres binds every member typed (an untyped VALUES cell would be\n // `text`, see {@link KeyTableMember}); `citext` and `text` are postgres\n // members, mysql binds text bare.\n const postgresMember = (member: KeyTableMember): boolean => member.kind === \"citext\" || member.kind === \"text\" || member.kind === \"integer\";\n const admitted = dialect.name === \"mysql\"\n ? join.members.every((member) => member.kind !== \"citext\" && member.kind !== \"text\")\n : dialect.name === \"postgres\" && join.members.every(postgresMember);\n if (!admitted) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"relation key table\",\n hint: \"the key-table join is mysql's relation association — this dialect compares relation keys by value\",\n });\n }\n if (join.columns.length === 0 || join.columns.length !== join.members.length) {\n throw internalError({ message: `key table needs one member per column, got ${join.members.length} for ${join.columns.length}` });\n }\n if (join.rows.length === 0) throw internalError({ message: \"key table needs at least one key row\" });\n for (const member of join.members) {\n if (member.kind === \"decimal\" && !(Number.isInteger(member.scale) && member.scale >= 0 && member.scale <= 30)) {\n throw internalError({ message: `key table decimal scale must be an integer 0-30, got ${String(member.scale)}` });\n }\n }\n const alias = dialect.quoteIdent({ name: join.alias });\n const memberNames = join.members.map((_, index) => dialect.quoteIdent({ name: `__vibe_k${index}` }));\n const rows = join.rows.map((row, ordinal) => {\n if (row.length !== join.members.length) {\n throw internalError({ message: `key table row has ${row.length} values for ${join.members.length} members` });\n }\n const cells = row.map((value, index) => {\n const placeholder = collector.add(value);\n const member = join.members[index] as KeyTableMember;\n switch (member.kind) {\n case \"integer\":\n return dialect.name === \"mysql\" ? `CAST(${placeholder} AS SIGNED)` : `CAST(${placeholder} AS bigint)`;\n case \"timestamp\":\n return `CAST(${placeholder} AS DATETIME(6))`;\n case \"time\":\n return `CAST(${placeholder} AS TIME(6))`;\n case \"decimal\":\n return `CAST(${placeholder} AS DECIMAL(65,${member.scale}))`;\n case \"citext\":\n return `CAST(${placeholder} AS citext)`;\n case \"text\":\n return `CAST(${placeholder} AS text)`;\n default:\n return placeholder;\n }\n });\n return dialect.name === \"mysql\" ? `ROW(${cells.join(\", \")}, ${ordinal})` : `(${cells.join(\", \")}, ${ordinal})`;\n });\n const on = join.columns.map((column, index) => `${quoteCol(dialect, column)} = ${alias}.${memberNames[index] as string}`).join(\" AND \");\n return `INNER JOIN (VALUES ${rows.join(\", \")}) AS ${alias} (${[...memberNames, dialect.quoteIdent({ name: join.ordinalAlias })].join(\", \")}) ON ${on}`;\n}\n\n// ─── Fix lane Q2 (D-03): derived-table LEFT JOIN ───\n\n/**\n * {@link LeftJoin}: `LEFT JOIN (<select>) AS \"alias\" ON \"alias\".\"k\" =\n * \"outer\".\"c\" [AND …]`. Portable. Refuses a builder bug: no ON pair, or a\n * derived projection with an unaliased column (the outer scope must see only\n * the reserved aliases, never a name that could make an unqualified outer\n * reference ambiguous). The derived select renders here, so its parameters\n * land in the shared sequence where they appear in the text.\n */\nfunction renderLeftJoin(params: { dialect: SqlDialect; join: LeftJoin; collector: ParamCollector }): string {\n const { dialect, join, collector } = params;\n if (join.on.length === 0) {\n throw internalError({ message: \"left join needs at least one ON pair\" });\n }\n if (join.select.columns.length === 0 || join.select.columns.some((column) => column.alias === undefined)) {\n throw internalError({ message: \"a left join's derived select must alias every projected column\" });\n }\n const inner = renderSelect({ dialect, statement: join.select, collector });\n const on = join.on\n .map((pair) => `${quoteCol(dialect, pair.left)} = ${quoteCol(dialect, pair.right)}`)\n .join(\" AND \");\n return `LEFT JOIN (${inner.text}) AS ${dialect.quoteIdent({ name: join.alias })} ON ${on}`;\n}\n\nfunction renderSelect(params: {\n dialect: SqlDialect;\n statement: SelectStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n\n if (statement.selectExpr !== undefined && statement.columns.length > 0 && statement.selectExpr.kind !== \"countAll\") {\n throw internalError({ message: \"only countAll can combine with a column list\" });\n }\n if (\n statement.selectExpr !== undefined &&\n statement.aggregates !== undefined &&\n statement.aggregates.length > 0\n ) {\n throw internalError({ message: \"selectExpr and aggregates cannot combine\" });\n }\n const columnList = statement.columns.map((column) => quoteProjection(dialect, column));\n if (statement.selectExpr !== undefined) {\n columnList.push(renderSelectExpr({ dialect, expr: statement.selectExpr }));\n }\n if (statement.aggregates !== undefined) {\n for (const selection of statement.aggregates) {\n const expression = renderAggRef(dialect, selection.agg, collector);\n const projected = selection.castText === true ? textProjection({ dialect, expression }) : expression;\n columnList.push(`${projected} AS ${dialect.quoteIdent({ name: selection.alias })}`);\n }\n }\n const groupKeys = statement.groupBy?.map((column) => quoteCol(dialect, column)) ?? [];\n if (statement.groupingSets !== undefined) {\n columnList.push(`${renderGroupingSetIndex({ keys: groupKeys, grouping: statement.groupingSets })} AS ${dialect.quoteIdent({ name: statement.groupingSets.indexAlias })}`);\n }\n if (statement.countSubqueries !== undefined) {\n for (const subquery of statement.countSubqueries) {\n columnList.push(renderCountSubquery({ dialect, subquery, collector }));\n }\n }\n if (statement.scalarSubqueries !== undefined) {\n for (const subquery of statement.scalarSubqueries) {\n columnList.push(`${renderScalarSubquery({ dialect, subquery, collector })} AS ${dialect.quoteIdent({ name: subquery.alias })}`);\n }\n }\n if (statement.rowNumber !== undefined) {\n const rowNumber = statement.rowNumber;\n // An unpartitioned window numbers the whole select: only the position slot\n // of a lateral list level (`lateralJson.order: \"positionSlot\"`), which\n // always carries the level's order.\n if (rowNumber.partitionBy.length === 0 && rowNumber.orderBy.length === 0) {\n throw internalError({ message: \"rowNumber needs a partition column or an order\" });\n }\n const partition = rowNumber.partitionBy.length === 0 ? \"\" : `PARTITION BY ${rowNumber.partitionBy.map((column) => quoteCol(dialect, column)).join(\", \")}`;\n const order =\n rowNumber.orderBy.length === 0\n ? \"\"\n : `${partition === \"\" ? \"\" : \" \"}ORDER BY ${rowNumber.orderBy.map((term) => renderOrderTerm({ dialect, term, collector })).join(\", \")}`;\n columnList.push(\n `ROW_NUMBER() OVER (${partition}${order}) AS ${dialect.quoteIdent({ name: rowNumber.alias })}`,\n );\n }\n let distinctPrefix = statement.distinct === true ? \"DISTINCT \" : \"\";\n if (statement.distinct === true && statement.distinctOn !== undefined) {\n throw internalError({ message: \"distinct and distinctOn cannot combine\" });\n }\n if (statement.distinctOn !== undefined && statement.distinctOn.length > 0) {\n if (!dialect.capabilities.distinctOn) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"SELECT DISTINCT ON\",\n hint: \"postgres-only — the runtime emulates distinct client-side on this dialect\",\n });\n }\n distinctPrefix = `DISTINCT ON (${statement.distinctOn.map((column) => quoteCol(dialect, typedOrderRef({ statement, column }))).join(\", \")}) `;\n }\n const columns = columnList.length === 0 ? \"*\" : columnList.join(\", \");\n\n let from: string;\n // EPIC 4 (ST-07): key rows render where the table would, under its name.\n if (statement.fromKeys !== undefined) {\n from = renderKeyRows({ dialect, statement, keys: statement.fromKeys, collector });\n } else if (statement.fromUnion !== undefined) {\n // Fix lane Q2 (DB-07): a union page renders where a derived table would.\n from = `(${renderUnionPage({ dialect, statement, collector })}) AS ${dialect.quoteIdent({ name: statement.table.name })}`;\n } else if (statement.keyPage !== undefined) {\n // Fix lane Q1 (DB-01): a per-key page renders where a derived table would.\n if (statement.fromSelect !== undefined || statement.table.alias !== undefined) {\n throw internalError({ message: \"keyPage uses table.name as the derived-table alias — fromSelect and table.alias must be unset\" });\n }\n from = `(${renderKeyPage({ dialect, page: statement.keyPage, collector })}) AS ${dialect.quoteIdent({ name: statement.table.name })}`;\n } else if (statement.fromSelect !== undefined) {\n if (statement.table.alias !== undefined) {\n throw internalError({ message: \"fromSelect uses table.name as the subquery alias — table.alias must be unset\" });\n }\n // The subquery renders before WHERE/ORDER BY, so its parameters land in\n // the shared sequence exactly where they appear in the text.\n const inner = renderSelect({ dialect, statement: statement.fromSelect, collector });\n from = `(${inner.text}) AS ${dialect.quoteIdent({ name: statement.table.name })}`;\n } else {\n from = renderTable(dialect, statement.table);\n }\n let text = `SELECT ${distinctPrefix}${columns} FROM ${from}`;\n\n if (statement.innerJoins !== undefined && statement.innerJoins.length > 0) {\n for (const join of statement.innerJoins) {\n if (join.on.length === 0) {\n throw internalError({ message: \"inner join needs at least one ON pair\" });\n }\n const on = join.on\n .map((pair) => `${quoteCol(dialect, pair.left)} = ${quoteCol(dialect, pair.right)}`)\n .join(\" AND \");\n text += ` INNER JOIN ${renderTable(dialect, join.table)} ON ${on}`;\n }\n }\n if (statement.keyTable !== undefined) {\n text += ` ${renderKeyTableJoin({ dialect, join: statement.keyTable, collector })}`;\n }\n // Fix lane Q2 (D-03): derived-table LEFT JOINs (to-one relation orderBy).\n if (statement.leftJoins !== undefined && statement.leftJoins.length > 0) {\n if (statement.rowLock !== undefined) {\n throw internalError({ message: \"a locking read cannot carry a left join — postgres refuses FOR UPDATE on the nullable side of an outer join\" });\n }\n for (const join of statement.leftJoins) {\n text += ` ${renderLeftJoin({ dialect, join, collector })}`;\n }\n }\n\n if (statement.lateralJoins !== undefined && statement.lateralJoins.length > 0) {\n if (!dialect.capabilities.lateralJoin || dialect.lateralJson === null) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"LATERAL JOIN relation loading\",\n hint: 'use the portable \"query\" relation strategy on this dialect',\n });\n }\n for (const join of statement.lateralJoins) {\n text += ` ${renderLateralJoin({ dialect, join, collector })}`;\n }\n }\n\n if (statement.where !== undefined) {\n text += ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`;\n }\n if (statement.groupBy !== undefined && statement.groupBy.length > 0) {\n text += ` GROUP BY ${statement.groupingSets === undefined ? groupKeys.join(\", \") : renderGroupingSets({ dialect, keys: groupKeys, grouping: statement.groupingSets })}`;\n } else if (statement.groupingSets !== undefined) {\n throw internalError({ message: \"grouping sets need groupBy columns\" });\n }\n if (statement.having !== undefined) {\n text += ` HAVING ${renderExpr({ dialect, expr: statement.having, collector })}`;\n }\n if (statement.orderBy !== undefined && statement.orderBy.length > 0) {\n const terms = statement.orderBy.map((term) => {\n if (!(\"column\" in term)) return renderOrderTerm({ dialect, term, collector });\n const nullsOutputName = term.nulls === undefined || dialect.orderByNullsMode === \"native\" ? undefined : groupKeyOutputName({ dialect, statement, column: term.column });\n return renderOrderTerm({\n dialect,\n term: { ...term, column: typedOrderRef({ statement, column: term.column }) },\n collector,\n ...(nullsOutputName === undefined ? {} : { nullsOutputName }),\n });\n });\n text += ` ORDER BY ${terms.join(\", \")}`;\n }\n\n if (statement.limit !== undefined) {\n assertCount(statement.limit, \"limit\");\n text += ` LIMIT ${statement.limit}`;\n }\n if (statement.offset !== undefined) {\n assertCount(statement.offset, \"offset\");\n if (statement.limit === undefined && dialect.offsetRequiresLimit !== null) {\n text += ` LIMIT ${dialect.offsetRequiresLimit.limitText}`;\n }\n text += ` OFFSET ${statement.offset}`;\n }\n if (statement.rowLock !== undefined) {\n const target = statement.table.alias ?? statement.table.name;\n if (statement.rowLock.of !== undefined && statement.rowLock.of.some((name) => name !== target)) {\n throw internalError({ message: `a row lock's \\`of\\` list may name only the statement's own table \"${target}\"` });\n }\n if (statement.rowLock.of !== undefined && (statement.fromSelect !== undefined || statement.keyPage !== undefined)) {\n throw internalError({ message: \"a row lock's `of` list cannot name a derived table\" });\n }\n const clause = renderRowLockClause({ dialect, lock: statement.rowLock });\n if (clause !== null) text += ` ${clause}`;\n }\n\n return { text, values: collector.values, returning: \"none\" };\n}\n\n// ─── INSERT (incl. upsert) ────────────────────────────────────────\n\n/** The unnest source's relation alias and its ordinality column (`InsertStatement.unnest`). */\nconst UNNEST_ROWS_ALIAS = \"__vibe_rows\";\nconst UNNEST_ORDINALITY = \"ord\";\n\n/**\n * One cell of an unnest insert, as its array element: a plain value, SQL NULL,\n * or a Json cell's text (the column's storage must match). `DEFAULT`, the\n * database clock and any other object are refused — the builder keeps VALUES\n * for them, so reaching here is a builder defect.\n */\nfunction unnestElement(params: { value: unknown; column: string; jsonStorage: \"json\" | \"jsonb\" | undefined }): unknown {\n const { value, column, jsonStorage } = params;\n if (value === null || value === undefined) return null;\n if (isJsonParamCell(value)) {\n if (jsonStorage === undefined || (value.storage ?? \"jsonb\") !== jsonStorage) {\n throw internalError({ message: `unnest insert column \"${column}\" got a Json cell its declared type does not take` });\n }\n return value.text;\n }\n if (jsonStorage === undefined) {\n switch (typeof value) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n return value;\n case \"object\":\n if (value instanceof Date || value instanceof Uint8Array) return value;\n }\n }\n throw internalError({ message: `unnest insert column \"${column}\" got a cell that is not a plain value (DEFAULT, the database clock, a document) — such rows keep VALUES` });\n}\n\n/**\n * `SELECT \"c1\", … FROM unnest($1::<type>[], …) WITH ORDINALITY AS\n * \"__vibe_rows\" (\"c1\", …, \"ord\") ORDER BY \"ord\"` — the source of an\n * {@link InsertStatement} carrying `unnest`. Collects ONE array per column, in\n * column order: the rows transposed, Json cells reduced to their text. The\n * aliases are positional, so no column name can collide with the ordinality\n * column; `ORDER BY \"ord\"` makes the insert consume rows in input order\n * (PostgreSQL promises no order without it).\n */\nfunction renderUnnestRows(params: {\n dialect: SqlDialect;\n statement: InsertStatement;\n members: readonly KeyListMember[];\n collector: ParamCollector;\n}): string {\n const { dialect, statement, members, collector } = params;\n if (dialect.bulkInsertForm !== \"unnest\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a bulk insert bound as typed arrays (INSERT … SELECT FROM unnest)\",\n hint: \"this dialect binds createMany rows as VALUES\",\n });\n }\n if (statement.columns.length === 0) throw internalError({ message: \"an unnest insert needs at least one column\" });\n if (members.length !== statement.columns.length) {\n throw internalError({ message: `unnest insert has ${members.length} column types for ${statement.columns.length} columns` });\n }\n if (statement.onConflict !== undefined && !(\"doNothing\" in statement.onConflict)) {\n throw internalError({ message: \"an unnest insert takes no DO UPDATE arm — upserts bind VALUES\" });\n }\n const aliases = statement.columns.map((_column, index) => dialect.quoteIdent({ name: `c${index + 1}` }));\n const arrays = members.map((member, index) => {\n const cast = postgresBulkInsertArrayCast({ dialect, member });\n const jsonStorage = member.type !== \"Json\" ? undefined : cast === \"text::json\" ? \"json\" : \"jsonb\";\n const column = statement.columns[index] as string;\n const values = statement.rows.map((row) => unnestElement({ value: row[index], column, jsonStorage }));\n return `${collector.add(values)}::${cast}[]`;\n });\n const ord = dialect.quoteIdent({ name: UNNEST_ORDINALITY });\n return `SELECT ${aliases.join(\", \")} FROM unnest(${arrays.join(\", \")}) WITH ORDINALITY AS ${dialect.quoteIdent({ name: UNNEST_ROWS_ALIAS })} (${aliases.join(\", \")}, ${ord}) ORDER BY ${ord}`;\n}\n\nfunction renderInsert(params: {\n dialect: SqlDialect;\n statement: InsertStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n\n if (statement.rows.length === 0) {\n throw internalError({ message: \"insert requires at least one row\" });\n }\n // No column named: every value is its column default (dialect.emptyInsert).\n const defaultValues = statement.columns.length === 0 && dialect.emptyInsert.form === \"defaultValues\";\n if (defaultValues && statement.rows.length !== 1) {\n throw internalError({ message: `${dialect.name} inserts an all-default row as DEFAULT VALUES, one row per statement` });\n }\n if (defaultValues && statement.onConflict !== undefined && !(dialect.emptyInsert.form === \"defaultValues\" && dialect.emptyInsert.conflictClause)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a conflict clause on an all-default row (DEFAULT VALUES)\",\n hint: \"supply at least one column value, or drop the conflict clause\",\n });\n }\n for (const row of statement.rows) {\n if (row.length !== statement.columns.length) {\n throw internalError({\n message: `insert row has ${row.length} values but ${statement.columns.length} columns`,\n });\n }\n }\n\n const onConflict = statement.onConflict;\n const insertKeyword = \"INSERT INTO\";\n\n const columnList = statement.columns.map((name) => dialect.quoteIdent({ name })).join(\", \");\n // EPIC C: rows bound as one typed array per column (`InsertStatement.unnest`).\n const unnestSource = statement.unnest === undefined ? undefined : renderUnnestRows({ dialect, statement, members: statement.unnest, collector });\n const rowsSql = unnestSource !== undefined ? \"\" : statement.rows\n .map(\n (row) =>\n `(${row\n .map((value) => {\n // Json cell: the param's type is pinned (`$n::text::jsonb` on\n // postgres) so OID-typed drivers cannot double-encode the document.\n if (isJsonParamCell(value)) return `${collector.add(value.text)}${jsonCellCast(dialect, value)}`;\n // Database-clock cell: the dialect's now() expression.\n if (isDbNowMarker(value)) {\n return dialect.renderDbNow({ offsetSeconds: value.offsetSeconds, collector });\n }\n if (!isSqlDefaultCell(value)) return collector.add(value);\n // M4: a heterogeneous createMany cell defers to the COLUMN default.\n if (!dialect.rowDefaultKeyword) {\n throw internalError({\n message: `${dialect.name} cannot render a per-row DEFAULT cell — rows must be grouped by column set`,\n });\n }\n return \"DEFAULT\";\n })\n .join(\", \")})`,\n )\n .join(\", \");\n let text = defaultValues\n ? `${insertKeyword} ${renderTable(dialect, statement.table)} DEFAULT VALUES`\n : `${insertKeyword} ${renderTable(dialect, statement.table)} (${columnList}) ${unnestSource ?? `VALUES ${rowsSql}`}`;\n\n // Mysql can only name the incoming row through a ROW ALIAS declared right\n // after the VALUES list; postgres/sqlite have the built-in `excluded`\n // pseudo-relation and need nothing. Emitted only when the update arm\n // actually references the incoming row.\n if (\n onConflict !== undefined &&\n !(\"doNothing\" in onConflict) &&\n dialect.excludedRowRef.form === \"rowAlias\" &&\n Object.values(onConflict.update).some((value) => isExcludedRef(value) || (isSqlFragment(value) && sqlUsesIncoming({ fragment: value })))\n ) {\n text += ` AS ${dialect.quoteIdent({ name: dialect.excludedRowRef.alias })}`;\n }\n\n if (onConflict !== undefined) {\n if (\"doNothing\" in onConflict) {\n if (dialect.doNothingForm === \"onConflictDoNothing\") {\n let target = \"\";\n if (onConflict.constraint !== undefined) {\n if (dialect.name !== \"postgres\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a named-constraint conflict target (ON CONFLICT ON CONSTRAINT)\",\n hint: \"only postgres names constraints in conflict targets — use a column-list target\",\n });\n }\n target = ` ON CONSTRAINT ${dialect.quoteIdent({ name: onConflict.constraint })}`;\n } else if (onConflict.columns !== undefined && onConflict.columns.length > 0) {\n target = ` (${onConflict.columns.map((name) => dialect.quoteIdent({ name })).join(\", \")})`;\n if (onConflict.conflictWhere !== undefined) {\n // RAW predicate — the engines match it against the index's own\n // predicate structurally; parameters could never match (ast.ts).\n target += ` WHERE ${onConflict.conflictWhere}`;\n }\n }\n text += ` ON CONFLICT${target} DO NOTHING`;\n } else {\n // `duplicateKeyKeep` fires on ANY duplicate key. A bare column target\n // degrades to that documented wider skip; a REFINED target (named\n // constraint, partial-index predicate) must not silently widen —\n // the builder gates first, the renderer defends.\n if (onConflict.constraint !== undefined || onConflict.conflictWhere !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a refined conflict target (constraint / partial-index predicate) on ON DUPLICATE KEY UPDATE\",\n hint: \"mysql skips on any duplicate key — drop the refinement or gate the call per dialect\",\n });\n }\n // A self-assignment: a duplicate changes nothing, every other error\n // (NOT NULL, range, foreign key) stays an error — never INSERT IGNORE.\n const keepName = onConflict.keepColumn ?? statement.columns[0];\n if (keepName === undefined) {\n throw internalError({ message: \"a skip-duplicates insert of an all-default row must name its keepColumn\" });\n }\n const keep = dialect.quoteIdent({ name: keepName });\n const current = `${dialect.quoteIdent({ name: statement.table.name })}.${keep}`;\n const flag = onConflict.duplicateFlag;\n if (flag !== undefined && !/^\\d{1,20}$/.test(flag)) {\n throw internalError({ message: `duplicateFlag must be a decimal literal, got ${JSON.stringify(flag)}` });\n }\n // The flag form reports a skipped duplicate through the insert id\n // (`LAST_INSERT_ID(S)` runs only on the duplicate arm).\n text += flag === undefined\n ? ` ON DUPLICATE KEY UPDATE ${keep} = ${current}`\n : ` ON DUPLICATE KEY UPDATE ${keep} = IF(LAST_INSERT_ID(${flag}), ${current}, ${current})`;\n }\n } else {\n const updates = Object.entries(onConflict.update);\n if (updates.length === 0) {\n throw internalError({ message: \"upsert update must set at least one column\" });\n }\n // The update arm's self-references MUST be table-qualified: inside\n // `ON CONFLICT … DO UPDATE SET`, postgres has BOTH the target row and\n // the `excluded` pseudo-relation in scope, so a bare `\"views\" + $n`\n // is rejected as ambiguous (SQLSTATE 42702). Sqlite and mysql accept\n // the qualified form with identical semantics (the pre-update row), so\n // one rule covers every dialect instead of a per-dialect divergence.\n const selfRef = dialect.quoteIdent({ name: statement.table.name });\n const assignments = renderAssignments({ dialect, entries: updates, collector, selfRef, allowExcluded: true, tableName: statement.table.name });\n if (dialect.upsertForm === \"onConflict\") {\n if (onConflict.lastInsertIdColumn !== undefined) {\n throw internalError({ message: \"lastInsertIdColumn is a mysql (onDuplicateKey) construct\" });\n }\n if (onConflict.constraint !== undefined && dialect.name !== \"postgres\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a named-constraint conflict target (ON CONFLICT ON CONSTRAINT)\",\n hint: \"sqlite conflict targets are column lists — name the indexed columns instead\",\n });\n }\n if (onConflict.constraint !== undefined && onConflict.conflictWhere !== undefined) {\n throw internalError({\n message: \"a named-constraint conflict target already identifies the index — it cannot carry a partial predicate too\",\n });\n }\n // RAW predicate — matched structurally against the partial index's own\n // stored predicate, exactly like the DO NOTHING form (ast.ts).\n const partial = onConflict.conflictWhere === undefined ? \"\" : ` WHERE ${onConflict.conflictWhere}`;\n const target =\n onConflict.constraint !== undefined\n ? ` ON CONSTRAINT ${dialect.quoteIdent({ name: onConflict.constraint })}`\n : ` (${onConflict.columns.map((name) => dialect.quoteIdent({ name })).join(\", \")})${partial}`;\n text += ` ON CONFLICT${target} DO UPDATE SET ${assignments}`;\n if (onConflict.updateWhere !== undefined) {\n if (!dialect.capabilities.conflictUpdateWhere) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a guarded conflict update (ON CONFLICT … DO UPDATE … WHERE)\",\n hint: \"run the guarded upsert as a find-then-write in a transaction instead\",\n });\n }\n text += ` WHERE ${renderExpr({ dialect, expr: onConflict.updateWhere, collector })}`;\n }\n } else {\n if (onConflict.updateWhere !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a guarded conflict update (ON DUPLICATE KEY UPDATE has no WHERE)\",\n hint: \"run the guarded upsert as a find-then-write in a transaction instead — the runtime does this when the dialect lacks conflictUpdateWhere\",\n });\n }\n if (onConflict.constraint !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a named-constraint conflict target on ON DUPLICATE KEY UPDATE\",\n hint: \"mysql's ODKU fires on any duplicate key — no target can be named\",\n });\n }\n if (onConflict.conflictWhere !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a partial-index conflict target on ON DUPLICATE KEY UPDATE\",\n hint: \"mysql's ODKU fires on any duplicate key — a partial arbiter cannot be selected; gate the call per dialect\",\n });\n }\n // B2: the update arm must record WHICH row it addressed — without this,\n // LAST_INSERT_ID() is stale after ODKU takes the update arm and the\n // read-back can resolve an unrelated row.\n const trick =\n onConflict.lastInsertIdColumn === undefined\n ? \"\"\n : `, ${dialect.quoteIdent({ name: onConflict.lastInsertIdColumn })} = LAST_INSERT_ID(${dialect.quoteIdent({ name: onConflict.lastInsertIdColumn })})`;\n text += ` ON DUPLICATE KEY UPDATE ${assignments}${trick}`;\n }\n }\n }\n\n const returning = applyReturning({ dialect, requested: statement.returning, collector });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n}\n\n// ─── UPDATE ───────────────────────────────────────────────────────\n\nfunction renderUpdate(params: {\n dialect: SqlDialect;\n statement: UpdateStatement;\n collector: ParamCollector;\n /** Chain steps defined before this one (a chain step only): a set value may read them. */\n earlier?: ReadonlySet<string>;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n\n const assignments = Object.entries(statement.set);\n if (assignments.length === 0) {\n throw internalError({ message: \"update must set at least one column\" });\n }\n const source = statement.from;\n if (source !== undefined) {\n if (statement.alias === undefined || statement.alias === source.alias) throw internalError({ message: \"UPDATE … FROM needs distinct target and source aliases\" });\n const target = dialect.quoteIdent({ name: statement.alias });\n const joined = dialect.quoteIdent({ name: source.alias });\n const assign = (): string => renderAssignments({ dialect, entries: assignments, collector, selfRef: target, source: joined, ...(dialect.name === \"mysql\" ? { qualifyWrite: target } : {}), ...(params.earlier === undefined ? {} : { steps: params.earlier }) });\n const where = (): string => statement.where === undefined ? \"\" : ` AND ${renderExpr({ dialect, expr: statement.where, collector })}`;\n if (\"select\" in source) {\n // A FROM subquery reading the target table is the previous-row read of\n // `update({ previous })`; only PostgreSQL's RETURNING can read it back.\n if (!dialect.capabilities.returningReadsJoinedSource) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"UPDATE … FROM (SELECT …) with RETURNING of the joined source\", hint: \"read the row inside the write's transaction first, then write it\" });\n }\n // Placeholders bind in text order: SET, the subquery, then the outer WHERE.\n const set = assign();\n const joinedSelect = renderSelect({ dialect, statement: source.select, collector }).text;\n const text = `UPDATE ${renderTable(dialect, statement.table)} AS ${target} SET ${set} FROM (${joinedSelect}) AS ${joined} WHERE ${renderExpr({ dialect, expr: source.on, collector })}${where()}`;\n const returning = applyReturning({ dialect, requested: statement.returning, qualify: target });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n }\n // Placeholders bind in text order: MySQL's ON precedes SET.\n const text = dialect.name === \"mysql\"\n ? `UPDATE ${renderTable(dialect, statement.table)} AS ${target} JOIN ${renderTable(dialect, source.table)} AS ${joined} ON ${renderExpr({ dialect, expr: source.on, collector })} SET ${assign()}${statement.where === undefined ? \"\" : ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`}`\n : `UPDATE ${renderTable(dialect, statement.table)} AS ${target} SET ${assign()} FROM ${renderTable(dialect, source.table)} AS ${joined} WHERE ${renderExpr({ dialect, expr: source.on, collector })}${where()}`;\n const returning = applyReturning({ dialect, requested: statement.returning, collector, ...(dialect.name === \"postgres\" ? { qualify: target } : {}) });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n }\n const setSql = renderAssignments({ dialect, entries: assignments, collector, ...(params.earlier === undefined ? {} : { steps: params.earlier }) });\n let text = `UPDATE ${renderTable(dialect, statement.table)} SET ${setSql}`;\n\n if (statement.where !== undefined) {\n text += ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`;\n }\n\n const returning = applyReturning({ dialect, requested: statement.returning, collector });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n}\n\n// ─── Assignments (SET / DO UPDATE SET) ────────────────────────────\n\n/**\n * `SET` assignments, shared by UPDATE and the upsert update arm.\n *\n * `selfRef` (the quoted target table) qualifies the READ side of an operation\n * that reads the column it writes — required inside `ON CONFLICT DO UPDATE`,\n * where a bare reference is ambiguous with `excluded` on postgres. The write\n * side is never qualified: `SET \"t\".\"col\" = …` is a syntax error everywhere.\n * A plain UPDATE passes no `selfRef` — it has no second relation in scope.\n */\n/**\n * The incoming row's column, qualified for this dialect: `excluded.\"col\"`\n * (postgres/sqlite) or `` `new`.`col` `` (mysql's row alias, declared after the\n * VALUES list by {@link renderInsert}).\n */\nfunction renderIncomingRowColumn(params: { dialect: SqlDialect; column: string }): string {\n const { dialect, column } = params;\n const ref = dialect.excludedRowRef;\n const qualifier = ref.form === \"keyword\" ? ref.name : dialect.quoteIdent({ name: ref.alias });\n return `${qualifier}.${dialect.quoteIdent({ name: column })}`;\n}\n\nfunction renderAssignments(params: {\n dialect: SqlDialect;\n entries: readonly (readonly [string, unknown])[];\n collector: ParamCollector;\n selfRef?: string;\n /** Only an upsert's update arm has an incoming row to reference. */\n allowExcluded?: boolean;\n tableName?: string;\n /** Lane C3: earlier chain steps a {@link StepColumnRef} value may read (a chain UPDATE step only). */\n steps?: ReadonlySet<string>;\n /** `UPDATE … FROM`: the quoted alias a {@link SourceColumnRef} value reads. */\n source?: string;\n /** MySQL's `UPDATE … JOIN` qualifies the written column with the target alias. */\n qualifyWrite?: string;\n}): string {\n const { dialect, entries, collector, selfRef } = params;\n return entries\n .map(([name, value]) => {\n const column = dialect.quoteIdent({ name });\n const read = selfRef === undefined ? column : `${selfRef}.${column}`;\n if (isSourceColumnRef(value)) {\n if (params.source === undefined) throw internalError({ message: `an UPDATE set value reads the joined source's column ${value.column}, but the statement joins no source` });\n return `${column} = ${params.source}.${dialect.quoteIdent({ name: value.column })}`;\n }\n // Lane C3: the value of an earlier step's one row — a scalar subquery,\n // whose own scope resolves the column (no clash with the target's).\n if (isStepColumnRef(value)) {\n if (params.steps === undefined || !params.steps.has(value.step)) {\n throw internalError({ message: `an UPDATE set value reads step \"${value.step}\", which is not an earlier chain step` });\n }\n return `${column} = (SELECT ${dialect.quoteIdent({ name: value.column })} FROM ${dialect.quoteIdent({ name: value.step })})`;\n }\n // The INCOMING row's value for this column — a column reference, so a\n // batched upsert writes each conflicting row's own value while binding\n // it exactly once (in the VALUES list).\n if (isSqlFragment(value)) {\n if (params.allowExcluded !== true || selfRef === undefined) throw internalError({ message: \"SQL assignment fragments require a conflict update\" });\n return `${column} = ${renderSqlFragment({ dialect, fragment: value, collector, conflict: { table: params.tableName! } })}`;\n }\n if (isExcludedRef(value)) {\n if (params.allowExcluded !== true) {\n throw internalError({\n message: `an incoming-row reference (${value.column}) is only meaningful inside an upsert's update arm`,\n });\n }\n return `${column} = ${renderIncomingRowColumn({ dialect, column: value.column })}`;\n }\n // V8: the column keeps its current value — a conflict update arm only.\n if (isSqlKeepCell(value)) {\n if (params.allowExcluded !== true || selfRef === undefined) throw internalError({ message: \"a keep-column cell is only meaningful inside an upsert's update arm\" });\n return `${column} = ${read}`;\n }\n if (isJsonPatchOperation(value)) {\n return `${column} = ${renderJsonPatch({ dialect, patch: value, read, collector })}`;\n }\n // Json cell: same param-type pinning as the VALUES cells above.\n if (isJsonParamCell(value)) {\n return `${column} = ${collector.add(value.text)}${jsonCellCast(dialect, value)}`;\n }\n if (isSetOperation(value)) {\n const operand = collector.add(value.value);\n const numeric = dialect.name === \"sqlite\" && value.numericType === \"Decimal\" ? `CAST(${operand} AS REAL)` : operand;\n return `${column} = ${read} ${SET_OPERATION_SQL[value.__op]} ${numeric}`;\n }\n if (isDbNowMarker(value)) {\n return `${column} = ${dialect.renderDbNow({ offsetSeconds: value.offsetSeconds, collector })}`;\n }\n if (isListSetOperation(value)) {\n assertScalarArrays(dialect, 'the scalar-list update operation \"push\"');\n if (value.__listOp === \"append\") {\n return `${column} = array_append(${read}, ${collector.add(value.value)})`;\n }\n return `${column} = ${read} || ${collector.add(value.value)}`;\n }\n return `${column} = ${collector.add(value)}`;\n })\n .map((assignment) => (params.qualifyWrite === undefined ? assignment : `${params.qualifyWrite}.${assignment}`))\n .join(\", \");\n}\n\n// ─── DELETE ───────────────────────────────────────────────────────\n\nfunction renderDelete(params: {\n dialect: SqlDialect;\n statement: DeleteStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n\n let text = `DELETE FROM ${renderTable(dialect, statement.table)}`;\n if (statement.where !== undefined) {\n text += ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`;\n }\n\n const returning = applyReturning({ dialect, requested: statement.returning, collector });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n}\n\n// ─── Statement chains (WITH … SELECT) ─────────────────────────────\n\n/** Derived-table aliases of a chain's verdict SELECT — no step may take them. */\nconst CHAIN_ROWS_ALIAS = \"__vibe_rows\";\nconst CHAIN_ONE_ALIAS = \"__vibe_one\";\n\n/**\n * `WITH \"a\" AS (…), \"b\" AS (…) <final SELECT>` — see {@link ChainStatement}.\n * Steps render in order through the ordinary statement renderers on ONE\n * shared collector, so parameters number in step order, then the verdict.\n *\n * The verdict form is `SELECT rows.cols, <verdict> FROM (SELECT 1) LEFT JOIN\n * (<union>) AS rows ON TRUE`: one row per written row, or ONE all-NULL row\n * carrying the verdict when the union is empty. A `LEFT JOIN`, not a NULL\n * marker branch inside the `UNION ALL`, so every column keeps its RETURNING\n * type — PostgreSQL resolves a nested UNION's untyped NULLs pairwise (two NULL\n * branches become `text`), which a bare marker branch would trip over.\n */\nfunction renderChain(params: {\n dialect: SqlDialect;\n statement: ChainStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n if (dialect.statementChain === null) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a statement chain (data-modifying WITH steps)\",\n hint: \"this dialect accepts only SELECT inside WITH — gate on SqlDialect.statementChain and keep the multi-statement path\",\n });\n }\n if (statement.steps.length === 0) throw internalError({ message: \"a statement chain needs at least one step\" });\n const defined = new Set<string>();\n const steps: string[] = [];\n for (const step of statement.steps) {\n if (step.name === CHAIN_ROWS_ALIAS || step.name === CHAIN_ONE_ALIAS || defined.has(step.name)) {\n throw internalError({ message: `chain step name \"${step.name}\" is reserved or repeated` });\n }\n const body = renderChainStep({ dialect, statement: step.statement, collector, earlier: defined });\n steps.push(`${dialect.quoteIdent({ name: step.name })} AS (${body})`);\n defined.add(step.name);\n }\n\n const result = statement.result;\n const captures = result.capture ?? [];\n if (captures.length > 0 && !dialect.capabilities.rowCapture) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"row capture (RETURNING old./new.)\", hint: \"row capture needs PostgreSQL 18 or later; the runtime refuses $transaction({ capture }) on this dialect\" });\n }\n for (const alias of captureAliases({ captures })) {\n if (result.columns.includes(alias) || alias === result.verdict?.alias || alias === result.tally?.alias) {\n throw internalError({ message: `chain capture alias \"${alias}\" collides with a result column` });\n }\n }\n if (result.rowsFrom.length === 0 && result.columns.length === 0 && result.tally !== undefined && result.verdict === undefined) {\n const tally = renderTallyColumn({ dialect, result, defined, collector });\n return { text: `WITH ${steps.join(\", \")} SELECT ${[tally, ...renderChainCaptures({ dialect, captures, defined, collector })].join(\", \")}`, values: collector.values, returning: \"none\" };\n }\n if (result.rowsFrom.length === 0 || result.columns.length === 0) {\n throw internalError({ message: \"a chain result needs at least one source step and one column\" });\n }\n for (const name of result.rowsFrom) {\n if (!defined.has(name)) throw internalError({ message: `chain result reads undefined step \"${name}\"` });\n }\n const columnList = result.columns.map((name) => dialect.quoteIdent({ name })).join(\", \");\n const guarded = result.verdict !== undefined || result.tally !== undefined || (result.veto !== undefined && result.veto.length > 0);\n // Without a guaranteed row the capture columns ride every arm: rendered once\n // (one bound limit each), the same text in every arm.\n const armCapture = guarded || captures.length === 0 ? \"\" : `, ${renderChainCaptures({ dialect, captures, defined, collector }).join(\", \")}`;\n const union = result.rowsFrom\n .map((name) => `SELECT ${columnList}${armCapture} FROM ${dialect.quoteIdent({ name })}`)\n .join(\" UNION ALL \");\n let select = union;\n if (guarded) {\n const extra: string[] = [];\n for (const alias of [result.verdict?.alias, result.tally?.alias]) {\n if (alias !== undefined && result.columns.includes(alias)) {\n throw internalError({ message: `chain result alias \"${alias}\" collides with a result column` });\n }\n }\n const rows = dialect.quoteIdent({ name: CHAIN_ROWS_ALIAS });\n const projected = result.columns.map((name) => `${rows}.${dialect.quoteIdent({ name })}`);\n if (result.verdict !== undefined) {\n extra.push(`${renderExpr({ dialect, expr: result.verdict.expr, collector })} AS ${dialect.quoteIdent({ name: result.verdict.alias })}`);\n }\n if (result.tally !== undefined || (result.veto !== undefined && result.veto.length > 0)) {\n extra.push(renderTallyColumn({ dialect, result, defined, collector }));\n }\n extra.push(...renderChainCaptures({ dialect, captures, defined, collector }));\n select =\n `SELECT ${[...projected, ...extra].join(\", \")} FROM (SELECT 1) AS ${dialect.quoteIdent({ name: CHAIN_ONE_ALIAS })}` +\n ` LEFT JOIN (${union}) AS ${rows} ON TRUE`;\n }\n return { text: `WITH ${steps.join(\", \")} ${select}`, values: collector.values, returning: \"none\" };\n}\n\nfunction renderChainStep(params: {\n dialect: SqlDialect;\n statement: ChainStepStatement;\n collector: ParamCollector;\n earlier: ReadonlySet<string>;\n}): string {\n const { dialect, statement, collector } = params;\n switch (statement.kind) {\n case \"select\":\n return renderSelect({ dialect, statement, collector }).text;\n case \"insert\":\n return renderInsert({ dialect, statement, collector }).text;\n case \"insertSelect\":\n return renderInsertSelect({ dialect, statement, collector, earlier: params.earlier });\n case \"update\":\n return renderUpdate({ dialect, statement, collector, earlier: params.earlier }).text;\n case \"delete\":\n return renderDelete({ dialect, statement, collector }).text;\n }\n}\n\n/** The result columns every {@link ChainCapture} entry adds, in render order. */\nfunction captureAliases(params: { captures: readonly ChainCapture[] }): string[] {\n const out: string[] = [];\n for (const entry of params.captures) {\n out.push(`${entry.alias}_n`);\n if (entry.inserted !== undefined) out.push(`${entry.alias}_i`);\n if (entry.before !== undefined && entry.before.length > 0) out.push(`${entry.alias}_b`);\n if (entry.after !== undefined && entry.after.length > 0) {\n if (entry.inserted === undefined || entry.insertedOnly !== true) out.push(`${entry.alias}_a`);\n if (entry.inserted !== undefined) out.push(`${entry.alias}_ia`);\n }\n for (const index of (entry.cascades ?? []).keys()) out.push(`${entry.alias}_c${index}`);\n }\n return out;\n}\n\n/**\n * The {@link ChainCapture} columns: a step's row count, its inserted-arm\n * count, and its distinct before/after images as ONE two-dimensional text\n * array literal each (an upsert step's after images one per arm), `LIMIT`\n * bound once per entry — so a write of 10 000 rows of one key ships one\n * image, and no aggregate ships more than `limit`.\n */\nfunction renderChainCaptures(params: { dialect: SqlDialect; captures: readonly ChainCapture[]; defined: ReadonlySet<string>; collector: ParamCollector }): string[] {\n const { dialect, captures, defined, collector } = params;\n const quote = (name: string): string => dialect.quoteIdent({ name });\n const out: string[] = [];\n for (const entry of captures) {\n if (!defined.has(entry.step)) throw internalError({ message: `chain capture reads undefined step \"${entry.step}\"` });\n const step = quote(entry.step);\n const marker = entry.inserted === undefined ? undefined : quote(entry.inserted);\n out.push(`(SELECT count(*) FROM ${step}) AS ${quote(`${entry.alias}_n`)}`);\n if (marker !== undefined) out.push(`(SELECT count(*) FROM ${step} WHERE ${marker}) AS ${quote(`${entry.alias}_i`)}`);\n const before = entry.before ?? [];\n const after = entry.after ?? [];\n out.push(...renderImageAggregates({ dialect, entry, step, marker, before, after, collector }));\n for (const [index, cascade] of (entry.cascades ?? []).entries()) {\n const keys = quote(\"__vibe_k\");\n const child = quote(CAPTURE_CHILD_ALIAS);\n const match = `EXISTS (SELECT 1 FROM ${step} AS ${keys} WHERE ${cascade.on.map((pair) => `${keys}.${quote(pair.parent)} = ${child}.${quote(pair.child)}`).join(\" AND \")})`;\n out.push(`${renderCascadeImages({ dialect, cascade, match, collector })} AS ${quote(`${entry.alias}_c${index}`)}`);\n }\n }\n return out;\n}\n\n/** A {@link ChainCapture} entry's `_b`, `_a` and `_ia` image aggregates, sharing one bound limit. */\nfunction renderImageAggregates(params: { dialect: SqlDialect; entry: ChainCapture; step: string; marker: string | undefined; before: readonly string[]; after: readonly string[]; collector: ParamCollector }): string[] {\n const { dialect, entry, step, marker, before, after, collector } = params;\n const quote = (name: string): string => dialect.quoteIdent({ name });\n const out: string[] = [];\n if (before.length === 0 && after.length === 0) return out;\n if (!Number.isSafeInteger(entry.limit) || entry.limit < 1) throw internalError({ message: `chain capture \"${entry.alias}\" needs a positive integer limit` });\n const limit = collector.add(entry.limit);\n const item = quote(\"__vibe_i\");\n const image = (columns: readonly string[], filter: string): string =>\n `(SELECT array_agg(${item})::text FROM (SELECT DISTINCT ARRAY[${columns.map(quote).join(\", \")}] AS ${item} FROM ${step}${filter} LIMIT ${limit}) AS ${quote(\"__vibe_d\")})`;\n const updatedRows = marker === undefined ? \"\" : ` WHERE NOT ${marker}`;\n if (before.length > 0) out.push(`${image(before, updatedRows)} AS ${quote(`${entry.alias}_b`)}`);\n if (after.length > 0 && (marker === undefined || entry.insertedOnly !== true)) out.push(`${image(after, updatedRows)} AS ${quote(`${entry.alias}_a`)}`);\n if (after.length > 0 && marker !== undefined) out.push(`${image(after, ` WHERE ${marker}`)} AS ${quote(`${entry.alias}_ia`)}`);\n return out;\n}\n\n/** One SELECT-list cell in a VALUES form: encoded value, Json cell or clock cell — never DEFAULT. */\nfunction renderSelectCell(params: { dialect: SqlDialect; value: unknown; collector: ParamCollector }): string {\n const { dialect, value, collector } = params;\n if (isJsonParamCell(value)) return `${collector.add(value.text)}${jsonCellCast(dialect, value)}`;\n if (isDbNowMarker(value)) return dialect.renderDbNow({ offsetSeconds: value.offsetSeconds, collector });\n if (isSqlDefaultCell(value)) {\n throw internalError({ message: \"DEFAULT is not allowed in an INSERT … SELECT list — omit the column instead\" });\n }\n return collector.add(value);\n}\n\n/**\n * `(SELECT cols FROM (VALUES (<typed NULL row>), ($1, $2), …) AS \"alias\"\n * (cols) OFFSET 1) AS \"alias\"` — see {@link ChainRowSource}: the first VALUES\n * row is one `(SELECT \"col\" FROM typedBy WHERE FALSE)` per column (a typed\n * NULL), which types every later parameter by the target table's own column;\n * `OFFSET 1` drops it again.\n */\nfunction renderRowSource(params: { dialect: SqlDialect; source: ChainRowSource; collector: ParamCollector }): string {\n const { dialect, source, collector } = params;\n if (source.columns.length === 0 || source.rows.length === 0) {\n throw internalError({ message: \"a row source needs at least one column and one row\" });\n }\n const typedBy = renderTable(dialect, source.typedBy);\n const columns = source.columns.map((name) => dialect.quoteIdent({ name }));\n const rows = [`(${columns.map((column) => `(SELECT ${column} FROM ${typedBy} WHERE FALSE)`).join(\", \")})`];\n for (const row of source.rows) {\n if (row.length !== source.columns.length) {\n throw internalError({ message: `row source row has ${row.length} values but ${source.columns.length} columns` });\n }\n rows.push(`(${row.map((value) => renderSelectCell({ dialect, value, collector })).join(\", \")})`);\n }\n const alias = dialect.quoteIdent({ name: source.alias });\n const columnList = columns.join(\", \");\n return `(SELECT ${columnList} FROM (VALUES ${rows.join(\", \")}) AS ${alias} (${columnList}) OFFSET 1) AS ${alias}`;\n}\n\n/**\n * The tally column guarded by the vetoes: `CASE WHEN NOT EXISTS (SELECT 1\n * FROM \"s\") THEN CAST('__vibe_veto:<token>:' || $n || ':' || (SELECT count(*)\n * FROM \"s\") AS integer) … ELSE (SELECT count(*) FROM \"a\") + … END`, `$n`\n * binding the veto's nonce. A veto with `minRows` above 1 (EPIC W) tests\n * `WHEN (SELECT count(*) FROM \"s\") < <minRows>` instead.\n *\n * The failing cast is how a plain SQL expression raises an error (SQLSTATE\n * 22P02, the marker quoted in the message). Its operand reads the step, so it\n * is NOT a constant: PostgreSQL folds constant CASE arms at plan time and\n * would raise even when the arm is never taken; this one is evaluated only\n * when its WHEN holds. The count it appends is the rows the step returned.\n */\nfunction renderTallyColumn(params: { dialect: SqlDialect; result: ChainResult; defined: ReadonlySet<string>; collector: ParamCollector }): string {\n const { dialect, result, defined, collector } = params;\n const tally = result.tally;\n if (tally === undefined) throw internalError({ message: \"a chain veto needs a tally column to guard\" });\n if (tally.steps.length === 0) throw internalError({ message: \"a chain tally needs at least one step\" });\n const step = (name: string): string => {\n if (!defined.has(name)) throw internalError({ message: `chain tally or veto reads undefined step \"${name}\"` });\n return dialect.quoteIdent({ name });\n };\n const count = (name: string): string => `(SELECT count(*) FROM ${step(name)})`;\n const sum = tally.steps.map(count).join(\" + \");\n const vetoes = result.veto ?? [];\n if (vetoes.length === 0) return `${sum} AS ${dialect.quoteIdent({ name: tally.alias })}`;\n const arms = vetoes.map((veto) => {\n if (!CHAIN_VETO_TOKEN_PATTERN.test(veto.token)) throw internalError({ message: `chain veto token \"${veto.token}\" is not a lower-case word` });\n if (typeof veto.nonce !== \"string\" || veto.nonce === \"\") throw internalError({ message: `chain veto \"${veto.token}\" needs a non-empty nonce` });\n const minRows = veto.minRows ?? 1;\n if (!Number.isSafeInteger(minRows) || minRows < 1) throw internalError({ message: `chain veto \"${veto.token}\" needs a positive integer minRows` });\n if (veto.exactRows !== undefined && (!Number.isSafeInteger(veto.exactRows) || veto.exactRows < 0 || veto.minRows !== undefined)) {\n throw internalError({ message: `chain veto \"${veto.token}\" needs a nonnegative safe integer exactRows without minRows` });\n }\n const when = veto.exactRows !== undefined\n ? `WHEN ${count(veto.step)} <> ${veto.exactRows}`\n : minRows === 1 ? `WHEN NOT EXISTS (SELECT 1 FROM ${step(veto.step)})` : `WHEN ${count(veto.step)} < ${minRows}`;\n return `${when} THEN CAST('${CHAIN_VETO_PREFIX}${veto.token}:' || ${collector.add(veto.nonce)} || ':' || ${count(veto.step)} AS integer)`;\n });\n return `CASE ${arms.join(\" \")} ELSE ${sum} END AS ${dialect.quoteIdent({ name: tally.alias })}`;\n}\n\n/** `INSERT INTO t (cols) SELECT <cells> [FROM steps] [WHERE …] [RETURNING …]` — a chain step only. */\nfunction renderInsertSelect(params: {\n dialect: SqlDialect;\n statement: InsertSelectStatement;\n collector: ParamCollector;\n earlier: ReadonlySet<string>;\n}): string {\n const { dialect, statement, collector } = params;\n if (statement.columns.length === 0) throw internalError({ message: \"insert requires at least one column\" });\n if (statement.cells.length !== statement.columns.length) {\n throw internalError({\n message: `insert row has ${statement.cells.length} values but ${statement.columns.length} columns`,\n });\n }\n const from = statement.from ?? [];\n for (const name of from) {\n if (!params.earlier.has(name)) throw internalError({ message: `INSERT … SELECT reads step \"${name}\" before it is defined` });\n }\n const source = statement.source;\n if (source !== undefined && (params.earlier.has(source.alias) || from.includes(source.alias))) {\n throw internalError({ message: `row source alias \"${source.alias}\" collides with a chain step` });\n }\n const cells = statement.cells.map((value) => {\n if (isStepColumnRef(value)) {\n if (!from.includes(value.step) && value.step !== source?.alias) {\n throw internalError({ message: `cell reads step \"${value.step}\", which the INSERT … SELECT does not name in FROM` });\n }\n return `${dialect.quoteIdent({ name: value.step })}.${dialect.quoteIdent({ name: value.column })}`;\n }\n return renderSelectCell({ dialect, value, collector });\n });\n const columnList = statement.columns.map((name) => dialect.quoteIdent({ name })).join(\", \");\n let text = `INSERT INTO ${renderTable(dialect, statement.table)} (${columnList}) SELECT ${cells.join(\", \")}`;\n const relations = from.map((name) => dialect.quoteIdent({ name }));\n if (source !== undefined) relations.push(renderRowSource({ dialect, source, collector }));\n if (relations.length > 0) text += ` FROM ${relations.join(\" CROSS JOIN \")}`;\n if (statement.where !== undefined) {\n text += ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`;\n }\n const conflict = statement.conflictDoNothing;\n if (conflict !== undefined) {\n if (conflict.columns.length === 0) throw internalError({ message: \"an INSERT … SELECT conflict clause needs at least one column\" });\n if (dialect.doNothingForm !== \"onConflictDoNothing\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"ON CONFLICT DO NOTHING on an INSERT … SELECT chain step\",\n hint: \"gate on SqlDialect.statementChain and keep the multi-statement path\",\n });\n }\n text += ` ON CONFLICT (${conflict.columns.map((name) => dialect.quoteIdent({ name })).join(\", \")}) DO NOTHING`;\n }\n return text + applyReturning({ dialect, requested: statement.returning, collector }).suffix;\n}\n",
50
+ "/** PostgreSQL readiness catalog reads and temporary-clone DDL. Runtime owns execution order. */\nimport { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport { NATIVE_RLS } from \"./postgres-rls.ts\";\n\n/** Throwaway policy identity; never installed on a live table by readiness. */\nexport const NATIVE_RLS_PROBE_POLICY: \"vibeorm_probe\" = \"vibeorm_probe\";\n\n/** The eight independent catalog reads, folded into one statement by `catalog`. */\nconst CATALOG_READS: {\n readonly identity: string;\n readonly elevatedRoles: string;\n readonly schemaControl: string;\n readonly tables: string;\n readonly policies: string;\n readonly views: string;\n readonly routines: string;\n readonly triggers: string;\n} = Object.freeze({\n identity: `SELECT current_user::text AS \"currentUser\",\n session_user::text AS \"sessionUser\",\n r.rolsuper AS \"super\",\n r.rolbypassrls AS \"bypassRls\",\n r.rolcreatedb AS \"createDb\",\n r.rolcreaterole AS \"createRole\",\n pg_catalog.current_setting('server_version_num') AS \"serverVersionNum\",\n pg_catalog.pg_backend_pid()::text AS \"backendPid\",\n pg_catalog.pg_postmaster_start_time()::text AS \"instanceStart\",\n (SELECT a.backend_start::text FROM pg_catalog.pg_stat_activity a WHERE a.pid = pg_catalog.pg_backend_pid()) AS \"backendStart\",\n pg_catalog.has_database_privilege(current_user, pg_catalog.current_database(), 'TEMP') AS \"tempPrivilege\"\nFROM pg_catalog.pg_roles r\nWHERE r.rolname = current_user`,\n\n // Membership is the RECURSIVE role graph: pg_has_role(..., 'MEMBER') is true\n // for indirect membership and for NOINHERIT roles the runtime could SET ROLE\n // into. Predefined pg_* roles are flagged wholesale — pg_execute_server_program,\n // pg_read_server_files and pg_write_server_files reach the host even with\n // rolbypassrls = false, and pg_database_owner owns the public schema.\n elevatedRoles: `SELECT r.rolname::text AS \"role\",\n r.rolsuper AS \"super\",\n r.rolbypassrls AS \"bypassRls\",\n r.rolcreaterole AS \"createRole\",\n r.rolcreatedb AS \"createDb\"\nFROM pg_catalog.pg_roles r\nWHERE r.rolname <> current_user\n AND pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND (r.rolsuper OR r.rolbypassrls OR r.rolcreaterole OR r.rolcreatedb OR r.rolname LIKE 'pg\\\\_%')\nORDER BY r.rolname`,\n\n // Owning the schema means DROP SCHEMA ... CASCADE reaches every protected\n // table inside it; owning the database reaches the schema.\n schemaControl: `SELECT n.nspname::text AS \"schema\",\n pg_catalog.pg_get_userbyid(n.nspowner)::text AS \"owner\",\n pg_catalog.pg_has_role(current_user, n.nspowner, 'MEMBER') AS \"ownerAccess\",\n EXISTS (\n SELECT 1 FROM pg_catalog.pg_roles r\n WHERE pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND pg_catalog.has_schema_privilege(r.oid, n.oid, 'CREATE')\n ) AS \"create\",\n pg_catalog.current_database()::text AS \"database\",\n pg_catalog.pg_get_userbyid(d.datdba)::text AS \"databaseOwner\",\n pg_catalog.pg_has_role(current_user, d.datdba, 'MEMBER') AS \"databaseOwnerAccess\"\nFROM pg_catalog.pg_namespace n\nJOIN pg_catalog.pg_database d ON d.datname = pg_catalog.current_database()\nWHERE n.nspname = $1`,\n\n // ownerAccess covers direct ownership, inherited membership and SET ROLE\n // reach alike. TRUNCATE is checked for every role the runtime can reach,\n // because has_table_privilege(current_user, ...) alone misses a privilege\n // held by a NOINHERIT role the runtime may SET ROLE into.\n tables: `SELECT c.relname::text AS \"table\",\n c.relrowsecurity AS \"rlsEnabled\",\n c.relforcerowsecurity AS \"rlsForced\",\n pg_catalog.pg_get_userbyid(c.relowner)::text AS \"owner\",\n pg_catalog.pg_has_role(current_user, c.relowner, 'MEMBER') AS \"ownerAccess\",\n EXISTS (\n SELECT 1 FROM pg_catalog.pg_roles r\n WHERE pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND pg_catalog.has_table_privilege(r.oid, c.oid, 'TRUNCATE')\n ) AS \"truncate\"\nFROM pg_catalog.pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname = $1 AND c.relkind IN ('r', 'p')\nORDER BY c.relname`,\n\n policies: `SELECT c.relname::text AS \"table\",\n p.polname::text AS \"name\",\n p.polpermissive AS \"permissive\",\n p.polcmd::text AS \"command\",\n (p.polroles = '{0}'::oid[]) AS \"toPublic\",\n (p.polqual IS NOT NULL) AS \"hasUsing\",\n (p.polwithcheck IS NOT NULL) AS \"hasWithCheck\"\nFROM pg_catalog.pg_policy p\nJOIN pg_catalog.pg_class c ON c.oid = p.polrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname = $1\nORDER BY c.relname, p.polname`,\n\n // Only objects this role can actually reach are reported.\n views: `SELECT n.nspname::text AS \"schema\",\n c.relname::text AS \"name\",\n pg_catalog.pg_get_userbyid(c.relowner)::text AS \"owner\",\n (c.relkind = 'm') AS \"materialized\",\n (COALESCE((\n SELECT o.option_value FROM pg_catalog.pg_options_to_table(c.reloptions) AS o\n WHERE o.option_name = 'security_invoker'\n ), 'false') = 'true') AS \"securityInvoker\"\nFROM pg_catalog.pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname NOT IN ('pg_catalog', 'information_schema')\n AND c.relkind IN ('v', 'm')\n AND EXISTS (\n SELECT 1 FROM pg_catalog.pg_roles r\n WHERE pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND pg_catalog.has_schema_privilege(r.oid, n.oid, 'USAGE')\n AND (pg_catalog.has_table_privilege(r.oid, c.oid, 'SELECT')\n OR pg_catalog.has_any_column_privilege(r.oid, c.oid, 'SELECT'))\n )\nORDER BY n.nspname, c.relname`,\n\n routines: `SELECT n.nspname::text AS \"schema\",\n p.proname::text AS \"name\",\n pg_catalog.pg_get_userbyid(p.proowner)::text AS \"owner\"\nFROM pg_catalog.pg_proc p\nJOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace\nWHERE n.nspname NOT IN ('pg_catalog', 'information_schema')\n AND p.prosecdef\n AND EXISTS (\n SELECT 1 FROM pg_catalog.pg_roles r\n WHERE pg_catalog.pg_has_role(current_user, r.oid, 'MEMBER')\n AND pg_catalog.has_schema_privilege(r.oid, n.oid, 'USAGE')\n AND pg_catalog.has_function_privilege(r.oid, p.oid, 'EXECUTE')\n )\nORDER BY n.nspname, p.proname`,\n\n triggers: `SELECT c.relname::text AS \"table\",\n t.tgname::text AS \"name\",\n f.proname::text AS \"function\",\n pg_catalog.pg_get_userbyid(f.proowner)::text AS \"owner\",\n f.prosecdef AS \"securityDefiner\"\nFROM pg_catalog.pg_trigger t\nJOIN pg_catalog.pg_class c ON c.oid = t.tgrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nJOIN pg_catalog.pg_proc f ON f.oid = t.tgfoid\nWHERE n.nspname = $1\n AND NOT t.tgisinternal\n AND f.prosecdef\nORDER BY c.relname, t.tgname`,\n});\n\n/**\n * The reads `catalog` folds, in the order their JSON columns appear.\n * @internal\n */\nexport const RLS_READINESS_CATALOG_KEYS: readonly (\"identity\" | \"elevatedRoles\" | \"schemaControl\" | \"tables\" | \"policies\" | \"views\" | \"routines\" | \"triggers\")[] =\n Object.freeze([\"identity\", \"elevatedRoles\", \"schemaControl\", \"tables\", \"policies\", \"views\", \"routines\", \"triggers\"] as const);\n\n/**\n * One statement, eight result sets. Each subquery body is the single-read SQL\n * VERBATIM: same predicates, same privileges, same live catalog, read on the\n * same connection under the same role. Only the transport changes.\n *\n * `json_agg(...)::text` is deliberate. Drivers disagree about `json` (node-pg\n * parses it into JS values, others hand back the text), and a security flag\n * that arrives as the STRING \"false\" is truthy. Casting to text gives one\n * shape everywhere, which the reader parses itself — so a boolean stays a\n * boolean. `json_agg` over zero rows is NULL, which the reader can tell apart\n * from a value it could not read.\n *\n * A second, free property: the eight facts now share ONE snapshot. Under READ\n * COMMITTED eight separate statements each take their own.\n */\nconst COMPOSITE_CATALOG: string = `SELECT\\n${RLS_READINESS_CATALOG_KEYS.map(\n (key) => ` (SELECT json_agg(t)::text FROM (\\n${CATALOG_READS[key]}\\n ) t) AS \"${key}\"`,\n).join(\",\\n\")}`;\n\n/** Read-only catalog SQL; exported for exact statement routing in adapter tests. */\nexport const RLS_READINESS_SQL: {\n readonly identity: string;\n readonly elevatedRoles: string;\n readonly schemaControl: string;\n readonly tables: string;\n readonly policies: string;\n readonly expressions: string;\n readonly views: string;\n readonly routines: string;\n readonly triggers: string;\n readonly catalog: string;\n readonly readSearchPath: string;\n readonly setSearchPath: string;\n} = Object.freeze({\n identity: CATALOG_READS.identity,\n elevatedRoles: CATALOG_READS.elevatedRoles,\n schemaControl: CATALOG_READS.schemaControl,\n tables: CATALOG_READS.tables,\n policies: CATALOG_READS.policies,\n\n // Both sides of the comparison are deparsed by THIS server, in ONE\n // statement, in one transaction, under the same empty search_path.\n expressions: `SELECT c.relname::text AS \"table\",\n p.polname::text AS \"name\",\n (n.nspname <> $1) AS \"probe\",\n pg_catalog.pg_get_expr(p.polqual, p.polrelid) AS \"using\",\n pg_catalog.pg_get_expr(p.polwithcheck, p.polrelid) AS \"withCheck\"\nFROM pg_catalog.pg_policy p\nJOIN pg_catalog.pg_class c ON c.oid = p.polrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE (n.nspname = $1 AND p.polname = $2)\n OR (c.relnamespace = pg_catalog.pg_my_temp_schema() AND p.polname = $3)\nORDER BY c.relname, p.polname`,\n\n views: CATALOG_READS.views,\n routines: CATALOG_READS.routines,\n triggers: CATALOG_READS.triggers,\n catalog: COMPOSITE_CATALOG,\n\n readSearchPath: `SELECT pg_catalog.current_setting('search_path') AS \"searchPath\"`,\n setSearchPath: `SELECT pg_catalog.set_config('search_path', $1, true)`,\n});\n\n/** The closed set of catalog queries used by readiness. */\nexport type RlsReadinessQuery = keyof typeof RLS_READINESS_SQL;\n\nfunction requireRls(params: { dialect: SqlDialect }): void {\n if (!params.dialect.capabilities.nativeRowLevelSecurity) {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"nativeRowLevelSecurity\" });\n }\n}\n\n/** Parameterized catalog read, or transaction-local search-path setting. */\nexport function renderRlsReadinessQuery(params: {\n dialect: SqlDialect;\n query: RlsReadinessQuery;\n searchPath?: string;\n}): RenderedQuery {\n requireRls(params);\n const values = params.query === \"setSearchPath\" ? [params.searchPath ?? \"\"]\n : [NATIVE_RLS.tableSchema, NATIVE_RLS.policyName, NATIVE_RLS_PROBE_POLICY];\n const collector = new ParamCollector(params.dialect);\n const slots = new Map<string, string>();\n const text = RLS_READINESS_SQL[params.query].replace(/\\$(\\d+)/g, (slot, index: string) => {\n let placeholder = slots.get(slot);\n if (placeholder === undefined) {\n placeholder = collector.add(values[Number(index) - 1]);\n slots.set(slot, placeholder);\n }\n return placeholder;\n });\n return { text, values: collector.values, returning: \"none\" };\n}\n\n/** Clone only physical columns/types, on the same backend and with the same table name. */\nexport function renderRlsProbeTable(params: { dialect: SqlDialect; table: string; action: \"create\" | \"drop\" }): RenderedQuery {\n requireRls(params);\n const name = params.dialect.quoteIdent({ name: params.table });\n const schema = params.dialect.quoteIdent({ name: params.action === \"create\" ? NATIVE_RLS.tableSchema : \"pg_temp\" });\n const text = params.action === \"create\"\n ? `CREATE TEMP TABLE ${name} (LIKE ${schema}.${name}) ON COMMIT DROP`\n : `DROP TABLE ${schema}.${name}`;\n return { text, values: [], returning: \"none\" };\n}\n\n/** Save/empty/restore around migration policy DDL without replacing the operator's path. */\nexport function renderRlsPolicyPath(params: { dialect: SqlDialect; stage: \"save\" | \"empty\" | \"restore\" }): RenderedQuery {\n requireRls(params);\n const text = params.stage === \"save\"\n ? \"SELECT pg_catalog.set_config('vibeorm.rls_saved_search_path', pg_catalog.current_setting('search_path'), true)\"\n : params.stage === \"empty\"\n ? \"SELECT pg_catalog.set_config('search_path', '', true)\"\n : \"SELECT pg_catalog.set_config('search_path', pg_catalog.current_setting('vibeorm.rls_saved_search_path'), true)\";\n return { text, values: [], returning: \"none\" };\n}\n",
51
+ "/** Native RLS text contract. PostgreSQL/PGlite only, with no rewriting fallback. */\nimport { RlsContextError, VibeError, assertNativeRlsAdmission, assertValidSchemaIR, unsupportedCapability, validateRlsContextIR } from \"@vibeorm/schema\";\nimport type { FieldIR, ModelIR, RlsContextIR, RlsContextScalar, SchemaIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/** Managed identity and namespace, shared by migration and readiness checks. */\nexport const NATIVE_RLS: {\n readonly policyName: \"vibeorm_managed\";\n readonly tableSchema: \"public\";\n readonly settingPrefix: \"vibeorm.\";\n readonly parentAlias: \"parent\";\n} = Object.freeze({ policyName: \"vibeorm_managed\", tableSchema: \"public\", settingPrefix: \"vibeorm.\", parentAlias: \"parent\" });\n\nconst COLUMN_TYPES: Readonly<Record<RlsContextScalar, { readonly default: string; readonly native: Readonly<Record<string, string>> }>> = {\n String: { default: \"text\", native: { text: \"text\", varchar: \"varchar\", charactervarying: \"varchar\", uuid: \"uuid\" } },\n Boolean: { default: \"boolean\", native: { boolean: \"boolean\", bool: \"boolean\" } },\n Int: { default: \"integer\", native: { integer: \"integer\", int: \"integer\", int4: \"integer\", smallint: \"smallint\", int2: \"smallint\" } },\n BigInt: { default: \"bigint\", native: { bigint: \"bigint\", int8: \"bigint\" } },\n Float: { default: \"double precision\", native: { doubleprecision: \"double precision\", float8: \"double precision\", real: \"real\", float4: \"real\" } },\n Decimal: { default: \"numeric\", native: { numeric: \"numeric\", decimal: \"numeric\" } },\n DateTime: { default: \"timestamptz\", native: { timestamptz: \"timestamptz\", timestampwithtimezone: \"timestamptz\", timestamp: \"timestamp\", timestampwithouttimezone: \"timestamp\", date: \"date\" } },\n};\n\nfunction requireRls(params: { dialect: SqlDialect }): void {\n if (!params.dialect.capabilities.nativeRowLevelSecurity) {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"nativeRowLevelSecurity\" });\n }\n}\n\nfunction identifier(params: { dialect: SqlDialect; name: string }): string {\n if (typeof params.name !== \"string\" || params.name.length === 0 || params.name.includes(\"\\0\") || new TextEncoder().encode(params.name).length > 63) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Native RLS identifiers must be nonempty PostgreSQL identifiers of at most 63 bytes\" });\n }\n return params.dialect.quoteIdent({ name: params.name });\n}\n\nfunction tableRef(params: { dialect: SqlDialect; table: string; schema?: \"public\" | \"pg_temp\" }): string {\n if (params.schema !== undefined && params.schema !== \"public\" && params.schema !== \"pg_temp\") {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"nativeRowLevelSecurity\", hint: \"Only public tables and temporary policy probes are supported\" });\n }\n return `${identifier({ dialect: params.dialect, name: params.schema ?? NATIVE_RLS.tableSchema })}.${identifier({ dialect: params.dialect, name: params.table })}`;\n}\n\nfunction query(params: { text: string; values?: unknown[] }): RenderedQuery {\n return { text: params.text, values: params.values ?? [], returning: \"none\" };\n}\n\n/** ENABLE is one statement; migrate owns transaction/order and pairs it with FORCE. */\nexport function renderRlsEnable(params: { dialect: SqlDialect; table: string }): RenderedQuery {\n requireRls(params);\n return query({ text: `ALTER TABLE ${tableRef(params)} ENABLE ROW LEVEL SECURITY` });\n}\n\n/** FORCE is separate so migration step ordering stays explicit. */\nexport function renderRlsForce(params: { dialect: SqlDialect; table: string }): RenderedQuery {\n requireRls(params);\n return query({ text: `ALTER TABLE ${tableRef(params)} FORCE ROW LEVEL SECURITY` });\n}\n\n/** DISABLE is separate; migrate owns acknowledgement and teardown ordering. */\nexport function renderRlsDisable({ dialect, table }: { dialect: SqlDialect; table: string }): RenderedQuery {\n requireRls({ dialect });\n return query({ text: `ALTER TABLE ${tableRef({ dialect, table })} DISABLE ROW LEVEL SECURITY` });\n}\n\n/** NO FORCE precedes DISABLE when migrate deliberately removes protection. */\nexport function renderRlsNoForce({ dialect, table }: { dialect: SqlDialect; table: string }): RenderedQuery {\n requireRls({ dialect });\n return query({ text: `ALTER TABLE ${tableRef({ dialect, table })} NO FORCE ROW LEVEL SECURITY` });\n}\n\n/** Drop one named policy; migrate owns child-first dependency ordering. */\nexport function renderRlsDropPolicy({ dialect, table, policyName }: {\n dialect: SqlDialect;\n table: string;\n policyName?: string;\n}): RenderedQuery {\n requireRls({ dialect });\n const name = identifier({ dialect, name: policyName ?? NATIVE_RLS.policyName });\n return query({ text: `DROP POLICY ${name} ON ${tableRef({ dialect, table })}` });\n}\n\n/**\n * Context casts use the physical base type, NOT typmods: varchar(n), numeric(p,s)\n * and timestamp(p) casts can truncate/round another identity into an allowed one.\n * Unknown/user-defined casts refuse rather than splice raw nativeType into SQL.\n */\nexport function renderRlsColumnType(params: { dialect: SqlDialect; field: FieldIR }): string {\n requireRls(params);\n const { field } = params;\n const mapping = typeof field.type === \"string\" && Object.hasOwn(COLUMN_TYPES, field.type)\n ? COLUMN_TYPES[field.type as RlsContextScalar] : undefined;\n if (mapping !== undefined && !field.isList && !field.isUnsupported) {\n if (field.nativeType === undefined) return mapping.default;\n const match = /^([a-z][a-z0-9 ]*)(?:\\(\\s*\\d+(?:\\s*,\\s*\\d+)?\\s*\\))?$/i.exec(field.nativeType.trim());\n const base = match?.[1]?.toLowerCase().replace(/\\s+/g, \"\");\n const native = base !== undefined && Object.hasOwn(mapping.native, base) ? mapping.native[base] : undefined;\n if (native !== undefined) return native;\n }\n throw unsupportedCapability({ dialect: params.dialect.name, feature: \"nativeRowLevelSecurity\", hint: `Unsupported physical ownership type on field ${field.name}` });\n}\n\nfunction protectedModel(params: { dialect: SqlDialect; schema: SchemaIR; model: string }): ModelIR {\n requireRls(params);\n assertNativeRlsAdmission({ schema: params.schema, dialect: params.dialect.name });\n assertValidSchemaIR({ schema: params.schema });\n const model = params.schema.models.find((entry) => entry.name === params.model);\n if (model === undefined || model.rls === undefined || model.rls === \"unprotected\") {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Native RLS policy rendering requires a protected model\", meta: { model: params.model } });\n }\n return model;\n}\n\n/**\n * Desired predicate only, for drift probes; it is NOT server-canonical deparse.\n * `qualify` names the table a `where` rule's columns are read from, for a\n * statement with another relation in scope (`excluded` in `ON CONFLICT … DO\n * UPDATE`); the policy itself and the drift probes render them bare.\n */\nexport function renderRlsPredicate(params: { dialect: SqlDialect; schema: SchemaIR; model: string; qualify?: string }): string {\n const model = protectedModel(params);\n return predicate({ dialect: params.dialect, schema: params.schema, model, ...(params.qualify === undefined ? {} : { qualify: params.qualify }) });\n}\n\nfunction predicate(params: { dialect: SqlDialect; schema: SchemaIR; model: ModelIR; qualify?: string }): string {\n const { dialect, schema, model } = params;\n const owner = params.qualify === undefined ? \"\" : `${identifier({ dialect, name: params.qualify })}.`;\n const rule = model.rls;\n if (rule === \"deny\") return \"false\";\n if (typeof rule === \"object\" && \"where\" in rule) {\n return Object.entries(rule.where).map(([name, ref]) => {\n const field = model.fields.find((entry) => entry.name === name)!;\n const column = identifier({ dialect, name: field.dbName ?? field.name });\n const physicalType = renderRlsColumnType({ dialect, field });\n // Context keys passed structural validation; SQL literals are declarations,\n // never request values. The empty reset sentinel MUST become SQL NULL.\n return `(${owner}${column} = NULLIF(current_setting('${NATIVE_RLS.settingPrefix}${ref.context}', true), '')::${physicalType})`;\n }).join(\" AND \");\n }\n if (typeof rule === \"object\" && \"through\" in rule) {\n const relation = model.relations.find((entry) => entry.name === rule.through)!;\n const parent = schema.models.find((entry) => entry.name === relation.targetModel)!;\n const alias = identifier({ dialect, name: NATIVE_RLS.parentAlias });\n const child = identifier({ dialect, name: params.qualify ?? model.dbName ?? model.name });\n const join = relation.fields!.map((name, index) => {\n const childField = model.fields.find((field) => field.name === name)!;\n const parentField = parent.fields.find((field) => field.name === relation.references![index])!;\n return `(${alias}.${identifier({ dialect, name: parentField.dbName ?? parentField.name })} = ${child}.${identifier({ dialect, name: childField.dbName ?? childField.name })})`;\n }).join(\" AND \");\n return `EXISTS (SELECT 1 FROM ${tableRef({ dialect, table: parent.dbName ?? parent.name })} AS ${alias} WHERE ${join})`;\n }\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"Native RLS requires a protected policy rule\" });\n}\n\n/** One PERMISSIVE ALL/PUBLIC policy with equal existing/proposed-row checks. */\nexport function renderRlsPolicy(params: {\n dialect: SqlDialect;\n schema: SchemaIR;\n model: string;\n policyName?: string;\n targetSchema?: \"public\" | \"pg_temp\";\n}): RenderedQuery {\n const model = protectedModel(params);\n const expression = predicate({ dialect: params.dialect, schema: params.schema, model });\n const name = identifier({ dialect: params.dialect, name: params.policyName ?? NATIVE_RLS.policyName });\n const table = tableRef({ dialect: params.dialect, table: model.dbName ?? model.name, schema: params.targetSchema });\n return query({ text: `CREATE POLICY ${name} ON ${table} AS PERMISSIVE FOR ALL TO PUBLIC USING (${expression}) WITH CHECK (${expression})` });\n}\n\n/**\n * Every declared setting, parameterized in declaration order and transaction-local.\n *\n * Optional parts travel in the SAME statement (statement-count pass, EPIC 1-2);\n * without them the text is exactly the claims statement:\n * - `role` (PGlite): binds the trusted runtime role FIRST, as {@link renderRlsRole} does;\n * - `readOnly`: switches the transaction to READ ONLY after the claims (`$all` on a\n * verified connection; PostgreSQL accepts this switch at any point of a transaction);\n * - `backend`: reports the backend as `\"backendPid\"` / `\"backendStart\"` text columns,\n * the readiness catalog read's own expressions (adapters that name no connection object).\n *\n * A context with zero keys is accepted only when one of these parts is present.\n */\nexport function renderRlsContext(params: {\n dialect: SqlDialect;\n context: RlsContextIR;\n values: Readonly<Record<string, string | null>>;\n role?: string;\n readOnly?: boolean;\n backend?: boolean;\n}): RenderedQuery {\n requireRls(params);\n const extra = params.role !== undefined || params.readOnly === true || params.backend === true;\n if (validateRlsContextIR({ context: params.context }).length !== 0 || (Object.keys(params.context).length === 0 && !extra) ||\n typeof params.values !== \"object\" || params.values === null || Array.isArray(params.values)) {\n throw new RlsContextError({ reason: \"invalid\" });\n }\n const collector = new ParamCollector(params.dialect);\n const parts: string[] = [];\n if (params.role !== undefined) parts.push(`set_config('role', ${collector.add(runtimeRoleOf({ role: params.role }))}, true)`);\n for (const [key, slot] of Object.entries(params.context)) {\n if (!Object.hasOwn(params.values, key)) throw new RlsContextError({ reason: \"missing\", key });\n const value = params.values[key];\n if ((value === null && !slot.nullable) || (value !== null && (typeof value !== \"string\" || value.length === 0 || value.includes(\"\\0\")))) {\n throw new RlsContextError({ reason: \"invalid\", key });\n }\n parts.push(`set_config(${collector.add(`${NATIVE_RLS.settingPrefix}${key}`)}, ${collector.add(value ?? \"\")}, true)`);\n }\n for (const key of Reflect.ownKeys(params.values)) {\n if (typeof key !== \"string\" || !Object.hasOwn(params.context, key)) throw new RlsContextError({ reason: \"invalid\" });\n }\n if (params.readOnly === true) parts.push(\"set_config('transaction_read_only', 'on', true)\");\n if (params.backend === true) {\n parts.push(\n `pg_catalog.pg_backend_pid()::text AS ${identifier({ dialect: params.dialect, name: \"backendPid\" })}`,\n `(SELECT a.backend_start::text FROM pg_catalog.pg_stat_activity a WHERE a.pid = pg_catalog.pg_backend_pid()) AS ${identifier({ dialect: params.dialect, name: \"backendStart\" })}`,\n );\n }\n return query({ text: `SELECT ${parts.join(\", \")}`, values: collector.values });\n}\n\nfunction runtimeRoleOf(params: { role: string }): string {\n if (typeof params.role !== \"string\" || params.role.trim().length === 0 || params.role.includes(\"\\0\")) {\n throw new VibeError({ code: \"VIBE_CONFIG\", message: \"PGlite native RLS requires a trusted nonempty runtime role name\" });\n }\n return params.role;\n}\n\n/** First transaction statement on eligible PGlite only; server roles are login roles. */\nexport function renderRlsRole(params: { dialect: SqlDialect; role: string }): RenderedQuery {\n requireRls(params);\n const role = runtimeRoleOf({ role: params.role });\n const collector = new ParamCollector(params.dialect);\n return query({ text: `SELECT set_config('role', ${collector.add(role)}, true)`, values: collector.values });\n}\n",
52
+ "import { renderSqliteJsonEquality } from \"./dialects/sqlite-json-equality.ts\";\nimport { JSON_TRANSPORT, projectionOutputName } from \"./json-transport.ts\";\nimport { isFixedDiagnostic, renderCaptureReadiness, renderDiagnostic } from \"./dialects/diagnostics.ts\";\nimport type { DiagnosticStatement } from \"./dialects/diagnostics.ts\";\nimport { renderPostgresExplain, renderPostgresWorkload } from \"./dialects/postgres-diagnostics.ts\";\nimport { renderRlsReadinessQuery, renderRlsProbeTable, renderRlsPolicyPath } from \"./dialects/postgres-rls-readiness.ts\";\n/**\n * Statement renderer: SQL AST × dialect → { text, values, returning }.\n *\n * The shared grammar lives here; every dialect divergence goes through an\n * explicit SqlDialect strategy field. Malformed ASTs throw VIBE_INTERNAL —\n * the AST is built by VibeORM code, so a bad shape is always our bug.\n */\n\nimport { assertSqlNamespace, internalError, unsupportedCapability } from \"@vibeorm/schema\";\nimport { isSqlFragment, renderSqlFragment, sqlUsesIncoming } from \"./composable.ts\";\nimport type { SqlFragmentSpec } from \"@vibeorm/schema\";\nimport type { ColRef, JsonParamCell, KeyTableJoin, KeyTableMember, OrderTerm, SqlStatement, RlsReadinessStatement, RlsProbeTableStatement, RlsPolicyPathStatement, SqlExpr, TableRef } from \"./ast.ts\";\nimport type {\n AggFn,\n AggRef,\n ChainResult,\n ChainCapture,\n CaptureCascade,\n CaptureCell,\n CaptureReturningColumn,\n OtherRowReturningColumn,\n ChainRowSource,\n ChainStatement,\n ChainStepStatement,\n DeleteStatement,\n GroupKeyExpression,\n GroupingSets,\n InsertSelectStatement,\n InsertStatement,\n UnchangedColumn,\n KeyListMember,\n KeyPage,\n KeyRows,\n OrderByColumn,\n LateralJoin,\n LeftJoin,\n CountSubquery,\n ReturningColumn,\n SelectExpr,\n SelectStatement,\n SetOperator,\n UpdateStatement,\n} from \"./ast.ts\";\nimport { CHAIN_VETO_PREFIX, CHAIN_VETO_TOKEN_PATTERN, isCaptureReturningColumn, isOtherRowReturningColumn, isDbNowMarker, returningColumnName, isExcludedRef, isJsonParamCell, isListSetOperation, isSetOperation, isSqlDefaultCell, isSqlKeepCell, isSourceColumnRef, isStepColumnRef } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { containsPattern, endsWithPattern, startsWithPattern, strictMatchCollationPrefilter, strictMatchPattern } from \"./like.ts\";\nimport { renderAdvisoryLock, renderAdvisoryLocks, renderRowLockClause } from \"./locks.ts\";\nimport { renderDateTruncation } from \"./date-truncation.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport { isJsonListParameter, jsonListParameter } from \"./json-list-parameter.ts\";\nimport { jsonPathString } from \"./json-path.ts\";\nimport { isJsonPatchOperation, renderJsonPatch } from \"./json-patch.ts\";\nimport { keyListBindsUntypedRows, postgresBulkInsertArrayCast, postgresKeyListElementType } from \"./key-list.ts\";\nimport { renderRlsContext, renderRlsDisable, renderRlsDropPolicy, renderRlsEnable, renderRlsForce, renderRlsNoForce, renderRlsPolicy, renderRlsRole } from \"./dialects/postgres-rls.ts\";\n\n// ─── Result shape ─────────────────────────────────────────────────\n\nexport type RenderedQuery = {\n readonly text: string;\n readonly values: unknown[];\n /**\n * RETURNING status: \"native\" (rendered), \"omitted\" (requested but the dialect\n * lacks it — caller must re-select), \"none\" (not requested).\n */\n readonly returning: \"native\" | \"omitted\" | \"none\";\n};\n\n// ─── Entry point ──────────────────────────────────────────────────\n\nexport function renderStatement(params: { dialect: SqlDialect; statement: DiagnosticStatement | SqlStatement | RlsReadinessStatement | RlsProbeTableStatement | RlsPolicyPathStatement }): RenderedQuery {\n const { dialect, statement } = params;\n const collector = new ParamCollector(dialect);\n switch (statement.kind) {\n case \"diagnostic\": {\n // EPIC 5: `postgresExplain` wraps another statement, so it renders that\n // one first and keeps its parameters; the read-only workload reads take\n // their own identifiers and bounds. Everything else is a fixed probe.\n if (isFixedDiagnostic(statement)) return renderDiagnostic({ dialect, query: statement.query });\n if (statement.query === \"postgresCaptureReadiness\") return renderCaptureReadiness({ dialect, tables: statement.tables });\n if (statement.query === \"postgresExplain\") {\n return renderPostgresExplain({\n dialect,\n query: renderStatement({ dialect, statement: statement.statement }),\n ...(statement.options === undefined ? {} : { options: statement.options }),\n });\n }\n return renderPostgresWorkload({ dialect, ...statement });\n }\n case \"select\":\n return renderSelect({ dialect, statement, collector });\n case \"advisoryLocks\":\n return renderAdvisoryLocks({ dialect, keys: statement.keys, mode: statement.mode });\n case \"advisoryLock\":\n return renderAdvisoryLock({ dialect, statement, collector });\n case \"insert\":\n return renderInsert({ dialect, statement, collector });\n case \"update\":\n return renderUpdate({ dialect, statement, collector });\n case \"delete\":\n return renderDelete({ dialect, statement, collector });\n case \"chain\":\n return renderChain({ dialect, statement, collector });\n case \"rlsReadiness\": return renderRlsReadinessQuery({ dialect, ...statement });\n case \"rlsProbeTable\": return renderRlsProbeTable({ dialect, ...statement });\n case \"rlsPolicyPath\": return renderRlsPolicyPath({ dialect, ...statement });\n case \"rlsEnable\":\n return renderRlsEnable({ dialect, table: statement.table });\n case \"rlsForce\":\n return renderRlsForce({ dialect, table: statement.table });\n case \"rlsDisable\":\n return renderRlsDisable({ dialect, table: statement.table });\n case \"rlsNoForce\":\n return renderRlsNoForce({ dialect, table: statement.table });\n case \"rlsDropPolicy\":\n return renderRlsDropPolicy({ dialect, table: statement.table, policyName: statement.policyName });\n case \"rlsPolicy\":\n return renderRlsPolicy({ dialect, ...statement });\n case \"rlsContext\":\n return renderRlsContext({ dialect, ...statement });\n case \"rlsRole\":\n return renderRlsRole({ dialect, role: statement.role });\n }\n}\n\n// ─── Shared pieces ────────────────────────────────────────────────\n\nfunction quoteCol(dialect: SqlDialect, column: ColRef): string {\n if (column.coalesce !== undefined) {\n if (column.coalesce.length < 2 || column.coalesce.some((member) => member.coalesce !== undefined)) {\n throw internalError({ message: \"ColRef.coalesce needs two or more plain member references\" });\n }\n return `COALESCE(${column.coalesce.map((member) => quoteCol(dialect, member)).join(\", \")})`;\n }\n const name = dialect.quoteIdent({ name: column.name });\n const ref = column.table === undefined ? name : `${dialect.quoteIdent({ name: column.table })}.${name}`;\n // groupBy date keys: the start of the period, rendered identically at the\n // projection, GROUP BY and ORDER BY sites (refused without the capability).\n if (column.truncate !== undefined) return renderDateTruncation({ dialect, reference: ref, truncation: column.truncate });\n if (column.groupKey !== undefined) return renderGroupKey({ dialect, reference: ref, key: column.groupKey });\n if (column.enumOrdinal === true) return dialect.renderEnumOrdinal({ column: ref });\n // B4: sqlite Decimal compare/order/aggregate sites read the TEXT column as\n // REAL — the builder sets this only there, never on projections.\n if (column.castReal === true) {\n if (dialect.name !== \"sqlite\") {\n throw internalError({ message: \"ColRef.castReal is a sqlite Decimal construct\" });\n }\n return `CAST(${ref} AS REAL)`;\n }\n // D3: postgres `json` order/distinct/compare sites read the column as jsonb.\n if (column.castJsonb !== undefined) {\n if (dialect.name !== \"postgres\") {\n throw internalError({ message: \"ColRef.castJsonb is a postgres json construct\" });\n }\n return `${ref}::${column.castJsonb}`;\n }\n return ref;\n}\n\n/**\n * An ORDER BY / DISTINCT ON column of a SELECT, protected from binding to an\n * OUTPUT column. Postgres, MySQL and SQLite all resolve a bare name in ORDER\n * BY (postgres: DISTINCT ON too) to an output column of that name FIRST. When\n * the projection renames something else to the column's name — a postgres\n * `Float[]`/`Json[]` list read as `\"col\"::text AS \"col\"`, or a projection\n * alias — the bare name would order the TEXT, not the typed column\n * (`{10}` < `{1e-07}` < `{9}`). Such a reference is qualified with the\n * select's FROM name (its alias, or the derived-table name), which only ever\n * names the input column. Qualified references, casts and truncations\n * (`castReal`, `castJsonb`, `truncate` — expressions read input columns, and a\n * truncated key must repeat its GROUP BY text) and plain projections render\n * unchanged. Window ORDER BY (ROW_NUMBER) never sees output names, so it is\n * not passed through here.\n */\nfunction typedOrderRef(params: { statement: SelectStatement; column: ColRef }): ColRef {\n const { statement, column } = params;\n // MySQL and SQLite resolve an output name inside an ORDER BY expression too.\n if (column.coalesce !== undefined) return { ...column, coalesce: column.coalesce.map((member) => typedOrderRef({ statement, column: member })) };\n if (column.table !== undefined || column.castReal === true || column.castJsonb !== undefined || column.truncate !== undefined || column.groupKey !== undefined) return column;\n const renamed = statement.columns.some(\n (projected) => (projected.alias ?? projected.name) === column.name && (projected.transform !== undefined || projected.alias !== undefined),\n );\n return renamed ? { ...column, table: statement.table.alias ?? statement.table.name } : column;\n}\n\n/**\n * The cast a {@link JsonParamCell} renders after its placeholder: the\n * dialect's json param cast (`::text::jsonb` on postgres, empty elsewhere),\n * or `::text::json` for a cell bound for a postgres `json` column — the\n * server parses the text as `json` and stores it as written (D3).\n */\nfunction jsonCellCast(dialect: SqlDialect, cell: JsonParamCell): string {\n if (cell.storage !== \"json\" || dialect.jsonParamCast === \"\") return dialect.jsonParamCast;\n if (dialect.name !== \"postgres\") {\n throw internalError({ message: \"JsonParamCell storage json is a postgres construct\" });\n }\n return \"::text::json\";\n}\n\n/**\n * Projection rendering: a plain reference or its wire transform. JSON text\n * projections use the dialect primitive and keep explicit aliases. Text casts\n * preserve lossless transport on every dialect; both base64 forms remain\n * postgres-only.\n */\nfunction quoteProjection(dialect: SqlDialect, column: ColRef): string {\n if (column.transform === undefined) {\n const base = quoteCol(dialect, column);\n // A truncated key is an expression: it keeps the column's name as output name.\n const alias = column.alias ?? (column.truncate === undefined && column.groupKey === undefined ? undefined : column.name);\n if (alias === undefined) return base;\n return `${base} AS ${dialect.quoteIdent({ name: alias })}`;\n }\n if (column.transform === \"jsonText\") {\n const ref = quoteCol(dialect, column);\n const alias = dialect.quoteIdent({ name: column.alias ?? column.name });\n return `${dialect.jsonTextProjection({ expression: ref })} AS ${alias}`;\n }\n const ref = quoteCol(dialect, column);\n const alias = dialect.quoteIdent({ name: column.alias ?? column.name });\n if (column.transform === \"castText\") return `${textProjection({ dialect, expression: ref })} AS ${alias}`;\n // Lane J: MySQL's lateral subselect ships Bytes as `TO_BASE64` (a newline\n // every 76 characters, which the base64 decoder skips).\n if (column.transform === \"encodeBase64\" && dialect.name === \"mysql\") return `TO_BASE64(${ref}) AS ${alias}`;\n if (dialect.name !== \"postgres\") {\n throw internalError({ message: `${column.transform} is a postgres construct` });\n }\n if (column.transform === \"encodeArrayBase64\") return `encode(array_send(${ref}), 'base64') AS ${alias}`;\n return `encode(${ref}, 'base64') AS ${alias}`;\n}\n\nfunction textProjection(params: { dialect: SqlDialect; expression: string }): string {\n return params.dialect.name === \"postgres\" ? `${params.expression}::text`\n : `CAST(${params.expression} AS ${params.dialect.name === \"mysql\" ? \"CHAR\" : \"TEXT\"})`;\n}\n\n/**\n * A SELECT list rendered exactly as a {@link SelectStatement}'s columns are —\n * plain references and their wire transforms (`\"t\".\"scores\"::text AS\n * \"scores\"`) — for SQL assembled outside the AST (extension statements), so\n * its rows reach the driver in the same formats as `findMany`'s.\n */\nexport function renderProjection(params: { dialect: SqlDialect; columns: readonly ColRef[] }): string {\n const { dialect, columns } = params;\n return columns.map((column) => quoteProjection(dialect, column)).join(\", \");\n}\n\nfunction renderTable(dialect: SqlDialect, table: TableRef): string {\n if (table.namespace !== undefined) assertSqlNamespace({ namespace: table.namespace, dialect: dialect.name });\n const relation = dialect.quoteIdent({ name: table.name });\n const name = table.namespace === undefined ? relation : `${dialect.quoteIdent({ name: table.namespace })}.${relation}`;\n if (table.alias === undefined) return name;\n return `${name} AS ${dialect.quoteIdent({ name: table.alias })}`;\n}\n\nfunction assertCount(value: number, what: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw internalError({ message: `${what} must be a non-negative integer, got ${value}` });\n }\n}\n\nconst COMPARISON_SQL: Readonly<Record<string, string>> = {\n eq: \"=\",\n ne: \"<>\",\n gt: \">\",\n gte: \">=\",\n lt: \"<\",\n lte: \"<=\",\n};\n\n/**\n * Atomic SET arithmetic. `divide` is plain `/`: integer columns therefore\n * follow each dialect's own integer-division rule (pg/sqlite truncate, mysql\n * promotes to decimal) — pinned by the update-atomic-ops catalog case.\n */\nconst SET_OPERATION_SQL: Readonly<Record<SetOperator, string>> = {\n increment: \"+\",\n decrement: \"-\",\n multiply: \"*\",\n divide: \"/\",\n};\n\nconst AGG_FN_SQL: Readonly<Record<AggFn, string>> = {\n count: \"COUNT\",\n avg: \"AVG\",\n sum: \"SUM\",\n min: \"MIN\",\n max: \"MAX\",\n};\n\n/**\n * `COUNT(*)` / `FN(\"col\")` — shared by projections, HAVING and ORDER BY. A\n * filtered aggregate renders its predicate where it stands, so its parameters\n * bind at every site, in text order.\n */\nfunction renderAggRef(dialect: SqlDialect, agg: AggRef, collector: ParamCollector): string {\n if (agg.filter !== undefined) return renderFilteredAggregate({ dialect, agg, filter: agg.filter, collector });\n if (agg.fn === \"countAll\") return \"COUNT(*)\";\n const column = quoteCol(dialect, agg.column);\n if ((agg.fn === \"min\" || agg.fn === \"max\") && agg.enumOrder !== undefined) {\n return dialect.renderEnumMinMax({ fn: agg.fn, column, result: agg.enumOrder });\n }\n return `${AGG_FN_SQL[agg.fn]}(${column})`;\n}\n\n/**\n * `AGG(x) FILTER (WHERE …)`, or on a `caseWhen` dialect `AGG(CASE WHEN … THEN\n * x END)` — `COUNT(*)` counts `CASE WHEN … THEN 1 END` there. A row the\n * predicate leaves unknown is left out by both forms.\n */\nfunction renderFilteredAggregate(params: { dialect: SqlDialect; agg: AggRef; filter: SqlExpr; collector: ParamCollector }): string {\n const { dialect, agg, filter, collector } = params;\n if (dialect.capabilities.filteredAggregates === \"filterClause\") {\n const { filter: _filter, ...plain } = agg;\n const aggregate = renderAggRef(dialect, plain, collector);\n return `${aggregate} FILTER (WHERE ${renderExpr({ dialect, expr: filter, collector })})`;\n }\n const when = renderExpr({ dialect, expr: filter, collector });\n if (agg.fn === \"countAll\") return `COUNT(CASE WHEN ${when} THEN 1 END)`;\n const column = quoteCol(dialect, agg.column);\n if ((agg.fn === \"min\" || agg.fn === \"max\") && agg.enumOrder !== undefined) {\n return dialect.renderEnumMinMax({ fn: agg.fn, column, result: agg.enumOrder, when });\n }\n return `${AGG_FN_SQL[agg.fn]}(CASE WHEN ${when} THEN ${column} END)`;\n}\n\n/** The longest string prefix a `groupBy` prefix key takes. */\nconst MAX_GROUP_KEY_PREFIX = 1000;\n\n/**\n * A {@link GroupKeyExpression} over `reference`. The path steps and the prefix\n * length render as literals (each site of one key must repeat the identical\n * text), so they are checked again here.\n *\n * - postgres: `(\"col\" -> 'a' ->> 'b')` — `->` with a text key reads an object\n * member only, as the other dialects' quoted paths do; a `json` column\n * converts the extracted value to jsonb (`((\"col\" -> 'a' -> 'b')::jsonb #>>\n * '{}')`) so numbers and objects print as a jsonb column's do;\n * - sqlite: `json_extract` returns JSON booleans as 1/0 and numbers as\n * numbers, so a CASE over `json_type` spells each type as JSON text;\n * - mysql: `JSON_UNQUOTE` of a JSON `null` is the string `'null'`, so a CASE\n * over `JSON_TYPE` maps it to SQL NULL first.\n */\nfunction renderGroupKey(params: { dialect: SqlDialect; reference: string; key: GroupKeyExpression }): string {\n const { dialect, reference, key } = params;\n if (key.kind === \"prefix\") {\n if (!Number.isSafeInteger(key.length) || key.length < 1 || key.length > MAX_GROUP_KEY_PREFIX) {\n throw internalError({ message: `a groupBy prefix length must be an integer from 1 to ${MAX_GROUP_KEY_PREFIX}, got ${String(key.length)}` });\n }\n if (dialect.name === \"sqlite\") return `substr(${reference}, 1, ${key.length})`;\n return `${dialect.name === \"mysql\" ? \"LEFT\" : \"left\"}(${reference}, ${key.length})`;\n }\n if (key.path.length === 0 || key.path.some((step) => typeof step !== \"string\" || step.length === 0 || step.includes(\"\\u0000\"))) {\n throw internalError({ message: \"a groupBy JSON path needs one or more non-empty object keys without NUL characters\" });\n }\n switch (dialect.jsonPathMode) {\n case \"operators\": {\n const steps = key.path.map((step) => dialect.quoteStringLiteral({ value: step }));\n if (key.storage === \"json\") return `((${reference} -> ${steps.join(\" -> \")})::jsonb #>> '{}')`;\n const last = steps.length - 1;\n return `(${reference}${steps.map((step, index) => `${index === last ? \" ->> \" : \" -> \"}${step}`).join(\"\")})`;\n }\n case \"sqliteExtract\": {\n const path = dialect.quoteStringLiteral({ value: jsonPathString(key.path) });\n const extracted = `json_extract(${reference}, ${path})`;\n return `CASE json_type(${reference}, ${path}) WHEN 'text' THEN ${extracted} WHEN 'true' THEN 'true' WHEN 'false' THEN 'false' WHEN 'null' THEN NULL ELSE CAST(${extracted} AS TEXT) END`;\n }\n case \"mysqlExtract\": {\n const extracted = `JSON_EXTRACT(${reference}, ${dialect.quoteStringLiteral({ value: jsonPathString(key.path) })})`;\n return `CASE WHEN JSON_TYPE(${extracted}) = 'NULL' THEN NULL ELSE JSON_UNQUOTE(${extracted}) END`;\n }\n }\n}\n\n/**\n * `GROUP BY …` over grouping sets: `GROUPING SETS ((a, b), (a), ())`, or on a\n * `rollup` dialect `a, b WITH ROLLUP` when the sets are exactly the rollup\n * chain of the keys in order. Anything else is refused.\n */\nfunction renderGroupingSets(params: { dialect: SqlDialect; keys: readonly string[]; grouping: GroupingSets }): string {\n const { dialect, keys, grouping } = params;\n const sets = groupingSetIndexes({ keys, grouping });\n const mode = dialect.capabilities.groupingSets;\n if (mode === \"groupingSets\") {\n return `GROUPING SETS (${sets.map((set) => `(${set.map((index) => keys[index]).join(\", \")})`).join(\", \")})`;\n }\n if (mode === \"rollup\" && isRollupChain({ count: keys.length, sets })) return `${keys.join(\", \")} WITH ROLLUP`;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: mode === \"rollup\" ? \"groupBy grouping sets other than the rollup of `by` in order\" : \"groupBy grouping sets\",\n hint: mode === \"rollup\"\n ? \"MySQL groups by `WITH ROLLUP` only: list the sets [[a, b], [a], []] for by [a, b], or run one groupBy per set\"\n : \"run one groupBy per grouping set instead\",\n });\n}\n\n/** The sets' member indexes, checked against the key count. */\nfunction groupingSetIndexes(params: { keys: readonly string[]; grouping: GroupingSets }): readonly (readonly number[])[] {\n const { keys, grouping } = params;\n if (grouping.sets.length === 0 || keys.length === 0 || keys.length > 31) {\n throw internalError({ message: \"grouping sets need one or more sets over 1 to 31 groupBy keys\" });\n }\n for (const set of grouping.sets) {\n if (set.some((index) => !Number.isSafeInteger(index) || index < 0 || index >= keys.length)) {\n throw internalError({ message: \"a grouping set names a groupBy key that does not exist\" });\n }\n }\n return grouping.sets;\n}\n\n/**\n * Are `sets` (indexes into `count` grouping keys) exactly the rollup chain\n * `[0..n-1], [0..n-2], …, []`, in any order and with members in any order?\n * The one shape a `rollup` dialect can group by (`GROUP BY … WITH ROLLUP`).\n */\nexport function isRollupChain(params: { count: number; sets: readonly (readonly number[])[] }): boolean {\n const { count, sets } = params;\n if (sets.length !== count + 1) return false;\n const lengths = new Set<number>();\n for (const set of sets) {\n const sorted = [...set].sort((left, right) => left - right);\n if (!sorted.every((index, position) => index === position)) return false;\n lengths.add(set.length);\n }\n return lengths.size === count + 1;\n}\n\n/**\n * `CASE GROUPING(k0, k1, …) WHEN <mask> THEN <set index> … END`: GROUPING sets\n * a key's bit (the rightmost key is the lowest bit) when the row's set leaves\n * the key out, so each set has one mask.\n */\nfunction renderGroupingSetIndex(params: { keys: readonly string[]; grouping: GroupingSets }): string {\n const { keys } = params;\n const sets = groupingSetIndexes(params);\n const branches = sets.map((set, position) => {\n let mask = 0;\n for (let index = 0; index < keys.length; index++) {\n if (!set.includes(index)) mask += 2 ** (keys.length - 1 - index);\n }\n return `WHEN ${mask} THEN ${position}`;\n });\n return `CASE GROUPING(${keys.join(\", \")}) ${branches.join(\" \")} END`;\n}\n\nfunction assertScalarArrays(dialect: SqlDialect, feature: string): void {\n if (dialect.capabilities.scalarArrays) return;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature,\n hint: \"only postgres has native array columns — model the list as a related table instead\",\n });\n}\n\n// ─── Expressions ──────────────────────────────────────────────────\n\n/**\n * Render one boolean expression into SQL text, collecting parameters into the\n * shared collector. Public so extension delegates can AND user `where` trees\n * (compiled by the runtime) into their own statements.\n */\nexport function renderExpr(params: { dialect: SqlDialect; expr: SqlExpr; collector: ParamCollector }): string {\n const { dialect, expr, collector } = params;\n\n switch (expr.kind) {\n case \"cmp\": {\n const op = COMPARISON_SQL[expr.op];\n if (op === undefined) {\n throw internalError({ message: `unknown comparison operator \"${expr.op}\"` });\n }\n // Database-clock operand: the dialect's now() expression, never a param.\n if (isDbNowMarker(expr.value)) {\n return `${quoteCol(dialect, expr.column)} ${op} ${dialect.renderDbNow({ offsetSeconds: expr.value.offsetSeconds, collector })}`;\n }\n const compared = listComparison({ dialect, column: expr.column, value: expr.value, collector });\n return `${compared.column} ${op} ${compared.operand}`;\n }\n\n case \"cmpCol\": {\n const op = COMPARISON_SQL[expr.op];\n if (op === undefined) {\n throw internalError({ message: `unknown comparison operator \"${expr.op}\"` });\n }\n return `${quoteCol(dialect, expr.left)} ${op} ${quoteCol(dialect, expr.right)}`;\n }\n\n case \"isNull\":\n return `${quoteCol(dialect, expr.column)} IS ${expr.negate === true ? \"NOT NULL\" : \"NULL\"}`;\n\n case \"inArray\": {\n if (expr.values.length === 0) {\n // Empty IN matches nothing; empty NOT IN matches everything.\n return expr.negate === true ? \"1 = 1\" : \"1 = 0\";\n }\n const column = quoteCol(dialect, expr.column);\n if (expr.timeOfDay === true && dialect.timeOfDayInStrategy === \"equalities\") {\n const equalities = collector.addMany(expr.values).map((placeholder) => `${column} = ${placeholder}`);\n return `${expr.negate === true ? \"NOT \" : \"\"}(${equalities.join(\" OR \")})`;\n }\n if (dialect.inArrayStrategy === \"any\") {\n const base = `${column} = ANY(${collector.add(Array.isArray(expr.values) ? [...expr.values] : expr.values)})`;\n return expr.negate === true ? `NOT (${base})` : base;\n }\n const placeholders = collector.addMany(expr.values);\n return `${column} ${expr.negate === true ? \"NOT IN\" : \"IN\"} (${placeholders.join(\", \")})`;\n }\n\n case \"tupleIn\": {\n if (expr.columns.length === 0) {\n throw internalError({ message: \"tupleIn needs at least one column\" });\n }\n for (const row of expr.rows) {\n if (row.length !== expr.columns.length) {\n throw internalError({\n message: `tupleIn row has ${row.length} values for ${expr.columns.length} columns`,\n });\n }\n }\n if (expr.rows.length === 0) {\n // Same honesty as inArray: an empty membership matches nothing.\n return expr.negate === true ? \"1 = 1\" : \"1 = 0\";\n }\n const columns = expr.columns.map((column) => quoteCol(dialect, column));\n if (dialect.tupleInStrategy === \"rowValue\") {\n const tuples = expr.rows.map((row) => `(${collector.addMany(row).join(\", \")})`);\n const base = `(${columns.join(\", \")}) IN (${tuples.join(\", \")})`;\n return expr.negate === true ? `NOT (${base})` : base;\n }\n // No row constructors: an OR of COMPLETE conjunctions, never a per-column\n // IN (which would match the Cartesian product of the members).\n const conjunctions = expr.rows.map((row) => {\n const terms = row.map((value, index) => `${columns[index] as string} = ${collector.add(value)}`);\n return terms.length === 1 ? (terms[0] as string) : `(${terms.join(\" AND \")})`;\n });\n const base = conjunctions.length === 1 ? (conjunctions[0] as string) : `(${conjunctions.join(\" OR \")})`;\n return expr.negate === true ? `NOT ${base.startsWith(\"(\") ? base : `(${base})`}` : base;\n }\n\n case \"keyList\":\n return renderKeyList({ dialect, expr, collector });\n\n case \"rowCompare\": {\n // D-01: one row-value comparison; values bind in member order.\n const op = COMPARISON_SQL[expr.op];\n if (op === undefined || expr.columns.length === 0 || expr.values.length !== expr.columns.length) {\n throw internalError({ message: `rowCompare needs a range operator and one value per column (${expr.columns.length} columns, ${expr.values.length} values)` });\n }\n const columns = expr.columns.map((column) => quoteCol(dialect, column));\n const placeholders = expr.values.map((value) => collector.add(value));\n return `(${columns.join(\", \")}) ${op} (${placeholders.join(\", \")})`;\n }\n\n case \"inSelect\": {\n // D-04: the subquery shares the collector, like EXISTS.\n if (expr.columns.length === 0) throw internalError({ message: \"inSelect needs at least one column\" });\n if (dialect.name === \"mysql\" && (expr.select.limit !== undefined || expr.select.offset !== undefined)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"LIMIT inside an IN subquery\",\n hint: \"mysql refuses LIMIT directly inside an IN subquery (error 1235); wrap the limited select in a derived table\",\n });\n }\n const columns = expr.columns.map((column) => quoteCol(dialect, column));\n if (expr.single === true && columns.length !== 1) throw internalError({ message: \"a single-row inSelect compares exactly one column\" });\n const tested = columns.length === 1 ? (columns[0] as string) : `(${columns.join(\", \")})`;\n const sub = renderSelect({ dialect, statement: expr.select, collector });\n return expr.single === true ? `${tested} = (${sub.text})` : `${tested} IN (${sub.text})`;\n }\n\n case \"like\": {\n const column = quoteCol(dialect, expr.column);\n const placeholder = collector.add(expr.pattern);\n let base: string;\n if (expr.insensitive === true) {\n base =\n dialect.insensitiveLike === \"ilike\"\n ? `${column} ILIKE ${placeholder}`\n : expr.ciCollation === true\n ? // #36: the column's declared `_ci` collation already folds case —\n // plain LIKE keeps the index usable.\n `${column} LIKE ${placeholder}`\n : `LOWER(${column}) LIKE LOWER(${placeholder})`;\n } else {\n base = `${column} LIKE ${placeholder}`;\n }\n if (dialect.likeEscapeClause !== null) {\n base = `${base}${dialect.likeEscapeClause}`;\n }\n return expr.negate === true ? `NOT (${base})` : base;\n }\n\n case \"strictMatch\": {\n const column = quoteCol(dialect, expr.column);\n let base: string;\n if (expr.op === \"equals\") {\n // pg and sqlite `=` are already byte-exact; only mysql's `_ci`\n // collations fold equality and need the BINARY cast.\n base =\n dialect.strictMatchStrategy === \"binary\"\n ? `${column} = CAST(${collector.add(expr.value)} AS BINARY)`\n : `${column} = ${collector.add(expr.value)}`;\n } else {\n const pattern = strictMatchPattern({\n strategy: dialect.strictMatchStrategy,\n op: expr.op,\n value: expr.value,\n });\n if (dialect.strictMatchStrategy === \"glob\") {\n base = `${column} GLOB ${collector.add(pattern)}`;\n } else {\n // Fix lane Q2 (D-06): mysql strict startsWith ANDs the collation\n // LIKE first (same pattern, bound first) — an index-boundable\n // superset of the byte-exact test, so the rows are unchanged.\n const prefilter = strictMatchCollationPrefilter({\n strategy: dialect.strictMatchStrategy,\n op: expr.op,\n negate: expr.negate === true,\n })\n ? `${column} LIKE ${collector.add(pattern)}${dialect.likeEscapeClause ?? \"\"}`\n : null;\n const placeholder = collector.add(pattern);\n base =\n dialect.strictMatchStrategy === \"binary\"\n ? `${column} LIKE CAST(${placeholder} AS BINARY)`\n : `${column} LIKE ${placeholder}`;\n if (dialect.likeEscapeClause !== null) base = `${base}${dialect.likeEscapeClause}`;\n if (prefilter !== null) base = `(${prefilter} AND ${base})`;\n }\n }\n return expr.negate === true ? `NOT (${base})` : base;\n }\n\n case \"and\":\n case \"or\": {\n if (expr.operands.length === 0) {\n // Neutral elements: empty AND is always-true, empty OR always-false.\n return expr.kind === \"and\" ? \"1 = 1\" : \"1 = 0\";\n }\n if (expr.operands.length === 1) {\n return renderExpr({ dialect, expr: expr.operands[0]!, collector });\n }\n const joiner = expr.kind === \"and\" ? \" AND \" : \" OR \";\n const rendered = expr.operands.map((operand) => renderExpr({ dialect, expr: operand, collector }));\n return `(${rendered.join(joiner)})`;\n }\n\n case \"not\":\n return `NOT (${renderExpr({ dialect, expr: expr.operand, collector })})`;\n\n case \"aggCmp\": {\n const op = COMPARISON_SQL[expr.op];\n if (op === undefined) {\n throw internalError({ message: `unknown comparison operator \"${expr.op}\"` });\n }\n return `${renderAggRef(dialect, expr.agg, collector)} ${op} ${collector.add(expr.value)}`;\n }\n\n case \"arrayHas\": {\n assertScalarArrays(dialect, \"the scalar-list filter \\\"has\\\"\");\n const compared = listComparison({ dialect, column: expr.column, value: expr.value, collector });\n const base = `${compared.operand} = ANY(${compared.column})`;\n return expr.negate === true ? `NOT (${base})` : base;\n }\n\n case \"arrayContainsAll\": {\n assertScalarArrays(dialect, \"the scalar-list filter \\\"hasEvery\\\"\");\n const values = Array.isArray(expr.values) ? [...expr.values] : expr.values;\n const compared = listComparison({ dialect, column: expr.column, value: values, collector });\n return `${compared.column} @> ${compared.operand}`;\n }\n\n case \"arrayOverlaps\": {\n assertScalarArrays(dialect, \"the scalar-list filter \\\"hasSome\\\"\");\n const values = Array.isArray(expr.values) ? [...expr.values] : expr.values;\n const compared = listComparison({ dialect, column: expr.column, value: values, collector });\n return `${compared.column} && ${compared.operand}`;\n }\n\n case \"arrayIsEmpty\": {\n assertScalarArrays(dialect, \"the scalar-list filter \\\"isEmpty\\\"\");\n // v1 semantics kept: array_length of NULL and of '{}' are both NULL, so\n // `isEmpty: true` matches NULL **and** empty lists.\n const column = quoteCol(dialect, expr.column);\n return `array_length(${column}, 1) IS ${expr.empty ? \"NULL\" : \"NOT NULL\"}`;\n }\n\n case \"jsonFilter\":\n return renderJsonFilter({ dialect, expr, collector });\n\n case \"exists\": {\n // The subquery shares the statement's collector, so its parameters land\n // in the single sequence exactly where they appear in the text.\n const sub = renderSelect({ dialect, statement: expr.select, collector });\n return `${expr.negate === true ? \"NOT \" : \"\"}EXISTS (${sub.text})`;\n }\n\n case \"composed\":\n return `(${renderSqlFragment({ dialect, fragment: expr.fragment, collector })})`;\n\n case \"fragment\":\n return renderFragment({ dialect, fragment: expr.fragment, collector });\n\n case \"raw\":\n return expr.text;\n }\n}\n\n// ─── Bound fragments (extension SQL plane) ───────────────────\n\n/**\n * Render a neutral bound fragment (extensions.md §3): literal text verbatim,\n * `{ param }` through the collector (single placeholder sequence), `{ ident }`\n * paths through dialect.quoteIdent. Exported so extension delegates can build\n * full statements sharing one collector with core-compiled WHERE trees.\n */\nexport function renderFragment(params: {\n dialect: SqlDialect;\n fragment: SqlFragmentSpec;\n collector: ParamCollector;\n}): string {\n const { dialect, fragment, collector } = params;\n let text = \"\";\n for (const part of fragment.parts) {\n if (typeof part === \"string\") {\n text += part;\n } else if (\"param\" in part) {\n text += collector.add(part.param);\n } else {\n text += part.ident.map((name) => dialect.quoteIdent({ name })).join(\".\");\n }\n }\n return text;\n}\n\n/**\n * Column and operand of a comparison (`cmp`, `has`, `hasEvery`, `hasSome`).\n * A Json-list operand of a `json[]` column (`Json[] @db.Json`) compares as\n * jsonb on both sides — `\"col\"::jsonb[]` against `$n::text::jsonb[]` (or\n * `$n::text::jsonb` for one element) — because `json` has no equality\n * operator at all (\"could not identify an equality operator for type json\").\n * Write sites (`push`) keep the `json` operand. Everything else renders as\n * before. The column side is added first only in text: it binds nothing.\n */\nfunction listComparison(params: {\n dialect: SqlDialect;\n column: ColRef;\n value: unknown;\n collector: ParamCollector;\n}): { readonly column: string; readonly operand: string } {\n const { dialect, column, value, collector } = params;\n if (isJsonListParameter(value) && value.storage === \"json\") {\n return {\n column: `${quoteCol(dialect, column)}::jsonb[]`,\n operand: collector.add(jsonListParameter({ value: value.value, storage: \"jsonb\" })),\n };\n }\n return { column: quoteCol(dialect, column), operand: collector.add(value) };\n}\n\ntype KeyListExpr = Extract<SqlExpr, { kind: \"keyList\" }>;\n\n/**\n * Key-list membership per `SqlDialect.keyListStrategy` (see the `keyList`\n * node): postgres binds one typed array per member and unnests them in a\n * semi-join subquery — except when a member is a `DateTime` without a\n * declared native type ({@link keyListBindsUntypedRows}): then it renders the\n * row-constructor list of untyped parameters, so each member is typed from\n * its column like `\"col\" = $n`; mysql renders the row-constructor list (an OR\n * of complete conjunctions when a member is a time of day and the dialect\n * declares `equalities` for it); sqlite renders `IN (VALUES …)`.\n */\nfunction renderKeyList(params: { dialect: SqlDialect; expr: KeyListExpr; collector: ParamCollector }): string {\n const { dialect, expr, collector } = params;\n const arity = expr.columns.length;\n if (arity === 0) throw internalError({ message: \"keyList needs at least one column\" });\n if (expr.members.length !== arity) {\n throw internalError({ message: `keyList has ${expr.members.length} members for ${arity} columns` });\n }\n for (const row of expr.rows) {\n if (row.length !== arity) throw internalError({ message: `keyList row has ${row.length} values for ${arity} columns` });\n }\n // Same honesty as inArray: an empty key list matches nothing.\n if (expr.rows.length === 0) return \"1 = 0\";\n const columns = expr.columns.map((column) => quoteCol(dialect, column));\n const tuple = arity === 1 ? (columns[0] as string) : `(${columns.join(\", \")})`;\n if (dialect.keyListStrategy === \"unnest\") {\n // Every member's element type first: a member without one (Json, an\n // unknown native type) is refused in either form.\n const types = expr.members.map((member) => postgresKeyListElementType({ dialect, member }));\n if (!keyListBindsUntypedRows({ members: expr.members })) {\n const arrays = types.map((type, index) => `${collector.add(expr.rows.map((row) => row[index]))}::${type}[]`);\n return `${tuple} IN (SELECT * FROM unnest(${arrays.join(\", \")}))`;\n }\n }\n if (dialect.timeOfDayInStrategy === \"equalities\" && expr.members.some((member) => member.timeOfDay === true)) {\n const conjunctions = expr.rows.map((row) => {\n const terms = row.map((value, index) => `${columns[index] as string} = ${collector.add(value)}`);\n return terms.length === 1 ? (terms[0] as string) : `(${terms.join(\" AND \")})`;\n });\n return conjunctions.length === 1 ? (conjunctions[0] as string) : `(${conjunctions.join(\" OR \")})`;\n }\n const tuples = expr.rows.map((row) => `(${collector.addMany(row).join(\", \")})`);\n return dialect.keyListStrategy === \"values\"\n ? `${tuple} IN (VALUES ${tuples.join(\", \")})`\n : `${tuple} IN (${tuples.join(\", \")})`;\n}\n\n// ─── Fix lane Q1 (round 3, DB-01): per-key page ─────────────────────────\n\n/** Key-list source alias of a per-key page; its members are `__vibe_k<i>` on postgres. */\nconst KEY_PAGE_KEYS = \"__vibe_keys\";\n/** Postgres: the lateral page of identity keys. */\nconst KEY_PAGE_IDS = \"__vibe_ids\";\n/** The child table re-read by identity. */\nconst KEY_PAGE_ROWS = \"__vibe_page\";\n\n/** Members of a {@link KeyPage}'s `select` the per-key page renders; any other is a malformed node. */\nconst KEY_PAGE_SELECT_MEMBERS: ReadonlySet<string> = new Set([\"kind\", \"table\", \"columns\", \"where\", \"orderBy\", \"limit\", \"offset\"]);\n\n/**\n * The per-key page (`SelectStatement.keyPage`) per `SqlDialect.keyPageStrategy`\n * — see {@link KeyPage}. Parameters join the shared sequence in text order:\n * the key tuples (FROM), then the page's own `where`.\n */\nfunction renderKeyPage(params: { dialect: SqlDialect; page: KeyPage; collector: ParamCollector }): string {\n const { dialect, page, collector } = params;\n const { select } = page;\n const arity = page.keyColumns.length;\n if (arity === 0 || page.members.length !== arity) {\n throw internalError({ message: `keyPage has ${page.members.length} members for ${arity} key columns` });\n }\n if (page.rows.length === 0) throw internalError({ message: \"keyPage needs at least one key\" });\n for (const row of page.rows) {\n if (row.length !== arity) throw internalError({ message: `keyPage row has ${row.length} values for ${arity} key columns` });\n }\n if (page.identity.length === 0) throw internalError({ message: \"keyPage needs the child's identity columns\" });\n const order = select.orderBy ?? [];\n if (order.length === 0 || order.some((term) => !(\"column\" in term))) {\n throw internalError({ message: \"keyPage needs a non-empty order of plain column terms\" });\n }\n if (select.table.alias !== undefined || Object.keys(select).some((member) => !KEY_PAGE_SELECT_MEMBERS.has(member))) {\n throw internalError({ message: \"keyPage select carries a member the per-key page cannot render\" });\n }\n if (dialect.keyPageStrategy === \"window\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a per-key page (keyPage)\",\n hint: \"the runtime keeps the ROW_NUMBER window on this dialect\",\n });\n }\n const pageRef = (column: ColRef): ColRef => ({ ...column, table: KEY_PAGE_ROWS });\n const projection = select.columns.map((column) => quoteProjection(dialect, pageRef(column)));\n const withKey = (keyRef: (index: number) => ColRef): SqlExpr => {\n const equalities: SqlExpr[] = page.keyColumns.map((column, index) => ({ kind: \"cmpCol\", op: \"eq\", left: column, right: keyRef(index) }));\n const operands = select.where === undefined ? equalities : [...equalities, select.where];\n return operands.length === 1 ? (operands[0] as SqlExpr) : { kind: \"and\", operands };\n };\n const keyPage = (where: SqlExpr, rank: boolean): SelectStatement => ({\n kind: \"select\",\n table: select.table,\n columns: page.identity,\n ...(rank ? { rowNumber: { partitionBy: page.keyColumns, orderBy: order, alias: page.rankAlias } } : {}),\n where,\n orderBy: order,\n ...(select.limit === undefined ? {} : { limit: select.limit }),\n ...(select.offset === undefined ? {} : { offset: select.offset }),\n });\n const rows = renderTable(dialect, { ...select.table, alias: KEY_PAGE_ROWS });\n const keyAlias = select.table.name === KEY_PAGE_KEYS ? `${KEY_PAGE_KEYS}_1` : KEY_PAGE_KEYS;\n const keys = dialect.quoteIdent({ name: keyAlias });\n\n if (dialect.keyPageStrategy === \"lateral\") {\n // One typed array per member, exactly the key-list filter's element types.\n if (keyListBindsUntypedRows({ members: page.members })) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a per-key page over a DateTime key without a declared native type\",\n hint: \"the runtime keeps the ROW_NUMBER window for such keys\",\n });\n }\n const types = page.members.map((member) => postgresKeyListElementType({ dialect, member }));\n const arrays = types.map((type, index) => `${collector.add(page.rows.map((row) => row[index]))}::${type}[]`);\n const names = page.keyColumns.map((_, index) => dialect.quoteIdent({ name: `__vibe_k${index}` }));\n const ids = renderSelect({ dialect, statement: keyPage(withKey((index) => ({ table: keyAlias, name: `__vibe_k${index}` })), true), collector });\n const on = page.identity.map((column) => `${quoteCol(dialect, pageRef(column))} = ${quoteCol(dialect, { table: KEY_PAGE_IDS, name: column.name })}`).join(\" AND \");\n const rank = quoteCol(dialect, { table: KEY_PAGE_IDS, name: page.rankAlias });\n return `SELECT ${[...projection, rank].join(\", \")} FROM unnest(${arrays.join(\", \")}) AS ${keys} (${names.join(\", \")}) CROSS JOIN LATERAL (${ids.text}) AS ${dialect.quoteIdent({ name: KEY_PAGE_IDS })} INNER JOIN ${rows} ON ${on}`;\n }\n\n // inLimit: the rank is re-derived over the fetched page — rendered first,\n // it is text order; plain column terms bind nothing.\n const partition = page.keyColumns.map((column) => quoteCol(dialect, pageRef(column))).join(\", \");\n const rankOrder = order.map((term) => renderOrderTerm({ dialect, term: { ...term, column: pageRef((term as OrderByColumn).column) }, collector })).join(\", \");\n const rank = `ROW_NUMBER() OVER (PARTITION BY ${partition} ORDER BY ${rankOrder}) AS ${dialect.quoteIdent({ name: page.rankAlias })}`;\n const tuples = page.rows.map((row) => `(${collector.addMany(row).join(\", \")})`);\n // SQLite names a VALUES clause's columns column1, column2, … (documented).\n const membership = renderExpr({\n dialect,\n expr: { kind: \"inSelect\", columns: page.identity.map(pageRef), select: keyPage(withKey((index) => ({ table: keyAlias, name: `column${index + 1}` })), false) },\n collector,\n });\n return `SELECT ${[...projection, rank].join(\", \")} FROM (VALUES ${tuples.join(\", \")}) AS ${keys} INNER JOIN ${rows} ON ${membership}`;\n}\n\n// ─── Statement-count pass EPIC 4 (ST-07): key rows ───\n\n/**\n * The derived table of `SelectStatement.fromKeys` (see {@link KeyRows}):\n * `unnest($1::<type>[], …) AS \"<name>\" (\"<column>\", …)` — one typed array per\n * column, bound at the FROM position of the shared parameter sequence.\n *\n * @throws VibeError `VIBE_UNSUPPORTED_CAPABILITY` on a dialect without the\n * typed-array key list (`keyListStrategy` other than `unnest`), for a\n * `DateTime` member without a declared native type, and for a member type\n * the key list does not know.\n */\nfunction renderKeyRows(params: { dialect: SqlDialect; statement: SelectStatement; keys: KeyRows; collector: ParamCollector }): string {\n const { dialect, statement, keys, collector } = params;\n if (statement.fromSelect !== undefined || statement.keyPage !== undefined || statement.fromUnion !== undefined || statement.table.alias !== undefined) {\n throw internalError({ message: \"fromKeys uses table.name as the derived-table alias — fromSelect, keyPage, fromUnion and table.alias must be unset\" });\n }\n // A lock over bound key rows would lock nothing.\n if (statement.rowLock !== undefined) throw internalError({ message: \"a locking read cannot read from key rows\" });\n const arity = keys.columns.length;\n if (arity === 0 || keys.members.length !== arity) {\n throw internalError({ message: `fromKeys has ${keys.members.length} members for ${arity} columns` });\n }\n if (keys.rows.length === 0) throw internalError({ message: \"fromKeys needs at least one key row\" });\n for (const row of keys.rows) {\n if (row.length !== arity) throw internalError({ message: `fromKeys row has ${row.length} values for ${arity} columns` });\n }\n if (dialect.keyListStrategy !== \"unnest\" || keyListBindsUntypedRows({ members: keys.members })) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: dialect.keyListStrategy !== \"unnest\" ? \"a key-rows FROM (fromKeys)\" : \"a key-rows FROM over a DateTime key without a declared native type\",\n hint: \"the runtime keeps the per-relation loads for this write\",\n });\n }\n const types = keys.members.map((member) => postgresKeyListElementType({ dialect, member }));\n const arrays = types.map((type, index) => `${collector.add(keys.rows.map((row) => row[index]))}::${type}[]`);\n const names = keys.columns.map((name) => dialect.quoteIdent({ name }));\n return `unnest(${arrays.join(\", \")}) AS ${dialect.quoteIdent({ name: statement.table.name })} (${names.join(\", \")})`;\n}\n\n// ─── Fix lane Q2 (round 3, DB-07): union page ───\n\n/** Members a {@link SelectStatement.fromUnion} branch may carry; any other is a malformed node. */\nconst UNION_BRANCH_MEMBERS: ReadonlySet<string> = new Set([\"kind\", \"table\", \"columns\", \"where\", \"orderBy\", \"limit\"]);\n\n/**\n * The `UNION ALL` of a union page (`SelectStatement.fromUnion`), each branch\n * in its own derived table `\"__vibe_u<i>\"` — see the field's docs. Branches\n * render (and bind) in order.\n */\nfunction renderUnionPage(params: { dialect: SqlDialect; statement: SelectStatement; collector: ParamCollector }): string {\n const { dialect, statement, collector } = params;\n const branches = statement.fromUnion ?? [];\n if (branches.length < 2) throw internalError({ message: \"fromUnion needs at least two branches\" });\n if (statement.fromSelect !== undefined || statement.keyPage !== undefined || statement.table.alias !== undefined) {\n throw internalError({ message: \"fromUnion uses table.name as the derived-table alias — fromSelect, keyPage and table.alias must be unset\" });\n }\n // A lock over a derived union would not lock the base rows the branches read.\n if (statement.rowLock !== undefined) throw internalError({ message: \"a locking read cannot read from a union page\" });\n const outputNames = (branch: SelectStatement): string => branch.columns.map((column) => column.alias ?? column.name).join(\"\\u0000\");\n const names = outputNames(branches[0] as SelectStatement);\n return branches\n .map((branch, index) => {\n if (branch.columns.length === 0 || Object.keys(branch).some((member) => !UNION_BRANCH_MEMBERS.has(member))) {\n throw internalError({ message: \"a fromUnion branch must be a plain SELECT <columns> FROM <table> [WHERE] [ORDER BY] [LIMIT]\" });\n }\n if (outputNames(branch) !== names) throw internalError({ message: \"fromUnion branches must project the same output names in the same order\" });\n const inner = renderSelect({ dialect, statement: branch, collector });\n return `SELECT * FROM (${inner.text}) AS ${dialect.quoteIdent({ name: `__vibe_u${index}` })}`;\n })\n .join(\" UNION ALL \");\n}\n\ntype JsonFilterExpr = Extract<SqlExpr, { kind: \"jsonFilter\" }>;\n\nfunction jsonStringPattern(params: { expr: JsonFilterExpr }): string {\n const { expr } = params;\n if (typeof expr.value !== \"string\") {\n throw internalError({ message: `json ${expr.op} expects a string operand` });\n }\n if (expr.op === \"string_contains\") return containsPattern({ raw: expr.value });\n if (expr.op === \"string_starts_with\") return startsWithPattern({ raw: expr.value });\n return endsWithPattern({ raw: expr.value });\n}\n\n/** Case-[in]sensitive LIKE over an extracted-text expression, per dialect. */\nfunction renderJsonLike(params: {\n dialect: SqlDialect;\n target: string;\n expr: JsonFilterExpr;\n collector: ParamCollector;\n}): string {\n const { dialect, target, expr, collector } = params;\n const placeholder = collector.add(jsonStringPattern({ expr }));\n let base: string;\n if (expr.insensitive === true) {\n base =\n dialect.insensitiveLike === \"ilike\"\n ? `${target} ILIKE ${placeholder}`\n : `LOWER(${target}) LIKE LOWER(${placeholder})`;\n } else {\n base = `${target} LIKE ${placeholder}`;\n }\n if (dialect.likeEscapeClause !== null) base = `${base}${dialect.likeEscapeClause}`;\n return expr.negate === true ? `NOT (${base})` : base;\n}\n\n/**\n * Member presence as a three-valued predicate: TRUE or FALSE for a present\n * document, NULL for a SQL NULL column, so `NOT` keeps NULL columns out (the\n * rule every other path filter follows).\n */\nfunction renderJsonExists(params: { present: string; column: string; exists: boolean }): string {\n const { present, column, exists } = params;\n return `CASE WHEN ${present} THEN ${exists ? \"TRUE\" : \"FALSE\"} WHEN ${column} IS NOT NULL THEN ${exists ? \"FALSE\" : \"TRUE\"} END`;\n}\n\n/**\n * One JSON path predicate, per dialect strategy. The path is BOUND: a `text[]`\n * parameter on postgres (cast so string-literal array forms work too), a\n * `$.a.b` path string elsewhere. Values bind as JSON text for json/jsonb\n * comparisons and as LIKE patterns for the string ops.\n */\nfunction renderJsonFilter(params: {\n dialect: SqlDialect;\n expr: JsonFilterExpr;\n collector: ParamCollector;\n}): string {\n const { dialect, expr, collector } = params;\n if (!dialect.supportedJsonOps.includes(expr.op)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `the json filter \"${expr.op}\"`,\n hint: `this dialect can express: ${dialect.supportedJsonOps.join(\", \")}`,\n });\n }\n const cmp = expr.negate === true ? \"<>\" : \"=\";\n\n if (dialect.jsonPathMode === \"operators\") {\n const column = quoteCol(dialect, expr.column);\n const pathParam = `${collector.add(expr.path.map(String))}::text[]`;\n // A `json` column (`Json @db.Json`) has no `=`, `<>` or `@>` — postgres\n // defines them for jsonb only (SQLSTATE 42883 `json = jsonb`). The\n // value-comparing ops cast the EXTRACTED value, not the column: the\n // result is jsonb equality and containment, a jsonb column's semantics\n // (json navigation also takes the LAST of duplicate keys), and only the\n // sub-value is converted — ~40% faster than casting the whole document\n // on 20,000 4-KB rows (PostgreSQL 18.6). The string ops read the same\n // jsonb value as text (`#>> '{}'`): json's own `#>>` returns the STORED\n // spelling of a non-string value (`1e2`, `[1, 2]`, both duplicate keys)\n // where a jsonb column reads `100`, `[1, 2]` and the last key. For a\n // string value both forms return the same unescaped text.\n const extracted = expr.storage === \"json\" ? `(${column} #> ${pathParam})::jsonb` : `(${column} #> ${pathParam})`;\n switch (expr.op) {\n case \"exists\": {\n // `#>` reads a key PostgreSQL can parse as an integer (`\"0\"`, ` 1`,\n // `+1`) as an index into an array, so such a step also requires its\n // container to be an object. Presence needs no jsonb cast on a `json`\n // column: json's own `#>` and `json_typeof` give the same answer.\n const typeOf = expr.storage === \"json\" ? \"json_typeof\" : \"jsonb_typeof\";\n const guards = expr.path.flatMap((segment, index) => {\n if (typeof segment !== \"string\" || !/^\\s*[+-]?\\d/.test(segment)) return [];\n const container = index === 0 ? column : `${column} #> ${collector.add(expr.path.slice(0, index).map(String))}::text[]`;\n return [` AND ${typeOf}(${container}) = 'object'`];\n });\n return renderJsonExists({ present: `(${column} #> ${pathParam}) IS NOT NULL${guards.join(\"\")}`, column, exists: expr.value === true });\n }\n case \"equals\":\n return `${extracted} ${cmp} ${collector.add(JSON.stringify(expr.value))}${dialect.jsonParamCast}`;\n case \"string_contains\":\n case \"string_starts_with\":\n case \"string_ends_with\": {\n const target = expr.storage === \"json\" ? `(${extracted} #>> '{}')` : `(${column} #>> ${pathParam})`;\n return renderJsonLike({ dialect, target, expr, collector });\n }\n case \"array_contains\":\n return `${extracted} @> ${collector.add(JSON.stringify(expr.value))}${dialect.jsonParamCast}`;\n case \"array_starts_with\":\n return `${extracted} -> 0 = ${collector.add(JSON.stringify(expr.value))}${dialect.jsonParamCast}`;\n case \"array_ends_with\":\n return `${extracted} -> -1 = ${collector.add(JSON.stringify(expr.value))}${dialect.jsonParamCast}`;\n }\n }\n\n if (dialect.jsonPathMode === \"sqliteExtract\") {\n const column = quoteCol(dialect, expr.column);\n // JSON booleans surface as SQL 0/1, so value equality alone loses type.\n const typeMatches = (type: string, value: unknown): string => {\n if (typeof value === \"number\") return `${type} IN ('integer', 'real')`;\n const tag = typeof value === \"boolean\" ? String(value)\n : value === null ? \"null\" : Array.isArray(value) ? \"array\"\n : typeof value === \"object\" ? \"object\" : \"text\";\n return `${type} = '${tag}'`;\n };\n const compareExtracted = (path: string, value: unknown): string => {\n const type = `json_type(${column}, ${collector.add(path)})`;\n const guard = typeMatches(type, value);\n let base = guard;\n if (value !== null) {\n const target = `json_extract(${column}, ${collector.add(path)})`;\n const bound = typeof value === \"boolean\" ? (value ? 1 : 0) : value;\n const comparison = typeof value === \"object\"\n ? renderSqliteJsonEquality({ dialect, left: target, right: collector.add(JSON.stringify(value)) })\n : `${target} = ${collector.add(bound)}`;\n base = `(${guard} AND ${comparison})`;\n }\n return expr.negate === true ? `NOT (${base})` : base;\n };\n switch (expr.op) {\n case \"exists\":\n return renderJsonExists({ present: `json_type(${column}, ${collector.add(jsonPathString(expr.path))}) IS NOT NULL`, column, exists: expr.value === true });\n case \"equals\":\n return compareExtracted(jsonPathString(expr.path), expr.value);\n case \"string_contains\":\n case \"string_starts_with\":\n case \"string_ends_with\": {\n const target = `json_extract(${column}, ${collector.add(jsonPathString(expr.path))})`;\n return renderJsonLike({ dialect, target, expr, collector });\n }\n case \"array_starts_with\":\n case \"array_ends_with\": {\n // Edge-element access: `$[0]` / `$[#-1]` path elements (sqlite ≥3.31;\n // bun:sqlite bundles far newer) — N6/board #21.\n const edge = expr.op === \"array_starts_with\" ? \"[0]\" : \"[#-1]\";\n return compareExtracted(`${jsonPathString(expr.path)}${edge}`, expr.value);\n }\n case \"array_contains\": {\n // Scalar-needle containment via json_each() EXISTS — one EXISTS per\n // element, ANDed (jsonb `@>` semantics for scalar members). Deep\n // structural containment (object/array members) has no cheap faithful\n // sqlite form and stays refused; JSON null members compare through\n // json_each's 'null' type tag, not SQL NULL, so they are refused too.\n //\n // Haystack type guard (wave-C review): json_each() over a path holding\n // a SCALAR yields one row carrying that scalar, so an unguarded EXISTS\n // matched `{ tags: \"a\" }` against needle `[\"a\"]` where postgres (`@>`\n // with an array needle) and mysql (JSON_CONTAINS against an array\n // literal) are false. json_type() is NULL for a missing path, so\n // missing paths and NULL columns stay non-matches — and an empty\n // needle reduces to the guard alone: contained in every ARRAY (pg's\n // `@> '[]'` truth) and in nothing else.\n const guard = `json_type(${column}, ${collector.add(jsonPathString(expr.path))}) = 'array'`;\n const elements = Array.isArray(expr.value) ? expr.value : [expr.value];\n const tests = elements.map((element) => {\n if (element === null || (typeof element === \"object\" && element !== null)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"json array_contains with object/array/null elements\",\n hint: \"sqlite expresses scalar-element containment only — deep structural containment needs postgres or mysql\",\n });\n }\n const bound = typeof element === \"boolean\" ? (element ? 1 : 0) : element;\n const path = collector.add(jsonPathString(expr.path));\n const type = `${dialect.quoteIdent({ name: \"json_each\" })}.${dialect.quoteIdent({ name: \"type\" })}`;\n return `EXISTS (SELECT 1 FROM json_each(${column}, ${path}) WHERE ${typeMatches(type, element)} AND ${dialect.quoteIdent({ name: \"json_each\" })}.${dialect.quoteIdent({ name: \"value\" })} = ${collector.add(bound)})`;\n });\n return tests.length === 0 ? guard : `(${[guard, ...tests].join(\" AND \")})`;\n }\n default:\n throw internalError({ message: `json op \"${expr.op}\" leaked past supportedJsonOps on sqlite` });\n }\n }\n\n // mysqlExtract\n const column = quoteCol(dialect, expr.column);\n const pathString = jsonPathString(expr.path);\n switch (expr.op) {\n case \"exists\": {\n // NULL for a SQL NULL document, so `NOT` keeps such rows out as it does on the other dialects.\n const present = `JSON_CONTAINS_PATH(${column}, 'one', ${collector.add(pathString)})`;\n return expr.value === true ? present : `NOT ${present}`;\n }\n case \"equals\":\n return `JSON_EXTRACT(${column}, ${collector.add(pathString)}) ${cmp} CAST(${collector.add(JSON.stringify(expr.value))} AS JSON)`;\n case \"string_contains\":\n case \"string_starts_with\":\n case \"string_ends_with\": {\n const target = `JSON_UNQUOTE(JSON_EXTRACT(${column}, ${collector.add(pathString)}))`;\n return renderJsonLike({ dialect, target, expr, collector });\n }\n case \"array_contains\":\n return `JSON_CONTAINS(JSON_EXTRACT(${column}, ${collector.add(pathString)}), CAST(${collector.add(JSON.stringify(expr.value))} AS JSON))`;\n case \"array_starts_with\":\n return `JSON_EXTRACT(${column}, ${collector.add(`${pathString}[0]`)}) ${cmp} CAST(${collector.add(JSON.stringify(expr.value))} AS JSON)`;\n case \"array_ends_with\":\n return `JSON_EXTRACT(${column}, ${collector.add(`${pathString}[last]`)}) ${cmp} CAST(${collector.add(JSON.stringify(expr.value))} AS JSON)`;\n }\n}\n\n// ─── Ordering ─────────────────────────────────────────────────────\n\n/**\n * The output name a groupBy expression key's ORDER BY term reads in its\n * emulated null placement. MySQL's ONLY_FULL_GROUP_BY admits a GROUP BY\n * expression as a whole ORDER BY term, but inside `<expression> IS NULL` it\n * reads the expression's column as ungrouped (ER_WRONG_FIELD_WITH_GROUP);\n * MySQL resolves an output name inside an ORDER BY expression, and a key's\n * output name is never a column of its table (the runtime refuses such an\n * `as`). A truncated key keeps its column's name, so it never qualifies.\n */\nfunction groupKeyOutputName(params: { dialect: SqlDialect; statement: SelectStatement; column: ColRef }): string | undefined {\n const { dialect, statement, column } = params;\n if (column.groupKey === undefined) return undefined;\n const text = quoteCol(dialect, column);\n const projected = statement.columns.find((candidate) =>\n candidate.groupKey !== undefined && candidate.transform === undefined && candidate.alias !== undefined && quoteCol(dialect, candidate) === text);\n return projected?.alias;\n}\n\nfunction renderOrderTerm(params: { dialect: SqlDialect; term: OrderTerm; collector: ParamCollector; nullsOutputName?: string }): string {\n const { dialect, term, collector, nullsOutputName } = params;\n if (\"agg\" in term) {\n return `${renderAggRef(dialect, term.agg, collector)} ${term.direction === \"asc\" ? \"ASC\" : \"DESC\"}`;\n }\n // Relation orderBy: a correlated scalar subquery — its parameters merge into\n // the shared sequence exactly where they appear in the text (twice when the\n // NULL emulation below repeats the subquery).\n const expression = \"select\" in term\n ? (): string => renderScalarSubquery({ dialect, subquery: term, collector })\n : (): string => quoteCol(dialect, term.column);\n const direction = term.direction === \"asc\" ? \"ASC\" : \"DESC\";\n if (term.nulls === undefined) {\n return `${expression()} ${direction}`;\n }\n if (dialect.orderByNullsMode === \"native\") {\n return `${expression()} ${direction} NULLS ${term.nulls === \"first\" ? \"FIRST\" : \"LAST\"}`;\n }\n // Emulation (mysql): the engine's native order already places NULLs FIRST on\n // ASC and LAST on DESC — those pairings render the bare term (the redundant\n // boolean pre-term cost a per-row evaluation and could defeat index-order\n // scans, #14). Only the diverging pairings need the `IS NULL` pre-term:\n // false(0) sorts first, so plain `IS NULL` pushes nulls last and\n // `IS NULL DESC` pulls them first.\n if ((term.nulls === \"first\") === (term.direction === \"asc\")) {\n return `${expression()} ${direction}`;\n }\n const tested = nullsOutputName === undefined ? expression() : dialect.quoteIdent({ name: nullsOutputName });\n const nullsTerm = term.nulls === \"first\" ? `${tested} IS NULL DESC` : `${tested} IS NULL`;\n return `${nullsTerm}, ${expression()} ${direction}`;\n}\n\n// ─── Projections ──────────────────────────────────────────────────\n\nfunction renderSelectExpr(params: { dialect: SqlDialect; expr: SelectExpr }): string {\n const { dialect, expr } = params;\n if (expr.kind === \"one\") return \"1\";\n if (expr.kind === \"exists\") throw internalError({ message: \"an exists projection renders as its whole statement\" });\n const alias = expr.alias === undefined ? \"\" : ` AS ${dialect.quoteIdent({ name: expr.alias })}`;\n return `COUNT(*)${alias}`;\n}\n\n// ─── Lateral JSON joins ───────────────────────────────────\n\n/**\n * `LEFT JOIN LATERAL (… to_json …) AS alias ON true`. Postgres SQL, and MySQL\n * 8.0.14+ through `SqlDialect.lateralJson` (lane J: `JSON_ARRAY` rows,\n * `JSON_ARRAYAGG`, an ordered level's `ROW_NUMBER()` position slot) — the\n * runtime gates the \"join\" strategy on `capabilities.lateralJoin` at build\n * time, and this renderer refuses too (dialect honesty, rule 4).\n *\n * `json`, not `jsonb`: the payload is transport — parsed by the driver and\n * never touched by a JSON operator on the server. `jsonb_agg(to_jsonb(…))`\n * builds postgres's binary JSON (sorted, de-duplicated keys) and then\n * serializes it straight back to text for the wire, which measured at 2–3.7×\n * the server time of `json_agg(to_json(…))` for identical decoded values\n * (`.ai/plans/26.09.08 - performance-join-strategy.md` §1.2). The observable\n * differences are textual only: `json` keeps construction key order and `-0`,\n * `jsonb` normalizes both; every scalar still rides the B3 transforms.\n */\nfunction renderPositionalRow(params: { dialect: SqlDialect; join: LateralJoin; subAlias: string }): string {\n const { dialect, join, subAlias } = params;\n const json = lateralJsonOf({ dialect });\n // Lane J: a `positionSlot` dialect's ordered list level carries its\n // ROW_NUMBER() position as the LAST slot (the runtime sorts by it).\n const position = join.select.rowNumber;\n const positioned = position !== undefined && json.order === \"positionSlot\" && join.agg === \"jsonArray\" &&\n position.partitionBy.length === 0 && position.orderBy.length > 0;\n if (join.select.columns.length === 0 || join.select.selectExpr !== undefined ||\n (join.select.aggregates?.length ?? 0) > 0 || (position !== undefined && !positioned)) {\n throw internalError({ message: \"positional lateral rows require an explicit column-only projection\" });\n }\n const projected = join.select.columns.map((column) => projectionOutputName({ column }));\n const hidden = join.hidden ?? [];\n if (hidden.some((name) => !projected.includes(name)) || hidden.length >= projected.length) {\n throw internalError({ message: \"a hidden lateral column must be one of the projected columns, and one column must remain\" });\n }\n const names = [...projected.filter((name) => !hidden.includes(name)), ...(positioned ? [position.alias] : [])];\n if (new Set(names).size !== names.length) {\n throw internalError({ message: \"positional lateral projection has duplicate output names\" });\n }\n const values = names.map((name) => `${subAlias}.${dialect.quoteIdent({ name })}`);\n const chunks: string[] = [];\n for (let index = 0; index < values.length; index += JSON_TRANSPORT.chunkSize) {\n chunks.push(`${json.rowArray}(${values.slice(index, index + JSON_TRANSPORT.chunkSize).join(\", \")})`);\n }\n if (chunks.length > JSON_TRANSPORT.chunkSize) {\n throw internalError({ message: \"positional lateral projection exceeds the transport width limit\" });\n }\n return chunks.length === 1 ? chunks[0] as string : `${json.rowArray}(${chunks.join(\", \")})`;\n}\n\n/** The dialect's lateral JSON functions; callers already refused a dialect without them. */\nfunction lateralJsonOf(params: { dialect: SqlDialect }): NonNullable<SqlDialect[\"lateralJson\"]> {\n const json = params.dialect.lateralJson;\n if (json === null) throw internalError({ message: \"lateral JSON rendering on a dialect without LATERAL\" });\n return json;\n}\n\nfunction renderLateralJoin(params: {\n dialect: SqlDialect;\n join: LateralJoin;\n collector: ParamCollector;\n}): string {\n const { dialect, join, collector } = params;\n const inner = renderSelect({ dialect, statement: join.select, collector });\n if (join.agg === \"count\") {\n if (join.rowFormat === \"positional\" || join.select.columns.length !== 0 ||\n join.select.selectExpr?.kind !== \"countAll\" || join.select.selectExpr.alias !== join.columnAlias ||\n join.select.groupBy !== undefined || join.select.having !== undefined ||\n join.select.limit !== undefined || join.select.offset !== undefined || join.select.distinctOn !== undefined ||\n join.select.distinct !== undefined) {\n throw internalError({ message: \"count lateral must return one ungrouped COUNT(*) under its column alias\" });\n }\n return `LEFT JOIN LATERAL (${inner.text}) AS ${dialect.quoteIdent({ name: join.alias })} ON true`;\n }\n if (join.agg === \"aggregate\") {\n if (join.rowFormat === \"positional\" || join.select.columns.length !== 0 || join.select.selectExpr !== undefined ||\n (join.select.aggregates?.length ?? 0) === 0 ||\n join.select.groupBy !== undefined || join.select.having !== undefined || join.select.groupingSets !== undefined ||\n join.select.limit !== undefined || join.select.offset !== undefined || join.select.distinctOn !== undefined ||\n join.select.distinct !== undefined || join.select.rowLock !== undefined) {\n throw internalError({ message: \"aggregate lateral must return one ungrouped row of aggregates\" });\n }\n return `LEFT JOIN LATERAL (${inner.text}) AS ${dialect.quoteIdent({ name: join.alias })} ON true`;\n }\n const columnAlias = dialect.quoteIdent({ name: join.columnAlias });\n const subAlias = dialect.quoteIdent({ name: \"__sub\" });\n const json = lateralJsonOf({ dialect });\n // N2 (SQL review): json_agg over a subquery only \"usually\" preserves the\n // subquery's order — pin it with an explicit ORDER BY inside the aggregate\n // (the subquery keeps its own ORDER BY for LIMIT). Only column terms that\n // are PROJECTED (and untransformed — a B3 ::text cast would re-sort\n // lexicographically) can be referenced through `__sub`; anything else keeps\n // the old behavior. A `positionSlot` dialect (MySQL) orders through the\n // position slot instead ({@link renderPositionalRow}).\n let aggOrder = \"\";\n if (json.order === \"inAggregate\" && join.agg === \"jsonArray\" && join.select.orderBy !== undefined && join.select.orderBy.length > 0) {\n const projected = new Set(\n join.select.columns\n .filter((column) => column.transform === undefined && column.castReal !== true)\n .map((column) => column.name)\n .concat((join.select.scalarSubqueries ?? []).map((subquery) => subquery.alias)),\n );\n const terms = join.select.orderBy;\n const columnTerms = terms.filter(\n (term): term is Extract<OrderTerm, { column: ColRef }> => \"column\" in term,\n );\n const subRef = (column: ColRef): ColRef => ({ table: \"__sub\", name: column.name, ...(column.castJsonb === undefined ? {} : { castJsonb: column.castJsonb }) });\n const readable = (column: ColRef): boolean =>\n column.coalesce === undefined ? projected.has(column.name) : column.coalesce.every((member) => projected.has(member.name));\n if (columnTerms.length === terms.length && columnTerms.every((term) => readable(term.column))) {\n const rendered = columnTerms.map((term) =>\n renderOrderTerm({\n dialect,\n term: {\n ...term,\n column: term.column.coalesce === undefined ? subRef(term.column) : { ...term.column, coalesce: term.column.coalesce.map(subRef) },\n },\n collector,\n }),\n );\n aggOrder = ` ORDER BY ${rendered.join(\", \")}`;\n }\n }\n if (join.rowFormat !== \"positional\" && json.order !== \"inAggregate\") {\n // `to_json(\"__sub\".*)` names the columns itself; the runtime always sends\n // positional rows, so object rows stay a postgres construct.\n throw unsupportedCapability({ dialect: dialect.name, feature: \"object-format lateral rows\", hint: \"lateral relation rows render positional (rowFormat \\\"positional\\\") on this dialect\" });\n }\n const rowJson = join.rowFormat === \"positional\"\n ? renderPositionalRow({ dialect, join, subAlias })\n : `to_json(${subAlias}.*)`;\n const projection =\n join.agg === \"jsonArray\"\n ? `COALESCE(${json.arrayAgg}(${rowJson}${aggOrder}), ${json.emptyArray}) AS ${columnAlias}`\n : `${rowJson} AS ${columnAlias}`;\n const alias = dialect.quoteIdent({ name: join.alias });\n return `LEFT JOIN LATERAL (SELECT ${projection} FROM (${inner.text}) AS ${subAlias}) AS ${alias} ON true`;\n}\n\n/**\n * `(SELECT COUNT(*) FROM … WHERE …) AS \"alias\"` — one scalar per output row\n * ({@link CountSubquery}). Refuses anything but one ungrouped COUNT(*), so a\n * builder bug can never project a multi-row or multi-column subquery.\n */\nfunction renderCountSubquery(params: {\n dialect: SqlDialect;\n subquery: CountSubquery;\n collector: ParamCollector;\n}): string {\n const { dialect, subquery, collector } = params;\n const select = subquery.select;\n if (select.columns.length !== 0 || select.selectExpr?.kind !== \"countAll\" ||\n (select.aggregates?.length ?? 0) > 0 || select.rowNumber !== undefined ||\n select.groupBy !== undefined || select.having !== undefined ||\n select.limit !== undefined || select.offset !== undefined ||\n select.distinctOn !== undefined || select.distinct !== undefined || select.rowLock !== undefined ||\n select.countSubqueries !== undefined || select.scalarSubqueries !== undefined) {\n throw internalError({ message: \"count subquery must be one ungrouped COUNT(*)\" });\n }\n const inner = renderSelect({ dialect, statement: select, collector });\n return `(${inner.text}) AS ${dialect.quoteIdent({ name: subquery.alias })}`;\n}\n\n/** Render a scalar value without its projection alias. */\nfunction renderScalarSubquery(params: {\n dialect: SqlDialect;\n subquery: { readonly select: SelectStatement; readonly coalesce?: 0 };\n collector: ParamCollector;\n}): string {\n const { dialect, subquery, collector } = params;\n const value = `(${renderSelect({ dialect, statement: subquery.select, collector }).text})`;\n return subquery.coalesce === 0 ? `COALESCE(${value}, 0)` : value;\n}\n\n// ─── RETURNING ────────────────────────────────────────────────────\n\nfunction applyReturning(params: {\n dialect: SqlDialect;\n requested: readonly ReturningColumn[] | undefined;\n /**\n * The quoted target alias of an `UPDATE … FROM`, whose joined relation may\n * share a column name with the target (PostgreSQL only: SQLite's RETURNING\n * sees the target table alone).\n */\n qualify?: string;\n /** Binds a row-capture cascade column's limit. */\n collector?: ParamCollector;\n /** The written table when the statement gives it no alias: a table named `old` or `new` hides the row names. */\n table?: TableRef;\n}): { suffix: string; status: \"native\" | \"omitted\" | \"none\" } {\n const { dialect, requested } = params;\n if (requested === undefined || requested.length === 0) {\n return { suffix: \"\", status: \"none\" };\n }\n if (!dialect.capabilities.returning) {\n // Dropping a row-capture column with the omitted RETURNING would lose the capture without a word.\n const capture = requested.find(isCaptureReturningColumn);\n if (capture !== undefined) renderCaptureReturning({ dialect, column: capture, collector: params.collector, rows: PLAIN_ROW_NAMES });\n const other = requested.find(isOtherRowReturningColumn);\n if (other !== undefined) renderOtherRowReturning({ dialect, column: other, rows: PLAIN_ROW_NAMES });\n const version = requested.find((column) => typeof column !== \"string\" && \"serverVersion\" in column);\n if (version !== undefined) renderServerVersionReturning({ dialect, alias: returningColumnName(version) });\n return { suffix: \"\", status: \"omitted\" };\n }\n // PostgreSQL 18 resolves `old.` / `new.` to a target table of that name before the row it names, so such a\n // table renames the rows (`RETURNING WITH (OLD AS …)`), or `old.\"col\"` would silently read the new value.\n const hidden = (params.table?.name === \"old\" || params.table?.name === \"new\") &&\n requested.some((column) => isCaptureReturningColumn(column) || (isOtherRowReturningColumn(column) && column.from === \"old\"));\n const rows = hidden ? { old: dialect.quoteIdent({ name: \"__vibe_old\" }), new: dialect.quoteIdent({ name: \"__vibe_new\" }) } : PLAIN_ROW_NAMES;\n const read = (name: string): string => (params.qualify === undefined ? name : `${params.qualify}.${name}`);\n const columns = requested\n .map((column) => {\n if (typeof column === \"string\") return read(dialect.quoteIdent({ name: column }));\n if (\"capture\" in column) return renderCaptureReturning({ dialect, column, collector: params.collector, rows });\n if (\"from\" in column) return renderOtherRowReturning({ dialect, column, rows });\n if (\"serverVersion\" in column) return renderServerVersionReturning({ dialect, alias: column.alias });\n if (\"transform\" in column) {\n const name = dialect.quoteIdent({ name: column.name });\n return `${dialect.jsonTextProjection({ expression: read(name) })} AS ${name}`;\n }\n const name = dialect.quoteIdent({ name: column.name });\n return `${textProjection({ dialect, expression: read(name) })} AS ${name}`;\n })\n .join(\", \");\n const renamed = hidden ? `WITH (OLD AS ${rows.old}, NEW AS ${rows.new}) ` : \"\";\n return { suffix: ` RETURNING ${renamed}${columns}`, status: \"native\" };\n}\n\n/** How RETURNING names the row before and the row after the statement (PostgreSQL 18). */\ntype RowNames = { readonly old: string; readonly new: string };\n\nconst PLAIN_ROW_NAMES: RowNames = Object.freeze({ old: \"old\", new: \"new\" });\n\n/** {@link ServerVersionReturningColumn}: `pg_catalog.current_setting('server_version_num') AS \"alias\"`. */\nfunction renderServerVersionReturning(params: { dialect: SqlDialect; alias: string }): string {\n const { dialect } = params;\n if (!dialect.capabilities.rowCapture) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"RETURNING the server version\", hint: \"only a dialect whose RETURNING can name the row before the write asks for its server version\" });\n }\n return `pg_catalog.current_setting('server_version_num') AS ${dialect.quoteIdent({ name: params.alias })}`;\n}\n\n/**\n * `old.\"col\"::text AS \"alias\"`, `new.\"col\"::text AS \"alias\"` or `(old.\"col\" IS\n * NULL) AS \"alias\"` — see {@link CaptureReturningColumn}. Only a dialect with\n * the `rowCapture` capability names the row before and after the statement\n * in RETURNING; elsewhere the runtime refuses `capture` before it builds one.\n */\nfunction renderCaptureReturning(params: { dialect: SqlDialect; column: CaptureReturningColumn; collector?: ParamCollector | undefined; rows: RowNames }): string {\n const { dialect, column, rows } = params;\n if (!dialect.capabilities.rowCapture) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"row capture (RETURNING old./new.)\", hint: \"row capture needs PostgreSQL 18 or later; the runtime refuses $transaction({ capture }) on this dialect\" });\n }\n const alias = dialect.quoteIdent({ name: column.alias });\n if (column.capture === \"cascade\") {\n if (params.collector === undefined) throw internalError({ message: `capture cascade column \"${column.alias}\" rendered without a parameter collector` });\n const child = dialect.quoteIdent({ name: CAPTURE_CHILD_ALIAS });\n const match = column.cascade.on.map((pair) => `${child}.${dialect.quoteIdent({ name: pair.child })} = ${rows.old}.${dialect.quoteIdent({ name: pair.parent })}`).join(\" AND \");\n return `${renderCascadeImages({ dialect, cascade: column.cascade, match, collector: params.collector })} AS ${alias}`;\n }\n const name = dialect.quoteIdent({ name: column.name });\n if (column.capture === \"inserted\") return `(${rows.old}.${name} IS NULL) AS ${alias}`;\n if (column.capture === \"key\") return `${rows.old}.${name} AS ${alias}`;\n return `${renderCaptureCell({ dialect, row: rows[column.capture], cell: column })} AS ${alias}`;\n}\n\nconst CAPTURE_CHILD_ALIAS = \"__vibe_c\";\nconst CAPTURE_HOP_ALIAS = \"__vibe_h\";\n\n/**\n * One capture cell as text, read from `row` (`old`, `new` or a quoted alias):\n * `row.\"col\"::text`, or through a {@link CaptureCell.hop} the related row's\n * column, `(SELECT \"__vibe_h\".\"col\"::text FROM \"Related\" AS \"__vibe_h\" WHERE\n * \"__vibe_h\".\"id\" = row.\"relatedId\")`.\n */\nfunction renderCaptureCell(params: { dialect: SqlDialect; row: string; cell: CaptureCell }): string {\n const { dialect, row, cell } = params;\n const name = dialect.quoteIdent({ name: cell.name });\n if (cell.hop === undefined) return textProjection({ dialect, expression: `${row}.${name}` });\n if (cell.hop.on.length === 0) throw internalError({ message: `capture hop to \"${cell.hop.table.name}\" needs at least one key column` });\n const related = dialect.quoteIdent({ name: CAPTURE_HOP_ALIAS });\n const match = cell.hop.on.map((pair) => `${related}.${dialect.quoteIdent({ name: pair.target })} = ${row}.${dialect.quoteIdent({ name: pair.source })}`).join(\" AND \");\n return `(SELECT ${textProjection({ dialect, expression: `${related}.${name}` })} FROM ${renderTable(dialect, cell.hop.table)} AS ${related} WHERE ${match})`;\n}\n\n/** A {@link CaptureCascade}'s bounded distinct image aggregate over the child rows `match` admits. */\nfunction renderCascadeImages(params: { dialect: SqlDialect; cascade: CaptureCascade; match: string; collector: ParamCollector }): string {\n const { dialect, cascade, match, collector } = params;\n if (cascade.cells.length === 0 || cascade.on.length === 0) throw internalError({ message: `capture cascade into \"${cascade.table.name}\" needs at least one cell and one key column` });\n if (!Number.isSafeInteger(cascade.limit) || cascade.limit < 1) throw internalError({ message: `capture cascade into \"${cascade.table.name}\" needs a positive integer limit` });\n const child = dialect.quoteIdent({ name: CAPTURE_CHILD_ALIAS });\n const item = dialect.quoteIdent({ name: \"__vibe_i\" });\n const cells = cascade.cells.map((cell) => renderCaptureCell({ dialect, row: child, cell })).join(\", \");\n return `(SELECT array_agg(${item})::text FROM (SELECT DISTINCT ARRAY[${cells}] AS ${item} FROM ${renderTable(dialect, cascade.table)} AS ${child} WHERE ${match} LIMIT ${collector.add(cascade.limit)}) AS ${dialect.quoteIdent({ name: \"__vibe_d\" })})`;\n}\n\n/**\n * `old.\"col\" AS \"alias\"` or `\"source\".\"col\" AS \"alias\"`, projected like the\n * written row's own column — see {@link OtherRowReturningColumn}. Refused\n * where the dialect cannot name that row in RETURNING, so a caller never gets\n * a write whose previous values were silently dropped.\n */\nfunction renderOtherRowReturning(params: { dialect: SqlDialect; column: OtherRowReturningColumn; rows: RowNames }): string {\n const { dialect, column } = params;\n const fromOld = column.from === \"old\";\n if (fromOld ? !dialect.capabilities.rowCapture : !dialect.capabilities.returningReadsJoinedSource) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: fromOld ? \"RETURNING old.… (the row before the write)\" : \"RETURNING a joined source's columns\",\n hint: fromOld ? \"needs PostgreSQL 18 or later\" : \"read the row inside the write's transaction first, then write it\",\n });\n }\n const name = dialect.quoteIdent({ name: column.name });\n const expression = column.from === \"old\" ? `${params.rows.old}.${name}` : `${dialect.quoteIdent({ name: column.from.source })}.${name}`;\n const projected = column.projection === \"castText\" ? textProjection({ dialect, expression })\n : column.projection === \"jsonText\" ? dialect.jsonTextProjection({ expression })\n : expression;\n return `${projected} AS ${dialect.quoteIdent({ name: column.alias })}`;\n}\n\n// ─── SELECT ───────────────────────────────────────────────────────\n\n/**\n * {@link KeyTableJoin}: `INNER JOIN (VALUES ROW(?, 0), …) AS alias (…) ON …`.\n * Mysql only — the one dialect whose default text equality is not byte\n * equality, and the shape was measured there (8.0.19+ `VALUES ROW`, already\n * this project's floor for the upsert row alias). Postgres needs a typed\n * parameter per member, so it renders only `citext` / `text` / `integer`\n * members (`CAST($n AS citext | text | bigint)`, plain `(…)` rows) — the\n * runtime emits it for a key tuple with a citext member; every other postgres\n * member refuses, and sqlite has no derived-table column list, so it refuses\n * rather than render an untested form.\n *\n * Ordinals are literal integers (row `i` → `i`): a statement-local index, not\n * data, so a key costs exactly the parameters its members bind — the same\n * budget as `col IN (?, …)`. Text members bind bare so the column's collation\n * decides; numeric members that travel as strings are CAST (see\n * {@link KeyTableMember}).\n *\n * The runtime emits a key table wherever `conflictKeyEquality.textIsBinaryByDefault`\n * is false (packages/runtime/src/relation-loader.ts, `associatesInDatabase`);\n * this refusal is by NAME, so a new dialect declaring that fact must also be\n * measured and admitted here.\n */\nfunction renderKeyTableJoin(params: { dialect: SqlDialect; join: KeyTableJoin; collector: ParamCollector }): string {\n const { dialect, join, collector } = params;\n // Postgres binds every member typed (an untyped VALUES cell would be\n // `text`, see {@link KeyTableMember}); `citext` and `text` are postgres\n // members, mysql binds text bare.\n const postgresMember = (member: KeyTableMember): boolean => member.kind === \"citext\" || member.kind === \"text\" || member.kind === \"integer\";\n const admitted = dialect.name === \"mysql\"\n ? join.members.every((member) => member.kind !== \"citext\" && member.kind !== \"text\")\n : dialect.name === \"postgres\" && join.members.every(postgresMember);\n if (!admitted) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"relation key table\",\n hint: \"the key-table join is mysql's relation association — this dialect compares relation keys by value\",\n });\n }\n if (join.columns.length === 0 || join.columns.length !== join.members.length) {\n throw internalError({ message: `key table needs one member per column, got ${join.members.length} for ${join.columns.length}` });\n }\n if (join.rows.length === 0) throw internalError({ message: \"key table needs at least one key row\" });\n for (const member of join.members) {\n if (member.kind === \"decimal\" && !(Number.isInteger(member.scale) && member.scale >= 0 && member.scale <= 30)) {\n throw internalError({ message: `key table decimal scale must be an integer 0-30, got ${String(member.scale)}` });\n }\n }\n const alias = dialect.quoteIdent({ name: join.alias });\n const memberNames = join.members.map((_, index) => dialect.quoteIdent({ name: `__vibe_k${index}` }));\n const rows = join.rows.map((row, ordinal) => {\n if (row.length !== join.members.length) {\n throw internalError({ message: `key table row has ${row.length} values for ${join.members.length} members` });\n }\n const cells = row.map((value, index) => {\n const placeholder = collector.add(value);\n const member = join.members[index] as KeyTableMember;\n switch (member.kind) {\n case \"integer\":\n return dialect.name === \"mysql\" ? `CAST(${placeholder} AS SIGNED)` : `CAST(${placeholder} AS bigint)`;\n case \"timestamp\":\n return `CAST(${placeholder} AS DATETIME(6))`;\n case \"time\":\n return `CAST(${placeholder} AS TIME(6))`;\n case \"decimal\":\n return `CAST(${placeholder} AS DECIMAL(65,${member.scale}))`;\n case \"citext\":\n return `CAST(${placeholder} AS citext)`;\n case \"text\":\n return `CAST(${placeholder} AS text)`;\n default:\n return placeholder;\n }\n });\n return dialect.name === \"mysql\" ? `ROW(${cells.join(\", \")}, ${ordinal})` : `(${cells.join(\", \")}, ${ordinal})`;\n });\n const on = join.columns.map((column, index) => `${quoteCol(dialect, column)} = ${alias}.${memberNames[index] as string}`).join(\" AND \");\n return `INNER JOIN (VALUES ${rows.join(\", \")}) AS ${alias} (${[...memberNames, dialect.quoteIdent({ name: join.ordinalAlias })].join(\", \")}) ON ${on}`;\n}\n\n// ─── Fix lane Q2 (D-03): derived-table LEFT JOIN ───\n\n/**\n * {@link LeftJoin}: `LEFT JOIN (<select>) AS \"alias\" ON \"alias\".\"k\" =\n * \"outer\".\"c\" [AND …]`. Portable. Refuses a builder bug: no ON pair, or a\n * derived projection with an unaliased column (the outer scope must see only\n * the reserved aliases, never a name that could make an unqualified outer\n * reference ambiguous). The derived select renders here, so its parameters\n * land in the shared sequence where they appear in the text.\n */\nfunction renderLeftJoin(params: { dialect: SqlDialect; join: LeftJoin; collector: ParamCollector }): string {\n const { dialect, join, collector } = params;\n if (join.on.length === 0) {\n throw internalError({ message: \"left join needs at least one ON pair\" });\n }\n if (join.select.columns.length === 0 || join.select.columns.some((column) => column.alias === undefined)) {\n throw internalError({ message: \"a left join's derived select must alias every projected column\" });\n }\n const inner = renderSelect({ dialect, statement: join.select, collector });\n const on = join.on\n .map((pair) => `${quoteCol(dialect, pair.left)} = ${quoteCol(dialect, pair.right)}`)\n .join(\" AND \");\n return `LEFT JOIN (${inner.text}) AS ${dialect.quoteIdent({ name: join.alias })} ON ${on}`;\n}\n\n/**\n * `SELECT EXISTS (SELECT 1 FROM … WHERE …) AS \"alias\"`: the statement's own\n * FROM and WHERE as the subquery. Anything that would change which rows the\n * subquery sees, or add a column, is a builder bug.\n */\nfunction renderExistsSelect(params: { dialect: SqlDialect; statement: SelectStatement; alias: string; collector: ParamCollector }): RenderedQuery {\n const { dialect, statement, alias, collector } = params;\n const extra =\n statement.columns.length > 0 || (statement.aggregates?.length ?? 0) > 0 || statement.countSubqueries !== undefined ||\n statement.scalarSubqueries !== undefined || statement.rowNumber !== undefined || statement.groupBy !== undefined ||\n statement.groupingSets !== undefined || statement.having !== undefined || statement.orderBy !== undefined ||\n statement.limit !== undefined || statement.offset !== undefined || statement.rowLock !== undefined ||\n statement.distinct !== undefined || statement.distinctOn !== undefined || statement.lateralJoins !== undefined ||\n statement.innerJoins !== undefined || statement.leftJoins !== undefined || statement.keyTable !== undefined;\n if (extra) throw internalError({ message: \"an exists select takes only a FROM and a WHERE\" });\n const inner = renderSelect({ dialect, statement: { ...statement, selectExpr: { kind: \"one\" } }, collector });\n return { ...inner, text: `SELECT EXISTS (${inner.text}) AS ${dialect.quoteIdent({ name: alias })}` };\n}\n\nfunction renderSelect(params: {\n dialect: SqlDialect;\n statement: SelectStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n\n if (statement.selectExpr?.kind === \"exists\") return renderExistsSelect({ dialect, statement, alias: statement.selectExpr.alias, collector });\n if (statement.selectExpr !== undefined && statement.columns.length > 0 && statement.selectExpr.kind !== \"countAll\") {\n throw internalError({ message: \"only countAll can combine with a column list\" });\n }\n if (\n statement.selectExpr !== undefined &&\n statement.aggregates !== undefined &&\n statement.aggregates.length > 0\n ) {\n throw internalError({ message: \"selectExpr and aggregates cannot combine\" });\n }\n const columnList = statement.columns.map((column) => quoteProjection(dialect, column));\n if (statement.selectExpr !== undefined) {\n columnList.push(renderSelectExpr({ dialect, expr: statement.selectExpr }));\n }\n if (statement.aggregates !== undefined) {\n for (const selection of statement.aggregates) {\n const expression = renderAggRef(dialect, selection.agg, collector);\n const projected = selection.castText === true ? textProjection({ dialect, expression }) : expression;\n columnList.push(`${projected} AS ${dialect.quoteIdent({ name: selection.alias })}`);\n }\n }\n const groupKeys = statement.groupBy?.map((column) => quoteCol(dialect, column)) ?? [];\n if (statement.groupingSets !== undefined) {\n columnList.push(`${renderGroupingSetIndex({ keys: groupKeys, grouping: statement.groupingSets })} AS ${dialect.quoteIdent({ name: statement.groupingSets.indexAlias })}`);\n }\n if (statement.countSubqueries !== undefined) {\n for (const subquery of statement.countSubqueries) {\n columnList.push(renderCountSubquery({ dialect, subquery, collector }));\n }\n }\n if (statement.scalarSubqueries !== undefined) {\n for (const subquery of statement.scalarSubqueries) {\n columnList.push(`${renderScalarSubquery({ dialect, subquery, collector })} AS ${dialect.quoteIdent({ name: subquery.alias })}`);\n }\n }\n if (statement.rowNumber !== undefined) {\n const rowNumber = statement.rowNumber;\n // An unpartitioned window numbers the whole select: only the position slot\n // of a lateral list level (`lateralJson.order: \"positionSlot\"`), which\n // always carries the level's order.\n if (rowNumber.partitionBy.length === 0 && rowNumber.orderBy.length === 0) {\n throw internalError({ message: \"rowNumber needs a partition column or an order\" });\n }\n const partition = rowNumber.partitionBy.length === 0 ? \"\" : `PARTITION BY ${rowNumber.partitionBy.map((column) => quoteCol(dialect, column)).join(\", \")}`;\n const order =\n rowNumber.orderBy.length === 0\n ? \"\"\n : `${partition === \"\" ? \"\" : \" \"}ORDER BY ${rowNumber.orderBy.map((term) => renderOrderTerm({ dialect, term, collector })).join(\", \")}`;\n columnList.push(\n `ROW_NUMBER() OVER (${partition}${order}) AS ${dialect.quoteIdent({ name: rowNumber.alias })}`,\n );\n }\n let distinctPrefix = statement.distinct === true ? \"DISTINCT \" : \"\";\n if (statement.distinct === true && statement.distinctOn !== undefined) {\n throw internalError({ message: \"distinct and distinctOn cannot combine\" });\n }\n if (statement.distinctOn !== undefined && statement.distinctOn.length > 0) {\n if (!dialect.capabilities.distinctOn) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"SELECT DISTINCT ON\",\n hint: \"postgres-only — the runtime emulates distinct client-side on this dialect\",\n });\n }\n distinctPrefix = `DISTINCT ON (${statement.distinctOn.map((column) => quoteCol(dialect, typedOrderRef({ statement, column }))).join(\", \")}) `;\n }\n const columns = columnList.length === 0 ? \"*\" : columnList.join(\", \");\n\n let from: string;\n // EPIC 4 (ST-07): key rows render where the table would, under its name.\n if (statement.fromKeys !== undefined) {\n from = renderKeyRows({ dialect, statement, keys: statement.fromKeys, collector });\n } else if (statement.fromUnion !== undefined) {\n // Fix lane Q2 (DB-07): a union page renders where a derived table would.\n from = `(${renderUnionPage({ dialect, statement, collector })}) AS ${dialect.quoteIdent({ name: statement.table.name })}`;\n } else if (statement.keyPage !== undefined) {\n // Fix lane Q1 (DB-01): a per-key page renders where a derived table would.\n if (statement.fromSelect !== undefined || statement.table.alias !== undefined) {\n throw internalError({ message: \"keyPage uses table.name as the derived-table alias — fromSelect and table.alias must be unset\" });\n }\n from = `(${renderKeyPage({ dialect, page: statement.keyPage, collector })}) AS ${dialect.quoteIdent({ name: statement.table.name })}`;\n } else if (statement.fromSelect !== undefined) {\n if (statement.table.alias !== undefined) {\n throw internalError({ message: \"fromSelect uses table.name as the subquery alias — table.alias must be unset\" });\n }\n // The subquery renders before WHERE/ORDER BY, so its parameters land in\n // the shared sequence exactly where they appear in the text.\n const inner = renderSelect({ dialect, statement: statement.fromSelect, collector });\n from = `(${inner.text}) AS ${dialect.quoteIdent({ name: statement.table.name })}`;\n } else {\n from = renderTable(dialect, statement.table);\n }\n let text = `SELECT ${distinctPrefix}${columns} FROM ${from}`;\n\n if (statement.innerJoins !== undefined && statement.innerJoins.length > 0) {\n for (const join of statement.innerJoins) {\n if (join.on.length === 0) {\n throw internalError({ message: \"inner join needs at least one ON pair\" });\n }\n const on = join.on\n .map((pair) => `${quoteCol(dialect, pair.left)} = ${quoteCol(dialect, pair.right)}`)\n .join(\" AND \");\n text += ` INNER JOIN ${renderTable(dialect, join.table)} ON ${on}`;\n }\n }\n if (statement.keyTable !== undefined) {\n text += ` ${renderKeyTableJoin({ dialect, join: statement.keyTable, collector })}`;\n }\n // Fix lane Q2 (D-03): derived-table LEFT JOINs (to-one relation orderBy).\n if (statement.leftJoins !== undefined && statement.leftJoins.length > 0) {\n if (statement.rowLock !== undefined) {\n throw internalError({ message: \"a locking read cannot carry a left join — postgres refuses FOR UPDATE on the nullable side of an outer join\" });\n }\n for (const join of statement.leftJoins) {\n text += ` ${renderLeftJoin({ dialect, join, collector })}`;\n }\n }\n\n if (statement.lateralJoins !== undefined && statement.lateralJoins.length > 0) {\n if (!dialect.capabilities.lateralJoin || dialect.lateralJson === null) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"LATERAL JOIN relation loading\",\n hint: 'use the portable \"query\" relation strategy on this dialect',\n });\n }\n for (const join of statement.lateralJoins) {\n text += ` ${renderLateralJoin({ dialect, join, collector })}`;\n }\n }\n\n if (statement.where !== undefined) {\n text += ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`;\n }\n if (statement.groupBy !== undefined && statement.groupBy.length > 0) {\n text += ` GROUP BY ${statement.groupingSets === undefined ? groupKeys.join(\", \") : renderGroupingSets({ dialect, keys: groupKeys, grouping: statement.groupingSets })}`;\n } else if (statement.groupingSets !== undefined) {\n throw internalError({ message: \"grouping sets need groupBy columns\" });\n }\n if (statement.having !== undefined) {\n text += ` HAVING ${renderExpr({ dialect, expr: statement.having, collector })}`;\n }\n if (statement.orderBy !== undefined && statement.orderBy.length > 0) {\n const terms = statement.orderBy.map((term) => {\n if (!(\"column\" in term)) return renderOrderTerm({ dialect, term, collector });\n const nullsOutputName = term.nulls === undefined || dialect.orderByNullsMode === \"native\" ? undefined : groupKeyOutputName({ dialect, statement, column: term.column });\n return renderOrderTerm({\n dialect,\n term: { ...term, column: typedOrderRef({ statement, column: term.column }) },\n collector,\n ...(nullsOutputName === undefined ? {} : { nullsOutputName }),\n });\n });\n text += ` ORDER BY ${terms.join(\", \")}`;\n }\n\n if (statement.limit !== undefined) {\n assertCount(statement.limit, \"limit\");\n text += ` LIMIT ${statement.limit}`;\n }\n if (statement.offset !== undefined) {\n assertCount(statement.offset, \"offset\");\n if (statement.limit === undefined && dialect.offsetRequiresLimit !== null) {\n text += ` LIMIT ${dialect.offsetRequiresLimit.limitText}`;\n }\n text += ` OFFSET ${statement.offset}`;\n }\n if (statement.rowLock !== undefined) {\n const target = statement.table.alias ?? statement.table.name;\n if (statement.rowLock.of !== undefined && statement.rowLock.of.some((name) => name !== target)) {\n throw internalError({ message: `a row lock's \\`of\\` list may name only the statement's own table \"${target}\"` });\n }\n if (statement.rowLock.of !== undefined && (statement.fromSelect !== undefined || statement.keyPage !== undefined)) {\n throw internalError({ message: \"a row lock's `of` list cannot name a derived table\" });\n }\n const clause = renderRowLockClause({ dialect, lock: statement.rowLock });\n if (clause !== null) text += ` ${clause}`;\n }\n\n return { text, values: collector.values, returning: \"none\" };\n}\n\n// ─── INSERT (incl. upsert) ────────────────────────────────────────\n\n/** The unnest source's relation alias and its ordinality column (`InsertStatement.unnest`). */\nconst UNNEST_ROWS_ALIAS = \"__vibe_rows\";\nconst UNNEST_ORDINALITY = \"ord\";\n\n/**\n * One cell of an unnest insert, as its array element: a plain value, SQL NULL,\n * or a Json cell's text (the column's storage must match). `DEFAULT`, the\n * database clock and any other object are refused — the builder keeps VALUES\n * for them, so reaching here is a builder defect.\n */\nfunction unnestElement(params: { value: unknown; column: string; jsonStorage: \"json\" | \"jsonb\" | undefined }): unknown {\n const { value, column, jsonStorage } = params;\n if (value === null || value === undefined) return null;\n if (isJsonParamCell(value)) {\n if (jsonStorage === undefined || (value.storage ?? \"jsonb\") !== jsonStorage) {\n throw internalError({ message: `unnest insert column \"${column}\" got a Json cell its declared type does not take` });\n }\n return value.text;\n }\n if (jsonStorage === undefined) {\n switch (typeof value) {\n case \"string\":\n case \"number\":\n case \"boolean\":\n case \"bigint\":\n return value;\n case \"object\":\n if (value instanceof Date || value instanceof Uint8Array) return value;\n }\n }\n throw internalError({ message: `unnest insert column \"${column}\" got a cell that is not a plain value (DEFAULT, the database clock, a document) — such rows keep VALUES` });\n}\n\n/**\n * `SELECT \"c1\", … FROM unnest($1::<type>[], …) WITH ORDINALITY AS\n * \"__vibe_rows\" (\"c1\", …, \"ord\") ORDER BY \"ord\"` — the source of an\n * {@link InsertStatement} carrying `unnest`. Collects ONE array per column, in\n * column order: the rows transposed, Json cells reduced to their text. The\n * aliases are positional, so no column name can collide with the ordinality\n * column; `ORDER BY \"ord\"` makes the insert consume rows in input order\n * (PostgreSQL promises no order without it).\n */\nfunction renderUnnestRows(params: {\n dialect: SqlDialect;\n statement: InsertStatement;\n members: readonly KeyListMember[];\n collector: ParamCollector;\n}): string {\n const { dialect, statement, members, collector } = params;\n if (dialect.bulkInsertForm !== \"unnest\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a bulk insert bound as typed arrays (INSERT … SELECT FROM unnest)\",\n hint: \"this dialect binds createMany rows as VALUES\",\n });\n }\n if (statement.columns.length === 0) throw internalError({ message: \"an unnest insert needs at least one column\" });\n if (members.length !== statement.columns.length) {\n throw internalError({ message: `unnest insert has ${members.length} column types for ${statement.columns.length} columns` });\n }\n if (statement.onConflict !== undefined && !(\"doNothing\" in statement.onConflict)) {\n throw internalError({ message: \"an unnest insert takes no DO UPDATE arm — upserts bind VALUES\" });\n }\n const aliases = statement.columns.map((_column, index) => dialect.quoteIdent({ name: `c${index + 1}` }));\n const arrays = members.map((member, index) => {\n const cast = postgresBulkInsertArrayCast({ dialect, member });\n const jsonStorage = member.type !== \"Json\" ? undefined : cast === \"text::json\" ? \"json\" : \"jsonb\";\n const column = statement.columns[index] as string;\n const values = statement.rows.map((row) => unnestElement({ value: row[index], column, jsonStorage }));\n return `${collector.add(values)}::${cast}[]`;\n });\n const ord = dialect.quoteIdent({ name: UNNEST_ORDINALITY });\n return `SELECT ${aliases.join(\", \")} FROM unnest(${arrays.join(\", \")}) WITH ORDINALITY AS ${dialect.quoteIdent({ name: UNNEST_ROWS_ALIAS })} (${aliases.join(\", \")}, ${ord}) ORDER BY ${ord}`;\n}\n\nfunction renderInsert(params: {\n dialect: SqlDialect;\n statement: InsertStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n\n if (statement.rows.length === 0) {\n throw internalError({ message: \"insert requires at least one row\" });\n }\n // No column named: every value is its column default (dialect.emptyInsert).\n const defaultValues = statement.columns.length === 0 && dialect.emptyInsert.form === \"defaultValues\";\n if (defaultValues && statement.rows.length !== 1) {\n throw internalError({ message: `${dialect.name} inserts an all-default row as DEFAULT VALUES, one row per statement` });\n }\n if (defaultValues && statement.onConflict !== undefined && !(dialect.emptyInsert.form === \"defaultValues\" && dialect.emptyInsert.conflictClause)) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a conflict clause on an all-default row (DEFAULT VALUES)\",\n hint: \"supply at least one column value, or drop the conflict clause\",\n });\n }\n for (const row of statement.rows) {\n if (row.length !== statement.columns.length) {\n throw internalError({\n message: `insert row has ${row.length} values but ${statement.columns.length} columns`,\n });\n }\n }\n\n const onConflict = statement.onConflict;\n const insertKeyword = \"INSERT INTO\";\n\n const columnList = statement.columns.map((name) => dialect.quoteIdent({ name })).join(\", \");\n // EPIC C: rows bound as one typed array per column (`InsertStatement.unnest`).\n const unnestSource = statement.unnest === undefined ? undefined : renderUnnestRows({ dialect, statement, members: statement.unnest, collector });\n const rowsSql = unnestSource !== undefined ? \"\" : statement.rows\n .map(\n (row) =>\n `(${row\n .map((value) => {\n // Json cell: the param's type is pinned (`$n::text::jsonb` on\n // postgres) so OID-typed drivers cannot double-encode the document.\n if (isJsonParamCell(value)) return `${collector.add(value.text)}${jsonCellCast(dialect, value)}`;\n // Database-clock cell: the dialect's now() expression.\n if (isDbNowMarker(value)) {\n return dialect.renderDbNow({ offsetSeconds: value.offsetSeconds, collector });\n }\n if (!isSqlDefaultCell(value)) return collector.add(value);\n // M4: a heterogeneous createMany cell defers to the COLUMN default.\n if (!dialect.rowDefaultKeyword) {\n throw internalError({\n message: `${dialect.name} cannot render a per-row DEFAULT cell — rows must be grouped by column set`,\n });\n }\n return \"DEFAULT\";\n })\n .join(\", \")})`,\n )\n .join(\", \");\n let text = defaultValues\n ? `${insertKeyword} ${renderTable(dialect, statement.table)} DEFAULT VALUES`\n : `${insertKeyword} ${renderTable(dialect, statement.table)} (${columnList}) ${unnestSource ?? `VALUES ${rowsSql}`}`;\n\n // Mysql can only name the incoming row through a ROW ALIAS declared right\n // after the VALUES list; postgres/sqlite have the built-in `excluded`\n // pseudo-relation and need nothing. Emitted only when the update arm\n // actually references the incoming row.\n if (\n onConflict !== undefined &&\n !(\"doNothing\" in onConflict) &&\n dialect.excludedRowRef.form === \"rowAlias\" &&\n Object.values(onConflict.update).some((value) => isExcludedRef(value) || (isSqlFragment(value) && sqlUsesIncoming({ fragment: value })))\n ) {\n text += ` AS ${dialect.quoteIdent({ name: dialect.excludedRowRef.alias })}`;\n }\n\n if (onConflict !== undefined) {\n if (\"doNothing\" in onConflict) {\n if (dialect.doNothingForm === \"onConflictDoNothing\") {\n let target = \"\";\n if (onConflict.constraint !== undefined) {\n if (dialect.name !== \"postgres\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a named-constraint conflict target (ON CONFLICT ON CONSTRAINT)\",\n hint: \"only postgres names constraints in conflict targets — use a column-list target\",\n });\n }\n target = ` ON CONSTRAINT ${dialect.quoteIdent({ name: onConflict.constraint })}`;\n } else if (onConflict.columns !== undefined && onConflict.columns.length > 0) {\n target = ` (${onConflict.columns.map((name) => dialect.quoteIdent({ name })).join(\", \")})`;\n if (onConflict.conflictWhere !== undefined) {\n // RAW predicate — the engines match it against the index's own\n // predicate structurally; parameters could never match (ast.ts).\n target += ` WHERE ${onConflict.conflictWhere}`;\n }\n }\n text += ` ON CONFLICT${target} DO NOTHING`;\n } else {\n // `duplicateKeyKeep` fires on ANY duplicate key. A bare column target\n // degrades to that documented wider skip; a REFINED target (named\n // constraint, partial-index predicate) must not silently widen —\n // the builder gates first, the renderer defends.\n if (onConflict.constraint !== undefined || onConflict.conflictWhere !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a refined conflict target (constraint / partial-index predicate) on ON DUPLICATE KEY UPDATE\",\n hint: \"mysql skips on any duplicate key — drop the refinement or gate the call per dialect\",\n });\n }\n // A self-assignment: a duplicate changes nothing, every other error\n // (NOT NULL, range, foreign key) stays an error — never INSERT IGNORE.\n const keepName = onConflict.keepColumn ?? statement.columns[0];\n if (keepName === undefined) {\n throw internalError({ message: \"a skip-duplicates insert of an all-default row must name its keepColumn\" });\n }\n const keep = dialect.quoteIdent({ name: keepName });\n const current = `${dialect.quoteIdent({ name: statement.table.name })}.${keep}`;\n const flag = onConflict.duplicateFlag;\n if (flag !== undefined && !/^\\d{1,20}$/.test(flag)) {\n throw internalError({ message: `duplicateFlag must be a decimal literal, got ${JSON.stringify(flag)}` });\n }\n // The flag form reports a skipped duplicate through the insert id\n // (`LAST_INSERT_ID(S)` runs only on the duplicate arm).\n text += flag === undefined\n ? ` ON DUPLICATE KEY UPDATE ${keep} = ${current}`\n : ` ON DUPLICATE KEY UPDATE ${keep} = IF(LAST_INSERT_ID(${flag}), ${current}, ${current})`;\n }\n } else {\n const updates = Object.entries(onConflict.update);\n if (updates.length === 0) {\n throw internalError({ message: \"upsert update must set at least one column\" });\n }\n // The update arm's self-references MUST be table-qualified: inside\n // `ON CONFLICT … DO UPDATE SET`, postgres has BOTH the target row and\n // the `excluded` pseudo-relation in scope, so a bare `\"views\" + $n`\n // is rejected as ambiguous (SQLSTATE 42702). Sqlite and mysql accept\n // the qualified form with identical semantics (the pre-update row), so\n // one rule covers every dialect instead of a per-dialect divergence.\n const selfRef = dialect.quoteIdent({ name: statement.table.name });\n if (onConflict.skipUnchanged !== undefined && !dialect.capabilities.upsertSkipUnchanged) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"skipUnchanged on an upsert's update arm\", hint: \"drop skipUnchanged on this dialect\" });\n }\n if (onConflict.rowPolicy !== undefined && !dialect.capabilities.nativeRowLevelSecurity) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"nativeRowLevelSecurity\", hint: \"a conflict arm's row policy is a native row-security predicate\" });\n }\n const assignments = dialect.upsertForm !== \"onConflict\" && onConflict.skipUnchanged !== undefined\n ? renderStampFirstAssignments({ dialect, columns: onConflict.skipUnchanged, update: onConflict.update, collector, selfRef, tableName: statement.table.name })\n : renderAssignments({ dialect, entries: updates, collector, selfRef, allowExcluded: true, tableName: statement.table.name });\n if (dialect.upsertForm === \"onConflict\") {\n if (onConflict.lastInsertIdColumn !== undefined) {\n throw internalError({ message: \"lastInsertIdColumn is a mysql (onDuplicateKey) construct\" });\n }\n if (onConflict.constraint !== undefined && dialect.name !== \"postgres\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a named-constraint conflict target (ON CONFLICT ON CONSTRAINT)\",\n hint: \"sqlite conflict targets are column lists — name the indexed columns instead\",\n });\n }\n if (onConflict.constraint !== undefined && onConflict.conflictWhere !== undefined) {\n throw internalError({\n message: \"a named-constraint conflict target already identifies the index — it cannot carry a partial predicate too\",\n });\n }\n // RAW predicate — matched structurally against the partial index's own\n // stored predicate, exactly like the DO NOTHING form (ast.ts).\n const partial = onConflict.conflictWhere === undefined ? \"\" : ` WHERE ${onConflict.conflictWhere}`;\n const target =\n onConflict.constraint !== undefined\n ? ` ON CONSTRAINT ${dialect.quoteIdent({ name: onConflict.constraint })}`\n : ` (${onConflict.columns.map((name) => dialect.quoteIdent({ name })).join(\", \")})${partial}`;\n text += ` ON CONFLICT${target} DO UPDATE SET ${assignments}`;\n const unchanged = onConflict.skipUnchanged === undefined\n ? undefined\n : renderUnchangedGuard({ dialect, columns: onConflict.skipUnchanged, update: onConflict.update, collector, selfRef, tableName: statement.table.name });\n if (unchanged !== undefined || onConflict.updateWhere !== undefined) {\n if (!dialect.capabilities.conflictUpdateWhere) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a guarded conflict update (ON CONFLICT … DO UPDATE … WHERE)\",\n hint: \"run the guarded upsert as a find-then-write in a transaction instead\",\n });\n }\n const condition = onConflict.updateWhere === undefined ? undefined : renderExpr({ dialect, expr: onConflict.updateWhere, collector });\n const guard = unchanged === undefined ? condition : condition === undefined ? unchanged : `${unchanged} AND (${condition})`;\n // The guard reads the stored row before row security checks it: a row the policy hides skips nothing.\n text += onConflict.rowPolicy === undefined ? ` WHERE ${guard}` : ` WHERE (${onConflict.rowPolicy}) IS NOT TRUE OR (${guard})`;\n }\n } else {\n if (onConflict.updateWhere !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a guarded conflict update (ON DUPLICATE KEY UPDATE has no WHERE)\",\n hint: \"run the guarded upsert as a find-then-write in a transaction instead — the runtime does this when the dialect lacks conflictUpdateWhere\",\n });\n }\n if (onConflict.constraint !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a named-constraint conflict target on ON DUPLICATE KEY UPDATE\",\n hint: \"mysql's ODKU fires on any duplicate key — no target can be named\",\n });\n }\n if (onConflict.conflictWhere !== undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a partial-index conflict target on ON DUPLICATE KEY UPDATE\",\n hint: \"mysql's ODKU fires on any duplicate key — a partial arbiter cannot be selected; gate the call per dialect\",\n });\n }\n // B2: the update arm must record WHICH row it addressed — without this,\n // LAST_INSERT_ID() is stale after ODKU takes the update arm and the\n // read-back can resolve an unrelated row.\n const trick =\n onConflict.lastInsertIdColumn === undefined\n ? \"\"\n : `, ${dialect.quoteIdent({ name: onConflict.lastInsertIdColumn })} = LAST_INSERT_ID(${dialect.quoteIdent({ name: onConflict.lastInsertIdColumn })})`;\n const flagged = onConflict.duplicateFlag;\n if (flagged !== undefined && (onConflict.lastInsertIdColumn !== undefined || !/^\\d{1,20}$/.test(flagged.flag))) {\n throw internalError({ message: \"an update arm's duplicate flag must be a decimal literal, and cannot share LAST_INSERT_ID with lastInsertIdColumn\" });\n }\n const flag = flagged === undefined\n ? \"\"\n : `, ${dialect.quoteIdent({ name: flagged.column })} = IF(LAST_INSERT_ID(${flagged.flag}), ${selfRef}.${dialect.quoteIdent({ name: flagged.column })}, ${selfRef}.${dialect.quoteIdent({ name: flagged.column })})`;\n text += ` ON DUPLICATE KEY UPDATE ${assignments}${trick}${flag}`;\n }\n }\n }\n\n const returning = applyReturning({ dialect, requested: statement.returning, collector, table: statement.table });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n}\n\n// ─── UPDATE ───────────────────────────────────────────────────────\n\nfunction renderUpdate(params: {\n dialect: SqlDialect;\n statement: UpdateStatement;\n collector: ParamCollector;\n /** Chain steps defined before this one (a chain step only): a set value may read them. */\n earlier?: ReadonlySet<string>;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n\n const assignments = Object.entries(statement.set);\n if (assignments.length === 0) {\n throw internalError({ message: \"update must set at least one column\" });\n }\n const source = statement.from;\n if (source !== undefined) {\n if (statement.alias === undefined || statement.alias === source.alias) throw internalError({ message: \"UPDATE … FROM needs distinct target and source aliases\" });\n const target = dialect.quoteIdent({ name: statement.alias });\n const joined = dialect.quoteIdent({ name: source.alias });\n const assign = (): string => renderAssignments({ dialect, entries: assignments, collector, selfRef: target, source: joined, ...(dialect.name === \"mysql\" ? { qualifyWrite: target } : {}), ...(params.earlier === undefined ? {} : { steps: params.earlier }) });\n const where = (): string => statement.where === undefined ? \"\" : ` AND ${renderExpr({ dialect, expr: statement.where, collector })}`;\n if (\"select\" in source) {\n // A FROM subquery reading the target table is the previous-row read of\n // `update({ previous })`; only PostgreSQL's RETURNING can read it back.\n if (!dialect.capabilities.returningReadsJoinedSource) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"UPDATE … FROM (SELECT …) with RETURNING of the joined source\", hint: \"read the row inside the write's transaction first, then write it\" });\n }\n // Placeholders bind in text order: SET, the subquery, then the outer WHERE.\n const set = assign();\n const joinedSelect = renderSelect({ dialect, statement: source.select, collector }).text;\n const text = `UPDATE ${renderTable(dialect, statement.table)} AS ${target} SET ${set} FROM (${joinedSelect}) AS ${joined} WHERE ${renderExpr({ dialect, expr: source.on, collector })}${where()}`;\n const returning = applyReturning({ dialect, requested: statement.returning, qualify: target });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n }\n // Placeholders bind in text order: MySQL's ON precedes SET.\n const text = dialect.name === \"mysql\"\n ? `UPDATE ${renderTable(dialect, statement.table)} AS ${target} JOIN ${renderTable(dialect, source.table)} AS ${joined} ON ${renderExpr({ dialect, expr: source.on, collector })} SET ${assign()}${statement.where === undefined ? \"\" : ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`}`\n : `UPDATE ${renderTable(dialect, statement.table)} AS ${target} SET ${assign()} FROM ${renderTable(dialect, source.table)} AS ${joined} WHERE ${renderExpr({ dialect, expr: source.on, collector })}${where()}`;\n const returning = applyReturning({ dialect, requested: statement.returning, collector, ...(dialect.name === \"postgres\" ? { qualify: target } : {}) });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n }\n const setSql = renderAssignments({ dialect, entries: assignments, collector, ...(params.earlier === undefined ? {} : { steps: params.earlier }) });\n let text = `UPDATE ${renderTable(dialect, statement.table)} SET ${setSql}`;\n\n if (statement.where !== undefined) {\n text += ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`;\n }\n\n const returning = applyReturning({ dialect, requested: statement.returning, collector, table: statement.table });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n}\n\n// ─── Assignments (SET / DO UPDATE SET) ────────────────────────────\n\n/**\n * `SET` assignments, shared by UPDATE and the upsert update arm.\n *\n * `selfRef` (the quoted target table) qualifies the READ side of an operation\n * that reads the column it writes — required inside `ON CONFLICT DO UPDATE`,\n * where a bare reference is ambiguous with `excluded` on postgres. The write\n * side is never qualified: `SET \"t\".\"col\" = …` is a syntax error everywhere.\n * A plain UPDATE passes no `selfRef` — it has no second relation in scope.\n */\n/**\n * The incoming row's column, qualified for this dialect: `excluded.\"col\"`\n * (postgres/sqlite) or `` `new`.`col` `` (mysql's row alias, declared after the\n * VALUES list by {@link renderInsert}).\n */\nfunction renderIncomingRowColumn(params: { dialect: SqlDialect; column: string }): string {\n const { dialect, column } = params;\n const ref = dialect.excludedRowRef;\n const qualifier = ref.form === \"keyword\" ? ref.name : dialect.quoteIdent({ name: ref.alias });\n return `${qualifier}.${dialect.quoteIdent({ name: column })}`;\n}\n\ntype AssignmentContext = {\n dialect: SqlDialect;\n collector: ParamCollector;\n selfRef?: string;\n /** Only an upsert's update arm has an incoming row to reference. */\n allowExcluded?: boolean;\n tableName?: string;\n /** Lane C3: earlier chain steps a {@link StepColumnRef} value may read (a chain UPDATE step only). */\n steps?: ReadonlySet<string>;\n /** `UPDATE … FROM`: the quoted alias a {@link SourceColumnRef} value reads. */\n source?: string;\n /** MySQL's `UPDATE … JOIN` qualifies the written column with the target alias. */\n qualifyWrite?: string;\n};\n\nfunction renderAssignments(params: AssignmentContext & { entries: readonly (readonly [string, unknown])[] }): string {\n const { dialect, entries } = params;\n return entries\n .map(([name, value]) => `${dialect.quoteIdent({ name })} = ${renderAssignmentValue({ ...params, name, value })}`)\n .map((assignment) => (params.qualifyWrite === undefined ? assignment : `${params.qualifyWrite}.${assignment}`))\n .join(\", \");\n}\n\n/**\n * The skip-unchanged member of a conflict arm's WHERE: the stored row's\n * compared columns differ from the values the assignments write. Each value\n * renders again through the assignment renderer, so a bound value binds once\n * more; `excluded` references bind nothing.\n *\n * \"Unchanged\" means the stored value would not change. Where the column's own\n * equality is coarser, both sides compare as text instead: PostgreSQL text in\n * the \"C\" collation (a `citext` or nondeterministic-collation column), the\n * text of a bare `numeric` (`1.50` is not `1.5`), MySQL's `CAST(… AS BINARY)`;\n * a bound Json value is converted to MySQL's own document text first.\n */\nfunction renderUnchangedGuard(params: {\n dialect: SqlDialect;\n columns: readonly UnchangedColumn[];\n update: Readonly<Record<string, unknown>>;\n collector: ParamCollector;\n selfRef: string;\n tableName: string;\n}): string {\n const { dialect, columns, update, collector, selfRef, tableName } = params;\n if (columns.length === 0) throw internalError({ message: \"a skip-unchanged guard needs at least one compared column\" });\n const left: string[] = [];\n const right: string[] = [];\n for (const entry of columns) {\n if (!Object.hasOwn(update, entry.column)) {\n throw internalError({ message: `the skip-unchanged column ${entry.column} has no assignment in the update arm` });\n }\n const assigned = update[entry.column];\n const value = renderAssignmentValue({ dialect, collector, selfRef, allowExcluded: true, tableName, name: entry.column, value: assigned });\n const stored = `${selfRef}.${dialect.quoteIdent({ name: entry.column })}`;\n if (dialect.name === \"mysql\" && entry.bytes !== undefined && entry.bytes !== \"decimal\") {\n left.push(`CAST(${stored} AS BINARY)`);\n // A bound Json value is the caller's JSON text; the stored side is MySQL's normalized document text.\n right.push(entry.json !== undefined && !isExcludedRef(assigned) ? `CAST(CAST(${value} AS JSON) AS BINARY)` : `CAST(${value} AS BINARY)`);\n continue;\n }\n if (dialect.name === \"postgres\" && entry.folds === true) {\n const text = entry.list === true ? \"text[]\" : \"text\";\n left.push(`${stored}::${text} COLLATE \"C\"`);\n right.push(`(${value})::${text} COLLATE \"C\"`);\n continue;\n }\n if (dialect.name === \"postgres\" && entry.bytes === \"decimal\") {\n left.push(`${stored}::text`);\n right.push(`((${value})::numeric${entry.list === true ? \"[]\" : \"\"})::text`);\n continue;\n }\n const cast = dialect.name === \"postgres\" && entry.json !== undefined ? `::jsonb${entry.json === \"list\" ? \"[]\" : \"\"}` : \"\";\n left.push(`${stored}${cast}`);\n right.push(cast === \"\" ? value : `(${value})${cast}`);\n }\n return dialect.renderRowsDiffer({ left, right });\n}\n\n/**\n * A skip-unchanged update arm where the conflict clause has no WHERE (MySQL's\n * ON DUPLICATE KEY UPDATE): each column the comparison leaves out (the\n * `@updatedAt` stamps) is assigned FIRST, as `IF(<stored row differs>, <new\n * value>, <stored value>)`, then the compared columns as usual. MySQL runs the\n * assignments left to right, so the comparison reads the stored row; a row\n * whose assignments then change nothing is not written at all. Placeholders\n * bind in text order: each stamp's comparison values, its own value, then the\n * remaining assignments.\n */\nfunction renderStampFirstAssignments(params: {\n dialect: SqlDialect;\n columns: readonly UnchangedColumn[];\n update: Readonly<Record<string, unknown>>;\n collector: ParamCollector;\n selfRef: string;\n tableName: string;\n}): string {\n const { dialect, columns, update, collector, selfRef, tableName } = params;\n const compared = new Set(columns.map((entry) => entry.column));\n const context = { dialect, collector, selfRef, allowExcluded: true, tableName };\n const stamps = Object.entries(update).filter(([name]) => !compared.has(name));\n const rest = Object.entries(update).filter(([name]) => compared.has(name));\n const first = stamps.map(([name, value]) => {\n const differs = renderUnchangedGuard({ ...params });\n const column = dialect.quoteIdent({ name });\n return `${column} = IF(${differs}, ${renderAssignmentValue({ ...context, name, value })}, ${selfRef}.${column})`;\n });\n return [...first, ...(rest.length === 0 ? [] : [renderAssignments({ ...context, entries: rest })])].join(\", \");\n}\n\n/** The value expression one SET assignment writes into column `name`. */\nfunction renderAssignmentValue(params: AssignmentContext & { name: string; value: unknown }): string {\n const { dialect, collector, selfRef, name, value } = params;\n const column = dialect.quoteIdent({ name });\n const read = selfRef === undefined ? column : `${selfRef}.${column}`;\n if (isSourceColumnRef(value)) {\n if (params.source === undefined) throw internalError({ message: `an UPDATE set value reads the joined source's column ${value.column}, but the statement joins no source` });\n return `${params.source}.${dialect.quoteIdent({ name: value.column })}`;\n }\n // Lane C3: the value of an earlier step's one row — a scalar subquery,\n // whose own scope resolves the column (no clash with the target's).\n if (isStepColumnRef(value)) {\n if (params.steps === undefined || !params.steps.has(value.step)) {\n throw internalError({ message: `an UPDATE set value reads step \"${value.step}\", which is not an earlier chain step` });\n }\n return `(SELECT ${dialect.quoteIdent({ name: value.column })} FROM ${dialect.quoteIdent({ name: value.step })})`;\n }\n // The INCOMING row's value for this column — a column reference, so a\n // batched upsert writes each conflicting row's own value while binding\n // it exactly once (in the VALUES list).\n if (isSqlFragment(value)) {\n if (params.allowExcluded !== true || selfRef === undefined) throw internalError({ message: \"SQL assignment fragments require a conflict update\" });\n return renderSqlFragment({ dialect, fragment: value, collector, conflict: { table: params.tableName! } });\n }\n if (isExcludedRef(value)) {\n if (params.allowExcluded !== true) {\n throw internalError({\n message: `an incoming-row reference (${value.column}) is only meaningful inside an upsert's update arm`,\n });\n }\n return renderIncomingRowColumn({ dialect, column: value.column });\n }\n // V8: the column keeps its current value — a conflict update arm only.\n if (isSqlKeepCell(value)) {\n if (params.allowExcluded !== true || selfRef === undefined) throw internalError({ message: \"a keep-column cell is only meaningful inside an upsert's update arm\" });\n return read;\n }\n if (isJsonPatchOperation(value)) {\n return renderJsonPatch({ dialect, patch: value, read, collector });\n }\n // Json cell: same param-type pinning as the VALUES cells above.\n if (isJsonParamCell(value)) {\n return `${collector.add(value.text)}${jsonCellCast(dialect, value)}`;\n }\n if (isSetOperation(value)) {\n const operand = collector.add(value.value);\n const numeric = dialect.name === \"sqlite\" && value.numericType === \"Decimal\" ? `CAST(${operand} AS REAL)` : operand;\n return `${read} ${SET_OPERATION_SQL[value.__op]} ${numeric}`;\n }\n if (isDbNowMarker(value)) {\n return dialect.renderDbNow({ offsetSeconds: value.offsetSeconds, collector });\n }\n if (isListSetOperation(value)) {\n assertScalarArrays(dialect, 'the scalar-list update operation \"push\"');\n if (value.__listOp === \"append\") {\n return `array_append(${read}, ${collector.add(value.value)})`;\n }\n return `${read} || ${collector.add(value.value)}`;\n }\n return collector.add(value);\n}\n\n// ─── DELETE ───────────────────────────────────────────────────────\n\nfunction renderDelete(params: {\n dialect: SqlDialect;\n statement: DeleteStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n\n let text = `DELETE FROM ${renderTable(dialect, statement.table)}`;\n if (statement.where !== undefined) {\n text += ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`;\n }\n\n const returning = applyReturning({ dialect, requested: statement.returning, collector, table: statement.table });\n return { text: text + returning.suffix, values: collector.values, returning: returning.status };\n}\n\n// ─── Statement chains (WITH … SELECT) ─────────────────────────────\n\n/** Derived-table aliases of a chain's verdict SELECT — no step may take them. */\nconst CHAIN_ROWS_ALIAS = \"__vibe_rows\";\nconst CHAIN_ONE_ALIAS = \"__vibe_one\";\n\n/**\n * `WITH \"a\" AS (…), \"b\" AS (…) <final SELECT>` — see {@link ChainStatement}.\n * Steps render in order through the ordinary statement renderers on ONE\n * shared collector, so parameters number in step order, then the verdict.\n *\n * The verdict form is `SELECT rows.cols, <verdict> FROM (SELECT 1) LEFT JOIN\n * (<union>) AS rows ON TRUE`: one row per written row, or ONE all-NULL row\n * carrying the verdict when the union is empty. A `LEFT JOIN`, not a NULL\n * marker branch inside the `UNION ALL`, so every column keeps its RETURNING\n * type — PostgreSQL resolves a nested UNION's untyped NULLs pairwise (two NULL\n * branches become `text`), which a bare marker branch would trip over.\n */\nfunction renderChain(params: {\n dialect: SqlDialect;\n statement: ChainStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n if (dialect.statementChain === null) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a statement chain (data-modifying WITH steps)\",\n hint: \"this dialect accepts only SELECT inside WITH — gate on SqlDialect.statementChain and keep the multi-statement path\",\n });\n }\n if (statement.steps.length === 0) throw internalError({ message: \"a statement chain needs at least one step\" });\n const defined = new Set<string>();\n const steps: string[] = [];\n for (const step of statement.steps) {\n if (step.name === CHAIN_ROWS_ALIAS || step.name === CHAIN_ONE_ALIAS || defined.has(step.name)) {\n throw internalError({ message: `chain step name \"${step.name}\" is reserved or repeated` });\n }\n const body = renderChainStep({ dialect, statement: step.statement, collector, earlier: defined });\n steps.push(`${dialect.quoteIdent({ name: step.name })} AS (${body})`);\n defined.add(step.name);\n }\n\n const result = statement.result;\n const captures = result.capture ?? [];\n if (captures.length > 0 && !dialect.capabilities.rowCapture) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"row capture (RETURNING old./new.)\", hint: \"row capture needs PostgreSQL 18 or later; the runtime refuses $transaction({ capture }) on this dialect\" });\n }\n for (const alias of captureAliases({ captures })) {\n if (result.columns.includes(alias) || alias === result.verdict?.alias || alias === result.tally?.alias) {\n throw internalError({ message: `chain capture alias \"${alias}\" collides with a result column` });\n }\n }\n if (result.rowsFrom.length === 0 && result.columns.length === 0 && result.tally !== undefined && result.verdict === undefined) {\n const tally = renderTallyColumn({ dialect, result, defined, collector });\n return { text: `WITH ${steps.join(\", \")} SELECT ${[tally, ...renderChainCaptures({ dialect, captures, defined, collector })].join(\", \")}`, values: collector.values, returning: \"none\" };\n }\n if (result.rowsFrom.length === 0 || result.columns.length === 0) {\n throw internalError({ message: \"a chain result needs at least one source step and one column\" });\n }\n for (const name of result.rowsFrom) {\n if (!defined.has(name)) throw internalError({ message: `chain result reads undefined step \"${name}\"` });\n }\n const columnList = result.columns.map((name) => dialect.quoteIdent({ name })).join(\", \");\n const guarded = result.verdict !== undefined || result.tally !== undefined || (result.veto !== undefined && result.veto.length > 0);\n // Without a guaranteed row the capture columns ride every arm: rendered once\n // (one bound limit each), the same text in every arm.\n const armCapture = guarded || captures.length === 0 ? \"\" : `, ${renderChainCaptures({ dialect, captures, defined, collector }).join(\", \")}`;\n const union = result.rowsFrom\n .map((name) => `SELECT ${columnList}${armCapture} FROM ${dialect.quoteIdent({ name })}`)\n .join(\" UNION ALL \");\n let select = union;\n if (guarded) {\n const extra: string[] = [];\n for (const alias of [result.verdict?.alias, result.tally?.alias]) {\n if (alias !== undefined && result.columns.includes(alias)) {\n throw internalError({ message: `chain result alias \"${alias}\" collides with a result column` });\n }\n }\n const rows = dialect.quoteIdent({ name: CHAIN_ROWS_ALIAS });\n const projected = result.columns.map((name) => `${rows}.${dialect.quoteIdent({ name })}`);\n if (result.verdict !== undefined) {\n extra.push(`${renderExpr({ dialect, expr: result.verdict.expr, collector })} AS ${dialect.quoteIdent({ name: result.verdict.alias })}`);\n }\n if (result.tally !== undefined || (result.veto !== undefined && result.veto.length > 0)) {\n extra.push(renderTallyColumn({ dialect, result, defined, collector }));\n }\n extra.push(...renderChainCaptures({ dialect, captures, defined, collector }));\n select =\n `SELECT ${[...projected, ...extra].join(\", \")} FROM (SELECT 1) AS ${dialect.quoteIdent({ name: CHAIN_ONE_ALIAS })}` +\n ` LEFT JOIN (${union}) AS ${rows} ON TRUE`;\n }\n return { text: `WITH ${steps.join(\", \")} ${select}`, values: collector.values, returning: \"none\" };\n}\n\nfunction renderChainStep(params: {\n dialect: SqlDialect;\n statement: ChainStepStatement;\n collector: ParamCollector;\n earlier: ReadonlySet<string>;\n}): string {\n const { dialect, statement, collector } = params;\n switch (statement.kind) {\n case \"select\":\n return renderSelect({ dialect, statement, collector }).text;\n case \"insert\":\n return renderInsert({ dialect, statement, collector }).text;\n case \"insertSelect\":\n return renderInsertSelect({ dialect, statement, collector, earlier: params.earlier });\n case \"update\":\n return renderUpdate({ dialect, statement, collector, earlier: params.earlier }).text;\n case \"delete\":\n return renderDelete({ dialect, statement, collector }).text;\n }\n}\n\n/** The result columns every {@link ChainCapture} entry adds, in render order. */\nfunction captureAliases(params: { captures: readonly ChainCapture[] }): string[] {\n const out: string[] = [];\n for (const entry of params.captures) {\n out.push(`${entry.alias}_n`);\n if (entry.inserted !== undefined) out.push(`${entry.alias}_i`);\n if (entry.before !== undefined && entry.before.length > 0) out.push(`${entry.alias}_b`);\n if (entry.after !== undefined && entry.after.length > 0) {\n if (entry.inserted === undefined || entry.insertedOnly !== true) out.push(`${entry.alias}_a`);\n if (entry.inserted !== undefined) out.push(`${entry.alias}_ia`);\n }\n for (const index of (entry.cascades ?? []).keys()) out.push(`${entry.alias}_c${index}`);\n }\n return out;\n}\n\n/**\n * The {@link ChainCapture} columns: a step's row count, its inserted-arm\n * count, and its distinct before/after images as ONE two-dimensional text\n * array literal each (an upsert step's after images one per arm), `LIMIT`\n * bound once per entry — so a write of 10 000 rows of one key ships one\n * image, and no aggregate ships more than `limit`.\n */\nfunction renderChainCaptures(params: { dialect: SqlDialect; captures: readonly ChainCapture[]; defined: ReadonlySet<string>; collector: ParamCollector }): string[] {\n const { dialect, captures, defined, collector } = params;\n const quote = (name: string): string => dialect.quoteIdent({ name });\n const out: string[] = [];\n for (const entry of captures) {\n if (!defined.has(entry.step)) throw internalError({ message: `chain capture reads undefined step \"${entry.step}\"` });\n const step = quote(entry.step);\n const marker = entry.inserted === undefined ? undefined : quote(entry.inserted);\n out.push(`(SELECT count(*) FROM ${step}) AS ${quote(`${entry.alias}_n`)}`);\n if (marker !== undefined) out.push(`(SELECT count(*) FROM ${step} WHERE ${marker}) AS ${quote(`${entry.alias}_i`)}`);\n const before = entry.before ?? [];\n const after = entry.after ?? [];\n out.push(...renderImageAggregates({ dialect, entry, step, marker, before, after, collector }));\n for (const [index, cascade] of (entry.cascades ?? []).entries()) {\n const keys = quote(\"__vibe_k\");\n const child = quote(CAPTURE_CHILD_ALIAS);\n const match = `EXISTS (SELECT 1 FROM ${step} AS ${keys} WHERE ${cascade.on.map((pair) => `${keys}.${quote(pair.parent)} = ${child}.${quote(pair.child)}`).join(\" AND \")})`;\n out.push(`${renderCascadeImages({ dialect, cascade, match, collector })} AS ${quote(`${entry.alias}_c${index}`)}`);\n }\n }\n return out;\n}\n\n/** A {@link ChainCapture} entry's `_b`, `_a` and `_ia` image aggregates, sharing one bound limit. */\nfunction renderImageAggregates(params: { dialect: SqlDialect; entry: ChainCapture; step: string; marker: string | undefined; before: readonly string[]; after: readonly string[]; collector: ParamCollector }): string[] {\n const { dialect, entry, step, marker, before, after, collector } = params;\n const quote = (name: string): string => dialect.quoteIdent({ name });\n const out: string[] = [];\n if (before.length === 0 && after.length === 0) return out;\n if (!Number.isSafeInteger(entry.limit) || entry.limit < 1) throw internalError({ message: `chain capture \"${entry.alias}\" needs a positive integer limit` });\n const limit = collector.add(entry.limit);\n const item = quote(\"__vibe_i\");\n const image = (columns: readonly string[], filter: string): string =>\n `(SELECT array_agg(${item})::text FROM (SELECT DISTINCT ARRAY[${columns.map(quote).join(\", \")}] AS ${item} FROM ${step}${filter} LIMIT ${limit}) AS ${quote(\"__vibe_d\")})`;\n const updatedRows = marker === undefined ? \"\" : ` WHERE NOT ${marker}`;\n if (before.length > 0) out.push(`${image(before, updatedRows)} AS ${quote(`${entry.alias}_b`)}`);\n if (after.length > 0 && (marker === undefined || entry.insertedOnly !== true)) out.push(`${image(after, updatedRows)} AS ${quote(`${entry.alias}_a`)}`);\n if (after.length > 0 && marker !== undefined) out.push(`${image(after, ` WHERE ${marker}`)} AS ${quote(`${entry.alias}_ia`)}`);\n return out;\n}\n\n/** One SELECT-list cell in a VALUES form: encoded value, Json cell or clock cell — never DEFAULT. */\nfunction renderSelectCell(params: { dialect: SqlDialect; value: unknown; collector: ParamCollector }): string {\n const { dialect, value, collector } = params;\n if (isJsonParamCell(value)) return `${collector.add(value.text)}${jsonCellCast(dialect, value)}`;\n if (isDbNowMarker(value)) return dialect.renderDbNow({ offsetSeconds: value.offsetSeconds, collector });\n if (isSqlDefaultCell(value)) {\n throw internalError({ message: \"DEFAULT is not allowed in an INSERT … SELECT list — omit the column instead\" });\n }\n return collector.add(value);\n}\n\n/**\n * `(SELECT cols FROM (VALUES (<typed NULL row>), ($1, $2), …) AS \"alias\"\n * (cols) OFFSET 1) AS \"alias\"` — see {@link ChainRowSource}: the first VALUES\n * row is one `(SELECT \"col\" FROM typedBy WHERE FALSE)` per column (a typed\n * NULL), which types every later parameter by the target table's own column;\n * `OFFSET 1` drops it again.\n */\nfunction renderRowSource(params: { dialect: SqlDialect; source: ChainRowSource; collector: ParamCollector }): string {\n const { dialect, source, collector } = params;\n if (source.columns.length === 0 || source.rows.length === 0) {\n throw internalError({ message: \"a row source needs at least one column and one row\" });\n }\n const typedBy = renderTable(dialect, source.typedBy);\n const columns = source.columns.map((name) => dialect.quoteIdent({ name }));\n const rows = [`(${columns.map((column) => `(SELECT ${column} FROM ${typedBy} WHERE FALSE)`).join(\", \")})`];\n for (const row of source.rows) {\n if (row.length !== source.columns.length) {\n throw internalError({ message: `row source row has ${row.length} values but ${source.columns.length} columns` });\n }\n rows.push(`(${row.map((value) => renderSelectCell({ dialect, value, collector })).join(\", \")})`);\n }\n const alias = dialect.quoteIdent({ name: source.alias });\n const columnList = columns.join(\", \");\n return `(SELECT ${columnList} FROM (VALUES ${rows.join(\", \")}) AS ${alias} (${columnList}) OFFSET 1) AS ${alias}`;\n}\n\n/**\n * The tally column guarded by the vetoes: `CASE WHEN NOT EXISTS (SELECT 1\n * FROM \"s\") THEN CAST('__vibe_veto:<token>:' || $n || ':' || (SELECT count(*)\n * FROM \"s\") AS integer) … ELSE (SELECT count(*) FROM \"a\") + … END`, `$n`\n * binding the veto's nonce. A veto with `minRows` above 1 (EPIC W) tests\n * `WHEN (SELECT count(*) FROM \"s\") < <minRows>` instead.\n *\n * The failing cast is how a plain SQL expression raises an error (SQLSTATE\n * 22P02, the marker quoted in the message). Its operand reads the step, so it\n * is NOT a constant: PostgreSQL folds constant CASE arms at plan time and\n * would raise even when the arm is never taken; this one is evaluated only\n * when its WHEN holds. The count it appends is the rows the step returned.\n */\nfunction renderTallyColumn(params: { dialect: SqlDialect; result: ChainResult; defined: ReadonlySet<string>; collector: ParamCollector }): string {\n const { dialect, result, defined, collector } = params;\n const tally = result.tally;\n if (tally === undefined) throw internalError({ message: \"a chain veto needs a tally column to guard\" });\n if (tally.steps.length === 0) throw internalError({ message: \"a chain tally needs at least one step\" });\n const step = (name: string): string => {\n if (!defined.has(name)) throw internalError({ message: `chain tally or veto reads undefined step \"${name}\"` });\n return dialect.quoteIdent({ name });\n };\n const count = (name: string): string => `(SELECT count(*) FROM ${step(name)})`;\n const sum = tally.steps.map(count).join(\" + \");\n const vetoes = result.veto ?? [];\n if (vetoes.length === 0) {\n if (result.vetoGate !== undefined) throw internalError({ message: \"a chain veto gate needs a veto to gate\" });\n return `${sum} AS ${dialect.quoteIdent({ name: tally.alias })}`;\n }\n const gate = result.vetoGate === undefined ? [] : [`WHEN NOT EXISTS (SELECT 1 FROM ${step(result.vetoGate)}) THEN ${sum}`];\n const arms = vetoes.map((veto) => {\n if (!CHAIN_VETO_TOKEN_PATTERN.test(veto.token)) throw internalError({ message: `chain veto token \"${veto.token}\" is not a lower-case word` });\n if (typeof veto.nonce !== \"string\" || veto.nonce === \"\") throw internalError({ message: `chain veto \"${veto.token}\" needs a non-empty nonce` });\n const minRows = veto.minRows ?? 1;\n if (!Number.isSafeInteger(minRows) || minRows < 1) throw internalError({ message: `chain veto \"${veto.token}\" needs a positive integer minRows` });\n if (veto.exactRows !== undefined && (!Number.isSafeInteger(veto.exactRows) || veto.exactRows < 0 || veto.minRows !== undefined)) {\n throw internalError({ message: `chain veto \"${veto.token}\" needs a nonnegative safe integer exactRows without minRows` });\n }\n const when = veto.exactRows !== undefined\n ? `WHEN ${count(veto.step)} <> ${veto.exactRows}`\n : minRows === 1 ? `WHEN NOT EXISTS (SELECT 1 FROM ${step(veto.step)})` : `WHEN ${count(veto.step)} < ${minRows}`;\n return `${when} THEN CAST('${CHAIN_VETO_PREFIX}${veto.token}:' || ${collector.add(veto.nonce)} || ':' || ${count(veto.step)} AS integer)`;\n });\n return `CASE ${[...gate, ...arms].join(\" \")} ELSE ${sum} END AS ${dialect.quoteIdent({ name: tally.alias })}`;\n}\n\n/** `INSERT INTO t (cols) SELECT <cells> [FROM steps] [WHERE …] [RETURNING …]` — a chain step only. */\nfunction renderInsertSelect(params: {\n dialect: SqlDialect;\n statement: InsertSelectStatement;\n collector: ParamCollector;\n earlier: ReadonlySet<string>;\n}): string {\n const { dialect, statement, collector } = params;\n if (statement.columns.length === 0) throw internalError({ message: \"insert requires at least one column\" });\n if (statement.cells.length !== statement.columns.length) {\n throw internalError({\n message: `insert row has ${statement.cells.length} values but ${statement.columns.length} columns`,\n });\n }\n const from = statement.from ?? [];\n for (const name of from) {\n if (!params.earlier.has(name)) throw internalError({ message: `INSERT … SELECT reads step \"${name}\" before it is defined` });\n }\n const source = statement.source;\n if (source !== undefined && (params.earlier.has(source.alias) || from.includes(source.alias))) {\n throw internalError({ message: `row source alias \"${source.alias}\" collides with a chain step` });\n }\n const cells = statement.cells.map((value) => {\n if (isStepColumnRef(value)) {\n if (!from.includes(value.step) && value.step !== source?.alias) {\n throw internalError({ message: `cell reads step \"${value.step}\", which the INSERT … SELECT does not name in FROM` });\n }\n return `${dialect.quoteIdent({ name: value.step })}.${dialect.quoteIdent({ name: value.column })}`;\n }\n return renderSelectCell({ dialect, value, collector });\n });\n const columnList = statement.columns.map((name) => dialect.quoteIdent({ name })).join(\", \");\n let text = `INSERT INTO ${renderTable(dialect, statement.table)} (${columnList}) SELECT ${cells.join(\", \")}`;\n const relations = from.map((name) => dialect.quoteIdent({ name }));\n if (source !== undefined) relations.push(renderRowSource({ dialect, source, collector }));\n if (relations.length > 0) text += ` FROM ${relations.join(\" CROSS JOIN \")}`;\n if (statement.where !== undefined) {\n text += ` WHERE ${renderExpr({ dialect, expr: statement.where, collector })}`;\n }\n const conflict = statement.conflictDoNothing;\n if (conflict !== undefined) {\n if (conflict.columns.length === 0) throw internalError({ message: \"an INSERT … SELECT conflict clause needs at least one column\" });\n if (dialect.doNothingForm !== \"onConflictDoNothing\") {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"ON CONFLICT DO NOTHING on an INSERT … SELECT chain step\",\n hint: \"gate on SqlDialect.statementChain and keep the multi-statement path\",\n });\n }\n text += ` ON CONFLICT (${conflict.columns.map((name) => dialect.quoteIdent({ name })).join(\", \")}) DO NOTHING`;\n }\n return text + applyReturning({ dialect, requested: statement.returning, collector, table: statement.table }).suffix;\n}\n",
66
53
  "/**\n * LIKE pattern helpers.\n *\n * User input must be escaped before being embedded in a LIKE pattern, so that\n * `%`, `_` and `\\` in data match literally. All dialects use `\\` as the escape\n * character (sqlite only via the explicit ESCAPE clause the dialect appends —\n * see SqlDialect.likeEscapeClause).\n */\n\n/** Escape LIKE wildcards (`%`, `_`) and the escape character itself. */\nexport function escapeLikePattern(params: { raw: string }): string {\n return params.raw.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"%\", \"\\\\%\").replaceAll(\"_\", \"\\\\_\");\n}\n\n/** Pattern for a `contains` filter: `%value%` with the value escaped. */\nexport function containsPattern(params: { raw: string }): string {\n return `%${escapeLikePattern({ raw: params.raw })}%`;\n}\n\n/** Pattern for a `startsWith` filter: `value%` with the value escaped. */\nexport function startsWithPattern(params: { raw: string }): string {\n return `${escapeLikePattern({ raw: params.raw })}%`;\n}\n\n/** Pattern for an `endsWith` filter: `%value` with the value escaped. */\nexport function endsWithPattern(params: { raw: string }): string {\n return `%${escapeLikePattern({ raw: params.raw })}`;\n}\n\n/**\n * Escape sqlite GLOB metacharacters (`*`, `?`, `[`) via single-character\n * classes — GLOB has no ESCAPE clause, and LIKE's backslash escaping does NOT\n * apply to it (board #20; `]` is literal outside a class). Used by the\n * `strictMatch` renderer on dialects with `strictMatchStrategy: \"glob\"`.\n */\nexport function escapeGlobPattern(params: { raw: string }): string {\n return params.raw.replace(/[*?[]/g, (char) => `[${char}]`);\n}\n\n/**\n * The BOUND pattern a `strictMatch` pattern op renders, per strategy — the\n * ONE derivation point, used by the renderer AND the runtime's render-cache\n * mirror (which must bind the identical parameter, LEARNINGS mirror rule).\n */\nexport function strictMatchPattern(params: {\n strategy: \"native\" | \"glob\" | \"binary\";\n op: \"contains\" | \"startsWith\" | \"endsWith\";\n value: string;\n}): string {\n const { strategy, op, value } = params;\n if (strategy === \"glob\") {\n const inner = escapeGlobPattern({ raw: value });\n return op === \"contains\" ? `*${inner}*` : op === \"startsWith\" ? `${inner}*` : `*${inner}`;\n }\n return op === \"contains\"\n ? containsPattern({ raw: value })\n : op === \"startsWith\"\n ? startsWithPattern({ raw: value })\n : endsWithPattern({ raw: value });\n}\n\n// ─── Fix lane Q2 (D-06): collation prefilter of a strict prefix match ───\n\n/**\n * Does a `strictMatch` render the collation `LIKE` conjunct BEFORE its\n * byte-exact test? Only the `binary` strategy's (mysql) non-negated\n * `startsWith`: `(col LIKE ? AND col LIKE CAST(? AS BINARY))`, the same\n * pattern bound twice. A byte-exact prefix match is always a collation match\n * (a collation never separates identical characters, and the escaped prefix\n * plus `%` has no other wildcard), so the AND keeps exactly the binary test's\n * rows — while the plain conjunct lets a btree index on the column bound the\n * scan (measured on mysql 26.7: 5.92 → 0.24 ms, 100 002 → 3 rows read). The\n * ONE decision point for the renderer AND the runtime's render-cache mirror,\n * which must bind the pattern twice exactly when the renderer does.\n */\nexport function strictMatchCollationPrefilter(params: {\n strategy: \"native\" | \"glob\" | \"binary\";\n op: \"equals\" | \"contains\" | \"startsWith\" | \"endsWith\";\n negate: boolean;\n}): boolean {\n return params.strategy === \"binary\" && params.op === \"startsWith\" && !params.negate;\n}\n",
54
+ "/**\n * Lock SQL: the row-locking clause appended to a SELECT, and the\n * transaction-scoped advisory-lock statement.\n *\n * Both are pure text decisions, so both live here rather than in the runtime —\n * and both REFUSE rather than degrade. A dialect that cannot express a strength\n * or a wait policy has no text for it (`SqlDialect.rowLockSyntax`), and the\n * refusal is a `VIBE_UNSUPPORTED_CAPABILITY`, never a weaker clause: silently\n * turning `skipLocked` into a blocking read hands two workers the same job.\n */\n\nimport { internalError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { AdvisoryLockMode, RowLockStrength, RowLockWaitPolicy } from \"@vibeorm/schema\";\nimport type { AdvisoryLockKey, AdvisoryLockStatement, RowLock } from \"./ast.ts\";\nimport { ADVISORY_LOCK_RESULT_COLUMN } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport type { RenderedQuery } from \"./render.ts\";\n\n// ─── Row locks ────────────────────────────────────────────────────\n\n/**\n * How each strength and wait policy READS in a refusal message. Typed as a\n * total record, so adding a member to either union fails to compile until this\n * table names it — an error message can never silently describe the wrong lock.\n */\nconst ROW_LOCK_PROSE: {\n readonly strengths: Readonly<Record<RowLockStrength, string>>;\n readonly wait: Readonly<Record<RowLockWaitPolicy, string>>;\n} = Object.freeze({\n strengths: Object.freeze({\n update: \"FOR UPDATE\",\n noKeyUpdate: \"FOR NO KEY UPDATE\",\n share: \"FOR SHARE\",\n keyShare: \"FOR KEY SHARE\",\n }),\n wait: Object.freeze({ wait: \"\", nowait: \" NOWAIT\", skipLocked: \" SKIP LOCKED\" }),\n});\n\n/** How a lock request reads in a refusal message (`FOR UPDATE SKIP LOCKED`). */\nexport function describeRowLock(params: { lock: RowLock }): string {\n const { strength, wait } = params.lock;\n return `${ROW_LOCK_PROSE.strengths[strength]}${ROW_LOCK_PROSE.wait[wait]}`;\n}\n\n/**\n * The clause for one row lock, or `null` when this dialect has NO locking-read\n * clause at all and the request is the historical `FOR UPDATE` no-op.\n *\n * sqlite is that case: it has no clause, and its write transactions are\n * mutually exclusive, so `lock: \"update\"` there is a documented no-op kept for\n * compatibility. Anything else on such a dialect — a different strength, or a\n * wait policy that changes behaviour — is refused by the caller BEFORE this\n * point (the query builder), and refused again here as a backstop.\n */\nexport function renderRowLockClause(params: { dialect: SqlDialect; lock: RowLock }): string | null {\n const { dialect, lock } = params;\n const syntax = dialect.rowLockSyntax;\n if (syntax === null) {\n if (lock.strength === \"update\" && lock.wait === \"wait\") return null;\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `a ${describeRowLock({ lock })} locking read`,\n hint: `${dialect.name} has no locking-read clause at all`,\n });\n }\n const strengthText = syntax.strengths[lock.strength];\n if (strengthText === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `the ${describeRowLock({ lock: { ...lock, wait: \"wait\" } })} row-lock strength`,\n hint: `${dialect.name} can express: ${Object.keys(syntax.strengths).join(\", \")}`,\n });\n }\n const waitText = syntax.wait[lock.wait];\n if (waitText === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `the \"${lock.wait}\" lock wait policy`,\n hint: `${dialect.name} can express: ${Object.keys(syntax.wait).join(\", \")}`,\n });\n }\n // `OF <table>` sits between the strength and the wait policy on both\n // dialects that have the clause (postgres, mysql 8.0.1+).\n if (lock.of !== undefined) {\n if (lock.of.length === 0) throw internalError({ message: \"a row lock's `of` list cannot be empty\" });\n const tables = lock.of.map((name) => dialect.quoteIdent({ name })).join(\", \");\n return `${strengthText} OF ${tables}${waitText}`;\n }\n const plain = lock.wait === \"wait\" ? syntax.plain?.[lock.strength] : undefined;\n return plain ?? `${strengthText}${waitText}`;\n}\n\n// ─── Advisory locks ───────────────────────────────────────────────\n\n/** Largest/smallest value each advisory key part may carry, per PostgreSQL's types. */\nexport const ADVISORY_KEY_BOUNDS: {\n readonly single: { readonly min: bigint; readonly max: bigint };\n readonly pair: { readonly min: number; readonly max: number };\n} = Object.freeze({\n single: Object.freeze({ min: -(2n ** 63n), max: 2n ** 63n - 1n }),\n pair: Object.freeze({ min: -(2 ** 31), max: 2 ** 31 - 1 }),\n});\n\n/** Is this key the single 64-bit form? (The alternative is the two 32-bit form.) */\nfunction isSingleKey(key: AdvisoryLockKey): key is { readonly key: bigint } {\n return \"key\" in key;\n}\n\n/**\n * `SELECT pg_advisory_xact_lock($1::bigint)` and friends.\n *\n * The key binds as TEXT with an explicit cast: PostgreSQL overloads these\n * functions on `(bigint)` and `(int4, int4)`, and an OID-typed driver resolves\n * a bound parameter's type itself — the trap `jsonParamCast` already exists for.\n * Casting in the SQL makes every driver send the same bytes.\n */\nexport function renderAdvisoryLock(params: {\n dialect: SqlDialect;\n statement: AdvisoryLockStatement;\n collector: ParamCollector;\n}): RenderedQuery {\n const { dialect, statement, collector } = params;\n const functions = dialect.advisoryLockFunctions;\n if (functions === null) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"advisory locks\",\n hint:\n dialect.name === \"mysql\"\n ? \"mysql's GET_LOCK is SESSION-scoped — it survives a rollback, so it cannot be released with the transaction\"\n : `${dialect.name} has no advisory-lock functions`,\n });\n }\n const mode: AdvisoryLockMode = statement.mode;\n const fn = (mode === \"exclusive\" ? functions.exclusive : functions.shared)[statement.wait];\n const key = statement.key;\n const args = isSingleKey(key)\n ? `${collector.add(key.key.toString())}${functions.keyCast.single}`\n : `${collector.add(String(assertInt32({ value: key.classId, part: \"classId\" })))}${functions.keyCast.pair}, ` +\n `${collector.add(String(assertInt32({ value: key.objectId, part: \"objectId\" })))}${functions.keyCast.pair}`;\n // The try-lock's boolean IS the result, so it is projected under a stable\n // name; the blocking form returns void and needs no alias.\n const projection =\n statement.wait === \"nowait\"\n ? ` AS ${dialect.quoteIdent({ name: ADVISORY_LOCK_RESULT_COLUMN })}`\n : \"\";\n return {\n text: `SELECT ${fn}(${args})${projection}`,\n values: collector.values,\n returning: \"none\",\n };\n}\n\n/**\n * Take already sorted, deduplicated bigint transaction locks in their input\n * order. The volatile lock call runs after the ordinality sort. This is a\n * separate statement: a following read obtains its snapshot after lock waits.\n */\nexport function renderAdvisoryLocks(params: { readonly dialect: SqlDialect; readonly keys: readonly bigint[]; readonly mode: AdvisoryLockMode }): RenderedQuery {\n const { dialect, keys, mode } = params;\n const functions = dialect.advisoryLockFunctions;\n if (functions === null) throw unsupportedCapability({ dialect: dialect.name, feature: \"advisory locks\" });\n if (mode !== \"exclusive\" && mode !== \"shared\") throw internalError({ message: \"advisory lock mode must be exclusive or shared\" });\n if (keys.some((key) => typeof key !== \"bigint\" || key < ADVISORY_KEY_BOUNDS.single.min || key > ADVISORY_KEY_BOUNDS.single.max)) {\n throw internalError({ message: \"advisory lock keys must be signed 64-bit integers\" });\n }\n const collector = new ParamCollector(dialect);\n const binding = collector.add(JSON.stringify(keys.map((key) => key.toString())));\n const fn = (mode === \"exclusive\" ? functions.exclusive : functions.shared).wait;\n const table = dialect.quoteIdent({ name: \"__vibe_locks\" });\n const key = dialect.quoteIdent({ name: \"key\" });\n const order = dialect.quoteIdent({ name: \"ordinal\" });\n return {\n text: `SELECT ${fn}(${table}.${key}${functions.keyCast.single}) FROM jsonb_array_elements_text(${binding}::text::jsonb) WITH ORDINALITY AS ${table}(${key}, ${order}) ORDER BY ${table}.${order}`,\n values: collector.values,\n returning: \"none\",\n };\n}\n\n/** The AST is built by VibeORM code, so an out-of-range part is our bug. */\nfunction assertInt32(params: { value: number; part: string }): number {\n const { value, part } = params;\n if (\n !Number.isInteger(value) ||\n value < ADVISORY_KEY_BOUNDS.pair.min ||\n value > ADVISORY_KEY_BOUNDS.pair.max\n ) {\n throw internalError({\n message: `advisory lock ${part} must be a 32-bit integer, got ${String(value)}`,\n meta: { part, value },\n });\n }\n return value;\n}\n",
55
+ "import { DATE_TRUNCATION_UNITS, VibeError, internalError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { DateTruncation } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\n\n// ─── Calendar truncation (groupBy date keys) ──────────────────────\n\n/**\n * The characters a time-zone name may hold: a leading letter, then letters,\n * digits, `_`, `+`, `-` and `/`, at most 64 characters in all. Every IANA name\n * (`Europe/Oslo`, `America/Argentina/Buenos_Aires`, `Etc/GMT+1`) and `UTC`\n * fit. The name renders as an SQL string literal (a bind parameter inside a\n * GROUP BY key would not match the projection's), so this guard is what keeps\n * caller text out of the SQL grammar. Whether the zone EXISTS is the server's\n * decision: PostgreSQL refuses an unknown name with SQLSTATE 22023 (`time zone\n * \"…\" not recognized`) when the statement runs. JavaScript's `Intl` list is\n * not consulted, because its aliases differ from PostgreSQL's.\n */\nconst TIME_ZONE_NAME: RegExp = /^[A-Za-z][A-Za-z0-9_+\\-/]{0,63}$/;\n\n/** Is this value a time-zone name the renderer will spell as a literal? (See {@link TIME_ZONE_NAME}.) */\nexport function isTimeZoneName(params: { readonly value: unknown }): params is { readonly value: string } {\n return typeof params.value === \"string\" && TIME_ZONE_NAME.test(params.value);\n}\n\n/**\n * The start of the period that holds `reference`'s value, in the column's own\n * SQL type, so the field's codec decodes it unchanged:\n *\n * - `timestamptz` → `date_trunc('day', \"col\", 'Europe/Oslo')` — the 3-argument\n * form (PostgreSQL 12 or later) truncates in the named zone, never in the\n * session's `TimeZone`;\n * - `timestamp` (zone-less, UTC wall-clock by contract) →\n * `(date_trunc('day', \"col\" AT TIME ZONE 'UTC', 'Europe/Oslo') AT TIME ZONE 'UTC')`.\n *\n * The unit and the zone are literals, so every site of one key (projection,\n * GROUP BY, ORDER BY) repeats the identical text and binds no parameter.\n */\nexport function renderDateTruncation(params: { readonly dialect: SqlDialect; readonly reference: string; readonly truncation: DateTruncation }): string {\n const { dialect, reference, truncation } = params;\n if (!dialect.capabilities.dateTruncation) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: \"a truncated groupBy key ({ field, truncate, timeZone })\",\n hint: \"only PostgreSQL and PGlite truncate a timestamp in a named time zone — group by the plain field and bucket the rows in code instead\",\n });\n }\n if (!DATE_TRUNCATION_UNITS.includes(truncation.unit)) {\n throw internalError({ message: `unknown date truncation unit ${JSON.stringify(truncation.unit)}` });\n }\n if (!isTimeZoneName({ value: truncation.timeZone })) {\n throw new VibeError({\n code: \"VIBE_VALIDATION\",\n message: `time zone ${JSON.stringify(truncation.timeZone)} is not a time-zone name — use an IANA name such as \"Europe/Oslo\" or \"UTC\"`,\n meta: { timeZone: truncation.timeZone },\n });\n }\n const unit = dialect.quoteStringLiteral({ value: truncation.unit });\n const zone = dialect.quoteStringLiteral({ value: truncation.timeZone });\n switch (truncation.storage) {\n case \"timestamptz\":\n return `date_trunc(${unit}, ${reference}, ${zone})`;\n case \"timestamp\":\n return `(date_trunc(${unit}, ${reference} AT TIME ZONE 'UTC', ${zone}) AT TIME ZONE 'UTC')`;\n default:\n throw internalError({ message: `unknown date truncation storage ${JSON.stringify(truncation.storage)}` });\n }\n}\n",
56
+ "/**\n * Key-list membership (`SqlExpr` `keyList`, the public `where: { IN }`):\n * the postgres element type each member's array binds as.\n *\n * Postgres compares `\"col\" = $n` with the parameter typed as the column's\n * type WITHOUT its modifier (measured on postgres 18.6: `timestamptz(3) =\n * '…00.1234'` matches nothing, `numeric(10,2) = '1.234'` matches nothing,\n * `varchar(3) = 'abcd'` matches nothing). The unnest form must compare the\n * same way, so every member binds as `$n::<base type>[]`: a `timestamptz(3)[]`\n * cast would round `.1234` onto the stored `.123` and match a row `=` does not.\n * The base type also keeps the column's own operator and index: `bpchar` for\n * `char(n)` (pad-insensitive like `=`), `citext` (case-insensitive like `=`;\n * a `text[]` member would compare case-sensitively), the native enum's own\n * type, and text collations resolve to the column's collation, as for `=`.\n */\n\nimport { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { ScalarType } from \"@vibeorm/schema\";\nimport type { KeyListMember } from \"./ast.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\n\n/** Canonical element type per scalar (the column type when no `@db.*` type is declared). */\nconst SCALAR_ELEMENT_TYPES: Readonly<Record<ScalarType, string | null>> = Object.freeze({\n String: \"text\",\n Boolean: \"bool\",\n Int: \"int4\",\n BigInt: \"int8\",\n Float: \"float8\",\n Decimal: \"numeric\",\n DateTime: \"timestamptz\",\n // Json has no equality operator a key can use; the runtime refuses it first.\n Json: null,\n Bytes: \"bytea\",\n});\n\n/**\n * Declared native base name (lowercase, spaces and modifier removed) → element\n * type. Every Prisma postgres `@db.*` type a key field can carry, plus the\n * catalog spellings `db pull` and hand-written schemas use.\n */\nconst NATIVE_ELEMENT_TYPES: Readonly<Record<string, string>> = Object.freeze({\n text: \"text\",\n varchar: \"varchar\",\n charactervarying: \"varchar\",\n char: \"bpchar\",\n character: \"bpchar\",\n bpchar: \"bpchar\",\n uuid: \"uuid\",\n citext: \"citext\",\n xml: \"xml\",\n inet: \"inet\",\n money: \"money\",\n // Quoted: an unquoted `bit` is the SQL-standard `bit(1)` and refuses `101`.\n bit: \"\\\"bit\\\"\",\n varbit: \"varbit\",\n bitvarying: \"varbit\",\n smallint: \"int2\",\n int2: \"int2\",\n integer: \"int4\",\n int: \"int4\",\n int4: \"int4\",\n bigint: \"int8\",\n int8: \"int8\",\n oid: \"oid\",\n real: \"float4\",\n float4: \"float4\",\n doubleprecision: \"float8\",\n double: \"float8\",\n float8: \"float8\",\n decimal: \"numeric\",\n numeric: \"numeric\",\n boolean: \"bool\",\n bool: \"bool\",\n timestamp: \"timestamp\",\n timestampwithouttimezone: \"timestamp\",\n timestamptz: \"timestamptz\",\n timestampwithtimezone: \"timestamptz\",\n date: \"date\",\n time: \"time\",\n timewithouttimezone: \"time\",\n timetz: \"timetz\",\n timewithtimezone: \"timetz\",\n bytea: \"bytea\",\n});\n\n/**\n * The postgres element type a key-list member's array binds as, or\n * `undefined` when the member has none (Json, or a native type this list does\n * not know). Never throws: a caller deciding whether a key list CAN carry a\n * member (the automatic OR rewrite) asks here; {@link postgresKeyListElementType}\n * is the throwing form the renderer uses.\n */\nexport function postgresKeyListElementTypeOf(params: { dialect: SqlDialect; member: KeyListMember }): string | undefined {\n const { dialect, member } = params;\n if (member.type === \"Enum\") {\n if (member.enumType === undefined) return \"text\";\n const name = dialect.quoteIdent({ name: member.enumType.name });\n return member.enumType.namespace === undefined ? name : `${dialect.quoteIdent({ name: member.enumType.namespace })}.${name}`;\n }\n const native = member.nativeType === undefined\n ? undefined\n : NATIVE_ELEMENT_TYPES[member.nativeType.toLowerCase().replace(/\\([^)]*\\)/g, \"\").replace(/\\s+/g, \"\")];\n const type = member.nativeType === undefined ? SCALAR_ELEMENT_TYPES[member.type] : native;\n return type === null ? undefined : type;\n}\n\n/**\n * The postgres element type a key-list member's array binds as\n * (`$n::<type>[]`), derived from the column's declared type facts.\n *\n * @throws VibeError `VIBE_UNSUPPORTED_CAPABILITY` for a member whose type has\n * no equality a key can use (Json) or a native type this list does not know.\n * @internal\n */\nexport function postgresKeyListElementType(params: { dialect: SqlDialect; member: KeyListMember }): string {\n const { dialect, member } = params;\n const type = postgresKeyListElementTypeOf({ dialect, member });\n if (type === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `the key-list filter (IN) on a ${member.type}${member.nativeType === undefined ? \"\" : ` @db.${member.nativeType}`} member`,\n hint: \"IN binds every member as a typed array; filter this field with equality inside OR instead\",\n });\n }\n return type;\n}\n\n/**\n * Whether a key list must bind its rows as a row-value list of UNTYPED\n * parameters, `(a, b) IN (($1, $2), …)`, instead of typed arrays on the\n * `unnest` strategy: some member is a `DateTime` without a declared native\n * type. Its element type would be `timestamptz`, but such a field may sit on\n * a zone-less `timestamp(3)` column (a Prisma-created database;\n * docs/dialect-notes.md \"DateTime without time zone on postgres\"), where\n * `timestamp = timestamptz` converts the column through the session TimeZone\n * and matches other rows than `\"col\" = $n` (an untyped parameter the server\n * types from the column). The row-value list keeps that typing; PostgreSQL\n * plans it like the OR of conjunctions, so its planning grows with the list.\n * Shared by the renderer and the runtime's render-cache walk.\n */\nexport function keyListBindsUntypedRows(params: { members: readonly KeyListMember[] }): boolean {\n return params.members.some((member) => member.type === \"DateTime\" && member.nativeType === undefined);\n}\n\n// ─── Bulk insert (`InsertStatement.unnest`) ───────────────────────────\n\n/**\n * The cast after a bulk-insert column's array placeholder (`$n::<cast>[]`),\n * or `undefined` when the column has none and the insert must keep VALUES.\n * Never throws: the query builder asks here while deciding admission.\n *\n * Every type the key list knows binds its BASE type, exactly as above — the\n * INSERT's assignment then applies the column's modifier (length, precision,\n * rounding) the way it does for a VALUES parameter. Json is the one addition:\n * it binds through a text slot, `text::jsonb` (`text::json` for `@db.Json`),\n * because PostgreSQL has no assignment cast from text to jsonb and bun:sql's\n * named statements would JSON-encode pre-encoded text bound to a jsonb slot\n * (the `JsonParamCell` rule, per element).\n */\nexport function postgresBulkInsertArrayCastOf(params: { dialect: SqlDialect; member: KeyListMember }): string | undefined {\n const { dialect, member } = params;\n if (member.type === \"Json\") return member.nativeType?.trim().toLowerCase() === \"json\" ? \"text::json\" : \"text::jsonb\";\n return postgresKeyListElementTypeOf({ dialect, member });\n}\n\n/**\n * The throwing form of {@link postgresBulkInsertArrayCastOf}, for the renderer.\n *\n * @throws VibeError `VIBE_UNSUPPORTED_CAPABILITY` for a native type the\n * bulk-insert form does not know.\n * @internal\n */\nexport function postgresBulkInsertArrayCast(params: { dialect: SqlDialect; member: KeyListMember }): string {\n const { dialect, member } = params;\n const cast = postgresBulkInsertArrayCastOf({ dialect, member });\n if (cast === undefined) {\n throw unsupportedCapability({\n dialect: dialect.name,\n feature: `a bulk insert binding a ${member.type}${member.nativeType === undefined ? \"\" : ` @db.${member.nativeType}`} column as a typed array`,\n hint: \"the query builder keeps VALUES for this column type\",\n });\n }\n return cast;\n}\n",
57
+ "import { VibeError } from \"@vibeorm/schema\";\nimport { isSqlFragment } from \"./composable.ts\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { ParamCollector } from \"./params.ts\";\nimport { registerSqlHandleCheck } from \"./sql-handles.ts\";\nimport type { ResultReadDecoder } from \"./result-decoder.ts\";\nimport { bindSqlBindingProgram, finishSqlBindingCollection, startSqlBindingCollection } from \"./sql-bindings.ts\";\nimport type { SqlBindingProgram } from \"./sql-bindings.ts\";\nimport { isSqlInput, sqlInputScopeHandle, sqlInputScopeKeys } from \"./sql-input.ts\";\nimport type { SqlInputScope } from \"./sql-input.ts\";\n\ndeclare const queryBrand: unique symbol;\ndeclare const commandBrand: unique symbol;\n/** Authentic row-returning SQL plan, independent of a client or transaction. */\nexport type SqlQuery<Row> = { readonly [queryBrand]: Row };\n/** Authentic affected-count SQL plan; never a row-returning contract. */\nexport type SqlCommand = { readonly [commandBrand]: true };\n/** Render into the enclosing collector, preserving parameter order in compositions. */\nexport type SqlPlanRender = (params: { dialect: SqlDialect; collector: ParamCollector }) => string;\n/** Compiled row query and its captured runtime result contract. */\nexport type CompiledSqlQuery<Row> = { readonly text: string; readonly values: unknown[]; readonly decoder: ResultReadDecoder<Row> };\n\ntype QueryState = { readonly render: SqlPlanRender; readonly decoder: ResultReadDecoder<unknown> };\nconst queries = new WeakMap<object, QueryState>();\nconst commands = new WeakMap<object, SqlPlanRender>();\n\ndeclare const reusableQueryBrand: unique symbol;\ndeclare const reusableCommandBrand: unique symbol;\n/** Ownerless fixed SQL with required execution inputs and its own result decoder. */\nexport type ReusableSqlQuery<Params extends object, Row> = { readonly [reusableQueryBrand]: { readonly params: Params; readonly row: Row } };\n/** Ownerless fixed affected-count SQL with required execution inputs. */\nexport type ReusableSqlCommand<Params extends object> = { readonly [reusableCommandBrand]: Params };\n/** A fresh bound command, ready for the existing raw execution route. */\nexport type CompiledSqlCommand = { readonly text: string; readonly values: unknown[] };\ntype CompiledTemplate = { readonly text: string; readonly program: SqlBindingProgram };\ntype TemplateState = { readonly render: SqlPlanRender; readonly scope: SqlInputScope; readonly decoder?: ResultReadDecoder<unknown>; readonly cache: WeakMap<SqlDialect, CompiledTemplate> };\nconst reusableQueries = new WeakMap<object, TemplateState>();\nconst reusableCommands = new WeakMap<object, TemplateState>();\nregisterSqlHandleCheck({ check: (value) => queries.has(value) || commands.has(value) || reusableQueries.has(value) || reusableCommands.has(value) });\n\nfunction invalid(message: string): never {\n throw new VibeError({ code: \"VIBE_VALIDATION\", message });\n}\n\n/** Capture a renderer and decoder without opening any execution resource. */\nexport function createSqlQuery<Row>(params: { render: SqlPlanRender; decoder: ResultReadDecoder<Row> }): SqlQuery<Row> {\n if (typeof params.render !== \"function\" || typeof params.decoder?.decode !== \"function\") invalid(\"SQL queries require a renderer and result decoder\");\n const query = Object.freeze(Object.create(null)) as SqlQuery<Row>;\n queries.set(query, Object.freeze({ render: params.render, decoder: params.decoder }));\n return query;\n}\n\n/** Capture a command renderer without inventing a result-row contract. */\nexport function createSqlCommand(params: { render: SqlPlanRender }): SqlCommand {\n if (typeof params.render !== \"function\") invalid(\"SQL commands require a renderer\");\n const command = Object.freeze(Object.create(null)) as SqlCommand;\n commands.set(command, params.render);\n return command;\n}\n\n/** Structural copies and assertions are not executable row plans. */\nexport function isSqlQuery(value: unknown): value is SqlQuery<unknown> {\n return typeof value === \"object\" && value !== null && queries.has(value);\n}\n\n/** Structural copies and row plans are not executable commands. */\nexport function isSqlCommand(value: unknown): value is SqlCommand {\n return typeof value === \"object\" && value !== null && commands.has(value);\n}\n\n/** Authentic reusable row plans are distinct from ordinary composable plans. */\nexport function isReusableSqlQuery(value: unknown): value is ReusableSqlQuery<object, unknown> {\n return typeof value === \"object\" && value !== null && reusableQueries.has(value);\n}\n\n/** Authentic reusable commands never masquerade as row queries. */\nexport function isReusableSqlCommand(value: unknown): value is ReusableSqlCommand<object> {\n return typeof value === \"object\" && value !== null && reusableCommands.has(value);\n}\n\n/** Query-bundle provenance is checked by qb.reusable before this bridge. */\nexport function createReusableSqlQuery<P extends object, Row>(params: { query: SqlQuery<Row>; scope: SqlInputScope }): ReusableSqlQuery<P, Row> {\n const state = queries.get(params.query) ?? invalid(\"Expected an authentic SQL row query\");\n sqlInputScopeKeys({ scope: params.scope });\n const query = Object.freeze(Object.create(null)) as ReusableSqlQuery<P, Row>;\n reusableQueries.set(query, { ...state, scope: params.scope, cache: new WeakMap() });\n return query;\n}\n\n/** Wrap an admitted builder command without capturing an execution owner. */\nexport function createReusableSqlCommand<P extends object>(params: { query: SqlCommand; scope: SqlInputScope }): ReusableSqlCommand<P> {\n const render = commands.get(params.query) ?? invalid(\"Expected an authentic SQL command\");\n sqlInputScopeKeys({ scope: params.scope });\n const query = Object.freeze(Object.create(null)) as ReusableSqlCommand<P>;\n reusableCommands.set(query, { render, scope: params.scope, cache: new WeakMap() });\n return query;\n}\n\nfunction compiledTemplate(params: { dialect: SqlDialect; state: TemplateState }): CompiledTemplate {\n const cached = params.state.cache.get(params.dialect);\n if (cached !== undefined) return cached;\n const collector = new ParamCollector(params.dialect);\n startSqlBindingCollection({ collector, dialect: params.dialect, scope: params.state.scope });\n const text = params.state.render({ dialect: params.dialect, collector });\n if (collector.count() > params.dialect.paramBudget) invalid(\"SQL query exceeds this dialect's parameter budget; statements are never split implicitly\");\n const program = finishSqlBindingCollection({ collector });\n const compiled = Object.freeze({ text, program });\n params.state.cache.set(params.dialect, compiled);\n return compiled;\n}\n\n/** Core and builder handles are SQL code, never execution data, at any depth of an input bag. */\nfunction executionHandle(params: { scope: SqlInputScope; value: object }): boolean {\n const { value } = params;\n return queries.has(value) || commands.has(value) || reusableQueries.has(value) || reusableCommands.has(value)\n || isSqlFragment(value) || isSqlInput(value) || sqlInputScopeHandle(params);\n}\n\nfunction bindTemplate(params: { compiled: CompiledTemplate; state: TemplateState; inputs: unknown }): unknown[] {\n const { scope } = params.state;\n return bindSqlBindingProgram({ program: params.compiled.program, params: params.inputs, isHandle: (value) => executionHandle({ scope, value }) });\n}\n\n/** Compile structure once per dialect and synchronously snapshot/bind this invocation. */\nexport function compileReusableSqlQuery<P extends object, Row>(params: { readonly dialect: SqlDialect; readonly query: ReusableSqlQuery<P, Row>; readonly params?: unknown }): CompiledSqlQuery<Row> {\n const state = reusableQueries.get(params.query) ?? invalid(\"Expected an authentic reusable SQL row query\");\n const compiled = compiledTemplate({ dialect: params.dialect, state });\n return { text: compiled.text, values: bindTemplate({ compiled, state, inputs: params.params }), decoder: state.decoder as ResultReadDecoder<Row> };\n}\n\n/** Compile structure once per dialect and bind a fresh affected-count command. */\nexport function compileReusableSqlCommand<P extends object>(params: { readonly dialect: SqlDialect; readonly query: ReusableSqlCommand<P>; readonly params?: unknown }): CompiledSqlCommand {\n const state = reusableCommands.get(params.query) ?? invalid(\"Expected an authentic reusable SQL command\");\n const compiled = compiledTemplate({ dialect: params.dialect, state });\n return { text: compiled.text, values: bindTemplate({ compiled, state, inputs: params.params }) };\n}\n\n/** Compile a row plan once the execution dialect is known. */\nexport function compileSqlQuery<Row>(params: { dialect: SqlDialect; query: SqlQuery<Row> }): CompiledSqlQuery<Row> {\n const state = queries.get(params.query) ?? invalid(\"Expected an authentic SQL row query\");\n const collector = new ParamCollector(params.dialect);\n const text = state.render({ dialect: params.dialect, collector });\n if (collector.values.length > params.dialect.paramBudget) invalid(\"SQL query exceeds this dialect's parameter budget; statements are never split implicitly\");\n return { text, values: collector.values, decoder: state.decoder as ResultReadDecoder<Row> };\n}\n\n/** Compile an affected-count plan; row terminals are refused. */\nexport function compileSqlCommand(params: { dialect: SqlDialect; query: SqlCommand }): { text: string; values: unknown[] } {\n const render = commands.get(params.query) ?? invalid(\"Expected an authentic SQL command\");\n const collector = new ParamCollector(params.dialect);\n const text = render({ dialect: params.dialect, collector });\n if (collector.values.length > params.dialect.paramBudget) invalid(\"SQL command exceeds this dialect's parameter budget; statements are never split implicitly\");\n return { text, values: collector.values };\n}\n",
58
+ "import { VibeError, fieldTypeIdentity, isEnumType, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { ExclusionEndpoint, ExclusionIR, ExclusionSpec, FieldIR, ModelIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { renderPredicate } from \"./predicate.ts\";\n\nfunction invalid(rule: string): never {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Invalid exclusion constraint: ${rule}`, meta: { rule: `exclusion-${rule}` } });\n}\n\n/** Compile immutable range construction and equality operands using physical column names. */\nexport function compileExclusion(params: { exclusion: ExclusionSpec; model: Pick<ModelIR, \"name\" | \"fields\">; dialect: SqlDialect }): ExclusionIR {\n const { exclusion: spec, model, dialect } = params;\n if (!dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: dialect.name, feature: \"exclusionConstraints\" });\n if (!spec.name || spec.name.includes(\"\\0\")) invalid(\"name\");\n if (![\"int8range\", \"tsrange\", \"tstzrange\"].includes(spec.range.type)) invalid(\"range-type\");\n if (![\"[)\", \"[]\", \"()\", \"(]\"].includes(spec.range.bounds)) invalid(\"bounds\");\n const field = (name: string): FieldIR => {\n const value = model.fields.find((entry) => entry.name === name);\n if (value === undefined || value.isList || value.isUnsupported) invalid(\"field\");\n return value;\n };\n const endpoint = (value: ExclusionEndpoint): string => {\n if (\"unbounded\" in value) return \"NULL\";\n const infinity = \"infinity\" in value ? value.infinity : value.nullAs;\n if (infinity !== undefined && (spec.range.type === \"int8range\" || ![\"infinity\", \"-infinity\"].includes(infinity))) invalid(\"infinity\");\n const literal = infinity === undefined ? undefined : `${dialect.quoteStringLiteral({ value: infinity })}::${spec.range.type === \"tsrange\" ? \"timestamp\" : \"timestamptz\"}`;\n if (\"infinity\" in value) return literal!;\n const column = field(value.field);\n if (fieldTypeIdentity({ type: column.type }) !== (spec.range.type === \"int8range\" ? \"BigInt\" : \"DateTime\")) invalid(\"range-field-type\");\n if (column.type === \"DateTime\") {\n const timezone = /timestamptz|timestamp.*with time zone/i.test(column.nativeType ?? \"timestamptz\");\n if (timezone !== (spec.range.type === \"tstzrange\")) invalid(\"range-timezone\");\n }\n const sql = dialect.quoteIdent({ name: column.dbName ?? column.name });\n return literal === undefined ? sql : `COALESCE(${sql}, ${literal})`;\n };\n const keys = spec.keys.map((key) => {\n if (\"expression\" in key) {\n if (!key.expression.trim() || key.expression.includes(\"\\0\") || key.fields.length === 0) invalid(\"expression\");\n key.fields.forEach(field);\n return `(${key.expression}) WITH =`;\n }\n const column = field(key.field);\n if (column.isOptional) invalid(\"nullable-key-requires-expression\");\n if (!isEnumType(column.type) && ![\"String\", \"Int\", \"BigInt\", \"Float\", \"Decimal\", \"Boolean\", \"DateTime\"].includes(fieldTypeIdentity({ type: column.type }))) invalid(\"key-type\");\n return `${dialect.quoteIdent({ name: column.dbName ?? column.name })} WITH =`;\n });\n keys.push(`${spec.range.type}(${endpoint(spec.range.lower)}, ${endpoint(spec.range.upper)}, ${dialect.quoteStringLiteral({ value: spec.range.bounds })}) WITH &&`);\n const where = spec.where === undefined ? \"\" : ` WHERE (${renderPredicate({ predicate: spec.where, model, dialect, usage: \"exclusionPredicate\", site: spec.name })})`;\n return { name: spec.name, definition: `EXCLUDE USING gist (${keys.join(\", \")})${where}`, source: spec, requiredExtensions: spec.keys.length === 0 ? [] : dialect.capabilities.exclusionExtensions };\n}\n\n/** Exclusion DDL is a constraint operation, never an index operation. */\nexport function renderExclusionSetup(params: { dialect: SqlDialect; exclusion: ExclusionIR }): string[] {\n if (!params.dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: params.dialect.name, feature: \"exclusionConstraints\" });\n return params.exclusion.requiredExtensions.map((name) => `CREATE EXTENSION IF NOT EXISTS ${params.dialect.quoteIdent({ name })};`);\n}\n\nexport function renderExclusionDdl(params: { dialect: SqlDialect; table: string; exclusion: ExclusionIR; operation: \"add\" | \"drop\" }): string[] {\n const { dialect, table, exclusion, operation } = params;\n if (!dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: dialect.name, feature: \"exclusionConstraints\" });\n const target = `ALTER TABLE ${dialect.quoteIdent({ name: table })}`;\n if (operation === \"drop\") return [`${target} DROP CONSTRAINT ${dialect.quoteIdent({ name: exclusion.name })};`];\n return [...renderExclusionSetup({ dialect, exclusion }), `${target} ADD CONSTRAINT ${dialect.quoteIdent({ name: exclusion.name })} ${exclusion.definition};`];\n}\n\n/** Read catalog exclusion definitions, including index health; optional private probe table. */\nexport function renderExclusionCatalog(params: { dialect: SqlDialect; probe?: string; namespace?: string }): string {\n const { dialect, probe } = params;\n if (!dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: dialect.name, feature: \"exclusionConstraints\" });\n const scope = probe === undefined ? `n.nspname = ${dialect.quoteStringLiteral({ value: params.namespace ?? \"public\" })}` : `t.oid = ${dialect.quoteStringLiteral({ value: probe })}::regclass`;\n return `SELECT t.relname AS table_name, c.conname AS constraint_name, pg_catalog.pg_get_constraintdef(c.oid, true) AS definition, c.convalidated AS validated, i.indisvalid AS valid, i.indisready AS ready FROM pg_catalog.pg_constraint c JOIN pg_catalog.pg_class t ON t.oid = c.conrelid JOIN pg_catalog.pg_namespace n ON n.oid = t.relnamespace JOIN pg_catalog.pg_index i ON i.indexrelid = c.conindid WHERE c.contype = 'x' AND ${scope} ORDER BY t.relname, c.conname`;\n}\n\n/** Empty private clone for server normalization; no existing row is scanned or changed. */\nexport function renderExclusionProbe(params: { dialect: SqlDialect; table: string; namespace?: string; probe: string; definition: string }): string[] {\n const { dialect, table, probe, definition } = params;\n if (!dialect.capabilities.exclusionConstraints) throw unsupportedCapability({ dialect: dialect.name, feature: \"exclusionConstraints\" });\n return [`CREATE TEMP TABLE ${dialect.quoteIdent({ name: probe })} (LIKE ${dialect.quoteIdent({ name: params.namespace ?? \"public\" })}.${dialect.quoteIdent({ name: table })})`, `ALTER TABLE ${dialect.quoteIdent({ name: probe })} ADD CONSTRAINT ${dialect.quoteIdent({ name: `${probe}_x` })} ${definition}`];\n}\n",
59
+ "/**\n * PostgreSQL dialect. Also serves PGlite — the differences are adapter-level\n * (single connection, bundled extension set), not SQL-text-level.\n */\n\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { POSTGRES_CAPABILITIES } from \"../capabilities.ts\";\nimport { assertNoNul } from \"../identifiers.ts\";\n\nexport const postgresDialect: SqlDialect = {\n name: \"postgres\",\n capabilities: POSTGRES_CAPABILITIES,\n\n inArrayStrategy: \"any\",\n tupleInStrategy: \"rowValue\",\n keyListStrategy: \"unnest\",\n keysetSeekStrategy: \"rowValue\",\n keyPageStrategy: \"lateral\",\n lateralJson: { rowArray: \"json_build_array\", arrayAgg: \"json_agg\", emptyArray: \"'[]'::json\", order: \"inAggregate\", timeOfDayAsText: false, requiresUtcDateTimeWire: false },\n relationStrategyDefault: \"join\",\n relationFilterStrategy: \"eqSelect\",\n // Fix lane Q2 (DB-02/DB-07): the key page gains only as an index-only scan;\n // a btree stores NULLs last on ASC, so `desc nulls last` / `asc nulls first` sort the table.\n deferredJoinPage: { minSkip: 1000, requiresCoveringIndex: true },\n nativeNullsOrder: \"high\",\n nullsUnionPage: true,\n timeOfDayInStrategy: \"in\",\n upsertForm: \"onConflict\",\n // Measured on postgres 16.14 (notes-B.md): a batch proposing one conflict key\n // twice raises SQLSTATE 21000 (\"ON CONFLICT DO UPDATE command cannot affect\n // row a second time\") — including when the two keys are only equal under a\n // nondeterministic ICU collation, a char(n) trailing-space pad, `numeric`\n // scale or `uuid` case. The engine compares every proposed pair itself.\n // Text is byte-comparable by default because every collation postgres\n // creates is deterministic unless it was explicitly built with\n // `deterministic = false`: 'e' and 'E' stayed two rows on a default-collation\n // column. `numeric` is the exception the ORM cannot see from the encoded\n // value: '1.0' and '1.00' are one row.\n conflictKeyEquality: {\n foldingScalars: [\"Decimal\"],\n textIsBinaryByDefault: true,\n duplicatesInOneStatement: \"reject\",\n },\n excludedRowRef: { form: \"keyword\", name: \"excluded\" },\n doNothingForm: \"onConflictDoNothing\",\n insensitiveLike: \"ilike\",\n // Postgres `=`/`LIKE` are already byte-sensitive — strict mode is a no-op.\n strictMatchStrategy: \"native\",\n greatestForm: \"native\",\n orderByNullsMode: \"native\",\n offsetRequiresLimit: null,\n likeEscapeClause: null,\n jsonPathMode: \"operators\",\n supportedJsonOps: [\n \"equals\",\n \"exists\",\n \"string_contains\",\n \"string_starts_with\",\n \"string_ends_with\",\n \"array_contains\",\n \"array_starts_with\",\n \"array_ends_with\",\n ],\n // Json params bind as TEXT and the server parses (`$n::text::jsonb`):\n // OID-typed drivers (bun:sql) would re-serialize a bare jsonb-slot param\n // and double-encode the document (JsonParamCell, ast.ts).\n jsonParamCast: \"::text::jsonb\",\n valueCastTypes: Object.freeze({ String: \"TEXT\", Boolean: \"BOOLEAN\", Int: \"INTEGER\", BigInt: \"BIGINT\", Float: \"DOUBLE PRECISION\", Decimal: \"NUMERIC\", DateTime: \"TIMESTAMPTZ\", Json: \"JSONB\", Bytes: \"BYTEA\" }),\n lastInsertIdSql: null,\n // All four strengths and all three wait policies parse and behave on\n // PostgreSQL 18.6 and on PGlite 0.5.4 (PostgreSQL 18.3) — probed, not assumed.\n rowLockSyntax: {\n strengths: Object.freeze({\n update: \"FOR UPDATE\",\n noKeyUpdate: \"FOR NO KEY UPDATE\",\n share: \"FOR SHARE\",\n keyShare: \"FOR KEY SHARE\",\n }),\n wait: Object.freeze({ wait: \"\", nowait: \" NOWAIT\", skipLocked: \" SKIP LOCKED\" }),\n },\n // Transaction-scoped only. The session-scoped family (pg_advisory_lock) is\n // deliberately absent: on a pooled connection its lock outlives the caller.\n advisoryLockFunctions: {\n exclusive: Object.freeze({\n wait: \"pg_catalog.pg_advisory_xact_lock\",\n nowait: \"pg_catalog.pg_try_advisory_xact_lock\",\n }),\n shared: Object.freeze({\n wait: \"pg_catalog.pg_advisory_xact_lock_shared\",\n nowait: \"pg_catalog.pg_try_advisory_xact_lock_shared\",\n }),\n keyCast: Object.freeze({ single: \"::bigint\", pair: \"::int4\" }),\n },\n rowDefaultKeyword: true,\n bulkInsertForm: \"unnest\",\n emptyInsert: { form: \"defaultValues\", conflictClause: true },\n // Data-modifying CTEs (`WITH s AS (UPDATE … RETURNING …) SELECT …`) — one\n // snapshot, one atomic statement; PGlite runs the same engine.\n statementChain: \"dataModifyingCte\",\n paramBudget: 30000,\n\n // A real `boolean` type — `true`/`false` are the literals it stores.\n booleanLiteral: { true: \"true\", false: \"false\" },\n\n quoteIdent({ name }) {\n return `\"${assertNoNul({ name }).replaceAll('\"', '\"\"')}\"`;\n },\n // `standard_conforming_strings` has been on by default since postgres 9.1,\n // so a backslash is an ordinary character and only the quote is doubled.\n quoteStringLiteral({ value }) {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n },\n renderEnumOrdinal({ column }) {\n return column;\n },\n renderEnumMinMax({ fn, column }) {\n return `${fn === \"min\" ? \"MIN\" : \"MAX\"}(${column})`;\n },\n placeholder({ index }) {\n return `$${index}`;\n },\n jsonTextProjection({ expression }): string {\n return `${expression}::text`;\n },\n renderDbNow({ offsetSeconds, collector }) {\n if (offsetSeconds === 0) return \"now()\";\n return `(now() + make_interval(secs => ${collector.add(offsetSeconds)}))`;\n },\n renderRowsDiffer({ left, right }) {\n const row = (items: readonly string[]): string => (items.length === 1 ? (items[0] as string) : `(${items.join(\", \")})`);\n return `${row(left)} IS DISTINCT FROM ${row(right)}`;\n },\n};\n",
60
+ "/**\n * MySQL dialect (mysql2 adapter lands in P4).\n *\n * Notes pinned by catalog cases:\n * - No RETURNING → renderer omits it and flags `returning: \"omitted\"`; the\n * runtime re-selects by PK (app-generated ids) or insertId.\n * - Upserts use ON DUPLICATE KEY UPDATE (no conflict-target refinement).\n * - OFFSET requires LIMIT → the documented huge-limit idiom.\n * - No NULLS FIRST/LAST → `col IS NULL` emulation terms.\n * - No `ON CONFLICT ... DO NOTHING` → `ON DUPLICATE KEY UPDATE k = t.k` (a\n * no-op self-assignment on ANY duplicate key). Never `INSERT IGNORE`, which\n * also downgrades NOT NULL, range and foreign-key errors to warnings.\n */\n\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { MYSQL_CAPABILITIES } from \"../capabilities.ts\";\nimport { assertNoNul } from \"../identifiers.ts\";\n\nexport const mysqlDialect: SqlDialect = {\n name: \"mysql\",\n capabilities: MYSQL_CAPABILITIES,\n\n inArrayStrategy: \"expand\",\n tupleInStrategy: \"rowValue\",\n keyListStrategy: \"rowValue\",\n // D-01: the OR is already index ranges here; a row-value inequality scans.\n keysetSeekStrategy: \"or\",\n // Fix lane Q1 (DB-01/DB-03): a lateral page still read every child; EXISTS is a semi-join.\n keyPageStrategy: \"window\",\n // Lane J (wave 3): MySQL 8.0.14+ LATERAL + JSON_ARRAYAGG. JSON_ARRAYAGG has\n // no ORDER BY, so ordered levels carry a ROW_NUMBER() position slot.\n lateralJson: { rowArray: \"JSON_ARRAY\", arrayAgg: \"JSON_ARRAYAGG\", emptyArray: \"JSON_ARRAY()\", order: \"positionSlot\", timeOfDayAsText: true, requiresUtcDateTimeWire: true },\n relationStrategyDefault: \"join\",\n relationFilterStrategy: \"exists\",\n // Fix lane Q2 (DB-02/DB-07): deep OFFSET flips to a table scan from skip ≈ 5 000;\n // the `IS NULL` pre-term of a non-native placement is an expression no index serves.\n deferredJoinPage: { minSkip: 1000, requiresCoveringIndex: false },\n nativeNullsOrder: \"low\",\n nullsUnionPage: true,\n // 8.4.11: `time3_col IN (?, ?)` matches nothing; `=` per value works (26.7 both).\n timeOfDayInStrategy: \"equalities\",\n upsertForm: \"onDuplicateKey\",\n // Measured on mysql 8.4.11, server collation utf8mb4_0900_ai_ci (notes-B.md):\n // a batch proposing 'e' and 'E' stores ONE row and keeps the last one, with\n // no error. The same fold hits accents; `utf8mb4_general_ci` folds a trailing\n // space too (PAD SPACE), and a `DECIMAL(65,30)` key folds '1.0' into '1.00'.\n // A column declaring a `_bin` collation is byte-comparable again: 'e' and 'E'\n // stayed two rows there.\n conflictKeyEquality: {\n foldingScalars: [\"Decimal\"],\n defaultStringMaxLength: 191,\n textIsBinaryByDefault: false,\n // A declared `@collation` can make it byte-comparable again, but only a\n // measured NO PAD one: `SELECT COLLATION_NAME, PAD_ATTRIBUTE FROM\n // information_schema.COLLATIONS` reports 'NO PAD' for exactly `binary` and\n // `utf8mb4_0900_bin`, and 'PAD SPACE' for `utf8mb4_bin` and the 39 other\n // legacy `_bin` collations. Under PAD SPACE the ORM's own upsert statement\n // stored ONE row for a batch proposing 'x' and 'x '. The list the runtime\n // checks against lives in packages/runtime/src/bulk-upsert.ts.\n duplicatesInOneStatement: \"lastWriteWins\",\n },\n // 8.0.19+ row alias. The older `VALUES(col)` function answers with\n // deprecation warning 1287 on this project's 8.4.11 container.\n excludedRowRef: { form: \"rowAlias\", alias: \"new\" },\n doNothingForm: \"duplicateKeyKeep\",\n insensitiveLike: \"lower\",\n // `_ci` collations fold `=` and `LIKE` — strict mode casts the OPERAND to\n // BINARY (byte-wise comparison; CAST form, the unary BINARY operator is\n // deprecated since 8.0.27). Operand-side: no assumption about the column's\n // charset, and the cost (index defeat) is documented in dialect-notes.md.\n strictMatchStrategy: \"binary\",\n // Correlated derived tables need MySQL 8.0.14+ (outer references); 8.4\n // needs each operand in its own scalar subquery (dialect.ts).\n greatestForm: \"wrapped-frame\",\n orderByNullsMode: \"emulate\",\n offsetRequiresLimit: { limitText: \"18446744073709551615\" },\n likeEscapeClause: null,\n // JSON_EXTRACT/JSON_UNQUOTE for scalars and strings; JSON_CONTAINS for\n // array containment; `$[0]` / `$[last]` path elements for the edge ops.\n jsonPathMode: \"mysqlExtract\",\n supportedJsonOps: [\n \"equals\",\n \"exists\",\n \"string_contains\",\n \"string_starts_with\",\n \"string_ends_with\",\n \"array_contains\",\n \"array_starts_with\",\n \"array_ends_with\",\n ],\n // Json transport is already plain text here — no param cast needed.\n jsonParamCast: \"\",\n valueCastTypes: Object.freeze({ String: \"CHAR\", Boolean: \"UNSIGNED\", Int: \"SIGNED\", BigInt: \"SIGNED\", Float: \"DOUBLE\", Decimal: \"DECIMAL(65, 30)\", DateTime: \"DATETIME(3)\", Json: \"JSON\", Bytes: \"BINARY\" }),\n lastInsertIdSql: \"SELECT LAST_INSERT_ID() AS `id`\",\n // Probed on mysql 26.7.0: FOR UPDATE / FOR SHARE, each with NOWAIT or SKIP\n // LOCKED. `FOR NO KEY UPDATE` and `FOR KEY SHARE` are PostgreSQL-only and\n // fail to parse here (errno 1064), so they are absent rather than aliased\n // onto a stronger lock. A plain shared lock is `LOCK IN SHARE MODE`: the\n // same lock, and the one spelling MariaDB (MDEV-17514) and MySQL before\n // 8.0.1 parse; 26.7.0 takes it without a warning. `FOR SHARE` stays for\n // `OF` and wait policies, which only `FOR SHARE` carries on MySQL.\n rowLockSyntax: {\n strengths: Object.freeze({ update: \"FOR UPDATE\", share: \"FOR SHARE\" }),\n wait: Object.freeze({ wait: \"\", nowait: \" NOWAIT\", skipLocked: \" SKIP LOCKED\" }),\n plain: Object.freeze({ share: \"LOCK IN SHARE MODE\" }),\n },\n // `GET_LOCK` is SESSION-scoped: the probe held one, rolled the transaction\n // back, and the lock was still held. It cannot deliver a transaction-scoped\n // advisory lock, so mysql declares none.\n advisoryLockFunctions: null,\n rowDefaultKeyword: true,\n bulkInsertForm: \"values\",\n emptyInsert: { form: \"emptyRow\" },\n // MySQL CTEs are read-only — no data-modifying steps.\n statementChain: null,\n paramBudget: 10000,\n\n // Booleans store as TINYINT(1); 1/0 is what a comparison against stored rows\n // actually meets, and `TRUE`/`FALSE` are only aliases for them.\n booleanLiteral: { true: \"1\", false: \"0\" },\n\n quoteIdent({ name }) {\n return `\\`${assertNoNul({ name }).replaceAll(\"`\", \"``\")}\\``;\n },\n // Mysql treats BOTH the doubled quote and the backslash as escapes unless the\n // server runs `NO_BACKSLASH_ESCAPES`, which VibeORM never assumes. Verified on\n // mysql 8.4.11: inserting the literal `'a\\\\b'` stores bytes `61 5C 62`, so a\n // single authored backslash MUST be doubled or it eats the next character.\n quoteStringLiteral({ value }) {\n return `'${value.replaceAll(\"\\\\\", \"\\\\\\\\\").replaceAll(\"'\", \"''\")}'`;\n },\n renderEnumOrdinal({ column }) {\n return `${column} + 0`;\n },\n renderEnumMinMax({ fn, column, result, when }) {\n const aggregate = fn === \"min\" ? \"MIN\" : \"MAX\";\n const only = (value: string): string => when === undefined ? value : `CASE WHEN ${when} THEN ${value} END`;\n if (result === \"ordinal\") return `${aggregate}(${only(`${column} + 0`)})`;\n // Five digits cover all 65,535 member indexes. Keep the database's own label\n // after the sortable prefix, without schema labels or SQL-mode-dependent escapes.\n return `SUBSTRING(${aggregate}(${only(`CONCAT(LPAD(${column} + 0, 5, '0'), ${column})`)}), 6)`;\n },\n placeholder() {\n return \"?\";\n },\n jsonTextProjection({ expression }): string {\n return `CAST(${expression} AS CHAR)`;\n },\n renderDbNow({ offsetSeconds, collector }) {\n // NOW(6): microsecond precision — assignment to a lower-precision column\n // truncates, matching the driver's own Date serialization precision.\n if (offsetSeconds === 0) return \"NOW(6)\";\n return `DATE_ADD(NOW(6), INTERVAL ${collector.add(offsetSeconds)} SECOND)`;\n },\n renderRowsDiffer({ left, right }) {\n const row = (items: readonly string[]): string => (items.length === 1 ? (items[0] as string) : `(${items.join(\", \")})`);\n return `NOT (${row(left)} <=> ${row(right)})`;\n },\n};\n",
61
+ "/**\n * Dialect registry: the one place a `Dialect` name becomes a `SqlDialect`.\n *\n * Runtime and adapters resolve through this map so nobody re-implements the\n * lookup (and nobody can quietly forget a dialect — the Record type is total).\n */\n\nimport type { Dialect } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { postgresDialect } from \"./postgres.ts\";\nimport { sqliteDialect } from \"./sqlite.ts\";\nimport { mysqlDialect } from \"./mysql.ts\";\n\nexport const SQL_DIALECTS: Readonly<Record<Dialect, SqlDialect>> = {\n postgres: postgresDialect,\n sqlite: sqliteDialect,\n mysql: mysqlDialect,\n};\n\n/** The SQL dialect a dialect name selects. */\nexport function getSqlDialect(params: { dialect: Dialect }): SqlDialect {\n return SQL_DIALECTS[params.dialect];\n}\n",
62
+ "import { localDateCheckName } from \"@vibeorm/schema\";\nimport type { CheckIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\n\n/** The single owned SQLite calendar/domain CHECK; native DATE dialects need no marker. */\nexport function renderLocalDateCheck({ dialect, table, column }: {\n readonly dialect: SqlDialect;\n readonly table: string;\n readonly column: string;\n}): CheckIR | undefined {\n if (dialect.name !== \"sqlite\") return undefined;\n const quoted = dialect.quoteIdent({ name: column });\n // The lower bound is NULL-safe and refuses SQLite's otherwise valid year zero.\n return {\n name: localDateCheckName({ table, column }),\n expression: `${quoted} IS date(${quoted}) AND (${quoted} IS NULL OR ${quoted} >= ${dialect.quoteStringLiteral({ value: \"0001-01-01\" })})`,\n };\n}\n",
63
+ "/**\n * Column types per dialect: the type migrate creates for a scalar field, in\n * the spelling it compares types by. ONE rule, read by migrate's differ and by\n * the runtime's `describeSchema`, so two fields that describe the same type\n * are two columns migrate would never ALTER into each other.\n *\n * A field without a native type gets its scalar's column type\n * (dialect-matrix §2). A declared `@db.*` type replaces it on PostgreSQL and\n * MySQL unless it IS that type spelled another way. SQLite stores every column\n * by its scalar's storage class and ignores native types.\n */\n\nimport type { Dialect, ScalarType } from \"@vibeorm/schema\";\nimport { mysqlDialect } from \"./dialects/mysql.ts\";\n\n// ─── Scalar column types ──────────────────────────────────────────\n\n/** IR scalar → the PostgreSQL column type migrate creates. */\nexport const POSTGRES_SCALAR_COLUMN_TYPES: Readonly<Record<ScalarType, string>> = Object.freeze({\n String: \"text\",\n Boolean: \"boolean\",\n Int: \"integer\",\n BigInt: \"bigint\",\n Float: \"double precision\",\n Decimal: \"numeric\",\n DateTime: \"timestamptz\",\n Json: \"jsonb\",\n Bytes: \"bytea\",\n});\n\n/** IR scalar → the MySQL column type migrate creates (information_schema spelling). */\nexport const MYSQL_SCALAR_COLUMN_TYPES: Readonly<Record<ScalarType, string>> = Object.freeze({\n String: `varchar(${mysqlDialect.conflictKeyEquality.defaultStringMaxLength})`,\n Boolean: \"tinyint(1)\",\n Int: \"int\",\n BigInt: \"bigint\",\n Float: \"double\",\n Decimal: \"decimal(65,30)\",\n DateTime: \"datetime(3)\",\n Json: \"json\",\n Bytes: \"longblob\",\n});\n\n/** IR scalar → the SQLite storage class migrate declares. */\nexport const SQLITE_SCALAR_STORAGE_CLASSES: Readonly<Record<ScalarType, string>> = Object.freeze({\n String: \"TEXT\",\n Boolean: \"INTEGER\",\n Int: \"INTEGER\",\n BigInt: \"INTEGER\",\n Float: \"REAL\",\n Decimal: \"TEXT\",\n DateTime: \"TEXT\",\n Json: \"TEXT\",\n Bytes: \"BLOB\",\n});\n\n// ─── PostgreSQL spelling ──────────────────────────────────────────\n\n/**\n * Alias map applied to the base name of a native type (everything before the\n * parenthesized modifier) so that schema-declared `@db.*` spellings and\n * catalog-reported names compare equal.\n */\nexport const POSTGRES_NATIVE_ALIASES: Readonly<Record<string, string>> = Object.freeze({\n charactervarying: \"varchar\",\n character: \"char\",\n bpchar: \"char\",\n int: \"integer\",\n int4: \"integer\",\n int2: \"smallint\",\n int8: \"bigint\",\n serial: \"integer\",\n bigserial: \"bigint\",\n bool: \"boolean\",\n float4: \"real\",\n float8: \"doubleprecision\",\n double: \"doubleprecision\",\n doubleprecision: \"doubleprecision\",\n decimal: \"numeric\",\n timestampwithtimezone: \"timestamptz\",\n timestampwithouttimezone: \"timestamp\",\n timewithtimezone: \"timetz\",\n timewithouttimezone: \"time\",\n bitvarying: \"varbit\",\n});\n\n/** Modifiers PostgreSQL applies when none is declared, so the declared and the catalog spelling compare equal (`bit` IS `bit(1)`). */\nconst POSTGRES_IMPLICIT_MODIFIERS: Readonly<Record<string, string>> = Object.freeze({\n bit: \"(1)\",\n});\n\n/**\n * Temporal types whose bare spelling already means precision 6, so an explicit\n * `(6)` is the same type and normalizes to the bare name. `timestamptz` is not\n * here: migrate grandfathers its precisions per scalar\n * ({@link POSTGRES_EXACT_EQUIVALENTS} and its own looser class).\n */\nconst POSTGRES_DEFAULT_PRECISION_SIX: ReadonlySet<string> = new Set([\"timestamp\", \"time\", \"timetz\"]);\n\n/**\n * Normalize a PostgreSQL type string for comparison: lowercase, whitespace\n * stripped, base name de-aliased. `\"VarChar(191)\"` and `\"character\n * varying(191)\"` both become `\"varchar(191)\"`.\n */\nexport function normalizePostgresNativeType(params: { readonly raw: string }): string {\n const compact = params.raw.toLowerCase().replace(/\\s+/g, \"\");\n const match = compact.match(/^([a-z_0-9]+)(\\(.*\\))?(\\[\\])?$/);\n if (match === null) return compact;\n const base = POSTGRES_NATIVE_ALIASES[match[1] as string] ?? (match[1] as string);\n const modifier = POSTGRES_DEFAULT_PRECISION_SIX.has(base) && match[2] === \"(6)\" ? \"\" : match[2] ?? POSTGRES_IMPLICIT_MODIFIERS[base] ?? \"\";\n return `${base}${modifier}${match[3] ?? \"\"}`;\n}\n\n/**\n * Native spellings an explicit declaration compares EQUAL to its scalar's\n * column type without being it: `@db.Timestamptz(6)` is bare `timestamptz`\n * spelled out. Nothing grandfathered: `timestamptz(3)` stays its own type.\n */\nexport const POSTGRES_EXACT_EQUIVALENTS: Readonly<Partial<Record<ScalarType, readonly string[]>>> = Object.freeze({\n DateTime: Object.freeze([\"timestamptz(6)\"]),\n});\n\n// ─── MySQL spelling ───────────────────────────────────────────────\n\nconst MYSQL_NATIVE_ALIASES: Readonly<Record<string, string>> = Object.freeze({\n integer: \"int\",\n dec: \"decimal\",\n numeric: \"decimal\",\n bool: \"tinyint(1)\",\n boolean: \"tinyint(1)\",\n character: \"char\",\n});\n\n/**\n * Normalize a MySQL type string for comparison: lowercase, whitespace\n * stripped, base de-aliased, integer display widths dropped (MySQL 8.0.19+\n * omits them; older catalogs report `int(11)`) — EXCEPT `tinyint(1)`, which is\n * the Boolean marker and must survive normalization. A zero fractional\n * precision on a temporal type is dropped: the catalog reports\n * `datetime(0)` as `datetime`.\n */\nexport function normalizeMysqlNativeType(params: { readonly raw: string }): string {\n const compact = params.raw.toLowerCase().replace(/\\s+/g, \"\");\n if (compact === \"tinyint(1)\" || compact === \"bool\" || compact === \"boolean\") return \"tinyint(1)\";\n const match = compact.match(/^([a-z_0-9]+)(\\(.*\\))?(.*)$/);\n if (match === null) return compact;\n const base = MYSQL_NATIVE_ALIASES[match[1] as string] ?? (match[1] as string);\n let modifier = match[2] ?? \"\";\n if (/^(tinyint|smallint|mediumint|int|bigint)$/.test(base)) modifier = \"\";\n if (modifier === \"(0)\" && /^(datetime|timestamp|time)$/.test(base)) modifier = \"\";\n return `${base}${modifier}${match[3] ?? \"\"}`;\n}\n\n// ─── The column type ──────────────────────────────────────────────\n\n/**\n * The column type migrate creates for a scalar field on `dialect`, in the\n * spelling it compares types by (an explicit declaration's exact comparison):\n * the same answer for two fields means the same column type. `nativeType` is\n * the field's declared `@db.*` text; for a list field the answer is the\n * element type.\n *\n * - PostgreSQL: `String` and `String @db.Text` are `\"text\"`; `Int`,\n * `@db.Int4` and `@db.Integer` are `\"integer\"`; `Float` and\n * `@db.DoublePrecision` are `\"doubleprecision\"`; `DateTime` and\n * `@db.Timestamptz(6)` are `\"timestamptz\"`, while `@db.Timestamptz(3)` is\n * `\"timestamptz(3)\"`.\n * - MySQL: `String` is `\"varchar(191)\"`, `Boolean` `\"tinyint(1)\"`, display\n * widths dropped (`int(11)` is `\"int\"`).\n * - SQLite: the storage class (`\"TEXT\"`, `\"INTEGER\"`, `\"REAL\"`, `\"BLOB\"`);\n * a native type changes nothing there.\n */\nexport function canonicalColumnType(params: { readonly dialect: Dialect; readonly scalar: ScalarType; readonly nativeType?: string | undefined }): string {\n const { dialect, scalar, nativeType } = params;\n switch (dialect) {\n case \"postgres\": {\n const canonical = normalizePostgresNativeType({ raw: POSTGRES_SCALAR_COLUMN_TYPES[scalar] });\n if (nativeType === undefined) return canonical;\n const declared = normalizePostgresNativeType({ raw: nativeType });\n return declared === canonical || POSTGRES_EXACT_EQUIVALENTS[scalar]?.includes(declared) === true ? canonical : declared;\n }\n case \"mysql\":\n return normalizeMysqlNativeType({ raw: nativeType ?? MYSQL_SCALAR_COLUMN_TYPES[scalar] });\n case \"sqlite\":\n return SQLITE_SCALAR_STORAGE_CLASSES[scalar];\n }\n}\n",
64
+ "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { GeneratedColumnIR } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { renderPostgresGeneratedColumnClause } from \"./dialects/postgres-generated-columns.ts\";\nimport { renderMysqlGeneratedColumnClause } from \"./dialects/mysql-generated-columns.ts\";\nimport { renderSqliteGeneratedColumnClause } from \"./dialects/sqlite-generated-columns.ts\";\n\n/** SQL helper name for the canonical stored generation declaration. */\nexport type GeneratedColumnDeclaration = GeneratedColumnIR;\n\n/** Source evidence; virtual storage is reported for the caller's admission check. */\nexport type ExtractedGeneratedColumn = {\n readonly expression: string;\n readonly storage: \"stored\" | \"virtual\";\n readonly columnSql: string;\n /** Declaration prefix, including any type/charset/collation/nullability qualifiers. */\n readonly typeSql: string;\n};\n\n/** Render trusted physical SQL without interpreting or rewriting its expression. */\nexport function renderGeneratedColumnClause({ dialect, generated }: {\n readonly dialect: SqlDialect;\n readonly generated: GeneratedColumnDeclaration;\n}): string {\n if (!(\"generatedColumns\" in dialect.capabilities) || dialect.capabilities.generatedColumns !== true) {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"generatedColumns\" });\n }\n if (generated.storage !== \"stored\") {\n throw unsupportedCapability({ dialect: dialect.name, feature: \"virtualGeneratedColumns\" });\n }\n if (typeof generated.expression !== \"string\" || generated.expression.trim().length === 0 || generated.expression.includes(\"\\0\")) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: \"A generated column requires non-empty, NUL-free SQL\", meta: { reason: \"generated-expression-invalid\" } });\n }\n switch (dialect.name) {\n case \"postgres\": return renderPostgresGeneratedColumnClause({ generated });\n case \"mysql\": return renderMysqlGeneratedColumnClause({ generated });\n case \"sqlite\": return renderSqliteGeneratedColumnClause({ generated });\n }\n}\n",
65
+ "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { GeneratedColumnDeclaration } from \"../generated-columns.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/**\n * PostgreSQL stored syntax; the public dispatcher performs declaration admission.\n * @internal\n */\nexport function renderPostgresGeneratedColumnClause({ generated }: {\n readonly generated: GeneratedColumnDeclaration;\n}): string {\n return `GENERATED ALWAYS AS (${generated.expression}) STORED`;\n}\n\n/** The migration owner creates the desired base context inside the private savepoint. */\nexport type PostgresGeneratedColumnProbe =\n | { readonly operation: \"savepoint\" | \"rollback\" | \"release\"; readonly savepoint: string }\n | { readonly operation: \"add\"; readonly table: QualifiedSqlName; readonly column: string; readonly definition: string };\n\n/** Render pinned-session scratch statements; this helper never executes or manages a session. */\nexport function renderPostgresGeneratedColumnProbe({ dialect, probe }: {\n readonly dialect: SqlDialect;\n readonly probe: PostgresGeneratedColumnProbe;\n}): RenderedQuery {\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"rollbackGeneratedColumnProbe\" });\n const q = ({ name }: { readonly name: string }): string => dialect.quoteIdent({ name });\n let text: string;\n switch (probe.operation) {\n case \"savepoint\": text = `SAVEPOINT ${q({ name: probe.savepoint })}`; break;\n case \"rollback\": text = `ROLLBACK TO SAVEPOINT ${q({ name: probe.savepoint })}`; break;\n case \"release\": text = `RELEASE SAVEPOINT ${q({ name: probe.savepoint })}`; break;\n case \"add\": text = `ALTER TABLE ${q({ name: probe.table.namespace })}.${q({ name: probe.table.name })} ADD COLUMN ${q({ name: probe.column })} ${probe.definition}`; break;\n }\n return { text, values: [], returning: \"none\" };\n}\n\n/** Approved stored-generated to ordinary conversion, retaining the present stored values. */\nexport function renderPostgresDropGeneratedExpression({ dialect, table, column }: {\n readonly dialect: SqlDialect;\n readonly table: QualifiedSqlName;\n readonly column: string;\n}): RenderedQuery {\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"dropGeneratedExpression\" });\n return { text: `ALTER TABLE ${dialect.quoteIdent({ name: table.namespace })}.${dialect.quoteIdent({ name: table.name })} ALTER COLUMN ${dialect.quoteIdent({ name: column })} DROP EXPRESSION`, values: [], returning: \"none\" };\n}\n",
66
+ "import { VibeError, internalError, normalizeRowRules, rowRuleGateField, rowRuleIdentities, rowRuleProtectedFields, rowRuleShapeIssue, rowRuleTriggerName, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { FieldIR, ModelIR, QualifiedSqlName, RowRuleEvent, RowRuleIR, SchemaIR, SqlObjectIdentity } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"./dialect.ts\";\nimport { renderPostgresRowRule } from \"./dialects/postgres-row-rules.ts\";\nimport { renderSqliteRowRule } from \"./dialects/sqlite-row-rules.ts\";\nimport { renderMysqlRowRule } from \"./dialects/mysql-row-rules.ts\";\n\n/**\n * Finalized row-only inputs for the two per-event trigger renderers; not a SQL root export.\n * @internal\n */\nexport type EventRowRuleContext = {\n readonly model: string;\n readonly table: QualifiedSqlName;\n readonly rule: RowRuleIR;\n readonly triggers: readonly {\n readonly event: RowRuleEvent;\n readonly identity: { readonly kind: \"trigger\"; readonly table: QualifiedSqlName; readonly name: string };\n }[];\n readonly protectedFields: readonly FieldIR[];\n readonly gateField?: FieldIR;\n /** MySQL only: keep a re-created trigger at its earlier action-order position. */\n readonly placement?: Readonly<Record<string, RowRuleTriggerPlacement>>;\n};\n\n/**\n * MySQL `FOLLOWS`/`PRECEDES` position for one rule trigger, keyed by its event\n * trigger name. Disposable references use it to re-create a trigger where it was,\n * so a verification replay never changes the action order it then compares.\n */\nexport type RowRuleTriggerPlacement = { readonly follows: string } | { readonly precedes: string };\n\n/** Parameter-free rule DDL; each function body remains one complete statement. */\nexport type RowRuleStatement = {\n readonly text: string;\n readonly values: readonly unknown[];\n};\n\n/** Dialect-neutral physical output; later dialects may emit several triggers and no function. */\nexport type RenderedRowRule = {\n readonly identities: readonly SqlObjectIdentity[];\n /** Create objects after the final table shape exists, in dependency order. */\n readonly create: readonly RowRuleStatement[];\n /** Drop objects before invalidating table changes, in reverse dependency order. */\n readonly drop: readonly RowRuleStatement[];\n /** Logical fields, not observed catalog dependencies; generated fields are excluded. */\n readonly protectedFields: readonly string[];\n /** OLD's non-NULL activation field; it is also protected against later changes. */\n readonly gateField?: string;\n};\n\n/** Render a canonical declaration against the complete finalized model and authored generated-column evidence. */\nexport function renderRowRule({ schema, model, rule, dialect, placement }: {\n readonly schema: SchemaIR;\n readonly model: ModelIR;\n readonly rule: RowRuleIR;\n readonly dialect: SqlDialect;\n /** MySQL only; other engines have no trigger-order clause. */\n readonly placement?: Readonly<Record<string, RowRuleTriggerPlacement>>;\n}): RenderedRowRule {\n const issue = rowRuleShapeIssue({ value: rule });\n if (issue !== undefined) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: issue, meta: { model: model.name } });\n }\n if (placement !== undefined && Object.keys(placement).length > 0 && dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: dialect.name, feature: \"rowRuleTriggerPlacement\" });\n const normalized = normalizeRowRules({ schema, model, rules: [rule], dialect: dialect.name })[0]!;\n switch (dialect.name) {\n case \"postgres\": {\n const objects = rowRuleIdentities({ schema, model, rule: normalized, dialect: dialect.name });\n const functionIdentity = objects.find((object) => object.role === \"function\")?.identity;\n const triggerIdentity = objects.find((object) => object.role === \"trigger\")?.identity;\n if (functionIdentity?.kind !== \"function\" || triggerIdentity?.kind !== \"trigger\") throw internalError({ message: \"PostgreSQL row rules own one function and one trigger\", meta: { model: model.name, rule: normalized.name } });\n const gate = rowRuleGateField({ rule: normalized });\n const gateField = gate === undefined ? undefined : model.fields.find((field) => field.name === gate);\n return renderPostgresRowRule({\n dialect,\n context: {\n model: model.name, table: triggerIdentity.table, rule: normalized,\n functionIdentity, triggerIdentity: { kind: \"trigger\", table: triggerIdentity.table, name: triggerIdentity.name },\n protectedFields: rowRuleProtectedFields({ schema, model, rule: normalized }),\n ...(gateField === undefined ? {} : { gateField }),\n },\n });\n }\n case \"sqlite\":\n case \"mysql\": {\n const objects = rowRuleIdentities({ schema, model, rule: normalized, dialect: dialect.name });\n const triggers = objects.map(({ role, identity }): EventRowRuleContext[\"triggers\"][number] => {\n if (role !== \"trigger\" || identity.kind !== \"trigger\") throw internalError({ message: \"Event row rules own only triggers\", meta: { model: model.name, rule: normalized.name } });\n const event = ([\"update\", \"delete\"] as const).find((event) => identity.name === rowRuleTriggerName({ rule: normalized, event }));\n if (event === undefined) throw internalError({ message: \"Row-rule identity has no declared event\", meta: { model: model.name, rule: normalized.name, trigger: identity.name } });\n return { event, identity: { kind: \"trigger\", table: identity.table, name: identity.name } };\n });\n const table = triggers[0]?.identity.table;\n if (table === undefined) throw internalError({ message: \"Event row rules require at least one trigger\", meta: { model: model.name, rule: normalized.name } });\n const gate = rowRuleGateField({ rule: normalized });\n const gateField = gate === undefined ? undefined : model.fields.find((field) => field.name === gate);\n const context: EventRowRuleContext = {\n model: model.name, table, rule: normalized, triggers,\n protectedFields: rowRuleProtectedFields({ schema, model, rule: normalized }),\n ...(gateField === undefined ? {} : { gateField }),\n ...(placement === undefined ? {} : { placement }),\n };\n return dialect.name === \"sqlite\" ? renderSqliteRowRule({ dialect, context }) : renderMysqlRowRule({ dialect, context });\n }\n }\n}\n",
67
+ "import { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { FieldIR, QualifiedSqlName, RowRuleIR, SqlObjectIdentity } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedRowRule } from \"../row-rules.ts\";\n\n// ─── Stored-value equality ────────────────────────────────────────\n\nfunction comparison({ dialect, field }: { readonly dialect: SqlDialect; readonly field: FieldIR }): string {\n const column = dialect.quoteIdent({ name: field.dbName ?? field.name });\n const cast = field.type === \"Json\" ? `::pg_catalog.jsonb${field.isList ? \"[]\" : \"\"}` : \"\";\n return `OLD.${column}${cast} IS DISTINCT FROM NEW.${column}${cast}`;\n}\n\n// ─── PostgreSQL physical objects ──────────────────────────────────\n\n/**\n * A finalized PostgreSQL comparison context, supplied by the canonical schema collector.\n * @internal\n */\nexport type PostgresRowRuleContext = {\n readonly model: string;\n readonly table: QualifiedSqlName;\n readonly rule: RowRuleIR;\n readonly functionIdentity: Extract<SqlObjectIdentity, { readonly kind: \"function\" }>;\n readonly triggerIdentity: { readonly kind: \"trigger\"; readonly table: QualifiedSqlName; readonly name: string };\n readonly protectedFields: readonly FieldIR[];\n readonly gateField?: FieldIR;\n};\n\n/**\n * Emit one ordinary invoker function and an unfiltered BEFORE row trigger; no live objects are taken over.\n * @internal\n */\nexport function renderPostgresRowRule({ dialect, context }: {\n readonly dialect: SqlDialect;\n readonly context: PostgresRowRuleContext;\n}): RenderedRowRule {\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"postgresRowRules\" });\n const { rule, table, functionIdentity, triggerIdentity, protectedFields, gateField } = context;\n const qualify = ({ name }: { readonly name: QualifiedSqlName }): string => `${dialect.quoteIdent({ name: name.namespace })}.${dialect.quoteIdent({ name: name.name })}`;\n const functionName = qualify({ name: functionIdentity.name });\n const tableName = qualify({ name: table });\n const triggerName = dialect.quoteIdent({ name: triggerIdentity.name });\n const constraint = dialect.quoteStringLiteral({ value: triggerIdentity.name });\n const raise = `RAISE EXCEPTION 'VibeORM row rule refused mutation'\\n${rule.kind === \"appendOnly\" ? \" \" : \" \"}USING ERRCODE = 'check_violation', CONSTRAINT = ${constraint};`;\n let body: string;\n if (rule.kind === \"appendOnly\") {\n body = `BEGIN\\n ${raise}\\nEND;`;\n } else {\n const terms = protectedFields.map((field) => comparison({ dialect, field }));\n if (terms.length === 0) {\n throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row rule ${rule.name} has no protected fields`, meta: { model: context.model, rule: rule.name } });\n }\n const condition = gateField === undefined\n ? terms.join(\"\\n OR \")\n : `OLD.${dialect.quoteIdent({ name: gateField.dbName ?? gateField.name })} IS NOT NULL AND (\\n ${terms.join(\"\\n OR \")}\\n )`;\n body = `BEGIN\\n IF ${condition} THEN\\n ${raise}\\n END IF;\\n RETURN NEW;\\nEND;`;\n }\n let marker = \"$vibe_row_rule$\";\n for (let suffix = 1; body.includes(marker); suffix += 1) marker = `$vibe_row_rule_${suffix}$`;\n const createFunction = `CREATE FUNCTION ${functionName}() RETURNS pg_catalog.trigger\\nLANGUAGE plpgsql VOLATILE CALLED ON NULL INPUT SECURITY INVOKER\\nSET search_path = pg_catalog\\nAS ${marker}\\n${body}\\n${marker};`;\n const createTrigger = `CREATE TRIGGER ${triggerName} BEFORE UPDATE${rule.kind === \"appendOnly\" ? \" OR DELETE\" : \"\"} ON ${tableName}\\nFOR EACH ROW EXECUTE FUNCTION ${functionName}();`;\n return {\n identities: [functionIdentity, triggerIdentity],\n create: [{ text: createFunction, values: [] }, { text: createTrigger, values: [] }],\n drop: [{ text: `DROP TRIGGER ${triggerName} ON ${tableName};`, values: [] }, { text: `DROP FUNCTION ${functionName}();`, values: [] }],\n protectedFields: protectedFields.map((field) => field.name),\n ...(gateField === undefined ? {} : { gateField: gateField.name }),\n };\n}\n",
68
+ "import { SQLITE_ROW_RULE_ERROR_PREFIX, VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { EventRowRuleContext, RenderedRowRule } from \"../row-rules.ts\";\n\n/**\n * Emit literal-only ABORT diagnostics and one unfiltered BEFORE trigger per event.\n * @internal\n */\nexport function renderSqliteRowRule({ dialect, context }: {\n readonly dialect: SqlDialect;\n readonly context: EventRowRuleContext;\n}): RenderedRowRule {\n if (dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: dialect.name, feature: \"sqliteRowRules\" });\n const { rule, table, triggers, protectedFields, gateField } = context;\n if (table.namespace !== \"main\") throw unsupportedCapability({ dialect: dialect.name, feature: \"fixedNamespaces\" });\n const terms = protectedFields.map((field) => {\n const column = dialect.quoteIdent({ name: field.dbName ?? field.name });\n return `OLD.${column} IS NOT NEW.${column}`;\n });\n if (rule.kind !== \"appendOnly\" && terms.length === 0) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row rule ${rule.name} has no protected fields`, meta: { model: context.model, rule: rule.name } });\n const condition = rule.kind === \"appendOnly\" ? \"\" : gateField === undefined\n ? `WHEN ${terms.join(\"\\n OR \")}\\n`\n : `WHEN OLD.${dialect.quoteIdent({ name: gateField.dbName ?? gateField.name })} IS NOT NULL AND (\\n ${terms.join(\"\\n OR \")}\\n)\\n`;\n return {\n identities: triggers.map(({ identity }) => identity),\n create: triggers.map(({ event, identity }) => ({\n text: `CREATE TRIGGER ${dialect.quoteIdent({ name: identity.name })} BEFORE ${event.toUpperCase()} ON ${dialect.quoteIdent({ name: table.name })}\\nFOR EACH ROW\\n${condition}BEGIN\\n SELECT RAISE(ABORT, ${dialect.quoteStringLiteral({ value: `${SQLITE_ROW_RULE_ERROR_PREFIX}${identity.name}` })});\\nEND;`,\n values: [],\n })),\n drop: [...triggers].reverse().map(({ identity }) => ({ text: `DROP TRIGGER ${dialect.quoteIdent({ name: identity.name })};`, values: [] })),\n protectedFields: protectedFields.map((field) => field.name),\n ...(gateField === undefined ? {} : { gateField: gateField.name }),\n };\n}\n",
69
+ "import { MYSQL_ROW_RULE_MESSAGE_MAX_BYTES, VibeError, mysqlRowRuleMessageByteLength, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { EventRowRuleContext, RenderedRowRule } from \"../row-rules.ts\";\n\nfunction diagnosticLiteral({ name, context, dialect }: {\n readonly name: string;\n readonly context: EventRowRuleContext;\n readonly dialect: SqlDialect;\n}): string {\n const message = `Check constraint '${name}' is violated.`;\n // SIGNAL has a decoded MESSAGE_TEXT bound, not an encoded SQL-literal bound.\n if (mysqlRowRuleMessageByteLength({ triggerName: name }) > MYSQL_ROW_RULE_MESSAGE_MAX_BYTES) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row rule ${context.rule.name} exceeds MySQL's ${MYSQL_ROW_RULE_MESSAGE_MAX_BYTES}-byte diagnostic limit; supply a shorter name stem`, meta: { model: context.model, rule: context.rule.name } });\n // A backslash is data under both ordinary mode and NO_BACKSLASH_ESCAPES.\n if (message.includes(\"\\\\\")) {\n const hex = Array.from(new TextEncoder().encode(message), (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n return `_utf8mb4 X'${hex}'`;\n }\n return dialect.quoteStringLiteral({ value: message });\n}\n\n/**\n * Emit mode-safe SIGNAL diagnostics and one unfiltered BEFORE trigger per event.\n * @internal\n */\nexport function renderMysqlRowRule({ dialect, context }: {\n readonly dialect: SqlDialect;\n readonly context: EventRowRuleContext;\n}): RenderedRowRule {\n if (dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: dialect.name, feature: \"mysqlRowRules\" });\n const { rule, table, triggers, protectedFields, gateField, placement } = context;\n for (const name of Object.keys(placement ?? {})) if (!triggers.some(({ identity }) => identity.name === name)) throw new VibeError({ code: \"VIBE_INTERNAL\", message: \"A MySQL trigger placement names a trigger this rule does not own\", meta: { model: context.model, rule: rule.name, trigger: name } });\n const position = ({ name }: { readonly name: string }): string => {\n const entry = placement?.[name];\n if (entry === undefined) return \"\";\n return \"follows\" in entry ? ` FOLLOWS ${dialect.quoteIdent({ name: entry.follows })}` : ` PRECEDES ${dialect.quoteIdent({ name: entry.precedes })}`;\n };\n const qualify = ({ name }: { readonly name: string }): string => table.namespace === \"public\"\n ? dialect.quoteIdent({ name })\n : `${dialect.quoteIdent({ name: table.namespace })}.${dialect.quoteIdent({ name })}`;\n const terms = protectedFields.map((field) => {\n const column = dialect.quoteIdent({ name: field.dbName ?? field.name });\n return `NOT (OLD.${column} <=> NEW.${column})`;\n });\n if (rule.kind !== \"appendOnly\" && terms.length === 0) throw new VibeError({ code: \"VIBE_SCHEMA_INVALID\", message: `Row rule ${rule.name} has no protected fields`, meta: { model: context.model, rule: rule.name } });\n const condition = gateField === undefined ? terms.join(\"\\n OR \")\n : `OLD.${dialect.quoteIdent({ name: gateField.dbName ?? gateField.name })} IS NOT NULL AND (\\n ${terms.join(\"\\n OR \")}\\n )`;\n return {\n identities: triggers.map(({ identity }) => identity),\n create: triggers.map(({ event, identity }) => {\n const signal = `SIGNAL SQLSTATE 'HY000' SET MYSQL_ERRNO = 3819, MESSAGE_TEXT = ${diagnosticLiteral({ name: identity.name, context, dialect })};`;\n const body = rule.kind === \"appendOnly\" ? ` ${signal}` : ` IF ${condition} THEN\\n ${signal}\\n END IF;`;\n return { text: `CREATE TRIGGER ${qualify({ name: identity.name })} BEFORE ${event.toUpperCase()} ON ${qualify({ name: table.name })}\\nFOR EACH ROW${position({ name: identity.name })}\\nBEGIN\\n${body}\\nEND;`, values: [] };\n }),\n drop: [...triggers].reverse().map(({ identity }) => ({ text: `DROP TRIGGER ${qualify({ name: identity.name })};`, values: [] })),\n protectedFields: protectedFields.map((field) => field.name),\n ...(gateField === undefined ? {} : { gateField: gateField.name }),\n };\n}\n",
67
70
  "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/** Parsed custom type spelling; quoted identifiers retain their exact bytes. */\nexport type PostgresTypeName = {\n readonly namespace?: string;\n readonly name: string;\n readonly modifier: string;\n readonly array: boolean;\n};\n\nconst IDENTIFIER = '(?:\"(?:[^\"\\\\x00]|\"\")+\"|[a-zA-Z_][a-zA-Z_0-9$]*)';\nconst MODIFIER_VALUE = `(?:[+-]?\\\\d+|${IDENTIFIER}|'(?:[^'\\\\x00]|'')*')`;\nconst TYPE_NAME: RegExp = new RegExp(`^\\\\s*(${IDENTIFIER})(?:\\\\s*\\\\.\\\\s*(${IDENTIFIER}))?\\\\s*(\\\\(\\\\s*${MODIFIER_VALUE}(?:\\\\s*,\\\\s*${MODIFIER_VALUE})*\\\\s*\\\\))?\\\\s*((?:\\\\[\\\\s*\\\\]\\\\s*)*)$`);\nconst MODIFIER_TOKEN: RegExp = new RegExp(MODIFIER_VALUE, \"g\");\nfunction modifier(params: { raw?: string }): string {\n if (params.raw === undefined) return \"\";\n const tokens = params.raw.slice(1, -1).match(MODIFIER_TOKEN) ?? [];\n return `(${tokens.map((token) => /^[+-]?\\d+$/.test(token) ? BigInt(token).toString() : token.startsWith(\"'\") || token.startsWith('\"') ? token : token.toLowerCase()).join(\",\")})`;\n}\nfunction identifier(params: { value: string }): string {\n return params.value.startsWith('\"') ? params.value.slice(1, -1).replaceAll('\"\"', '\"') : params.value.toLowerCase();\n}\n\n/** Parse the identifier/modifier/array syntax used by PostgreSQL extension types. */\nexport function parsePostgresTypeName(params: { raw: string }): PostgresTypeName | undefined {\n const match = TYPE_NAME.exec(params.raw);\n if (match === null) return undefined;\n return {\n ...(match[2] === undefined ? {} : { namespace: identifier({ value: match[1]! }) }),\n name: identifier({ value: match[2] ?? match[1]! }),\n modifier: modifier({ ...(match[3] === undefined ? {} : { raw: match[3] }) }),\n array: (match[4]?.length ?? 0) > 0,\n };\n}\n\n/** Render a resolved type without depending on the executing connection's search path. */\nexport function renderPostgresTypeName(params: { dialect: SqlDialect; type: PostgresTypeName }): string {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"postgresTypeIdentity\" });\n const { dialect, type } = params;\n return `${type.namespace === undefined ? \"\" : `${dialect.quoteIdent({ name: type.namespace })}.`}${dialect.quoteIdent({ name: type.name })}${type.modifier}${type.array ? \"[]\" : \"\"}`;\n}\n\n/** Read catalog identity, or resolve an authored name in an explicitly chosen context. */\nexport function renderPostgresTypeIdentity(params: {\n dialect: SqlDialect;\n source: { readonly table: QualifiedSqlName; readonly column: string } | { readonly type: QualifiedSqlName | { readonly name: string } };\n}): RenderedQuery {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"postgresTypeIdentity\" });\n const collector = new ParamCollector(params.dialect);\n const { source } = params;\n let text: string;\n if (\"table\" in source) {\n text = `SELECT tn.nspname::text AS \"namespace\", base.typname::text AS \"name\" FROM pg_catalog.pg_attribute a JOIN pg_catalog.pg_class c ON c.oid = a.attrelid JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace JOIN pg_catalog.pg_type t ON t.oid = a.atttypid JOIN pg_catalog.pg_type base ON base.oid = CASE WHEN t.typelem <> 0 AND t.typlen = -1 THEN t.typelem ELSE t.oid END JOIN pg_catalog.pg_namespace tn ON tn.oid = base.typnamespace WHERE n.nspname = ${collector.add(source.table.namespace)} AND c.relname = ${collector.add(source.table.name)} AND a.attname = ${collector.add(source.column)} AND a.attnum > 0 AND NOT a.attisdropped`;\n } else {\n const name = renderPostgresTypeName({ dialect: params.dialect, type: { ...source.type, modifier: \"\", array: false } });\n text = `SELECT n.nspname::text AS \"namespace\", t.typname::text AS \"name\" FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE t.oid = pg_catalog.to_regtype(${collector.add(name)})`;\n }\n return { text, values: collector.values, returning: \"none\" };\n}\n",
68
71
  "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { QualifiedSqlName } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/** Read a stored default's function dependencies without evaluating its expression. */\nexport function renderPostgresDefaultFunctionIdentity(params: {\n dialect: SqlDialect;\n table: QualifiedSqlName;\n column: string;\n}): RenderedQuery {\n const { dialect, table, column } = params;\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"defaultFunctionIdentity\" });\n const collector = new ParamCollector(dialect);\n const namespace = collector.add(table.namespace);\n const name = collector.add(table.name);\n const field = collector.add(column);\n return {\n text: `SELECT pg_catalog.pg_get_expr(ad.adbin, ad.adrelid, false) AS \"expression\",\n pn.nspname::text AS \"functionNamespace\", p.proname::text AS \"functionName\",\n (p.pronargs = 0 AND p.provariadic = 0 AND p.prokind = 'f' AND NOT p.proretset) AS \"zeroArguments\",\n (p.prorettype = a.atttypid AND a.atttypmod = -1) AS \"exactResultType\"\nFROM pg_catalog.pg_attrdef ad\nJOIN pg_catalog.pg_attribute a ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum\nJOIN pg_catalog.pg_class c ON c.oid = ad.adrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nJOIN pg_catalog.pg_depend d ON d.classid = 'pg_catalog.pg_attrdef'::pg_catalog.regclass AND d.objid = ad.oid AND d.refclassid = 'pg_catalog.pg_proc'::pg_catalog.regclass AND d.deptype = 'n'\nJOIN pg_catalog.pg_proc p ON p.oid = d.refobjid\nJOIN pg_catalog.pg_namespace pn ON pn.oid = p.pronamespace\nWHERE n.nspname = ${namespace} AND c.relname = ${name} AND a.attname = ${field}\n AND a.attnum > 0 AND NOT a.attisdropped AND a.attgenerated = ''`,\n values: collector.values,\n returning: \"none\",\n };\n}\n",
69
72
  "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/** Remove a PostgreSQL unique constraint through its catalog owner, never DROP INDEX. */\nexport function renderConstraintOwnedIndexDrop(params: { dialect: SqlDialect; table: string; constraint: string }): RenderedQuery {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"constraintOwnedIndexDrop\" });\n const quote = (name: string): string => params.dialect.quoteIdent({ name });\n return { text: `ALTER TABLE ${quote(params.table)} DROP CONSTRAINT ${quote(params.constraint)};`, values: [], returning: \"none\" };\n}\n",
@@ -71,11 +74,11 @@
71
74
  "import type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\n\n/** Read complete journal progress without initializing or repairing it. */\nexport function renderMigrationHistoryQuery(params: { dialect: SqlDialect; namespace: string }): RenderedQuery {\n const q = (name: string): string => params.dialect.quoteIdent({ name });\n return { text: `SELECT ${q(\"name\")}, ${q(\"checksum\")}, ${q(\"statement_index\")}, ${q(\"error\")} FROM ${q(params.namespace)}.${q(\"_vibe_migrations\")} ORDER BY ${q(\"id\")}`, values: [], returning: \"none\" };\n}\n",
72
75
  "import type { SqlObjectIdentity } from \"@vibeorm/schema\";\nimport { tableDefinitionParts } from \"./sqlite-table-definition.ts\";\n\n/** A table-level source clause. Anonymous identities are diagnostic, not names usable in DDL. */\nexport type SqliteConstraintClause = {\n readonly name: string;\n readonly named: boolean;\n readonly type: Extract<SqlObjectIdentity, { kind: \"constraint\" }>[\"constraintType\"];\n readonly sql: string;\n readonly columns: readonly string[];\n};\nconst IDENTIFIER: string = '(?:\"(?:[^\" ]| |\"\")+\"|`(?:[^`]|``)+`|\\\\[[^\\\\]]+\\\\]|[A-Za-z_][A-Za-z_0-9]*)';\nfunction identifier(value: string): string {\n const text = value.trim();\n if (text.startsWith('\"')) return text.slice(1, -1).replaceAll('\"\"', '\"');\n if (text.startsWith(\"`\")) return text.slice(1, -1).replaceAll(\"``\", \"`\");\n if (text.startsWith(\"[\")) return text.slice(1, -1);\n return text;\n}\n\n/** Extract declaration boundaries only; never interpret the expressions inside CHECKs. */\nexport function sqliteTableConstraints(params: { sql: string }): readonly SqliteConstraintClause[] {\n const result: SqliteConstraintClause[] = [];\n for (const clause of tableDefinitionParts(params).clauses) {\n const named = new RegExp(`^CONSTRAINT\\\\s+(${IDENTIFIER})\\\\s+`, \"i\").exec(clause);\n const body = named === null ? clause : clause.slice(named[0].length);\n const kind = /^(CHECK|FOREIGN\\s+KEY|UNIQUE|PRIMARY\\s+KEY)\\s*\\(/i.exec(body);\n if (kind === null) continue;\n const type = /^CHECK$/i.test(kind[1]!) ? \"check\" : /^FOREIGN/i.test(kind[1]!) ? \"foreignKey\" : /^PRIMARY/i.test(kind[1]!) ? \"primaryKey\" : \"unique\";\n const parts = tableDefinitionParts({ sql: `CREATE TABLE x ${body.slice(kind[0].indexOf(\"(\"))}` });\n const columns = type === \"check\" ? [] : parts.clauses.map(identifier);\n result.push({ name: named === null ? `@sqlite:${type}:${result.length}` : identifier(named[1]!), named: named !== null, type, sql: body, columns });\n }\n return result;\n}\n",
73
76
  "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\nimport { MYSQL_NO_ROW_LIMIT } from \"./migration-inventory.ts\";\n\n/**\n * Direct grants needed to enumerate MySQL objects without privilege-filtered\n * omissions. Ends with {@link MYSQL_NO_ROW_LIMIT}: a `sql_select_limit` below\n * the grant count would otherwise cut grants and refuse a namespace whose\n * grants are complete.\n */\nexport function renderMigrationVisibility(params: { dialect: SqlDialect; namespace: string }): RenderedQuery {\n if (params.dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"mysqlCatalogVisibility\" });\n const collector = new ParamCollector(params.dialect);\n const grantee = \"CONCAT(QUOTE(SUBSTRING_INDEX(CURRENT_USER(), '@', 1)), '@', QUOTE(SUBSTRING_INDEX(CURRENT_USER(), '@', -1)))\";\n return { text: `SELECT PRIVILEGE_TYPE AS privilege FROM information_schema.USER_PRIVILEGES WHERE GRANTEE = ${grantee} UNION SELECT PRIVILEGE_TYPE AS privilege FROM information_schema.SCHEMA_PRIVILEGES WHERE GRANTEE = ${grantee} AND ${collector.add(params.namespace)} LIKE TABLE_SCHEMA${MYSQL_NO_ROW_LIMIT}`, values: collector.values, returning: \"none\" };\n}\n",
74
- "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n/**\n * Ends a MySQL catalog listing whose row count has no small bound (the\n * migration inventory, the visibility proof). `sql_select_limit` (session or\n * global, e.g. 1 000 under `mysql --safe-updates`) silently cuts the rows of a\n * SELECT without its own LIMIT, and a cut listing reads its last objects (or\n * grants) as missing; an explicit LIMIT takes precedence over it. After the\n * last `UNION` branch (and its ORDER BY) the LIMIT applies to the whole union.\n * The value is MySQL's largest row count, so nothing is ever cut. The batched\n * object readers end the same way (`migration-objects.ts`, LEFTOVERS-01).\n */\nexport const MYSQL_NO_ROW_LIMIT: string = \" LIMIT 18446744073709551615\";\n\n/** SQLite column metadata includes generated columns omitted by table_info. */\nexport function renderSqliteColumnInventory(params: { dialect: SqlDialect; namespace: string; table: string }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteColumnInventory\" });\n const collector = new ParamCollector(params.dialect);\n return { text: `SELECT name, hidden, pk, dflt_value AS definition FROM pragma_table_xinfo(${collector.add(params.table)}, ${collector.add(params.namespace)}) ORDER BY cid`, values: collector.values, returning: \"none\" };\n}\n\n/** Foreign keys include inline and anonymous declarations absent from the named clause list. */\nexport function renderSqliteForeignKeyInventory(params: { dialect: SqlDialect; namespace: string; table: string }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteForeignKeyInventory\" });\n const collector = new ParamCollector(params.dialect);\n return { text: `SELECT id, seq, \"from\", \"to\", \"table\", on_update, on_delete, match FROM pragma_foreign_key_list(${collector.add(params.table)}, ${collector.add(params.namespace)}) ORDER BY id, seq`, values: collector.values, returning: \"none\" };\n}\n\n/**\n * {@link renderSqliteColumnInventory} for many tables in one statement. Rows\n * carry `vibe_request` = the table's index in `tables`, then the single query's\n * columns in its order (`cid`). The table-valued pragma runs the same PRAGMA\n * per table, with the same namespace argument. Every table answers at least one\n * row (`LEFT JOIN`): one whose `name` is NULL when its PRAGMA has no rows, so a\n * table missing from the answer was not read.\n */\nexport function renderSqliteColumnInventoryBatch(params: { dialect: SqlDialect; namespace: string; tables: readonly string[] }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteColumnInventory\" });\n const collector = new ParamCollector(params.dialect);\n const request = params.dialect.quoteIdent({ name: \"vibe_request\" });\n return { text: `SELECT j.key AS ${request}, x.name AS name, x.hidden AS hidden, x.pk AS pk, x.dflt_value AS definition FROM json_each(${collector.add(JSON.stringify(params.tables))}) j LEFT JOIN pragma_table_xinfo(j.value, ${collector.add(params.namespace)}) x ORDER BY j.key, x.cid`, values: collector.values, returning: \"none\" };\n}\n\n/** {@link renderSqliteForeignKeyInventory} for many tables in one statement; rows as in {@link renderSqliteColumnInventoryBatch} (no-row marker: `id` NULL), ordered `id, seq` per table. */\nexport function renderSqliteForeignKeyInventoryBatch(params: { dialect: SqlDialect; namespace: string; tables: readonly string[] }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteForeignKeyInventory\" });\n const collector = new ParamCollector(params.dialect);\n const request = params.dialect.quoteIdent({ name: \"vibe_request\" });\n return { text: `SELECT j.key AS ${request}, f.id AS id, f.seq AS seq, f.\"from\" AS \"from\", f.\"to\" AS \"to\", f.\"table\" AS \"table\", f.on_update AS on_update, f.on_delete AS on_delete, f.match AS match FROM json_each(${collector.add(JSON.stringify(params.tables))}) j LEFT JOIN pragma_foreign_key_list(j.value, ${collector.add(params.namespace)}) f ORDER BY j.key, f.id, f.seq`, values: collector.values, returning: \"none\" };\n}\n\n/** The per-table and per-index PRAGMAs SQLite introspection reads, with the columns their own output is emitted in order of. */\nconst SQLITE_INTROSPECTION_PRAGMA_ORDER: Readonly<Record<SqliteIntrospectionPragma, string>> = Object.freeze({\n table_xinfo: \"p.cid\",\n index_list: \"p.seq\",\n index_xinfo: \"p.seqno\",\n foreign_key_list: \"p.id, p.seq\",\n});\n\n/** A PRAGMA SQLite introspection reads once per table (`table_xinfo`, `index_list`, `foreign_key_list`) or per index (`index_xinfo`). */\nexport type SqliteIntrospectionPragma = \"table_xinfo\" | \"index_list\" | \"index_xinfo\" | \"foreign_key_list\";\n\n/**\n * `PRAGMA <pragma>(\"<name>\")` for every name in one statement. Rows carry\n * `vibe_request` = the name's index in `names`, then exactly the PRAGMA's own\n * columns (a table-valued pragma's hidden `arg`/`schema` columns are not in\n * `p.*`), per name in the order the PRAGMA emits them. No schema argument, as\n * in the single statement: the table-valued pragma runs `PRAGMA <pragma>='name'`\n * internally, with the same temp-then-main name lookup.\n *\n * Literal text with no bound values, like every statement SQLite introspection\n * sends (the names list is one quoted string literal): an executor that runs a\n * value-less statement without binding anything reads the same rows.\n *\n * Every name answers at least one row (`LEFT JOIN`): a name whose PRAGMA has no\n * rows answers one row whose PRAGMA columns are all NULL, so a name missing\n * from the answer was not read (and an empty answer is never \"no rows\").\n */\nexport function renderSqliteIntrospectionPragmaBatch(params: { dialect: SqlDialect; pragma: SqliteIntrospectionPragma; names: readonly string[] }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteIntrospectionPragmaBatch\" });\n const order = SQLITE_INTROSPECTION_PRAGMA_ORDER[params.pragma];\n if (order === undefined) throw unsupportedCapability({ dialect: \"sqlite\", feature: `introspectionPragma:${String(params.pragma)}` });\n return { text: `SELECT j.key AS ${params.dialect.quoteIdent({ name: \"vibe_request\" })}, p.* FROM json_each(${params.dialect.quoteStringLiteral({ value: JSON.stringify(params.names) })}) j LEFT JOIN pragma_${params.pragma}(j.value) p ORDER BY j.key, ${order}`, values: [], returning: \"none\" };\n}\n\n/** Exact SQL needed to restore independently existing indexes and triggers during a rebuild. */\nexport function renderSqliteRebuildObjects(params: { dialect: SqlDialect }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteRebuildObjects\" });\n return { text: \"SELECT name, tbl_name, type, sql FROM main.sqlite_schema WHERE type IN ('index', 'trigger') AND sql IS NOT NULL ORDER BY type, name\", values: [], returning: \"none\" };\n}\n\n/**\n * Enumerate scoped catalog identities, including constraints and their backing\n * indexes. The MySQL listing ends with {@link MYSQL_NO_ROW_LIMIT}, so\n * `sql_select_limit` cannot drop objects from it.\n */\nexport function renderMigrationInventory(params: { dialect: SqlDialect; namespace: string }): RenderedQuery {\n const collector = new ParamCollector(params.dialect);\n const namespace = collector.add(params.namespace);\n if (params.dialect.name === \"postgres\") {\n return { text: `WITH relations AS (\n SELECT c.oid, c.relname, c.relkind FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = ${namespace} AND c.relname <> '_vibe_migrations'\n AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend jd JOIN pg_catalog.pg_class jt ON jt.oid = jd.refobjid WHERE jd.classid = 'pg_class'::regclass AND jd.objid = c.oid AND jd.refclassid = 'pg_class'::regclass AND jt.relname = '_vibe_migrations' AND jt.relnamespace = c.relnamespace)\n AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_class'::regclass AND d.objid = c.oid AND d.deptype = 'e')\n)\nSELECT CASE WHEN r.relkind IN ('v','m') THEN 'view' WHEN r.relkind = 'S' THEN 'sequence' ELSE 'table' END AS kind, r.relname::text AS name, NULL::text AS parent, NULL::text AS subtype, NULL::text AS signature, NULL::text AS backing FROM relations r WHERE r.relkind IN ('r','p','v','m','S')\nUNION ALL SELECT 'constraint', con.conname::text, r.relname::text, con.contype::text, NULL, NULL FROM relations r JOIN pg_catalog.pg_constraint con ON con.conrelid = r.oid WHERE con.contype IN ('c','f','x','u','p')\nUNION ALL SELECT 'index', ix.relname::text, r.relname::text, NULL, NULL, con.conname::text FROM relations r JOIN pg_catalog.pg_index i ON i.indrelid = r.oid JOIN pg_catalog.pg_class ix ON ix.oid = i.indexrelid LEFT JOIN pg_catalog.pg_constraint con ON con.conindid = i.indexrelid AND con.contype IN ('p','u','x')\nUNION ALL SELECT 'trigger', t.tgname::text, r.relname::text, NULL, NULL, NULL FROM relations r JOIN pg_catalog.pg_trigger t ON t.tgrelid = r.oid WHERE NOT t.tgisinternal\nUNION ALL SELECT 'column', a.attname::text, r.relname::text, NULL, NULL, NULL FROM relations r JOIN pg_catalog.pg_attribute a ON a.attrelid = r.oid WHERE a.attnum > 0 AND NOT a.attisdropped AND r.relkind IN ('r','p')\nUNION ALL SELECT CASE WHEN a.attgenerated <> '' THEN 'generatedColumn' ELSE 'columnDefault' END, a.attname::text, r.relname::text, NULL, NULL, NULL FROM relations r JOIN pg_catalog.pg_attribute a ON a.attrelid = r.oid JOIN pg_catalog.pg_attrdef d ON d.adrelid = r.oid AND d.adnum = a.attnum WHERE a.attnum > 0 AND NOT a.attisdropped\nUNION ALL SELECT 'function', p.proname::text, NULL, NULL, COALESCE((SELECT json_agg(json_build_object('namespace', tn.nspname, 'name', t.typname) ORDER BY a.ord)::text FROM unnest(p.proargtypes) WITH ORDINALITY a(oid, ord) JOIN pg_catalog.pg_type t ON t.oid = a.oid JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace), '[]'), NULL FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = ${namespace} AND p.prokind = 'f' AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_proc'::regclass AND d.objid = p.oid AND d.deptype = 'e')\nUNION ALL SELECT 'enum', t.typname::text, NULL, NULL, NULL, NULL FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = ${namespace} AND t.typtype = 'e' AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_type'::regclass AND d.objid = t.oid AND d.deptype = 'e')\n${params.namespace === \"public\" ? \"\" : `UNION ALL SELECT 'namespace', n.nspname::text, NULL, NULL, NULL, NULL FROM pg_catalog.pg_namespace n WHERE n.nspname = ${namespace}`}\nORDER BY kind, parent, name`, values: collector.values, returning: \"none\" };\n }\n if (params.dialect.name === \"mysql\") {\n // MySQL placeholders are positional. Each branch binds its own namespace.\n const n = (): string => collector.add(params.namespace);\n return { text: `SELECT CASE WHEN TABLE_TYPE = 'VIEW' THEN 'view' ELSE 'table' END AS kind, TABLE_NAME AS name, NULL AS parent, NULL AS subtype, NULL AS signature, NULL AS backing FROM information_schema.TABLES WHERE TABLE_SCHEMA = ${namespace} AND TABLE_NAME <> '_vibe_migrations'\nUNION ALL SELECT 'constraint', CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE, NULL, NULL FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = ${n()} AND TABLE_NAME <> '_vibe_migrations'\nUNION ALL SELECT 'index', s.INDEX_NAME, s.TABLE_NAME, NULL, NULL, tc.CONSTRAINT_NAME FROM information_schema.STATISTICS s LEFT JOIN information_schema.TABLE_CONSTRAINTS tc ON tc.TABLE_SCHEMA = s.TABLE_SCHEMA AND tc.TABLE_NAME = s.TABLE_NAME AND tc.CONSTRAINT_NAME = s.INDEX_NAME AND tc.CONSTRAINT_TYPE IN ('UNIQUE', 'PRIMARY KEY') WHERE s.TABLE_SCHEMA = ${n()} AND s.TABLE_NAME <> '_vibe_migrations' GROUP BY s.INDEX_NAME, s.TABLE_NAME, tc.CONSTRAINT_NAME\nUNION ALL SELECT 'trigger', TRIGGER_NAME, EVENT_OBJECT_TABLE, NULL, NULL, NULL FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = ${n()}\nUNION ALL SELECT 'column', COLUMN_NAME, TABLE_NAME, NULL, NULL, NULL FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ${n()} AND TABLE_NAME <> '_vibe_migrations'\nUNION ALL SELECT CASE WHEN GENERATION_EXPRESSION <> '' THEN 'generatedColumn' ELSE 'columnDefault' END, COLUMN_NAME, TABLE_NAME, NULL, NULL, NULL FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ${n()} AND TABLE_NAME <> '_vibe_migrations' AND (COLUMN_DEFAULT IS NOT NULL OR GENERATION_EXPRESSION <> '')\nUNION ALL SELECT 'function', ROUTINE_NAME, NULL, NULL, '[]', NULL FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = ${n()} AND ROUTINE_TYPE = 'FUNCTION'\nORDER BY kind, parent, name${MYSQL_NO_ROW_LIMIT}`, values: collector.values, returning: \"none\" };\n }\n const schema = params.dialect.quoteIdent({ name: params.namespace });\n return { text: `SELECT type AS kind, name, tbl_name AS parent, sql AS definition FROM ${schema}.sqlite_schema WHERE name NOT LIKE 'sqlite\\\\_%' ESCAPE '\\\\' AND name <> '_vibe_migrations' ORDER BY type, tbl_name, name`, values: [], returning: \"none\" };\n}\n",
77
+ "import { unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n/**\n * Ends a MySQL catalog listing whose row count has no small bound (the\n * migration inventory, the visibility proof). `sql_select_limit` (session or\n * global, e.g. 1 000 under `mysql --safe-updates`) silently cuts the rows of a\n * SELECT without its own LIMIT, and a cut listing reads its last objects (or\n * grants) as missing; an explicit LIMIT takes precedence over it. After the\n * last `UNION` branch (and its ORDER BY) the LIMIT applies to the whole union.\n * The value is MySQL's largest row count, so nothing is ever cut. The batched\n * object readers end the same way (`migration-objects.ts`, LEFTOVERS-01).\n * @internal\n */\nexport const MYSQL_NO_ROW_LIMIT: string = \" LIMIT 18446744073709551615\";\n\n/** SQLite column metadata includes generated columns omitted by table_info. */\nexport function renderSqliteColumnInventory(params: { dialect: SqlDialect; namespace: string; table: string }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteColumnInventory\" });\n const collector = new ParamCollector(params.dialect);\n return { text: `SELECT name, hidden, pk, dflt_value AS definition FROM pragma_table_xinfo(${collector.add(params.table)}, ${collector.add(params.namespace)}) ORDER BY cid`, values: collector.values, returning: \"none\" };\n}\n\n/** Foreign keys include inline and anonymous declarations absent from the named clause list. */\nexport function renderSqliteForeignKeyInventory(params: { dialect: SqlDialect; namespace: string; table: string }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteForeignKeyInventory\" });\n const collector = new ParamCollector(params.dialect);\n return { text: `SELECT id, seq, \"from\", \"to\", \"table\", on_update, on_delete, match FROM pragma_foreign_key_list(${collector.add(params.table)}, ${collector.add(params.namespace)}) ORDER BY id, seq`, values: collector.values, returning: \"none\" };\n}\n\n/**\n * {@link renderSqliteColumnInventory} for many tables in one statement. Rows\n * carry `vibe_request` = the table's index in `tables`, then the single query's\n * columns in its order (`cid`). The table-valued pragma runs the same PRAGMA\n * per table, with the same namespace argument. Every table answers at least one\n * row (`LEFT JOIN`): one whose `name` is NULL when its PRAGMA has no rows, so a\n * table missing from the answer was not read.\n */\nexport function renderSqliteColumnInventoryBatch(params: { dialect: SqlDialect; namespace: string; tables: readonly string[] }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteColumnInventory\" });\n const collector = new ParamCollector(params.dialect);\n const request = params.dialect.quoteIdent({ name: \"vibe_request\" });\n return { text: `SELECT j.key AS ${request}, x.name AS name, x.hidden AS hidden, x.pk AS pk, x.dflt_value AS definition FROM json_each(${collector.add(JSON.stringify(params.tables))}) j LEFT JOIN pragma_table_xinfo(j.value, ${collector.add(params.namespace)}) x ORDER BY j.key, x.cid`, values: collector.values, returning: \"none\" };\n}\n\n/** {@link renderSqliteForeignKeyInventory} for many tables in one statement; rows as in {@link renderSqliteColumnInventoryBatch} (no-row marker: `id` NULL), ordered `id, seq` per table. */\nexport function renderSqliteForeignKeyInventoryBatch(params: { dialect: SqlDialect; namespace: string; tables: readonly string[] }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteForeignKeyInventory\" });\n const collector = new ParamCollector(params.dialect);\n const request = params.dialect.quoteIdent({ name: \"vibe_request\" });\n return { text: `SELECT j.key AS ${request}, f.id AS id, f.seq AS seq, f.\"from\" AS \"from\", f.\"to\" AS \"to\", f.\"table\" AS \"table\", f.on_update AS on_update, f.on_delete AS on_delete, f.match AS match FROM json_each(${collector.add(JSON.stringify(params.tables))}) j LEFT JOIN pragma_foreign_key_list(j.value, ${collector.add(params.namespace)}) f ORDER BY j.key, f.id, f.seq`, values: collector.values, returning: \"none\" };\n}\n\n/** The per-table and per-index PRAGMAs SQLite introspection reads, with the columns their own output is emitted in order of. */\nconst SQLITE_INTROSPECTION_PRAGMA_ORDER: Readonly<Record<SqliteIntrospectionPragma, string>> = Object.freeze({\n table_xinfo: \"p.cid\",\n index_list: \"p.seq\",\n index_xinfo: \"p.seqno\",\n foreign_key_list: \"p.id, p.seq\",\n});\n\n/** A PRAGMA SQLite introspection reads once per table (`table_xinfo`, `index_list`, `foreign_key_list`) or per index (`index_xinfo`). */\nexport type SqliteIntrospectionPragma = \"table_xinfo\" | \"index_list\" | \"index_xinfo\" | \"foreign_key_list\";\n\n/**\n * `PRAGMA <pragma>(\"<name>\")` for every name in one statement. Rows carry\n * `vibe_request` = the name's index in `names`, then exactly the PRAGMA's own\n * columns (a table-valued pragma's hidden `arg`/`schema` columns are not in\n * `p.*`), per name in the order the PRAGMA emits them. No schema argument, as\n * in the single statement: the table-valued pragma runs `PRAGMA <pragma>='name'`\n * internally, with the same temp-then-main name lookup.\n *\n * Literal text with no bound values, like every statement SQLite introspection\n * sends (the names list is one quoted string literal): an executor that runs a\n * value-less statement without binding anything reads the same rows.\n *\n * Every name answers at least one row (`LEFT JOIN`): a name whose PRAGMA has no\n * rows answers one row whose PRAGMA columns are all NULL, so a name missing\n * from the answer was not read (and an empty answer is never \"no rows\").\n */\nexport function renderSqliteIntrospectionPragmaBatch(params: { dialect: SqlDialect; pragma: SqliteIntrospectionPragma; names: readonly string[] }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteIntrospectionPragmaBatch\" });\n const order = SQLITE_INTROSPECTION_PRAGMA_ORDER[params.pragma];\n if (order === undefined) throw unsupportedCapability({ dialect: \"sqlite\", feature: `introspectionPragma:${String(params.pragma)}` });\n return { text: `SELECT j.key AS ${params.dialect.quoteIdent({ name: \"vibe_request\" })}, p.* FROM json_each(${params.dialect.quoteStringLiteral({ value: JSON.stringify(params.names) })}) j LEFT JOIN pragma_${params.pragma}(j.value) p ORDER BY j.key, ${order}`, values: [], returning: \"none\" };\n}\n\n/** Exact SQL needed to restore independently existing indexes and triggers during a rebuild. */\nexport function renderSqliteRebuildObjects(params: { dialect: SqlDialect }): RenderedQuery {\n if (params.dialect.name !== \"sqlite\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"sqliteRebuildObjects\" });\n return { text: \"SELECT name, tbl_name, type, sql FROM main.sqlite_schema WHERE type IN ('index', 'trigger') AND sql IS NOT NULL ORDER BY type, name\", values: [], returning: \"none\" };\n}\n\n/**\n * Enumerate scoped catalog identities, including constraints and their backing\n * indexes. The MySQL listing ends with {@link MYSQL_NO_ROW_LIMIT}, so\n * `sql_select_limit` cannot drop objects from it.\n */\nexport function renderMigrationInventory(params: { dialect: SqlDialect; namespace: string }): RenderedQuery {\n const collector = new ParamCollector(params.dialect);\n const namespace = collector.add(params.namespace);\n if (params.dialect.name === \"postgres\") {\n return { text: `WITH relations AS (\n SELECT c.oid, c.relname, c.relkind FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE n.nspname = ${namespace} AND c.relname <> '_vibe_migrations'\n AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend jd JOIN pg_catalog.pg_class jt ON jt.oid = jd.refobjid WHERE jd.classid = 'pg_class'::regclass AND jd.objid = c.oid AND jd.refclassid = 'pg_class'::regclass AND jt.relname = '_vibe_migrations' AND jt.relnamespace = c.relnamespace)\n AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_class'::regclass AND d.objid = c.oid AND d.deptype = 'e')\n)\nSELECT CASE WHEN r.relkind IN ('v','m') THEN 'view' WHEN r.relkind = 'S' THEN 'sequence' ELSE 'table' END AS kind, r.relname::text AS name, NULL::text AS parent, NULL::text AS subtype, NULL::text AS signature, NULL::text AS backing FROM relations r WHERE r.relkind IN ('r','p','v','m','S')\nUNION ALL SELECT 'constraint', con.conname::text, r.relname::text, con.contype::text, NULL, NULL FROM relations r JOIN pg_catalog.pg_constraint con ON con.conrelid = r.oid WHERE con.contype IN ('c','f','x','u','p')\nUNION ALL SELECT 'index', ix.relname::text, r.relname::text, CASE WHEN i.indisunique AND i.indpred IS NULL AND i.indexprs IS NULL THEN 'k' END, CASE WHEN i.indisunique AND i.indpred IS NULL AND i.indexprs IS NULL THEN (SELECT json_agg(a.attname::text ORDER BY k.ord)::text FROM unnest(i.indkey) WITH ORDINALITY k(attnum, ord) JOIN pg_catalog.pg_attribute a ON a.attrelid = r.oid AND a.attnum = k.attnum WHERE k.ord <= i.indnkeyatts) END, con.conname::text FROM relations r JOIN pg_catalog.pg_index i ON i.indrelid = r.oid JOIN pg_catalog.pg_class ix ON ix.oid = i.indexrelid LEFT JOIN pg_catalog.pg_constraint con ON con.conindid = i.indexrelid AND con.contype IN ('p','u','x')\nUNION ALL SELECT 'trigger', t.tgname::text, r.relname::text, NULL, NULL, NULL FROM relations r JOIN pg_catalog.pg_trigger t ON t.tgrelid = r.oid WHERE NOT t.tgisinternal\nUNION ALL SELECT 'column', a.attname::text, r.relname::text, NULL, NULL, NULL FROM relations r JOIN pg_catalog.pg_attribute a ON a.attrelid = r.oid WHERE a.attnum > 0 AND NOT a.attisdropped AND r.relkind IN ('r','p')\nUNION ALL SELECT CASE WHEN a.attgenerated <> '' THEN 'generatedColumn' ELSE 'columnDefault' END, a.attname::text, r.relname::text, NULL, NULL, NULL FROM relations r JOIN pg_catalog.pg_attribute a ON a.attrelid = r.oid JOIN pg_catalog.pg_attrdef d ON d.adrelid = r.oid AND d.adnum = a.attnum WHERE a.attnum > 0 AND NOT a.attisdropped\nUNION ALL SELECT 'function', p.proname::text, NULL, NULL, COALESCE((SELECT json_agg(json_build_object('namespace', tn.nspname, 'name', t.typname) ORDER BY a.ord)::text FROM unnest(p.proargtypes) WITH ORDINALITY a(oid, ord) JOIN pg_catalog.pg_type t ON t.oid = a.oid JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace), '[]'), NULL FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = ${namespace} AND p.prokind = 'f' AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_proc'::regclass AND d.objid = p.oid AND d.deptype = 'e')\nUNION ALL SELECT 'enum', t.typname::text, NULL, NULL, NULL, NULL FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = ${namespace} AND t.typtype = 'e' AND NOT EXISTS (SELECT 1 FROM pg_catalog.pg_depend d WHERE d.classid = 'pg_type'::regclass AND d.objid = t.oid AND d.deptype = 'e')\n${params.namespace === \"public\" ? \"\" : `UNION ALL SELECT 'namespace', n.nspname::text, NULL, NULL, NULL, NULL FROM pg_catalog.pg_namespace n WHERE n.nspname = ${namespace}`}\nORDER BY kind, parent, name`, values: collector.values, returning: \"none\" };\n }\n if (params.dialect.name === \"mysql\") {\n // MySQL placeholders are positional. Each branch binds its own namespace.\n const n = (): string => collector.add(params.namespace);\n return { text: `SELECT CASE WHEN TABLE_TYPE = 'VIEW' THEN 'view' ELSE 'table' END AS kind, TABLE_NAME AS name, NULL AS parent, NULL AS subtype, NULL AS signature, NULL AS backing FROM information_schema.TABLES WHERE TABLE_SCHEMA = ${namespace} AND TABLE_NAME <> '_vibe_migrations'\nUNION ALL SELECT 'constraint', CONSTRAINT_NAME, TABLE_NAME, CONSTRAINT_TYPE, NULL, NULL FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_SCHEMA = ${n()} AND TABLE_NAME <> '_vibe_migrations'\nUNION ALL SELECT 'index', s.INDEX_NAME, s.TABLE_NAME, NULL, NULL, tc.CONSTRAINT_NAME FROM information_schema.STATISTICS s LEFT JOIN information_schema.TABLE_CONSTRAINTS tc ON tc.TABLE_SCHEMA = s.TABLE_SCHEMA AND tc.TABLE_NAME = s.TABLE_NAME AND tc.CONSTRAINT_NAME = s.INDEX_NAME AND tc.CONSTRAINT_TYPE IN ('UNIQUE', 'PRIMARY KEY') WHERE s.TABLE_SCHEMA = ${n()} AND s.TABLE_NAME <> '_vibe_migrations' GROUP BY s.INDEX_NAME, s.TABLE_NAME, tc.CONSTRAINT_NAME\nUNION ALL SELECT 'trigger', TRIGGER_NAME, EVENT_OBJECT_TABLE, NULL, NULL, NULL FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = ${n()}\nUNION ALL SELECT 'column', COLUMN_NAME, TABLE_NAME, NULL, NULL, NULL FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ${n()} AND TABLE_NAME <> '_vibe_migrations'\nUNION ALL SELECT CASE WHEN GENERATION_EXPRESSION <> '' THEN 'generatedColumn' ELSE 'columnDefault' END, COLUMN_NAME, TABLE_NAME, NULL, NULL, NULL FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ${n()} AND TABLE_NAME <> '_vibe_migrations' AND (COLUMN_DEFAULT IS NOT NULL OR GENERATION_EXPRESSION <> '')\nUNION ALL SELECT 'function', ROUTINE_NAME, NULL, NULL, '[]', NULL FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = ${n()} AND ROUTINE_TYPE = 'FUNCTION'\nORDER BY kind, parent, name${MYSQL_NO_ROW_LIMIT}`, values: collector.values, returning: \"none\" };\n }\n const schema = params.dialect.quoteIdent({ name: params.namespace });\n return { text: `SELECT type AS kind, name, tbl_name AS parent, sql AS definition FROM ${schema}.sqlite_schema WHERE name NOT LIKE 'sqlite\\\\_%' ESCAPE '\\\\' AND name <> '_vibe_migrations' ORDER BY type, tbl_name, name`, values: [], returning: \"none\" };\n}\n",
75
78
  "import { internalError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlObjectIdentity } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n/** Read a qualified object definition without changing the database. */\nexport function renderMigrationObjectQuery(params: { dialect: SqlDialect; identity: SqlObjectIdentity }): RenderedQuery {\n return objectQuery({ ...params, collector: new ParamCollector(params.dialect) });\n}\n\ntype InspectionCollector = Pick<ParamCollector, \"add\" | \"values\">;\n\nfunction objectQuery(params: { dialect: SqlDialect; identity: SqlObjectIdentity; collector: InspectionCollector }): RenderedQuery {\n const { dialect, identity: object, collector } = params;\n if (object.kind === \"namespace\") {\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"fixedNamespaces\" });\n return { text: `SELECT n.nspname::text AS \"name\" FROM pg_catalog.pg_namespace n WHERE n.nspname = ${collector.add(object.name)}`, values: collector.values, returning: \"none\" };\n }\n const physical = \"table\" in object ? object.table : object.name;\n const namespace = collector.add(physical.namespace);\n const name = collector.add(physical.name);\n let text: string;\n if (dialect.name === \"postgres\") {\n const relation = `FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace`;\n const where = `n.nspname = ${namespace} AND c.relname = ${name}`;\n switch (object.kind) {\n case \"constraint\": {\n const enforcement = object.constraintType === \"foreignKey\" ? `, (SELECT bool_and(t.tgenabled IN ('O', 'A')) FROM pg_catalog.pg_trigger t WHERE t.tgconstraint = con.oid) AS \"triggersEnabled\"` : \"\";\n text = `SELECT con.contype::text AS \"type\", pg_catalog.pg_get_constraintdef(con.oid, false) AS \"definition\", con.convalidated AS \"validated\", con.condeferrable AS \"deferrable\", con.condeferred AS \"deferred\"${enforcement} ${relation} JOIN pg_catalog.pg_constraint con ON con.conrelid = c.oid WHERE ${where} AND con.conname = ${collector.add(object.name)}`;\n break;\n }\n case \"trigger\":\n text = `SELECT pg_catalog.pg_get_triggerdef(t.oid, false) AS \"definition\", t.tgenabled::text AS \"enabled\", pn.nspname::text AS \"functionNamespace\", p.proname::text AS \"functionName\", pg_catalog.pg_get_function_identity_arguments(p.oid) AS \"functionArguments\" ${relation} JOIN pg_catalog.pg_trigger t ON t.tgrelid = c.oid JOIN pg_catalog.pg_proc p ON p.oid = t.tgfoid JOIN pg_catalog.pg_namespace pn ON pn.oid = p.pronamespace WHERE ${where} AND t.tgname = ${collector.add(object.name)} AND NOT t.tgisinternal`;\n break;\n case \"function\":\n text = `SELECT pg_catalog.pg_get_functiondef(p.oid) AS \"definition\", p.provolatile::text AS \"volatility\", p.prosecdef AS \"securityDefiner\", CASE WHEN p.prosecdef THEN pg_catalog.pg_get_userbyid(p.proowner)::text ELSE NULL END AS \"definerOwner\", p.proisstrict AS \"strict\", p.proconfig::text AS \"config\", pg_catalog.pg_get_function_result(p.oid) AS \"result\" FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = ${namespace} AND p.proname = ${name} AND p.prokind = 'f' AND ARRAY(SELECT tn.nspname || '.' || t.typname FROM unnest(p.proargtypes) WITH ORDINALITY a(oid, ord) JOIN pg_catalog.pg_type t ON t.oid = a.oid JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace ORDER BY a.ord) = ${collector.add(object.argumentTypes.map((type) => `${type.namespace}.${type.name}`))}::text[]`;\n break;\n case \"view\":\n text = `SELECT pg_catalog.pg_get_viewdef(c.oid, false) AS \"definition\", c.relkind::text AS \"type\", c.reloptions::text AS \"options\" ${relation} WHERE ${where} AND c.relkind IN ('v', 'm')`;\n break;\n case \"sequence\":\n text = `SELECT pg_catalog.format_type(s.seqtypid, NULL) AS \"type\", s.seqstart::text AS \"start\", s.seqincrement::text AS \"increment\", s.seqmax::text AS \"max\", s.seqmin::text AS \"min\", s.seqcache::text AS \"cache\", s.seqcycle AS \"cycle\" ${relation} JOIN pg_catalog.pg_sequence s ON s.seqrelid = c.oid WHERE ${where}`;\n break;\n case \"column\": case \"columnDefault\": case \"generatedColumn\":\n text = `SELECT pg_catalog.format_type(a.atttypid, a.atttypmod) AS \"type\", a.attnotnull AS \"notNull\", a.attgenerated::text AS \"generated\", a.attidentity::text AS \"identity\", cn.nspname::text AS \"collationNamespace\", coll.collname::text AS \"collationName\", pg_catalog.pg_get_expr(d.adbin, d.adrelid, false) AS \"definition\" ${relation} JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid LEFT JOIN pg_catalog.pg_collation coll ON coll.oid = a.attcollation LEFT JOIN pg_catalog.pg_namespace cn ON cn.oid = coll.collnamespace LEFT JOIN pg_catalog.pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum WHERE ${where} AND a.attname = ${collector.add(object.column)} AND a.attnum > 0 AND NOT a.attisdropped`;\n break;\n case \"index\":\n text = `SELECT pg_catalog.pg_get_indexdef(i.indexrelid, 0, false) AS \"definition\", i.indisunique AS \"unique\", i.indisvalid AS \"valid\", i.indisready AS \"ready\", con.conname::text AS \"constraint\", con.contype::text AS \"constraintType\" ${relation} JOIN pg_catalog.pg_index i ON i.indrelid = c.oid JOIN pg_catalog.pg_class ix ON ix.oid = i.indexrelid LEFT JOIN pg_catalog.pg_constraint con ON con.conindid = i.indexrelid AND con.contype IN ('p', 'u', 'x') WHERE ${where} AND ix.relname = ${collector.add(object.name)}`;\n break;\n case \"table\":\n text = `SELECT c.relkind::text AS \"type\", c.relrowsecurity AS \"rls\", c.relforcerowsecurity AS \"forceRls\", c.relpersistence::text AS \"persistence\", ARRAY(SELECT option FROM unnest(c.reloptions) AS option ORDER BY option COLLATE \"C\") AS \"options\" ${relation} WHERE ${where} AND c.relkind IN ('r', 'p')`;\n break;\n case \"enum\":\n text = `SELECT ARRAY(SELECT e.enumlabel::text FROM pg_catalog.pg_enum e WHERE e.enumtypid = t.oid ORDER BY e.enumsortorder) AS \"values\" FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = ${namespace} AND t.typname = ${name} AND t.typtype = 'e'`;\n break;\n case \"postgresExtension\":\n text = `SELECT e.extversion::text AS \"version\", e.extrelocatable AS \"relocatable\" FROM pg_catalog.pg_extension e JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace WHERE n.nspname = ${namespace} AND e.extname = ${name}`;\n break;\n }\n } else if (dialect.name === \"mysql\") {\n if (object.kind === \"constraint\" && object.constraintType === \"exclusion\") throw unsupportedCapability({ dialect: \"mysql\", feature: \"exclusionConstraints\" });\n const mysql = mysqlFactsText({ dialect, identity: object, namespace, name, collector });\n if (mysql === undefined) throw unsupportedCapability({ dialect: \"mysql\", feature: `inspect:${object.kind}` });\n text = mysql;\n } else {\n if (physical.namespace !== \"main\" && physical.namespace !== \"temp\") throw unsupportedCapability({ dialect: \"sqlite\", feature: \"attachedSchemaInspection\" });\n // sqlite_schema retains source SQL. It is not a semantic SQL normalizer.\n const catalog = `${dialect.quoteIdent({ name: physical.namespace })}.sqlite_schema`;\n const kind = object.kind === \"table\" || object.kind === \"view\" ? object.kind : object.kind === \"trigger\" ? \"trigger\" : object.kind === \"index\" ? \"index\" : \"table\";\n if ([\"function\", \"sequence\", \"postgresExtension\", \"enum\"].includes(object.kind) || (object.kind === \"constraint\" && object.constraintType === \"exclusion\")) throw unsupportedCapability({ dialect: \"sqlite\", feature: `inspect:${object.kind}` });\n // Rebuild parameters: SQLite has positional placeholders, including unused values is invalid.\n const sqliteParams = new ParamCollector(dialect);\n if (object.kind === \"column\" || object.kind === \"columnDefault\" || object.kind === \"generatedColumn\") {\n text = `SELECT x.type AS type, x.\"notnull\" AS \"notNull\", x.pk AS primaryKeyPosition, x.hidden AS generated, x.dflt_value AS definition, (SELECT sql FROM ${catalog} WHERE name = ${sqliteParams.add(physical.name)} AND type = 'table') AS tableDefinition FROM pragma_table_xinfo(${sqliteParams.add(physical.name)}, ${sqliteParams.add(physical.namespace)}) x WHERE x.name = ${sqliteParams.add(object.column)}`;\n return { text, values: sqliteParams.values, returning: \"none\" };\n }\n const objectName = object.kind === \"trigger\" || object.kind === \"index\" ? object.name : physical.name;\n text = `SELECT sql AS definition, type AS type FROM ${catalog} WHERE name = ${sqliteParams.add(objectName)} AND type = ${sqliteParams.add(kind)}${object.kind === \"trigger\" ? ` AND tbl_name = ${sqliteParams.add(physical.name)}` : \"\"}`;\n return { text, values: sqliteParams.values, returning: \"none\" };\n }\n return { text, values: collector.values, returning: \"none\" };\n}\n\n/**\n * MySQL facts query text of one object (its namespace and name already bound),\n * or undefined for a kind MySQL cannot inspect. The one source of the MySQL\n * facts SQL: single reads and {@link renderMysqlObjectBatch} both render it.\n */\nfunction mysqlFactsText(params: { dialect: SqlDialect; identity: Exclude<SqlObjectIdentity, { kind: \"namespace\" }>; namespace: string; name: string; collector: InspectionCollector }): string | undefined {\n const { dialect, identity: object, namespace, name, collector } = params;\n switch (object.kind) {\n case \"view\": return `SELECT VIEW_DEFINITION AS definition, CHECK_OPTION AS checkOption, SECURITY_TYPE AS securityType, DEFINER AS definer FROM information_schema.VIEWS WHERE TABLE_SCHEMA = ${namespace} AND TABLE_NAME = ${name}`;\n case \"trigger\": return `SELECT ACTION_STATEMENT AS definition, ACTION_TIMING AS timing, EVENT_MANIPULATION AS event, ACTION_ORDER AS actionOrder, SQL_MODE AS sqlMode, DEFINER AS definer FROM information_schema.TRIGGERS WHERE TRIGGER_SCHEMA = ${namespace} AND EVENT_OBJECT_TABLE = ${name} AND TRIGGER_NAME = ${collector.add(object.name)}`;\n case \"function\": return `SELECT ROUTINE_DEFINITION AS definition, DTD_IDENTIFIER AS result, IS_DETERMINISTIC AS deterministic, SQL_DATA_ACCESS AS dataAccess, SECURITY_TYPE AS securityType, SQL_MODE AS sqlMode, DEFINER AS definer FROM information_schema.ROUTINES WHERE ROUTINE_SCHEMA = ${namespace} AND ROUTINE_NAME = ${name} AND ROUTINE_TYPE = 'FUNCTION'`;\n case \"column\": case \"columnDefault\": case \"generatedColumn\": return `SELECT COLUMN_TYPE AS type, IS_NULLABLE AS nullable, COLUMN_DEFAULT AS definition, GENERATION_EXPRESSION AS ${dialect.quoteIdent({ name: \"generated\" })}, EXTRA AS extra, COLLATION_NAME AS collation FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ${namespace} AND TABLE_NAME = ${name} AND COLUMN_NAME = ${collector.add(object.column)}`;\n case \"constraint\":\n if (object.constraintType === \"exclusion\") return undefined;\n return `SELECT tc.CONSTRAINT_TYPE AS type, tc.ENFORCED AS enforced, cc.CHECK_CLAUSE AS definition, rc.UPDATE_RULE AS onUpdate, rc.DELETE_RULE AS onDelete, rc.MATCH_OPTION AS matchOption FROM information_schema.TABLE_CONSTRAINTS tc LEFT JOIN information_schema.CHECK_CONSTRAINTS cc ON cc.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA AND cc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME LEFT JOIN information_schema.REFERENTIAL_CONSTRAINTS rc ON rc.CONSTRAINT_SCHEMA = tc.CONSTRAINT_SCHEMA AND rc.TABLE_NAME = tc.TABLE_NAME AND rc.CONSTRAINT_NAME = tc.CONSTRAINT_NAME WHERE tc.TABLE_SCHEMA = ${namespace} AND tc.TABLE_NAME = ${name} AND tc.CONSTRAINT_NAME = ${collector.add(object.name)}`;\n case \"index\": return `SELECT INDEX_NAME AS name, NON_UNIQUE AS nonUnique, INDEX_TYPE AS method, IS_VISIBLE AS visible FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = ${namespace} AND TABLE_NAME = ${name} AND INDEX_NAME = ${collector.add(object.name)} GROUP BY INDEX_NAME, NON_UNIQUE, INDEX_TYPE, IS_VISIBLE`;\n case \"table\": return `SELECT TABLE_TYPE AS type, ENGINE AS engine, TABLE_COLLATION AS collation FROM information_schema.TABLES WHERE TABLE_SCHEMA = ${namespace} AND TABLE_NAME = ${name}`;\n default: return undefined;\n }\n}\n\n/** The parts of one MySQL member query: its select list, its source with WHERE, and the column its rows are ordered by. */\ntype MysqlMemberParts = { readonly columns: string; readonly source: string; readonly ordinal: string };\n\nfunction mysqlMemberParts(params: { identity: SqlObjectIdentity; collector: InspectionCollector }): MysqlMemberParts | undefined {\n const { identity: object, collector } = params;\n if (object.kind !== \"function\" && object.kind !== \"index\" && object.kind !== \"constraint\") return undefined;\n const physical = \"table\" in object ? object.table : object.name;\n const namespace = collector.add(physical.namespace);\n const name = collector.add(physical.name);\n return object.kind === \"function\"\n ? { columns: \"PARAMETER_MODE AS mode, PARAMETER_NAME AS name, DTD_IDENTIFIER AS type, CHARACTER_SET_NAME AS characterSet, COLLATION_NAME AS collation\", source: `information_schema.PARAMETERS WHERE SPECIFIC_SCHEMA = ${namespace} AND SPECIFIC_NAME = ${name}`, ordinal: \"ORDINAL_POSITION\" }\n : object.kind === \"index\"\n ? { columns: \"COLUMN_NAME AS name, EXPRESSION AS expression, SUB_PART AS prefixLength, COLLATION AS collation\", source: `information_schema.STATISTICS WHERE TABLE_SCHEMA = ${namespace} AND TABLE_NAME = ${name} AND INDEX_NAME = ${collector.add(object.name)}`, ordinal: \"SEQ_IN_INDEX\" }\n : { columns: \"COLUMN_NAME AS name, REFERENCED_TABLE_SCHEMA AS referenceNamespace, REFERENCED_TABLE_NAME AS referenceTable, REFERENCED_COLUMN_NAME AS referenceColumn\", source: `information_schema.KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA = ${namespace} AND TABLE_NAME = ${name} AND CONSTRAINT_NAME = ${collector.add(object.name)}`, ordinal: \"ORDINAL_POSITION\" };\n}\n\n/** Ordered MySQL object members; no GROUP_CONCAT truncation can hide a definition change. */\nexport function renderMysqlObjectMembers(params: { dialect: SqlDialect; identity: SqlObjectIdentity }): RenderedQuery | undefined {\n if (params.dialect.name !== \"mysql\") return undefined;\n const collector = new ParamCollector(params.dialect);\n const parts = mysqlMemberParts({ identity: params.identity, collector });\n if (parts === undefined) return undefined;\n return { text: `SELECT ${parts.columns} FROM ${parts.source} ORDER BY ${parts.ordinal}`, values: collector.values, returning: \"none\" };\n}\n\n/**\n * One batched MySQL catalog read. Its rows carry `vibe_position` = i, the\n * branch that answers for request position `positions[i]`; member reads also\n * carry `vibe_ordinal`, the single query's ORDER BY column.\n */\nexport type MysqlObjectBatch = RenderedQuery & { readonly positions: readonly number[] };\n\n/**\n * Objects per batched MySQL statement. Larger unions cost the server more per\n * object (lane M probe, 17.10.2026: 100 per statement is as fast as single reads\n * or faster; 500 and 1 000 are slower), and 100 keeps a statement far below\n * the prepared-statement placeholder limit.\n */\nconst MYSQL_OBJECT_BATCH_SIZE = 100;\n\n/**\n * Ends every batched MySQL statement. `sql_select_limit` (session or global,\n * e.g. 1 000 under `mysql --safe-updates`) silently cuts the rows of a SELECT\n * without its own LIMIT, and a cut batch would read its last objects as\n * missing; an explicit LIMIT takes precedence over it. After the last\n * `UNION ALL` branch the LIMIT applies to the whole union. The value is MySQL's\n * largest row count, so nothing is ever cut.\n */\nconst MYSQL_BATCH_NO_ROW_LIMIT = \" LIMIT 18446744073709551615\";\n\n/** Branch-relative positions keep one statement text per shape and chunk size, so prepared statements are reused. */\nfunction mysqlBatches(params: { groups: ReadonlyMap<string, readonly { readonly position: number; readonly branch: (index: number) => string; readonly values: readonly unknown[] }[]>; suffix: string }): MysqlObjectBatch[] {\n const batches: MysqlObjectBatch[] = [];\n for (const group of params.groups.values()) {\n for (let offset = 0; offset < group.length; offset += MYSQL_OBJECT_BATCH_SIZE) {\n const chunk = group.slice(offset, offset + MYSQL_OBJECT_BATCH_SIZE);\n batches.push({\n text: `${chunk.map((entry, index) => entry.branch(index)).join(\" UNION ALL \")}${params.suffix}${MYSQL_BATCH_NO_ROW_LIMIT}`,\n values: chunk.flatMap((entry) => entry.values),\n returning: \"none\",\n positions: chunk.map((entry) => entry.position),\n });\n }\n }\n return batches;\n}\n\n/**\n * MySQL facts reads in bounded statements, grouped by query shape in request\n * order, 100 objects per statement. Each `UNION ALL` branch is the UNCHANGED\n * single-object query as a derived table, so the server matches names with the\n * single read's own `WHERE` and collation: the rows of a position are exactly the\n * rows {@link renderMigrationObjectQuery} returns for it. An identity MySQL cannot\n * inspect is in no batch; the caller reads it on its own (and gets its refusal).\n * The statement ends with `LIMIT 18446744073709551615`, so `sql_select_limit`\n * cannot cut it.\n */\nexport function renderMysqlObjectBatch(params: { dialect: SqlDialect; identities: readonly SqlObjectIdentity[] }): readonly MysqlObjectBatch[] {\n const { dialect } = params;\n if (dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: dialect.name, feature: \"batchedMigrationInspection\" });\n const position = dialect.quoteIdent({ name: \"vibe_position\" });\n const groups = new Map<string, { position: number; branch: (index: number) => string; values: readonly unknown[] }[]>();\n for (const [index, identity] of params.identities.entries()) {\n if (identity.kind === \"namespace\") continue;\n const physical = \"table\" in identity ? identity.table : identity.name;\n const collector = new ParamCollector(dialect);\n const text = mysqlFactsText({ dialect, identity, namespace: collector.add(physical.namespace), name: collector.add(physical.name), collector });\n if (text === undefined) continue;\n const group = groups.get(text) ?? [];\n group.push({ position: index, branch: (branch) => `SELECT ${branch} AS ${position}, q.* FROM (${text}) q`, values: collector.values });\n groups.set(text, group);\n }\n return mysqlBatches({ groups, suffix: \"\" });\n}\n\n/**\n * MySQL member reads (function parameters, index and constraint columns) in\n * bounded statements, grouped by kind in request order, 100 objects per\n * statement. Each branch is the single member query's select list and `WHERE`\n * plus its ORDER BY column as `vibe_ordinal`; MySQL ignores an ORDER BY inside a\n * union branch, so the statement orders by `vibe_position, vibe_ordinal` (then\n * `LIMIT 18446744073709551615`, so `sql_select_limit` cannot cut it). Rows\n * of a position equal {@link renderMysqlObjectMembers}' rows in its order\n * whenever that object's ordinals are distinct; the caller checks that.\n */\nexport function renderMysqlObjectMembersBatch(params: { dialect: SqlDialect; identities: readonly SqlObjectIdentity[] }): readonly MysqlObjectBatch[] {\n const { dialect } = params;\n if (dialect.name !== \"mysql\") throw unsupportedCapability({ dialect: dialect.name, feature: \"batchedMigrationInspection\" });\n const position = dialect.quoteIdent({ name: \"vibe_position\" });\n const ordinal = dialect.quoteIdent({ name: \"vibe_ordinal\" });\n const groups = new Map<string, { position: number; branch: (index: number) => string; values: readonly unknown[] }[]>();\n for (const [index, identity] of params.identities.entries()) {\n const collector = new ParamCollector(dialect);\n const parts = mysqlMemberParts({ identity, collector });\n if (parts === undefined) continue;\n const group = groups.get(identity.kind) ?? [];\n group.push({ position: index, branch: (branch) => `SELECT ${branch} AS ${position}, ${parts.ordinal} AS ${ordinal}, ${parts.columns} FROM ${parts.source}`, values: collector.values });\n groups.set(identity.kind, group);\n }\n return mysqlBatches({ groups, suffix: ` ORDER BY ${position}, ${ordinal}` });\n}\n\n/** PostgreSQL dependency addresses are returned as server-owned strings, never guessed from SQL. */\nexport function renderMigrationDependencies(params: { dialect: SqlDialect; identity: SqlObjectIdentity }): RenderedQuery {\n return dependencyQuery({ ...params, collector: new ParamCollector(params.dialect) });\n}\n\nfunction dependencyQuery(params: { dialect: SqlDialect; identity: SqlObjectIdentity; collector: InspectionCollector }): RenderedQuery {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"catalogDependencies\" });\n const object = params.identity;\n const collector = params.collector;\n if (object.kind === \"namespace\") {\n const namespace = collector.add(object.name);\n return { text: `SELECT DISTINCT json_build_array(d.deptype, a.type, a.object_names, a.object_args)::text AS address FROM pg_catalog.pg_namespace n JOIN pg_catalog.pg_depend d ON d.classid = 'pg_namespace'::regclass AND d.objid = n.oid AND d.objsubid = 0 CROSS JOIN LATERAL pg_catalog.pg_identify_object_as_address(d.refclassid, d.refobjid, d.refobjsubid) a WHERE n.nspname = ${namespace} ORDER BY address`, values: collector.values, returning: \"none\" };\n }\n const physical = \"table\" in object ? object.table : object.name;\n const namespace = collector.add(physical.namespace);\n const name = collector.add(physical.name);\n const relation = `SELECT c.oid FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace WHERE n.nspname = ${namespace} AND c.relname = ${name}`;\n let source: string;\n switch (object.kind) {\n case \"constraint\": source = `SELECT 'pg_constraint'::regclass AS classid, con.oid AS objid, 0 AS objsubid FROM pg_catalog.pg_constraint con WHERE con.conrelid = (${relation}) AND con.conname = ${collector.add(object.name)}`; break;\n case \"trigger\": source = `SELECT 'pg_trigger'::regclass AS classid, t.oid AS objid, 0 AS objsubid FROM pg_catalog.pg_trigger t WHERE t.tgrelid = (${relation}) AND t.tgname = ${collector.add(object.name)}`; break;\n case \"columnDefault\": case \"generatedColumn\": source = `SELECT 'pg_attrdef'::regclass AS classid, d.oid AS objid, 0 AS objsubid FROM pg_catalog.pg_attrdef d JOIN pg_catalog.pg_attribute a ON a.attrelid = d.adrelid AND a.attnum = d.adnum WHERE a.attrelid = (${relation}) AND a.attname = ${collector.add(object.column)}`; break;\n case \"column\": source = `SELECT 'pg_class'::regclass AS classid, a.attrelid AS objid, a.attnum AS objsubid FROM pg_catalog.pg_attribute a WHERE a.attrelid = (${relation}) AND a.attname = ${collector.add(object.column)}`; break;\n case \"view\": source = `SELECT 'pg_rewrite'::regclass AS classid, r.oid AS objid, 0 AS objsubid FROM pg_catalog.pg_rewrite r WHERE r.ev_class = (${relation})`; break;\n case \"index\": source = `SELECT 'pg_class'::regclass AS classid, i.indexrelid AS objid, 0 AS objsubid FROM pg_catalog.pg_index i JOIN pg_catalog.pg_class c ON c.oid = i.indexrelid WHERE i.indrelid = (${relation}) AND c.relname = ${collector.add(object.name)}`; break;\n case \"function\": source = `SELECT 'pg_proc'::regclass AS classid, p.oid AS objid, 0 AS objsubid FROM pg_catalog.pg_proc p JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace WHERE n.nspname = ${namespace} AND p.proname = ${name} AND ARRAY(SELECT tn.nspname || '.' || t.typname FROM unnest(p.proargtypes) WITH ORDINALITY a(oid, ord) JOIN pg_catalog.pg_type t ON t.oid = a.oid JOIN pg_catalog.pg_namespace tn ON tn.oid = t.typnamespace ORDER BY a.ord) = ${collector.add(object.argumentTypes.map((type) => `${type.namespace}.${type.name}`))}::text[]`; break;\n case \"enum\": source = `SELECT 'pg_type'::regclass AS classid, t.oid AS objid, 0 AS objsubid FROM pg_catalog.pg_type t JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE n.nspname = ${namespace} AND t.typname = ${name} AND t.typtype = 'e'`; break;\n case \"postgresExtension\": source = `SELECT 'pg_extension'::regclass AS classid, e.oid AS objid, 0 AS objsubid FROM pg_catalog.pg_extension e JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace WHERE n.nspname = ${namespace} AND e.extname = ${name}`; break;\n default: source = `SELECT 'pg_class'::regclass AS classid, c.oid AS objid, 0 AS objsubid FROM pg_catalog.pg_class c WHERE c.oid = (${relation})`; break;\n }\n return { text: `SELECT DISTINCT json_build_array(d.deptype, a.type, a.object_names, a.object_args)::text AS address FROM (${source}) s JOIN pg_catalog.pg_depend d ON d.classid = s.classid AND d.objid = s.objid AND d.objsubid = s.objsubid CROSS JOIN LATERAL pg_catalog.pg_identify_object_as_address(d.refclassid, d.refobjid, d.refobjsubid) a ORDER BY address`, values: collector.values, returning: \"none\" };\n}\n\nfunction inspectionReferences(params: { dialect: SqlDialect }): InspectionCollector {\n const values: unknown[] = [];\n return { values, add(value) {\n values.push(value);\n return `request.${params.dialect.quoteIdent({ name: `p${values.length}` })}`;\n } };\n}\n\n/** One batched PostgreSQL catalog read and the request positions it answers for. */\nexport type MigrationObjectBatch = RenderedQuery & { readonly positions: readonly number[] };\n\n/** Batch PostgreSQL facts and dependencies by SQL shape, retaining each requested position. */\nexport function renderMigrationObjectBatch(params: { dialect: SqlDialect; identities: readonly SqlObjectIdentity[] }): readonly MigrationObjectBatch[] {\n const { dialect } = params;\n if (dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: dialect.name, feature: \"batchedMigrationInspection\" });\n const groups = new Map<string, { identity: SqlObjectIdentity; position: number }[]>();\n for (const [position, identity] of params.identities.entries()) {\n // One group per distinct facts/dependency SQL pair; columnDefault and generatedColumn render the same pair.\n const kind = identity.kind === \"constraint\" ? `${identity.kind}:${identity.constraintType}` : identity.kind === \"generatedColumn\" ? \"columnDefault\" : identity.kind;\n const group = groups.get(kind) ?? [];\n group.push({ identity, position });\n groups.set(kind, group);\n }\n return [...groups.values()].map((group): MigrationObjectBatch => {\n const identity = group[0]!.identity;\n const facts = objectQuery({ dialect, identity, collector: inspectionReferences({ dialect }) });\n const dependencies = dependencyQuery({ dialect, identity, collector: inspectionReferences({ dialect }) });\n // Both queries read request.p1..pN, so they must bind the identity's values in one order.\n if (JSON.stringify(dependencies.values) !== JSON.stringify(facts.values)) throw internalError({ message: \"Batched catalog queries bind their identity in different orders\", meta: { kind: identity.kind } });\n const columns = facts.values.map((value, index) => `${dialect.quoteIdent({ name: `p${index + 1}` })} ${Array.isArray(value) ? \"text[]\" : \"text\"}`);\n const requests = group.map(({ identity, position }) => ({ position, ...Object.fromEntries(renderMigrationObjectQuery({ dialect, identity }).values.map((value, index) => [`p${index + 1}`, value])) }));\n // Bind serialized JSON as text; a jsonb wire parameter is JSON-encoded again by Bun.\n const collector = new ParamCollector(dialect);\n return {\n text: `SELECT request.position, to_jsonb(facts) AS facts, ARRAY(SELECT address FROM (${dependencies.text}) dependency ORDER BY address) AS \"dependencyAddresses\" FROM jsonb_to_recordset(${collector.add(JSON.stringify(requests))}::text::jsonb) AS request(position integer, ${columns.join(\", \")}) CROSS JOIN LATERAL (${facts.text}) facts`,\n values: collector.values,\n returning: \"none\",\n positions: group.map(({ position }) => position),\n };\n });\n}\n\n/** Record the database normalization context in generated metadata. */\nexport function renderMigrationServerVersion(params: { dialect: SqlDialect }): RenderedQuery {\n return { text: params.dialect.name === \"sqlite\" ? \"SELECT sqlite_version() AS version\" : \"SELECT version() AS version\", values: [], returning: \"none\" };\n}\n\n/** Inspectable current namespace; core PostgreSQL schema mapping remains public. */\nexport function renderMigrationNamespace(params: { dialect: SqlDialect }): RenderedQuery {\n return { text: params.dialect.name === \"mysql\" ? \"SELECT DATABASE() AS namespace\" : params.dialect.name === \"sqlite\" ? \"SELECT 'main' AS namespace\" : \"SELECT 'public' AS namespace\", values: [], returning: \"none\" };\n}\n\n/** PostgreSQL CHECK probe uses the actual table's type context and is always rolled back. */\nexport function renderCheckProbe(params: { dialect: SqlDialect; table: { namespace: string; name: string }; expression: string; name: string }): RenderedQuery {\n if (params.dialect.name !== \"postgres\") throw unsupportedCapability({ dialect: params.dialect.name, feature: \"rollbackCheckProbe\" });\n const q = (name: string): string => params.dialect.quoteIdent({ name });\n return { text: `ALTER TABLE ${q(params.table.namespace)}.${q(params.table.name)} ADD CONSTRAINT ${q(params.name)} CHECK (${params.expression}) NOT VALID`, values: [], returning: \"none\" };\n}\n",
76
79
  "/**\n * PostgreSQL migration-operations SQL: migration-owned session settings and\n * the read-only catalog probes a nontransactional migration needs to establish\n * what actually happened before it resumes.\n *\n * Why these live here and not in @vibeorm/migrate: every SQL-text decision\n * belongs to a dialect module (constitution rule 4). The migrate runner\n * decides WHEN to ask; this file decides WHAT is asked.\n *\n * Honesty notes carried by these shapes:\n *\n * - `lock_timeout` bounds how long ONE statement waits for a lock. It does not\n * make an operation online, and it does not bound the lock's HOLD time once\n * acquired. The runner surfaces that as risk output, not as a guarantee.\n * - The index probe reports `indisvalid`/`indisready` AND the full deparsed\n * definition, because `CREATE INDEX CONCURRENTLY` can fail leaving an\n * invalid index behind that `IF NOT EXISTS` would happily accept.\n * - Every probe is scoped to `current_schema()`, the same schema the migrate\n * DDL renderers write into.\n */\n\nimport { VibeError, unsupportedCapability } from \"@vibeorm/schema\";\nimport type { SqlDialect } from \"../dialect.ts\";\nimport type { RenderedQuery } from \"../render.ts\";\nimport { ParamCollector } from \"../params.ts\";\n\n// ─── Session settings ─────────────────────────────────────────────\n\n/** Session settings a migration may scope to its own work. */\nexport type MigrationSessionSetting = \"lock_timeout\" | \"statement_timeout\";\n\n/**\n * A PostgreSQL interval-ish setting value as `current_setting` returns it\n * (`0`, `5s`, `250ms`, `2min`). Anything else is refused rather than\n * interpolated — these values are written into SQL text, not parameters,\n * because `SET` takes no placeholders.\n */\nconst SETTING_VALUE = /^[0-9]+(?:\\.[0-9]+)?\\s*(?:us|ms|s|min|h|d)?$/;\n\nfunction requirePostgres(params: { dialect: SqlDialect; feature: string }): void {\n if (params.dialect.name !== \"postgres\") {\n throw unsupportedCapability({ dialect: params.dialect.name, feature: params.feature });\n }\n}\n\n/** Read the session's current `lock_timeout` / `statement_timeout`, to restore them later. */\nexport function renderMigrationSessionRead(params: { dialect: SqlDialect }): RenderedQuery {\n requirePostgres({ dialect: params.dialect, feature: \"migrationSessionSettings\" });\n return {\n text: `SELECT pg_catalog.current_setting('lock_timeout') AS \"lockTimeout\", pg_catalog.current_setting('statement_timeout') AS \"statementTimeout\"`,\n values: [],\n returning: \"none\",\n };\n}\n\n/**\n * Scope a setting to the migration's own work. Milliseconds only, and only a\n * non-negative safe integer: 0 means \"no limit\", which is PostgreSQL's own\n * default and the value a restore falls back to.\n */\nexport function renderMigrationSessionSet(params: {\n dialect: SqlDialect;\n setting: MigrationSessionSetting;\n milliseconds: number;\n /** `SET LOCAL` — reverted by the enclosing COMMIT/ROLLBACK, so no restore is needed. */\n local?: boolean;\n}): RenderedQuery {\n requirePostgres({ dialect: params.dialect, feature: \"migrationSessionSettings\" });\n const { milliseconds, setting } = params;\n if (!Number.isSafeInteger(milliseconds) || milliseconds < 0) {\n throw new VibeError({\n code: \"VIBE_MIGRATION\",\n message: `${setting} must be a non-negative integer number of milliseconds (got ${String(milliseconds)})`,\n meta: { reason: \"execution-metadata-invalid\", setting, value: milliseconds },\n });\n }\n return { text: `SET ${params.local === true ? \"LOCAL \" : \"\"}${setting} = '${milliseconds}ms'`, values: [], returning: \"none\" };\n}\n\n/**\n * Put a setting back to the value {@link renderMigrationSessionRead} reported.\n * An unrecognized value restores the server default with `RESET` instead of\n * being interpolated — never guess at SQL text read back from a session.\n */\nexport function renderMigrationSessionRestore(params: {\n dialect: SqlDialect;\n setting: MigrationSessionSetting;\n value: string;\n}): RenderedQuery {\n requirePostgres({ dialect: params.dialect, feature: \"migrationSessionSettings\" });\n const trimmed = params.value.trim();\n const text = SETTING_VALUE.test(trimmed)\n ? `SET ${params.setting} = '${trimmed}'`\n : `RESET ${params.setting}`;\n return { text, values: [], returning: \"none\" };\n}\n\n// ─── Catalog probes ───────────────────────────────────────────────\n\n/**\n * Everything needed to decide whether a `CREATE INDEX CONCURRENTLY` finished:\n * the index's validity, its access method, its uniqueness, its key-column\n * expressions as PostgreSQL itself deparses them (newline-joined so every\n * adapter decodes one plain text column), its partial predicate and the full\n * `pg_get_indexdef` text for the operator to read in an error message.\n * Complete recovery also reads NULL uniqueness and lossless ordered JSON text\n * for key and included definitions. PostgreSQL 16/17/18 expose these fields.\n *\n * `indisvalid = false` is the state a cancelled/failed concurrent build\n * leaves behind: the index exists, is skipped by the planner, and is still\n * maintained by writes. `IF NOT EXISTS` cannot tell that apart from success.\n */\nexport function renderIndexStateQuery(params: { dialect: SqlDialect; index: string }): RenderedQuery {\n requirePostgres({ dialect: params.dialect, feature: \"concurrentIndexRecovery\" });\n const collector = new ParamCollector(params.dialect);\n const name = collector.add(params.index);\n return {\n text: `SELECT c.relname::text AS \"index\",\n t.relname::text AS \"table\",\n am.amname::text AS \"method\",\n i.indisunique AS \"unique\",\n i.indnullsnotdistinct AS \"nullsNotDistinct\",\n pg_catalog.array_to_json(ARRAY(SELECT pg_catalog.pg_get_indexdef(i.indexrelid, k.k, true)\n FROM pg_catalog.generate_series(1, i.indnkeyatts) AS k(k) ORDER BY k.k))::text AS \"keyColumns\",\n pg_catalog.array_to_json(ARRAY(SELECT pg_catalog.pg_get_indexdef(i.indexrelid, k.k, true)\n FROM pg_catalog.generate_series(i.indnkeyatts + 1, i.indnatts) AS k(k) ORDER BY k.k))::text AS \"includedColumns\",\n i.indisvalid AS \"valid\",\n i.indisready AS \"ready\",\n pg_catalog.pg_get_expr(i.indpred, i.indrelid) AS \"predicate\",\n pg_catalog.pg_get_indexdef(i.indexrelid) AS \"definition\",\n (SELECT string_agg(pg_catalog.pg_get_indexdef(i.indexrelid, k.k, true), E'\\\\n' ORDER BY k.k)\n FROM pg_catalog.generate_series(1, i.indnkeyatts) AS k(k)) AS \"columns\"\nFROM pg_catalog.pg_class c\nJOIN pg_catalog.pg_index i ON i.indexrelid = c.oid\nJOIN pg_catalog.pg_class t ON t.oid = i.indrelid\nJOIN pg_catalog.pg_am am ON am.oid = c.relam\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname = pg_catalog.current_schema() AND c.relname = ${name}`,\n values: collector.values,\n returning: \"none\",\n };\n}\n\n/** Whether a named constraint exists on a table, and whether it is validated. */\nexport function renderConstraintStateQuery(params: {\n dialect: SqlDialect;\n table: string;\n constraint: string;\n}): RenderedQuery {\n requirePostgres({ dialect: params.dialect, feature: \"stagedConstraints\" });\n const collector = new ParamCollector(params.dialect);\n const table = collector.add(params.table);\n const constraint = collector.add(params.constraint);\n return {\n text: `SELECT con.conname::text AS \"constraint\",\n rel.relname::text AS \"table\",\n con.contype::text AS \"type\",\n con.convalidated AS \"validated\",\n pg_catalog.pg_get_constraintdef(con.oid) AS \"definition\"\nFROM pg_catalog.pg_constraint con\nJOIN pg_catalog.pg_class rel ON rel.oid = con.conrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = rel.relnamespace\nWHERE n.nspname = pg_catalog.current_schema() AND rel.relname = ${table} AND con.conname = ${constraint}`,\n values: collector.values,\n returning: \"none\",\n };\n}\n\n/** Whether a relation of that physical name exists in the migration's schema. */\nexport function renderRelationStateQuery(params: { dialect: SqlDialect; table: string }): RenderedQuery {\n requirePostgres({ dialect: params.dialect, feature: \"renameRecovery\" });\n const collector = new ParamCollector(params.dialect);\n const table = collector.add(params.table);\n return {\n text: `SELECT c.relname::text AS \"table\", c.relkind::text AS \"kind\"\nFROM pg_catalog.pg_class c\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname = pg_catalog.current_schema() AND c.relname = ${table}`,\n values: collector.values,\n returning: \"none\",\n };\n}\n\n/** Whether a live (non-dropped, non-system) column of that name exists on a table. */\nexport function renderColumnStateQuery(params: {\n dialect: SqlDialect;\n table: string;\n column: string;\n}): RenderedQuery {\n requirePostgres({ dialect: params.dialect, feature: \"renameRecovery\" });\n const collector = new ParamCollector(params.dialect);\n const table = collector.add(params.table);\n const column = collector.add(params.column);\n return {\n text: `SELECT a.attname::text AS \"column\"\nFROM pg_catalog.pg_attribute a\nJOIN pg_catalog.pg_class c ON c.oid = a.attrelid\nJOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\nWHERE n.nspname = pg_catalog.current_schema() AND c.relname = ${table} AND a.attname = ${column}\n AND a.attnum > 0 AND NOT a.attisdropped`,\n values: collector.values,\n returning: \"none\",\n };\n}\n"
77
80
  ],
78
- "mappings": "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",
79
- "debugId": "B21A2ED0EE62B5B964756E2164756E21",
81
+ "mappings": ";;AAqBA,IAAM,aAAa,IAAI;AAGvB,SAAS,YAAY,CAAC,QAAwD;AAAA,EAC5E,MAAM,WAAW,UAAU,KAAK,OAAO,IAAI,IAAI,MAAM;AAAA,EACrD,MAAM,YAAY,SAAS,MAAM,CAAC,EAAE,QAAQ,OAAO,EAAE;AAAA,EACrD,MAAM,YAAY,KAAK,UAAU,YAAY,KAAK,IAAI,KAAK,OAAO,YAAY,CAAC,EAAE,QAAQ,eAAe,KAAK,YAAY;AAAA,EACzH,OAAO,QAAQ;AAAA;AAGjB,SAAS,WAAW,CAAC,UAAqC;AAAA,EACxD,IAAI,SAAS,QAAQ;AAAA,IAAW,SAAS,MAAM,aAAa,EAAE,cAAc,SAAS,cAAc,MAAM,SAAS,KAAK,CAAC;AAAA,EACxH,OAAO,SAAS;AAAA;AAOX,SAAS,yBAAyB,CAAC,QAMjC;AAAA,EACP,QAAQ,MAAM,SAAS;AAAA,EACvB,MAAM,eAAe,KAAK,UAAU,QAAQ,KAAK,IAAI;AAAA,EAErD,IAAI,CAAC,OAAO,SAAS,YAAY;AAAA,IAAG,KAAK,UAAU,YAAY,KAAK,IAAI;AAAA,EACxE,WAAW,IAAI,MAAM;AAAA,IACnB;AAAA,IACA;AAAA,IACA,SAAS,OAAO;AAAA,IAChB,KAAK,OAAO;AAAA,IACZ,MAAM,OAAO,QAAQ;AAAA,EACvB,CAAC;AAAA,EACD,OAAO;AAAA;AAGT,SAAS,UAAU,CAAC,QAAuD;AAAA,EACzE,MAAM,SAAS,WAAW,IAAI,OAAO,IAAI;AAAA,EACzC,IAAI,WAAW,aAAa,OAAO,iBAAiB,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,GAAG;AAAA,IAC5F,WAAW,OAAO,OAAO,IAAI;AAAA,IAC7B;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,oBAAoB,CAAC,QAAgC;AAAA,EACnE,MAAM,WAAW,WAAW,MAAM;AAAA,EAClC,OAAO,aAAa,YAAY,YAAY,QAAQ,IAAI,QAAQ,OAAO,SAAS,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,CAAC,IAAI,KAAK,UAAU,YAAY,KAAK,OAAO,IAAI,IAAI;AAAA;AAItK,SAAS,qBAAqB,CAAC,QAA8E;AAAA,EAClH,MAAM,WAAW,WAAW,MAAM;AAAA,EAClC,OAAO,aAAa,cAAc,OAAO,SAAS,aAAa,SAAS,SAAS,OAAO,QAAQ,SAAS,OAAO;AAAA;AAO3G,SAAS,4BAA4B,CAAC,QAAqD;AAAA,EAChG,MAAM,WAAW,WAAW,MAAM;AAAA,EAClC,OAAO,UAAU,SAAS,WAAW,SAAS,WAAW,SAAS,OAAO;AAAA;AAIpE,SAAS,qBAAqB,CAAC,QAAwD;AAAA,EAC5F,MAAM,OAAO,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,EAC7C,MAAM,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,EAC/C,IAAI,qBAAqB,EAAE,MAAM,OAAO,KAAK,CAAC,MAAM,qBAAqB,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,IAAG,OAAO;AAAA,EACzG,MAAM,OAAO,CAAC,GAA6B,MAA4C,IAAI,IAAI,KAAK,IAAI,IAAI,IAAI;AAAA,EAChH,IAAI,MAAM,SAAS,YAAY,OAAO,SAAS,UAAU;AAAA,IACvD,OAAO,MAAM,YAAY,aAAa,OAAO,YAAY,YAAY,KAAK,KAAK,SAAS,MAAM,OAAO,IAAI;AAAA,EAC3G;AAAA,EACA,MAAM,QAAQ,CAAC,aAA2D;AAAA,IACxE,SAAS,OAAO,SAAS,SAAS,UAAU,YAAY,QAAQ,EAAE,MAAM,GAAG;AAAA,IAC3E,OAAO,OAAO,WAAW,MAAM,QAAS,MAAM,GAAG;AAAA,IACjD,MAAM,QAAQ,OAAO,OAAO,KAAK,IAAI,OAAO,OAAO,OAAO,IAAI,KAAK,OAAO,KAAK,CAAC,IAAI,cAChF,OAAO,SAAS,OAAO,GAAG,GAAG,CAAC;AAAA,IAClC,MAAM,OAAO,OAAO,MAAM;AAAA,IAE1B,OAAO,CAAC,QAAQ,OAAO,IAAI,IAAI,UAAY,CAAC,IAAI;AAAA;AAAA,EAElD,IAAK,MAAM,SAAS,aAAa,KAAK,SAAS,eAAiB,OAAO,SAAS,aAAa,MAAM,SAAS,aAAc;AAAA,IACxH,IAAI,SAAS,aAAa,UAAU,aAAa,KAAK,SAAS,MAAM;AAAA,MAAM,OAAO;AAAA,IAClF,MAAM,IAAI,MAAM,IAAI;AAAA,IACpB,MAAM,IAAI,MAAM,KAAK;AAAA,IACrB,OAAO,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE,IAAI,EAAE,EAAE;AAAA,EAC5C;AAAA,EACA,MAAM,eAAe,KAAK,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,GAAG,KAAK,UAAU,QAAQ,KAAK,OAAO,KAAK,CAAC;AAAA,EAC7G,IAAI,iBAAiB;AAAA,IAAG,OAAO;AAAA,EAC/B,MAAM,IAAI,UAAU,KAAK,MAAM,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAC,KAAK;AAAA,EAC7D,MAAM,IAAI,UAAU,KAAK,OAAO,QAAQ,EAAE,IAAI,IAAI,MAAM,CAAC,KAAK;AAAA,EAC9D,OAAO,KAAK,EAAE,OAAO,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,GAAG,EAAE,OAAO,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;AAAA;AAU/F,SAAS,uBAAuB,CAAC,QAA8B;AAAA,EACpE,MAAM,WAAW,WAAW,MAAM;AAAA,EAClC,MAAM,OAAO,IAAI,KAAK,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,EAC9D,IAAI,aAAa;AAAA,IAAW,WAAW,IAAI,MAAM,KAAK,UAAU,OAAO,KAAK,CAAC;AAAA,EAC7E,OAAO;AAAA;AAQF,SAAS,kBAAkB,CAAC,QAAgD;AAAA,EACjF,QAAQ,UAAU;AAAA,EAClB,IAAI,EAAE,iBAAiB;AAAA,IAAO;AAAA,EAC9B,MAAM,WAAW,WAAW,EAAE,MAAM,MAAM,CAAC;AAAA,EAC3C,OAAO,UAAU,UAAU,OAAO,SAAS,OAAO;AAAA;AAI7C,SAAS,kBAAkB,CAAC,QAA8B;AAAA,EAC/D,MAAM,OAAO,IAAI,KAAK,KAAK,UAAU,QAAQ,KAAK,OAAO,IAAI,CAAC;AAAA,EAC9D,MAAM,WAAW,WAAW,MAAM;AAAA,EAClC,IAAI,aAAa;AAAA,IAAW,WAAW,IAAI,MAAM,QAAQ;AAAA,EACzD,OAAO;AAAA;;ACrIT,IAAM,gBAAmC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAGxF,IAAM,kBAAqC,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE;AAkBnF,SAAS,uBAAuB,CAAC,QAAyF;AAAA,EAC/H,QAAQ,MAAM,UAAU;AAAA,EACxB,MAAM,SAAS,KAAK;AAAA,EACpB,MAAM,YAAY,KAAK,WAAW,EAAE;AAAA,EACpC,IACE,SAAS,MACT,KAAK,WAAW,CAAC,MAAM,MACvB,KAAK,WAAW,CAAC,MAAM,MACtB,cAAc,OAAO,UAAU,YAAY,cAAc,OAC1D,KAAK,WAAW,EAAE,MAAM,MACxB,KAAK,WAAW,EAAE,MAAM,IACxB;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAS,WAAW,EAAG,WAAW,gBAAgB,QAAQ,YAAY;AAAA,IACpE,MAAM,OAAO,KAAK,WAAW,gBAAgB,SAAmB;AAAA,IAChE,IAAI,OAAO,MAAM,OAAO;AAAA,MAAI;AAAA,EAC9B;AAAA,EACA,MAAM,QACH,KAAK,WAAW,CAAC,IAAI,MAAM,QAAQ,KAAK,WAAW,CAAC,IAAI,MAAM,OAAO,KAAK,WAAW,CAAC,IAAI,MAAM,MAAM,KAAK,WAAW,CAAC,IAAI;AAAA,EAC9H,MAAM,SAAS,KAAK,WAAW,CAAC,IAAI,MAAM,MAAM,KAAK,WAAW,CAAC,IAAI;AAAA,EACrE,MAAM,OAAO,KAAK,WAAW,CAAC,IAAI,MAAM,MAAM,KAAK,WAAW,CAAC,IAAI;AAAA,EACnE,MAAM,QAAQ,KAAK,WAAW,EAAE,IAAI,MAAM,MAAM,KAAK,WAAW,EAAE,IAAI;AAAA,EACtE,MAAM,UAAU,KAAK,WAAW,EAAE,IAAI,MAAM,MAAM,KAAK,WAAW,EAAE,IAAI;AAAA,EACxE,MAAM,UAAU,KAAK,WAAW,EAAE,IAAI,MAAM,MAAM,KAAK,WAAW,EAAE,IAAI;AAAA,EACxE,IAAI,OAAO,QAAQ,QAAQ,KAAK,QAAQ,MAAM,MAAM,KAAK,OAAO,MAAM,SAAS,MAAM,SAAS;AAAA,IAAI;AAAA,EAClG,IAAI,MAAM,IAAI;AAAA,IACZ,MAAM,OAAO,OAAO,MAAM,MAAM,OAAO,QAAQ,KAAK,OAAO,QAAQ;AAAA,IACnE,MAAM,OAAO,UAAU,IAAK,OAAO,KAAK,KAAO,cAAc,QAAQ;AAAA,IACrE,IAAI,MAAM;AAAA,MAAM;AAAA,EAClB;AAAA,EAEA,IAAI,QAAQ;AAAA,EACZ,IAAI,eAAe;AAAA,EACnB,IAAI,QAAQ,UAAU,KAAK,WAAW,KAAK,MAAM,IAAI;AAAA,IACnD;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,OAAO,QAAQ,QAAQ;AAAA,MACrB,MAAM,OAAO,KAAK,WAAW,KAAK;AAAA,MAClC,IAAI,OAAO,MAAM,OAAO;AAAA,QAAI;AAAA,MAC5B,IAAI,QAAQ,QAAQ;AAAA,QAAG,eAAe,eAAe,MAAM,OAAO;AAAA,MAClE;AAAA,IACF;AAAA,IACA,MAAM,SAAS,QAAQ;AAAA,IACvB,IAAI,WAAW,KAAK,SAAS;AAAA,MAAG;AAAA,IAChC,IAAI,WAAW;AAAA,MAAG,gBAAgB;AAAA,IAClC,KAAK,IAAI,WAAW;AAAA,MAAG,gBAAgB;AAAA,EACzC;AAAA,EAEA,IAAI,gBAAgB;AAAA,EACpB,IAAI,UAAU,YAAY,UAAU,SAAS,KAAK,KAAK,WAAW,KAAK,MAAM,IAAI;AAAA,IAC/E,QAAQ;AAAA,EACV,EAAE,KAAK,IAAI,UAAU,QAAS,UAAU,YAAY,QAAQ,QAAS;AAAA,IACnE,IAAI,QAAQ,IAAI;AAAA,MAAQ;AAAA,IACxB,MAAM,OAAO,KAAK,WAAW,KAAK;AAAA,IAClC,IAAI,SAAS,MAAM,SAAS;AAAA,MAAI;AAAA,IAChC,MAAM,SAAS,KAAK,WAAW,QAAQ,CAAC,IAAI;AAAA,IAC5C,MAAM,SAAS,KAAK,WAAW,QAAQ,CAAC,IAAI;AAAA,IAC5C,IAAI,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS,KAAK,SAAS;AAAA,MAAI;AAAA,IACvF,iBAAiB,SAAS,KAAK,UAAU;AAAA,IACzC,SAAS;AAAA,IACT,IAAI,QAAQ,QAAQ;AAAA,MAElB,IAAI,QAAQ,MAAM,UAAU,KAAK,WAAW,KAAK,MAAM;AAAA,QAAI;AAAA,MAC3D,MAAM,WAAW,KAAK,WAAW,QAAQ,CAAC,IAAI;AAAA,MAC9C,MAAM,WAAW,KAAK,WAAW,QAAQ,CAAC,IAAI;AAAA,MAC9C,IAAI,WAAW,KAAK,WAAW,KAAK,WAAW,KAAK,WAAW;AAAA,QAAG;AAAA,MAClE,iBAAiB,WAAW,KAAK;AAAA,MACjC,QAAQ;AAAA,IACV;AAAA,IACA,IAAI,SAAS;AAAA,MAAI,gBAAgB,CAAC;AAAA,EACpC;AAAA,EACA,IAAI,UAAU;AAAA,IAAQ;AAAA,EAEtB,OAAO,IAAI,KAAK,KAAK,IAAI,MAAM,QAAQ,GAAG,KAAK,MAAM,QAAQ,QAAQ,YAAY,IAAI,gBAAgB,KAAM;AAAA;;ACjH7G,IAAM,8BAA6C,OAAO,kCAAkC;AAUrF,SAAS,wBAAwB,CAAC,QAA6E;AAAA,EACpH,OAAO,GAAG,8BAA8B,MAAM,OAAO,OAAO,OAAO,MAAM,OAAO,KAAK;AAAA;AAIhF,SAAS,0BAA0B,CAAC,OAAmD;AAAA,EAC5F,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,+BAA+B;AAAA;;AClBvF,IAAM,sBAAqC,OAAO,2BAA2B;AAgCtE,SAAS,iBAAiB,CAAC,QAA4F;AAAA,EAC5H,OAAO,GAAG,sBAAsB,MAAM,OAAO,OAAO,OAAO,SAAS,OAAO,QAAQ;AAAA;AAI9E,SAAS,mBAAmB,CAAC,OAA4C;AAAA,EAC9E,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,uBAAuB;AAAA;;AChB/E;;;AC4FO,IAAM,oBAA4B;AAGlC,SAAS,WAAW,CAAC,QAAgD;AAAA,EAC1E,OAAO,EAAE,MAAM,mBAAmB,UAAU,OAAO,QAAQ;AAAA;AAgW7D,IAAM,gBAAmC,CAAC,aAAa,aAAa,YAAY,QAAQ;AAGjF,SAAS,cAAc,CAAC,OAAuC;AAAA,EACpE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO;AAAA,EAEhF,IAAI,CAAC,OAAO,OAAO,OAAO,MAAM;AAAA,IAAG,OAAO;AAAA,EAC1C,MAAM,OAAO,OAAO,KAAK,KAAK;AAAA,EAC9B,IAAI,CAAC,KAAK,SAAS,MAAM,KAAK,CAAC,KAAK,SAAS,OAAO;AAAA,IAAG,OAAO;AAAA,EAC9D,MAAM,YAAY;AAAA,EAClB,IAAI,KAAK,WAAW,KAAK,EAAE,KAAK,WAAW,KAAK,KAAK,SAAS,aAAa,KAAK,UAAU,gBAAgB;AAAA,IAAY,OAAO;AAAA,EAC7H,OACE,OAAO,UAAU,SAAS,YAC1B,cAAc,SAAS,UAAU,IAAI,MACnC,OAAO,UAAU,UAAU,YAAY,OAAO,SAAS,UAAU,KAAK,KACtE,OAAO,UAAU,UAAU,YAAY,OAAO,UAAU,UAAU;AAAA;AAkBxE,IAAM,qBAAwC,CAAC,UAAU,QAAQ;AAG1D,SAAS,kBAAkB,CAAC,OAA2C;AAAA,EAC5E,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO;AAAA,EAEhF,IAAI,CAAC,OAAO,OAAO,OAAO,UAAU;AAAA,IAAG,OAAO;AAAA,EAC9C,MAAM,OAAO,OAAO,KAAK,KAAK;AAAA,EAC9B,IAAI,KAAK,WAAW,KAAK,CAAC,KAAK,SAAS,UAAU,KAAK,CAAC,KAAK,SAAS,OAAO;AAAA,IAAG,OAAO;AAAA,EACvF,MAAM,YAAY;AAAA,EAClB,OAAO,OAAO,UAAU,aAAa,YAAY,mBAAmB,SAAS,UAAU,QAAQ;AAAA;AAkB1F,SAAS,WAAW,CAAC,QAAgD;AAAA,EAC1E,OAAO,EAAE,SAAS,MAAM,eAAe,OAAO,cAAc;AAAA;AAIvD,SAAS,aAAa,CAAC,OAAsC;AAAA,EAClE,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO;AAAA,EAGhF,IAAI,CAAC,OAAO,OAAO,OAAO,SAAS;AAAA,IAAG,OAAO;AAAA,EAC7C,MAAM,OAAO,OAAO,KAAK,KAAK;AAAA,EAC9B,IAAI,KAAK,WAAW,KAAK,CAAC,KAAK,SAAS,SAAS,KAAK,CAAC,KAAK,SAAS,eAAe;AAAA,IAAG,OAAO;AAAA,EAC9F,MAAM,YAAY;AAAA,EAClB,OACE,UAAU,YAAY,QACtB,OAAO,UAAU,kBAAkB,YACnC,OAAO,SAAS,UAAU,aAAa;AAAA;AAmepC,IAAM,mBAAoD,OAAO,OAAO,EAAE,cAAc,KAAK,CAAC;AAU9F,IAAM,gBAA8C,OAAO,OAAO,EAAE,WAAW,KAAK,CAAC;AAGrF,SAAS,aAAa,CAAC,OAAyB;AAAA,EACrD,OAAO,UAAU;AAAA;AAIZ,SAAS,gBAAgB,CAAC,OAAyB;AAAA,EACxD,OAAO,UAAU;AAAA;AAyBZ,SAAS,aAAa,CAAC,QAA2D;AAAA,EACvF,OAAO,OAAO,YAAY,SAAS,EAAE,aAAa,MAAM,MAAM,OAAO,MAAM,SAAS,OAAO,IAAI,EAAE,aAAa,MAAM,MAAM,OAAO,KAAK;AAAA;AAIjI,SAAS,eAAe,CAAC,OAAwC;AAAA,EACtE,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAoC,gBAAgB;AAAA;AAelD,SAAS,WAAW,CAAC,QAAyC;AAAA,EACnE,OAAO,EAAE,YAAY,MAAM,QAAQ,OAAO,OAAO;AAAA;AAI5C,SAAS,aAAa,CAAC,OAAsC;AAAA,EAClE,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAmC,eAAe;AAAA;AA0HhD,SAAS,mBAAmB,CAAC,QAAiC;AAAA,EACnE,OAAO,OAAO,WAAW,WAAW,UAAS,aAAa,YAAU,UAAU,YAAU,mBAAmB,UAAS,OAAO,QAAQ,OAAO;AAAA;AAIrI,SAAS,yBAAyB,CAAC,QAA4D;AAAA,EACpG,OAAO,OAAO,WAAW,YAAY,UAAU;AAAA;AAI1C,SAAS,wBAAwB,CAAC,QAA2D;AAAA,EAClG,OAAO,OAAO,WAAW,YAAY,aAAa;AAAA;AAiS7C,IAAM,8BAAsC;AAc5C,SAAS,aAAa,CAAC,QAAyD;AAAA,EACrF,OAAO,EAAE,cAAc,MAAM,MAAM,OAAO,MAAM,QAAQ,OAAO,OAAO;AAAA;AAqBjE,SAAS,eAAe,CAAC,QAA6C;AAAA,EAC3E,OAAO,OAAO,OAAO,EAAE,gBAAgB,MAAM,QAAQ,OAAO,OAAO,CAAC;AAAA;AAI/D,SAAS,iBAAiB,CAAC,OAA0C;AAAA,EAC1E,IAAI,OAAO,UAAU,YAAY,UAAU;AAAA,IAAM,OAAO;AAAA,EACxD,MAAM,YAAY;AAAA,EAClB,OAAO,UAAU,mBAAmB,QAAQ,OAAO,UAAU,WAAW,YAAY,OAAO,KAAK,KAAK,EAAE,WAAW;AAAA;AAI7G,SAAS,eAAe,CAAC,OAAwC;AAAA,EACtE,OACE,OAAO,UAAU,YACjB,UAAU,QACT,MAAqC,iBAAiB;AAAA;AA2MpD,IAAM,oBAA4B;AAGlC,IAAM,2BAAmC;AAQzC,SAAS,cAAc,CAAC,QAAgE;AAAA,EAC7F,QAAQ,SAAS,UAAU;AAAA,EAC3B,IAAI,UAAU;AAAA,IAAI;AAAA,EAClB,SAAS,QAAQ,QAAQ,QAAQ,iBAAiB,EAAG,SAAS,GAAG,QAAQ,QAAQ,QAAQ,mBAAmB,QAAQ,CAAC,GAAG;AAAA,IACtH,MAAM,OAAO,QAAQ,MAAM,QAAQ,kBAAkB,MAAM;AAAA,IAC3D,MAAM,QAAQ,sBAAsB,KAAK,IAAI;AAAA,IAC7C,IAAI,UAAU,QAAQ,KAAK,WAAW,GAAG,UAAU,MAAM,GAAG,MAAM;AAAA,MAAG,OAAO,MAAM;AAAA,EACpF;AAAA,EACA;AAAA;;;ACvwDK,SAAS,cAAc,CAAC,MAA4C;AAAA,EACzE,IAAI,MAAM;AAAA,EACV,WAAW,WAAW,MAAM;AAAA,IAC1B,IAAI,OAAO,YAAY,UAAU;AAAA,MAC/B,OAAO,IAAI;AAAA,IACb,EAAE,KAAK,IAAI,2BAA2B,KAAK,OAAO,GAAG;AAAA,MACnD,OAAO,IAAI;AAAA,IACb,EAAE,KAAK;AAAA,MAGL,OAAO,KAAK,QAAQ,WAAW,MAAM,MAAM,EAAE,WAAW,KAAK,MAAK;AAAA;AAAA,EAEtE;AAAA,EACA,OAAO;AAAA;;;AFkCT,IAAM,wBAAwB;AAGvB,SAAS,oBAAoB,CAAC,OAA6C;AAAA,EAChF,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO;AAAA,EAChF,IAAI,CAAC,OAAO,OAAO,OAAO,aAAa;AAAA,IAAG,OAAO;AAAA,EACjD,MAAM,OAAO,OAAO,KAAK,KAAK;AAAA,EAC9B,IAAI,KAAK,KAAK,CAAC,QAAQ,QAAQ,iBAAiB,QAAQ,WAAW,QAAQ,WAAW,QAAQ,SAAS;AAAA,IAAG,OAAO;AAAA,EACjH,MAAM,YAAY;AAAA,EAClB,OAAO,UAAU,gBAAgB,QAAQ,MAAM,QAAQ,UAAU,KAAK,KAAK,UAAU,MAAM,SAAS,KAClG,OAAO,UAAU,UAAU,aAAa,UAAU,YAAY,aAAa,UAAU,YAAY;AAAA;AAsBrG,IAAM,WAAW,OAAiB,EAAE,MAAM,QAAQ,QAAQ,OAAO,UAAU,IAAI,IAAM;AAErF,SAAS,YAAY,CAAC,OAAkD;AAAA,EACtE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAAA;AAG5E,SAAS,SAAS,CAAC,OAAoC;AAAA,EACrD,IAAI,UAAU;AAAA,IAAM,OAAO;AAAA,EAC3B,IAAI,MAAM,QAAQ,KAAK;AAAA,IAAG,OAAO;AAAA,EACjC,QAAQ,OAAO;AAAA,IACb,KAAK;AAAA,MACH,OAAO;AAAA,IACT,KAAK;AAAA,MACH,OAAO;AAAA,IACT,KAAK;AAAA,MACH,OAAO;AAAA;AAAA,EAEX,MAAM,cAAc,EAAE,SAAS,uCAAuC,CAAC;AAAA;AAIzE,SAAS,YAAY,CAAC,QAAmF;AAAA,EACvG,OAAO,eAAe,OAAO,WAAW,OAAO,KAAK,EAAE,OAAO,OAAO,OAAO,YAAY,MAAM,UAAU,MAAM,cAAc,KAAK,CAAC;AAAA;AAOnI,SAAS,UAAU,CAAC,QAA+I;AAAA,EACjK,QAAQ,MAAM,MAAM,UAAU;AAAA,EAC9B,IAAI,YAAY,OAAO;AAAA,EACvB,SAAS,QAAQ,EAAG,QAAQ,KAAK,QAAQ,SAAS;AAAA,IAChD,IAAI,CAAC,aAAa,SAAS;AAAA,MAAG,OAAO,EAAE,MAAM,OAAO,MAAM,CAAC,GAAG,OAAO,IAAI,GAAG,KAAK,MAAM,GAAG,KAAK,CAAC,GAAG,OAAO,UAAU,SAAS,EAAE;AAAA,IAC/H,MAAM,MAAM,KAAK;AAAA,IACjB,IAAI,UAAU,KAAK,SAAS,GAAG;AAAA,MAC7B,IAAI,SAAS;AAAA,QAAM,aAAa,EAAE,WAAW,KAAK,OAAO,KAAK,MAAM,KAAK,KAAK,EAAa,CAAC;AAAA,MAC5F;AAAA,QAAK,OAAO,UAAU;AAAA,MACtB;AAAA,IACF;AAAA,IACA,IAAI,CAAC,OAAO,OAAO,WAAW,GAAG,GAAG;AAAA,MAClC,IAAI,EAAE,SAAS;AAAA,QAAO;AAAA,MACtB,aAAa,EAAE,WAAW,KAAK,OAAO,CAAC,EAAE,CAAC;AAAA,IAC5C;AAAA,IACA,YAAY,UAAU;AAAA,EACxB;AAAA,EACA;AAAA;AAGF,SAAS,IAAI,CAAC,OAAyC;AAAA,EACrD,MAAM,OAAO,SAAS;AAAA,EACtB,MAAM,SAA2B,CAAC;AAAA,EAClC,MAAM,UAAU,IAAI;AAAA,EACpB,SAAS,QAAQ,EAAG,QAAQ,MAAM,QAAQ,SAAS;AAAA,IACjD,MAAM,OAAO,MAAM;AAAA,IACnB,MAAM,UAAU,SAAS;AAAA,IACzB,MAAM,OAAO,UAAU,KAAK,MAAM,KAAK;AAAA,IACvC,IAAI,KAAK,WAAW;AAAA,MAAG,MAAM,cAAc,EAAE,SAAS,2CAA2C,CAAC;AAAA,IAClG,IAAI,OAAO;AAAA,IACX,SAAS,QAAQ,EAAG,QAAQ,KAAK,QAAQ,SAAS;AAAA,MAChD,MAAM,YAAY,KAAK,UAAU,KAAK,MAAM,GAAG,KAAK,CAAC;AAAA,MACrD,IAAI,CAAC,QAAQ,IAAI,SAAS,GAAG;AAAA,QAC3B,QAAQ,IAAI,SAAS;AAAA,QACrB,OAAO,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,KAAK,GAAG,MAAM,MAAM,CAAC;AAAA,MACzD;AAAA,MACA,IAAI;AAAA,QAAS,KAAK,SAAS;AAAA,MAC3B,MAAM,MAAM,KAAK;AAAA,MACjB,IAAI,UAAU,KAAK,SAAS,GAAG;AAAA,QAC7B,KAAK,SAAS,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,MAAM,KAAK,MAAM,IAAI,EAAE,MAAM,SAAS,CAAC;AAAA,QAC3F;AAAA,MACF;AAAA,MACA,IAAI,QAAQ,KAAK,SAAS,IAAI,GAAG;AAAA,MACjC,IAAI,UAAU,WAAW;AAAA,QACvB,QAAQ,SAAS;AAAA,QACjB,KAAK,SAAS,IAAI,KAAK,KAAK;AAAA,MAC9B;AAAA,MACA,IAAI,MAAM,SAAS,QAAQ;AAAA,QACzB,OAAO;AAAA,QACP;AAAA,MACF;AAAA,MACA,IAAI,MAAM,SAAS,UAAU;AAAA,QAG3B,IAAI,CAAC;AAAA,UAAS;AAAA,QACd,QAAQ,EAAE,MAAM,WAAW,MAAM,MAAM,QAAQ,CAAC,EAAE;AAAA,QAClD,KAAK,SAAS,IAAI,KAAK,KAAK;AAAA,MAC9B;AAAA,MACA,MAAM,WAAW,KAAK,MAAM,MAAM,IAAI;AAAA,MACtC,MAAM,WAAW,WAAW,EAAE,OAAO,MAAM,QAAQ,MAAM,KAAK,MAAM,QAAQ,CAAC,GAAG,MAAM,IAAI,KAAK,MAAM,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC;AAAA,MAC3H,IAAI,aAAa;AAAA,QAAW,OAAO,EAAE,SAAS;AAAA,MAC9C;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO,EAAE,MAAM,OAAO;AAAA;AAQjB,SAAS,aAAa,CAAC,QAA4D;AAAA,EACxF,MAAM,SAAS,KAAK,OAAO,KAAK;AAAA,EAChC,OAAO,cAAc,SAAS,EAAE,UAAU,OAAO,SAAS,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA;AAGxF,IAAM,SAAS,CAAC,SAA+B,KAAK,WAAW,YAAY,KAAK,OAAO,KAAK,UAAU,KAAK,MAAM;AAGjH,SAAS,cAAc,CAAC,MAAoD;AAAA,EAC1E,MAAM,MAA0C,CAAC;AAAA,EACjD,YAAY,KAAK,UAAU,KAAK,UAAU;AAAA,IACxC,IAAI,MAAM,SAAS,aAAc,MAAM,SAAS,UAAU,MAAM;AAAA,MAAS,IAAI,KAAK,CAAC,KAAK,KAAK,CAAC;AAAA,EAChG;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,YAAY,CAAC,QAAiE;AAAA,EACrF,MAAM,MAAkB,CAAC;AAAA,EACzB,YAAY,KAAK,UAAU,OAAO,KAAK,UAAU;AAAA,IAC/C,IAAI,MAAM,SAAS;AAAA,MAAU,IAAI,KAAK,CAAC,GAAG,OAAO,MAAM,GAAG,CAAC;AAAA,IAC3D,KAAK,IAAI,MAAM,SAAS;AAAA,MAAQ,IAAI,KAAK,GAAG,aAAa,EAAE,MAAM,OAAO,MAAM,CAAC,GAAG,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,EACxG;AAAA,EACA,OAAO;AAAA;AAKT,IAAM,YAAY,GAAG,oBAAoB;AASlC,SAAS,eAAe,CAAC,QAA6G;AAAA,EAC3I,MAAM,SAAS,KAAK,OAAO,MAAM,KAAK;AAAA,EACtC,IAAI,cAAc,QAAQ;AAAA,IACxB,MAAM,cAAc,EAAE,SAAS,uFAAuF,CAAC;AAAA,EACzH;AAAA,EACA,QAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AAAA,MACH,OAAO,oBAAoB,KAAK,WAAW,OAAO,CAAC;AAAA,IACrD,KAAK;AAAA,MACH,OAAO,kBAAkB,KAAK,WAAW,OAAO,CAAC;AAAA,IACnD,KAAK;AAAA,MACH,OAAO,iBAAiB,KAAK,WAAW,OAAO,CAAC;AAAA;AAAA;AAmBtD,SAAS,mBAAmB,CAAC,QAA6B;AAAA,EACxD,QAAQ,OAAO,MAAM,cAAc;AAAA,EACnC,MAAM,OAAO,MAAM,YAAY;AAAA,EAC/B,MAAM,SAAS,OAAO,gBAAgB;AAAA,EACtC,MAAM,KAAK,CAAC,QAAgB,SAC1B,KAAK,WAAW,IAAI,SAAS,GAAG,aAAa,UAAU,IAAI,CAAC,GAAG,IAAI,CAAC;AAAA,EACtE,MAAM,OAAO,OAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AAAA,IAC/C,MAAM,YAAY,GAAG,UAAU,GAAG,MAAM,MAAM,IAAI;AAAA,IAClD,MAAM,SAAS,UAAU,IAAI,GAAG,MAAM,SAAS,OAAO;AAAA,IACtD,OAAO,QAAQ,wCAAwC,eAAe,sBAAsB,UAAU,GAAG,MAAM,MAAM,IAAI;AAAA,GAC1H;AAAA,EACD,MAAM,SAAS,OAAO,GAAG,gBAAgB;AAAA,EACzC,MAAM,QAAQ,CAAC,MAAgB,SAAoC;AAAA,IACjE,MAAM,OAAO,GAAG,QAAQ,IAAI;AAAA,IAC5B,MAAM,QAAQ,KAAK,SAAS,YAAY,uBAAuB;AAAA,IAC/D,MAAM,UAAU,eAAe,IAAI;AAAA,IACnC,IAAI,QAAQ,WAAW;AAAA,MAAG,OAAO;AAAA,IACjC,MAAM,QAAQ,QAAQ,IAAI,EAAE,KAAK,WAAW;AAAA,MAC1C,MAAM,OAAO,GAAG,UAAU,IAAI,GAAG;AAAA,MACjC,OAAO,GAAG,SAAS,MAAM,SAAS,YAAY,GAAG,UAAU,IAAI,OAAO,KAAK,CAAC,mBAAmB,MAAM,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,KAC3H;AAAA,IACD,OAAO,IAAI,+BAA+B,MAAM,KAAK,IAAI;AAAA;AAAA,EAE3D,IAAI,SAAS,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,EAClC,MAAM,UAAU,aAAa,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EAC5D,IAAI,QAAQ,SAAS;AAAA,IAAG,SAAS,IAAI,SAAS,QAAQ,IAAI,CAAC,SAAS,OAAO,UAAU,IAAI,IAAI,WAAW,EAAE,KAAK,EAAE;AAAA,EACjH,MAAM,QAAQ,QAAQ,KAAK,KAAK,GAAG,UAAU;AAAA,EAC7C,OAAO,OAAO,IAAI,iBAAiB;AAAA;AAQrC,SAAS,iBAAiB,CAAC,QAA6B;AAAA,EACtD,QAAQ,OAAO,MAAM,cAAc;AAAA,EACnC,MAAM,SAAS,CAAC,SACd,KAAK,WAAW,IAAI,aAAa,UAAU,aAAa,SAAS,UAAU,IAAI,eAAe,IAAI,CAAC;AAAA,EACrG,MAAM,OAAO,OAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AAAA,IAC/C,MAAM,YAAY,GAAG,OAAO,MAAM,IAAI;AAAA,IACtC,MAAM,SAAS,UAAU,IAAI,GAAG,MAAM,SAAS,OAAO;AAAA,IACtD,OAAO,QAAQ,sCAAsC,iBAAiB,oBAAoB,OAAO,MAAM,IAAI;AAAA,GAC5G;AAAA,EACD,MAAM,QAAQ,CAAC,MAAgB,SAAoC;AAAA,IACjE,MAAM,OAAO,KAAK,WAAW,IAAI,OAAO,gBAAgB,SAAS,UAAU,IAAI,eAAe,IAAI,CAAC;AAAA,IACnG,MAAM,QAAQ,KAAK,SAAS,YAAY,gBAAgB;AAAA,IACxD,MAAM,UAAU,eAAe,IAAI;AAAA,IACnC,IAAI,QAAQ,WAAW;AAAA,MAAG,OAAO;AAAA,IACjC,MAAM,QAAQ,QAAQ,IAAI,EAAE,KAAK,WAAW;AAAA,MAC1C,MAAM,SAAS,UAAU,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;AAAA,MAClD,OAAO,GAAG,gBAAgB,MAAM,SAAS,YAAY,UAAU,IAAI,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,KAChH;AAAA,IACD,OAAO,YAAY,UAAU,MAAM,KAAK,IAAI;AAAA;AAAA,EAE9C,IAAI,SAAS,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,EAClC,MAAM,UAAU,aAAa,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EAC5D,IAAI,QAAQ,SAAS;AAAA,IAAG,SAAS,eAAe,WAAW,QAAQ,IAAI,CAAC,SAAS,UAAU,IAAI,eAAe,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAC/H,OAAO,QAAQ,KAAK,KAAK,GAAG,UAAU;AAAA;AASxC,SAAS,gBAAgB,CAAC,QAA6B;AAAA,EACrD,QAAQ,OAAO,MAAM,cAAc;AAAA,EACnC,MAAM,KAAK,CAAC,SACV,KAAK,WAAW,IAAI,OAAO,gBAAgB,SAAS,UAAU,IAAI,eAAe,IAAI,CAAC;AAAA,EACxF,MAAM,OAAO,OAAO,OAAO,IAAI,CAAC,OAAO,UAAU;AAAA,IAC/C,MAAM,YAAY,aAAa,GAAG,MAAM,IAAI;AAAA,IAC5C,MAAM,SAAS,UAAU,IAAI,GAAG,MAAM,SAAS,OAAO;AAAA,IACtD,OAAO,QAAQ,iDAAiD,eAAe,0BAA0B,GAAG,MAAM,IAAI;AAAA,GACvH;AAAA,EACD,MAAM,QAAQ,CAAC,MAAgB,SAAoC;AAAA,IACjE,MAAM,OAAO,GAAG,IAAI;AAAA,IACpB,MAAM,QAAQ,KAAK,SAAS,YAAY,yBAAyB;AAAA,IACjE,MAAM,UAAU,eAAe,IAAI;AAAA,IACnC,IAAI,QAAQ,WAAW;AAAA,MAAG,OAAO;AAAA,IACjC,MAAM,QAAQ,QAAQ,IAAI,EAAE,KAAK,WAAW;AAAA,MAC1C,MAAM,SAAS,UAAU,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;AAAA,MAClD,OAAO,GAAG,WAAW,MAAM,SAAS,YAAY,QAAQ,UAAU,IAAI,OAAO,KAAK,CAAC,eAAe,MAAM,OAAO,CAAC,GAAG,MAAM,GAAG,CAAC;AAAA,KAC9H;AAAA,IACD,OAAO,YAAY,UAAU,MAAM,KAAK,IAAI;AAAA;AAAA,EAE9C,IAAI,SAAS,MAAM,OAAO,MAAM,CAAC,CAAC;AAAA,EAClC,MAAM,UAAU,aAAa,EAAE,MAAM,OAAO,MAAM,MAAM,CAAC,EAAE,CAAC;AAAA,EAC5D,IAAI,QAAQ,SAAS;AAAA,IAAG,SAAS,eAAe,WAAW,QAAQ,IAAI,CAAC,SAAS,UAAU,IAAI,eAAe,IAAI,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAC/H,OAAO,QAAQ,KAAK,KAAK,GAAG,UAAU;AAAA;AASjC,SAAS,eAAe,CAAC,QAAwD;AAAA,EACtF,MAAM,QAAQ,OAAO,QAAQ,QAAQ,SAAS;AAAA,EAC9C,IAAI,QAAQ;AAAA,IAAG;AAAA,EACf,MAAM,QAAQ,iCAAiC,KAAK,OAAO,QAAQ,MAAM,QAAQ,UAAU,MAAM,CAAC;AAAA,EAClG,IAAI,UAAU;AAAA,IAAM;AAAA,EACpB,OAAO,EAAE,OAAO,MAAM,IAAc,OAAO,OAAO,MAAM,EAAE,GAAG,OAAO,MAAM,GAAa;AAAA;;AGnWzF;AAKO,SAAS,8BAA8B,CAAC,QAA4H;AAAA,EACzK,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,sBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,kBAAkB,CAAC;AAAA,EAChI,MAAM,QAAQ;AAAA,EACd,IAAI;AAAA,EACJ,QAAQ,OAAO;AAAA,IACb,KAAK;AAAA,MAAc,OAAO,6HAA6H;AAAA,MAA4B;AAAA,IACnL,KAAK;AAAA,MAAe,OAAO,mYAAmY;AAAA,MAA8D;AAAA,IAC5d,KAAK;AAAA,MAAkB,OAAO,8gBAA8gB;AAAA,MAAuC;AAAA,IACnlB,KAAK;AAAA,MAAe,OAAO,8aAA8a;AAAA,MAAkD;AAAA;AAAA,EAE7f,OAAO,EAAE,MAAM,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;;ACf/C,kCAAS;;;ACCT,kCAAS;;;ACDT,sBAAS,qCAAW;;;ACApB,sBAAS;;;ACAT,sBAAS;;;ACAT,sBAAS;;;ACCT,IAAM,iBAAyB;AAGxB,SAAS,gBAAgB,CAAC,QAAgD;AAAA,EAC/E,QAAQ,WAAW;AAAA,EACnB,MAAM,QAAQ,OAAO,IAAI,CAAC,UAAU;AAAA,IAClC,IAAI,UAAU,QAAQ,UAAU;AAAA,MAAW,OAAO;AAAA,IAClD,MAAM,OAAO,OAAO,KAAK;AAAA,IACzB,OAAO,eAAe,KAAK,IAAI,IAAI,IAAI,KAAK,QAAQ,UAAU,CAAC,SAAS,KAAK,MAAM,OAAO;AAAA,GAC3F;AAAA,EACD,OAAO,IAAI,MAAM,KAAK,GAAG;AAAA;AAepB,SAAS,mBAAmB,CAAC,QAAuD;AAAA,EAEzF,MAAM,UAAU,OAAO,QAAQ,WAAW,GAAG,IAAI,OAAO,QAAQ,QAAQ,qBAAqB,EAAE,IAAI,OAAO;AAAA,EAC1G,IAAI,QAAQ,SAAS,KAAK,QAAQ,WAAW,CAAC,MAAM,OAAO,QAAQ,WAAW,QAAQ,SAAS,CAAC,MAAM;AAAA,IAAK,OAAO;AAAA,EAElH,MAAM,MAAM,QAAQ,SAAS;AAAA,EAC7B,IAAI,QAAQ;AAAA,IAAG,OAAO,CAAC;AAAA,EACvB,MAAM,MAAyB,CAAC;AAAA,EAChC,IAAI,QAAQ;AAAA,EACZ,OAAO,QAAQ,KAAK;AAAA,IAClB,IAAI,QAAQ,WAAW,KAAK,MAAM,IAAI;AAAA,MAEpC,IAAI,OAAO;AAAA,MACX;AAAA,MACA,IAAI,MAAM;AAAA,MACV,OAAO,QAAQ,KAAK;AAAA,QAClB,MAAM,OAAO,QAAQ,WAAW,KAAK;AAAA,QACrC,IAAI,SAAS,IAAI;AAAA,UACf,QAAQ,QAAQ,MAAM,KAAK,KAAK,KAAK,QAAQ,IAAI,MAAO,QAAQ,QAAQ,KAAgB;AAAA,UACxF,SAAS;AAAA,UACT,MAAM;AAAA,UACN;AAAA,QACF;AAAA,QACA,IAAI,SAAS;AAAA,UAAI;AAAA,QACjB;AAAA,MACF;AAAA,MACA,QAAQ,QAAQ,MAAM,KAAK,KAAK,IAAI,OAAO,GAAG,CAAC;AAAA,MAE/C,IAAI,QAAQ;AAAA,QAAK;AAAA,MACjB,IAAI,KAAK,IAAI;AAAA,IACf,EAAE,KAAK;AAAA,MACL,IAAI,OAAO,QAAQ,QAAQ,KAAK,KAAK;AAAA,MACrC,IAAI,SAAS,MAAM,OAAO;AAAA,QAAK,OAAO;AAAA,MACtC,MAAM,OAAO,QAAQ,MAAM,OAAO,IAAI;AAAA,MACtC,IAAI,KAAK,SAAS,SAAS,OAAO,IAAI;AAAA,MACtC,QAAQ;AAAA;AAAA,IAEV,IAAI,QAAQ,WAAW,KAAK,MAAM;AAAA,MAAI;AAAA,EACxC;AAAA,EACA,OAAO;AAAA;AAcF,SAAS,yBAAyB,CAAC,QAA6D;AAAA,EACrG,MAAM,OAAO,OAAO,QAAQ,QAAQ,0BAA0B,EAAE;AAAA,EAChE,MAAM,SAAS,EAAE,OAAO,EAAE;AAAA,EAC1B,MAAM,SAAS,eAAe,EAAE,MAAM,OAAO,CAAC;AAAA,EAC9C,OAAO,WAAW,QAAQ,OAAO,UAAU,KAAK,SAAS,SAAS;AAAA;AAIpE,SAAS,cAAc,CAAC,QAAqF;AAAA,EAC3G,QAAQ,MAAM,WAAW;AAAA,EACzB,IAAI,KAAK,OAAO,WAAW;AAAA,IAAK,OAAO;AAAA,EACvC,OAAO;AAAA,EACP,MAAM,MAA+B,CAAC;AAAA,EACtC,IAAI,KAAK,OAAO,WAAW,KAAK;AAAA,IAC9B,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,OAAO,OAAO,QAAQ,KAAK,QAAQ;AAAA,IACjC,IAAI,KAAK,OAAO,WAAW,KAAK;AAAA,MAC9B,MAAM,SAAS,eAAe,EAAE,MAAM,OAAO,CAAC;AAAA,MAC9C,IAAI,WAAW;AAAA,QAAM,OAAO;AAAA,MAC5B,IAAI,KAAK,MAAM;AAAA,IACjB,EAAE,KAAK,IAAI,KAAK,OAAO,WAAW,KAAK;AAAA,MACrC,IAAI,UAAU;AAAA,MACd,OAAO;AAAA,MACP,OAAO,OAAO,QAAQ,KAAK,UAAU,KAAK,OAAO,WAAW,KAAK;AAAA,QAC/D,IAAI,KAAK,OAAO,WAAW;AAAA,UAAM,OAAO;AAAA,QACxC,WAAW,KAAK,OAAO,UAAU;AAAA,QACjC,OAAO;AAAA,MACT;AAAA,MACA,IAAI,KAAK,OAAO,WAAW;AAAA,QAAK,OAAO;AAAA,MACvC,OAAO;AAAA,MACP,IAAI,KAAK,OAAO;AAAA,IAClB,EAAE,KAAK;AAAA,MACL,IAAI,UAAU;AAAA,MACd,OAAO,OAAO,QAAQ,KAAK,UAAU,KAAK,OAAO,WAAW,OAAO,KAAK,OAAO,WAAW,KAAK;AAAA,QAC7F,WAAW,KAAK,OAAO;AAAA,QACvB,OAAO;AAAA,MACT;AAAA,MACA,IAAI,KAAK,YAAY,SAAS,OAAO,OAAO;AAAA;AAAA,IAE9C,IAAI,KAAK,OAAO,WAAW,KAAK;AAAA,MAC9B,OAAO;AAAA,MACP;AAAA,IACF;AAAA,IACA,IAAI,KAAK,OAAO,WAAW;AAAA,MAAK,OAAO;AAAA,IACvC,OAAO;AAAA,IACP,OAAO;AAAA,EACT;AAAA,EACA,OAAO;AAAA;;;ACzGT;AAoBO,SAAS,mBAAmB,CAAC,QAKpB;AAAA,EACd,QAAQ,OAAO,OAAO,MAAM,aAAa;AAAA,EACzC,MAAM,UAA+B,IAAI,IAAI,OAAO,OAAO;AAAA,EAC3D,OAAO;AAAA,IACL,QAAQ,CAAC,UAAU;AAAA,MACjB,IAAI,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAK;AAAA,QAAG,OAAO;AAAA,MAC5D,MAAM,IAAI,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,SAAS,0BAA0B,eAAe,SAAS;AAAA,QAC3D,MAAM,EAAE,OAAO,OAAO,MAAM,SAAS;AAAA,MACvC,CAAC;AAAA;AAAA,IAEH,QAAQ,CAAC,UAAU;AAAA,MACjB,IAAI,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAK;AAAA,QAAG,OAAO;AAAA,MAC5D,MAAM,kBAAkB,EAAE,OAAO,OAAO,MAAM,UAAU,MAAM,CAAC;AAAA;AAAA,EAEnE;AAAA;AAgEF,SAAS,SAAS,CAAC,MAA8D;AAAA,EAC/E,IAAI,SAAS,aAAa,SAAS;AAAA,IAAO;AAAA,EAC1C,IAAI,SAAS;AAAA,IAAS,OAAO;AAAA,EAC7B,OAAO,KAAK,kBAAkB,IAAI,YAAY,KAAK;AAAA;AAO9C,SAAS,eAAe,CAAC,QAAoD;AAAA,EAClF,MAAM,QAAQ,UAAU,OAAO,MAAM,gBAAgB;AAAA,EACrD,OAAO,UAAU,YAAY,KAAK,OAAO,KAAK;AAAA;AA4BzC,SAAS,YAAY,CAAC,QAA6E;AAAA,EACxG,QAAQ,YAAY,SAAS;AAAA,EAC7B,IAAI,SAAS;AAAA,IAAW,OAAO;AAAA,EAC/B,IAAI,eAAe;AAAA,IAAY,OAAO;AAAA,EACtC,IAAI,eAAe;AAAA,IAAQ,OAAO,KAAK,SAAS;AAAA,EAChD,IAAI,eAAe,SAAS,eAAe;AAAA,IAAS,OAAO,KAAK,YAAY;AAAA,EAC5E,OAAO;AAAA;AAKT,IAAM,WAAW,CAAC,UAA4B;AAG9C,IAAM,mBAAgC,EAAE,QAAQ,UAAU,QAAQ,SAAS;AAG3E,IAAM,cAA2B;AAAA,EAC/B,QAAQ;AAAA,EACR,QAAQ,CAAC,UAAW,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAClE;AAOA,IAAM,cAA2B;AAAA,EAC/B,QAAQ,CAAC,UAAW,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI;AAAA,EACnE,QAAQ,CAAC,UAAU;AAAA,IACjB,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO;AAAA,IACtC,IAAI,OAAO,UAAU,YAAY,aAAa,KAAK,MAAM,KAAK,CAAC;AAAA,MAAG,OAAO,OAAO,MAAM,KAAK,CAAC;AAAA,IAC5F,IAAI,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK;AAAA,MAAG,OAAO,OAAO,KAAK;AAAA,IACjF,MAAM,IAAI,UAAU,EAAE,MAAM,qBAAqB,SAAS,uDAAuD,MAAM,EAAE,MAAM,EAAE,CAAC;AAAA;AAEtI;AAaA,IAAM,eAA4B;AAAA,EAChC,QAAQ,CAAC,UAAW,OAAO,UAAU,YAAY,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAAA,EAC7F,QAAQ;AACV;AAWA,IAAM,oBAAiC;AAAA,EACrC,QAAQ,aAAa;AAAA,EACrB,QAAQ,CAAC,UAAU;AAAA,IACjB,IAAI,OAAO,UAAU,YAAY,CAAC,MAAM,SAAS,GAAG;AAAA,MAAG,OAAO;AAAA,IAC9D,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,EAAE,QAAQ,OAAO,EAAE;AAAA,IAC1D,OAAO,YAAY,MAAM,YAAY,MAAM,MAAM;AAAA;AAErD;AASA,IAAM,qBAAqB;AAS3B,IAAM,oBAAoB;AAG1B,IAAM,oBAAoB;AAG1B,IAAM,YAAY;AAoBX,SAAS,iBAAiB,CAAC,QAA4C;AAAA,EAC5E,MAAM,UAAU,OAAO,KAAK,KAAK;AAAA,EACjC,MAAM,OAAO,sBAAsB,EAAE,QAAQ,CAAC,KAAK,eAAe,EAAE,QAAQ,CAAC;AAAA,EAC7E,OAAO,SAAS,YAAY,YAAY,0BAA0B,EAAE,MAAM,MAAM,QAAQ,CAAC;AAAA;AAG3F,SAAS,cAAc,CAAC,QAA+C;AAAA,EACrE,MAAM,SAAS,IAAI,KAAK,OAAO,OAAO;AAAA,EACtC,OAAO,OAAO,MAAM,OAAO,QAAQ,CAAC,IAAI,YAAY;AAAA;AActD,SAAS,qBAAqB,CAAC,QAA+C;AAAA,EAC5E,QAAQ,YAAY;AAAA,EACpB,MAAM,QAAQ,wBAAwB,EAAE,MAAM,SAAS,OAAO,SAAS,CAAC;AAAA,EACxE,IAAI,UAAU;AAAA,IAAW,OAAO;AAAA,EAChC,MAAM,SAAS,QAAQ;AAAA,EACvB,IACG,SAAS,KAAK,QAAQ,WAAW,SAAS,CAAC,MAAM,OAChD,WAAW,MAAO,WAAW,MAAM,QAAQ,WAAW,EAAE,MAAM,OAC9D,QAAQ,WAAW,EAAE,MAAM,MAC3B,QAAQ,WAAW,SAAS,CAAC,MAAM,OAClC,QAAQ,WAAW,SAAS,CAAC,MAAM,MAAM,QAAQ,WAAW,SAAS,CAAC,MAAM,KAC/E;AAAA,IAEA,IAAI,CAAC,YAAY,KAAK,OAAO;AAAA,MAAG;AAAA,IAChC,MAAM,SAAS,IAAI,KAAK,OAAO;AAAA,IAC/B,OAAO,OAAO,MAAM,OAAO,QAAQ,CAAC,IAAI,YAAY;AAAA,EACtD;AAAA,EACA,MAAM,OAAO,eAAe,EAAE,QAAQ,CAAC;AAAA,EACvC,IAAI,SAAS;AAAA,IAAW,OAAO;AAAA,EAC/B,IAAI,mBAAmB,KAAK,OAAO,GAAG;AAAA,IACpC,MAAM,QAAQ,IAAI,KAAK,GAAG,QAAQ,QAAQ,KAAK,GAAG,EAAE,QAAQ,iBAAiB,IAAI,IAAI;AAAA,IACrF,IAAI,CAAC,OAAO,MAAM,MAAM,QAAQ,CAAC;AAAA,MAAG,OAAO;AAAA,EAC7C;AAAA,EACA,MAAM,QAAQ,kBAAkB,KAAK,OAAO;AAAA,EAC5C,IAAI,UAAU,MAAM;AAAA,IAClB,SAAS,MAAM,MAAM,UAAU,OAAO,WAAW;AAAA,IACjD,MAAM,MAAM,IAAI,KAAK,GAAG,QAAQ,QAAQ,YAAY,IAAI,MAAM,GAAG,CAAC,IAAI,SAAS,WAAW,MAAM;AAAA,IAChG,IAAI,CAAC,OAAO,MAAM,IAAI,QAAQ,CAAC;AAAA,MAAG,OAAO;AAAA,EAC3C;AAAA,EACA,IAAI,UAAU,KAAK,OAAO;AAAA,IAAG,OAAO,eAAe,EAAE,QAAQ,CAAC;AAAA,EAC9D,OAAO,0BAA0B,EAAE,MAAM,SAAS,SAAS,KAAK,CAAC;AAAA;AAOnE,IAAM,cAAc;AAWpB,SAAS,cAAc,CAAC,QAA+C;AAAA,EACrE,QAAQ,YAAY;AAAA,EACpB,MAAM,SAAS,QAAQ;AAAA,EACvB,MAAM,SAAS,SAAS;AAAA,EACxB,IAAI,SAAS,KAAK,SAAS;AAAA,IAAG;AAAA,EAC9B,SAAS,QAAQ,EAAG,QAAQ,QAAQ,SAAS;AAAA,IAC3C,MAAM,OAAO,QAAQ,WAAW,KAAK;AAAA,IACrC,MAAM,WAAW,UAAU,KAAK,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,UAAU,MAAM,UAAU,MAAM,UAAU,SAAS,IAAI,KAAK,UAAU,KAAK,KAAK,UAAU,SAAS,IAAI,KAAK;AAAA,IACnL,IAAI,aAAa,IAAI,OAAO,MAAM,OAAO,KAAK,aAAa,KAAK,SAAS,MAAM,SAAS,KAAK,SAAS;AAAA,MAAU;AAAA,EAClH;AAAA,EACA,MAAM,SAAS,IAAI,KAAK,UAAU,IAAI,UAAU,GAAG,QAAQ,MAAM,GAAG,EAAE,IAAI,QAAQ,MAAM,SAAS,CAAC,GAAG;AAAA,EACrG,OAAO,OAAO,MAAM,OAAO,QAAQ,CAAC,IAAI,YAAY;AAAA;AAqB/C,SAAS,yBAAyB,CAAC,QAA+D;AAAA,EACvG,MAAM,QAAQ,kBAAkB,KAAK,OAAO,KAAK,KAAK,CAAC;AAAA,EACvD,IAAI,UAAU;AAAA,IAAM;AAAA,EACpB,SAAS,UAAU,OAAO,KAAK,OAAO,SAAS,SAAS,UAAU,MAAM,aAAa,eAAe,eAAe,OAAO;AAAA,EAC1H,IAAK,SAAoB,SAAS,KAAK,QAAQ,aAAa,OAAO,YAAY;AAAA,IAAM;AAAA,EACrF,MAAM,OAAO,QAAQ,YAAY,OAAO,QAAQ,IAAI,IAAI,OAAO,QAAQ;AAAA,EACvE,MAAM,OAAO,IAAI,KAAK,CAAC;AAAA,EACvB,KAAK,eAAe,MAAM,OAAO,KAAK,IAAI,GAAG,OAAO,GAAG,CAAC;AAAA,EACxD,KAAK,YAAY,OAAO,SAAS,CAAC,GAAG,OAAO,WAAW,CAAC,GAAG,OAAO,WAAW,CAAC,GAAG,QAAQ,YAAY,IAAI,OAAO,GAAG,GAAG,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAAA,EAEpI,IAAI,KAAK,YAAY,MAAM,OAAO,KAAK,IAAI,KAAK,KAAK,WAAW,MAAM,OAAO,GAAG,KAAK,OAAO,SAAS,CAAC,IAAI,MAAM,OAAO,WAAW,CAAC,IAAI,MAAM,OAAO,WAAW,CAAC,IAAI;AAAA,IAAI;AAAA,EACxK,IAAI,SAAS,WAAW;AAAA,IACtB,MAAM,UAAU,OAAO,WAAW,IAAI,OAAO,OAAO,iBAAiB,CAAC,IAAI,KAAK,OAAO,iBAAiB,CAAC,KAAK;AAAA,IAC7G,KAAK,QAAQ,KAAK,QAAQ,KAAK,SAAS,MAAM,CAAC,SAAS,OAAO;AAAA,EACjE;AAAA,EACA,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,IAAI,YAAY;AAAA;AAS7C,SAAS,sBAAsB,GAAc;AAAA,EAClD,OAAO,IAAI,UAAU,EAAE,MAAM,qBAAqB,SAAS,gGAAgG,CAAC;AAAA;AAG9J,SAAS,sBAAsB,GAAU;AAAA,EACvC,MAAM,uBAAuB;AAAA;AAQ/B,IAAM,kBAA+B;AAAA,EACnC,QAAQ,CAAC,UAAU;AAAA,IACjB,IAAK,iBAAiB,QAAQ,CAAC,OAAO,SAAS,MAAM,QAAQ,CAAC,KAAO,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,KAAO,OAAO,UAAU,YAAY,mBAAmB,KAAK,MAAM,KAAK,CAAC,GAAI;AAAA,MAClM,MAAM,IAAI,UAAU,EAAE,MAAM,mBAAmB,SAAS,gGAAgG,CAAC;AAAA,IAC3J;AAAA,IACA,OAAO,iBAAiB,OAAO,sBAAsB,EAAE,MAAM,MAAM,CAAC,KAAK,QAAQ;AAAA;AAAA,EAEnF,QAAQ,CAAC,UAAU;AAAA,IACjB,MAAM,OAAO,iBAAiB,OAAO,QACjC,OAAO,UAAU,WAAW,qBAAqB,EAAE,MAAM,OAAO,SAAS,WAAW,CAAC,IACrF,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAAI;AAAA,IAClD,IAAI,SAAS,aAAa,OAAO,SAAS,KAAK,QAAQ,CAAC;AAAA,MAAG,OAAO;AAAA,IAClE,OAAO,uBAAuB;AAAA;AAElC;AAGA,SAAS,oBAAoB,CAAC,QAA8D;AAAA,EAC1F,MAAM,UAAU,OAAO,KAAK,KAAK;AAAA,EACjC,MAAM,OAAO,sBAAsB,EAAE,QAAQ,CAAC;AAAA,EAC9C,IAAI,SAAS,WAAW;AAAA,IACtB,IAAI,mBAAmB,KAAK,OAAO;AAAA,MAAG;AAAA,IACtC,MAAM,wBAAwB,EAAE,MAAM,SAAS,SAAS,OAAO,QAAQ,CAAC;AAAA,EAC1E;AAAA,EACA,OAAO,0BAA0B,EAAE,MAAM,MAAM,QAAQ,CAAC;AAAA;AAI1D,IAAM,iBAAiB;AAgBhB,SAAS,uBAAuB,CAAC,QAAuD;AAAA,EAC7F,MAAM,UAAU,OAAO,KAAK,KAAK;AAAA,EACjC,IAAI,eAAe,KAAK,OAAO,KAAM,OAAO,YAAY,WAAW,QAAQ,WAAW,WAAW;AAAA,IAAI,OAAO,gBAAgB;AAAA,EAC5H,IAAI,gCAAgC,KAAK,OAAO,KAAK,0BAA0B,KAAK,OAAO,GAAG;AAAA,IAC5F,OAAO,IAAI,UAAU;AAAA,MACnB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,EAAE,QAAQ,wBAAwB;AAAA,IAC1C,CAAC;AAAA,EACH;AAAA,EACA,IAAI,OAAO,YAAY;AAAA,IAAY,OAAO,wBAAwB;AAAA,EAClE,OAAO,IAAI,UAAU;AAAA,IACnB,MAAM;AAAA,IACN,SAAS,OAAO,YAAY,WACxB,iLACA;AAAA,IACJ,MAAM,EAAE,QAAQ,wBAAwB,UAAU,WAAW;AAAA,EAC/D,CAAC;AAAA;AAIH,SAAS,eAAe,GAAc;AAAA,EACpC,OAAO,IAAI,UAAU;AAAA,IACnB,MAAM;AAAA,IACN,SACE,0IACA,mIACA;AAAA,IACF,MAAM,EAAE,QAAQ,YAAY;AAAA,EAC9B,CAAC;AAAA;AASI,SAAS,uBAAuB,GAAc;AAAA,EACnD,OAAO,IAAI,UAAU;AAAA,IACnB,MAAM;AAAA,IACN,SACE,iIACA,iIACA;AAAA,IACF,MAAM;AAAA,MACJ,QAAQ;AAAA,MACR,SAAS;AAAA,MACT,UAAU;AAAA,MACV,KAAK,CAAC,2CAA2C,mDAAmD,oDAAoD;AAAA,IAC1J;AAAA,EACF,CAAC;AAAA;AAIH,IAAM,gBAA6B;AAAA,EACjC,QAAQ,CAAC,UAAU;AAAA,IACjB,gBAAgB,OAAO,KAAK;AAAA,IAC5B,MAAM,OAAO,iBAAiB,OAAO,QACjC,OAAO,UAAU,WAAW,kBAAkB,EAAE,MAAM,MAAM,CAAC,IAC7D,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAAI;AAAA,IAClD,IAAI,SAAS,aAAa,OAAO,SAAS,KAAK,QAAQ,CAAC;AAAA,MAAG,OAAO,iBAAiB,OAAO,6BAA6B,EAAE,MAAM,MAAM,CAAC,KAAK,KAAK,YAAY,IAAI,KAAK,YAAY;AAAA,IACjL,MAAM,IAAI,UAAU,EAAE,MAAM,mBAAmB,SAAS,uDAAuD,CAAC;AAAA;AAAA,EAElH,QAAQ,CAAC,UAAU;AAAA,IACjB,IAAI,OAAO,UAAU,UAAU;AAAA,MAG7B,MAAM,OAAO,sBAAsB,EAAE,SAAS,MAAM,KAAK,EAAE,CAAC;AAAA,MAC5D,IAAI,SAAS;AAAA,QAAW,MAAM,wBAAwB,EAAE,MAAM,OAAO,SAAS,SAAS,CAAC;AAAA,MACxF,IAAI,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC;AAAA,QAAG,OAAO,uBAAuB;AAAA,MACpE,OAAO,0BAA0B,EAAE,MAAM,MAAM,OAAO,KAAK,QAAQ,SAAS,MAAM,SAAS,CAAC;AAAA,IAC9F;AAAA,IACA,MAAM,OAAO,gBAAgB,OAAO,KAAK;AAAA,IACzC,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO,0BAA0B,EAAE,MAAM,MAAM,KAAK,YAAY,GAAG,SAAS,OAAO,KAAK,SAAS,SAAS,MAAM,SAAS,CAAC;AAAA,IACzJ,OAAO;AAAA;AAEX;AAkBA,IAAM,iBAA8B;AAAA,EAClC,QAAQ,CAAC,UAAU;AAAA,IACjB,gBAAgB,OAAO,KAAK;AAAA,IAC5B,IAAI,iBAAiB,MAAM;AAAA,MAGzB,OAAO,sBAAsB,EAAE,MAAM,OAAO,MAAM,YAAY,CAAC,MAAM,YAAY,QAAQ,wBAAwB,EAAE,MAAM,MAAM,CAAC;AAAA,IAClI;AAAA,IACA,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,MAAM,SAAS,IAAI,KAAK,KAAK;AAAA,MAC7B,IAAI,CAAC,OAAO,MAAM,OAAO,QAAQ,CAAC;AAAA,QAAG,OAAO;AAAA,MAC5C,OAAO;AAAA,IACT;AAAA,IACA,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO,kBAAkB,EAAE,MAAM,MAAM,CAAC,KAAK;AAAA,IAC5E,OAAO;AAAA;AAAA,EAET,QAAQ,CAAC,UAAU;AAAA,IACjB,IAAI,OAAO,UAAU,UAAU;AAAA,MAC7B,MAAM,OAAO,qBAAqB,EAAE,MAAM,OAAO,SAAS,QAAQ,CAAC;AAAA,MACnE,IAAI,SAAS,aAAa,OAAO,SAAS,KAAK,QAAQ,CAAC;AAAA,QAAG,OAAO;AAAA,MAClE,OAAO,uBAAuB;AAAA,IAChC;AAAA,IAGA,IAAK,iBAAiB,QAAQ,CAAC,OAAO,SAAS,MAAM,QAAQ,CAAC,KAAM,UAAU;AAAA,MAAW,MAAM,gBAAgB;AAAA,IAC/G,OAAO,gBAAgB,OAAO,KAAK;AAAA;AAEvC;AAeA,IAAM,qBAAkC,OAAO,OAAO;AAAA,EACpD,QAAQ,CAAC,UAA4B;AAAA,IACnC,gBAAgB,OAAO,KAAK;AAAA,IAC5B,IAAI,iBAAiB,MAAM;AAAA,MACzB,MAAM,MAAM,qBAAqB,KAAK,sBAAsB,EAAE,MAAM,OAAO,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI;AAAA,MACzG,IAAI,QAAQ;AAAA,QAAW,OAAO;AAAA,IAChC;AAAA,IACA,MAAM,OAAO,iBAAiB,OAAO,QACjC,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAC1C,OAAO,UAAU,WAAW,kBAAkB,EAAE,MAAM,MAAM,CAAC,IAAI;AAAA,IACrE,IAAI,SAAS,aAAa,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC;AAAA,MAAG,OAAO,eAAe,OAAO,KAAK;AAAA,IAC9F,OAAO,IAAI,KAAK,KAAK,MAAM,KAAK,QAAQ,IAAI,IAAI,IAAI,IAAI;AAAA;AAAA,EAE1D,QAAQ,eAAe;AACzB,CAAC;AAQM,SAAS,aAAa,CAAC,QAAuF;AAAA,EACnH,OAAO,OAAO,YAAY,WAAW,OAAO,YAAY,KAAK,EAAE,YAAY,MAAM,SAAS,qBAAqB;AAAA;AAMjH,IAAM,uBAAuB;AAG7B,SAAS,WAAW,CAAC,QAA4C;AAAA,EAC/D,QAAQ,SAAS;AAAA,EACjB,OAAO,wBAAwB,EAAE,MAAM,OAAO,MAAM,CAAC,MAAM,qBAAqB,KAAK,IAAI,IAAI,0BAA0B,EAAE,MAAM,SAAS,KAAK,CAAC,IAAI;AAAA;AAUpJ,SAAS,MAAM,CAAC,QAAmE;AAAA,EACjF,QAAQ,MAAM,UAAU;AAAA,EACxB,IAAI,UAAU;AAAA,IAAW,OAAO;AAAA,EAChC,IAAI,UAAU;AAAA,IAAS,OAAO,IAAI,KAAK,KAAK,QAAQ,IAAI,QAAQ,KAAM;AAAA,EACtE,MAAM,OAAO,KAAK,eAAe;AAAA,EACjC,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAAA,EAClC,MAAM,QAAQ,IAAI,KAAK,QAAQ,OAAO,MAAM,MAAM,KAAK,YAAY,GAAG,KAAK,WAAW,GAAG,KAAK,YAAY,GAAG,KAAK,cAAc,GAAG,KAAK,cAAc,GAAG,KAAK,mBAAmB,CAAC;AAAA,EAClL,IAAI;AAAA,IAAO,MAAM,YAAY,IAAI;AAAA,EACjC,OAAO;AAAA;AASF,SAAS,qBAAqB,CAAC,QAA4E;AAAA,EAChH,MAAM,OAAO,YAAY,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,EAC9C,OAAO,SAAS,YAAY,YAAY,OAAO,EAAE,MAAM,OAAO,UAAU,OAAO,IAAI,EAAE,CAAC;AAAA;AAIxF,SAAS,gBAAgB,CAAC,QAAkE;AAAA,EAC1F,QAAQ,UAAU;AAAA,EAClB,OAAO,CAAC,UAAU;AAAA,IAChB,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO,eAAe,OAAO,KAAK;AAAA,IACjE,MAAM,UAAU,MAAM,KAAK;AAAA,IAC3B,MAAM,OAAO,YAAY,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC1C,IAAI,SAAS;AAAA,MAAW,OAAO,eAAe,OAAO,KAAK;AAAA,IAC1D,MAAM,OAAO,OAAO,EAAE,MAAM,MAAM,CAAC;AAAA,IACnC,IAAI,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC;AAAA,MAAG,OAAO,uBAAuB;AAAA,IACpE,OAAO,0BAA0B,EAAE,MAAM,MAAM,QAAQ,CAAC;AAAA;AAAA;AAK5D,IAAM,mBAAmB,IAAI;AAStB,SAAS,UAAU,CAAC,QAA+F;AAAA,EACxH,QAAQ,UAAU;AAAA,EAClB,IAAI,OAAO,YAAY,WAAY,UAAU,kBAAkB,UAAU;AAAA,IAAqB,OAAO;AAAA,EACrG,MAAM,QAAQ,UAAU,OAAO,MAAM,gBAAgB;AAAA,EACrD,IAAI,UAAU;AAAA,IAAW,OAAO;AAAA,EAChC,MAAM,MAAM,OAAO,KAAK;AAAA,EACxB,IAAI,OAAO,iBAAiB,IAAI,GAAG;AAAA,EACnC,IAAI,SAAS,WAAW;AAAA,IACtB,MAAM,SAAS,iBAAiB,EAAE,MAAM,CAAC;AAAA,IACzC,OAAO,OAAO,OAAO;AAAA,MACnB,UAAU,OAAO,OAAO,EAAE,QAAQ,eAAe,QAAQ,OAAO,CAAC;AAAA,MACjE,UAAU,OAAO,OAAO,EAAE,QAAQ,mBAAmB,QAAQ,OAAO,CAAC;AAAA,IACvE,CAAC;AAAA,IACD,iBAAiB,IAAI,KAAK,IAAI;AAAA,EAChC;AAAA,EACA,OAAO,UAAU,iBAAiB,KAAK,WAAW,KAAK;AAAA;AAclD,SAAS,uBAAuB,CAAC,QAAgF;AAAA,EACtH,MAAM,OAAO,mBAAmB,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,EACvD,IAAI,SAAS;AAAA,IAAW;AAAA,EACxB,MAAM,OAAO,OAAO;AAAA,EACpB,MAAM,QAAQ,UAAU,OAAO,IAAI;AAAA,EACnC,MAAM,SAAS,kBAAkB,KAAK,IAAI;AAAA,EAC1C,IAAI,WAAW,QAAQ,OAAO,EAAE,MAAM,YAAY,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK,OAAO,GAAG,GAAG,MAAM,CAAC,EAAE,QAAQ,MAAM,KAAK,UAAU,QAAQ,KAAK,IAAI,GAAG;AAAA,IAC7I,OAAO,GAAG,OAAO,MAAM,OAAO,MAAM,eAAe,OAAO,MAAM,IAAI,OAAO,GAAG,GAAG;AAAA,EACnF;AAAA,EACA,MAAM,SAAS,KAAK,UAAU,KAAK,IAAI,IAAI,MAAM,IAAI,OAAO,GAAG,GAAG;AAAA,EAClE,IAAI,UAAU,SAAS;AAAA,IACrB,MAAM,OAAO,UAAU,YAAY,OAAO,IAAI,KAAK,KAAK,UAAU,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAM;AAAA,IACrG,OAAO,KAAK,UAAU,YAAY,KAAK,IAAI,EAAE,QAAQ,KAAK,GAAG,EAAE,QAAQ,aAAa,MAAM;AAAA,EAC5F;AAAA,EACA,MAAM,MAAM,CAAC,OAAe,UAA0B,OAAO,KAAK,EAAE,SAAS,OAAO,GAAG;AAAA,EACvF,OAAO,GAAG,IAAI,KAAK,YAAY,GAAG,CAAC,KAAK,IAAI,KAAK,SAAS,IAAI,GAAG,CAAC,KAAK,IAAI,KAAK,QAAQ,GAAG,CAAC,KAAK,IAAI,KAAK,SAAS,GAAG,CAAC,KAAK,IAAI,KAAK,WAAW,GAAG,CAAC,KAAK,IAAI,KAAK,WAAW,GAAG,CAAC,IAAI;AAAA;AAIvL,IAAM,oBAAoB;AAI1B,IAAM,uBAAuB;AAQ7B,IAAM,mBAAmB;AAEzB,IAAM,MAAM,CAAC,OAAe,UAA0B,OAAO,KAAK,EAAE,SAAS,OAAO,GAAG;AAGvF,IAAM,sBAAsB,CAAC,UACzB,KAAK,QAAQ,IAAI,uBAAwB,wBAAwB;AAGrE,IAAM,gBAAgB,CAAC,gBACrB,GAAG,IAAI,KAAK,MAAM,cAAc,OAAS,GAAG,CAAC,KAAK,IAAI,KAAK,MAAM,cAAc,KAAM,IAAI,IAAI,CAAC,KAAK,IAAI,KAAK,MAAM,cAAc,IAAI,IAAI,IAAI,CAAC,KAAK,IAAI,cAAc,MAAM,CAAC;AAsB7K,SAAS,kBAAkB,CAAC,QAAyC;AAAA,EACnE,MAAM,SAAS,OAAO,QAAQ,QAAQ;AAAA,EACtC,OAAO,OAAO,OAAO;AAAA,IACnB,QAAQ,CAAC,UAA4B;AAAA,MACnC,gBAAgB,OAAO,KAAK;AAAA,MAC5B,MAAM,OAAO,iBAAiB,OAAO,QACjC,OAAO,UAAU,WAAW,kBAAkB,EAAE,MAAM,MAAM,CAAC,IAC7D,OAAO,UAAU,WAAW,IAAI,KAAK,KAAK,IAAI;AAAA,MAClD,IAAI,SAAS,aAAa,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,GAAG;AAAA,QAC1D,MAAM,IAAI,UAAU,EAAE,MAAM,mBAAmB,SAAS,iEAAiE,MAAM,EAAE,MAAM,EAAE,CAAC;AAAA,MAC5I;AAAA,MACA,OAAO,sBAAsB,EAAE,MAAM,MAAM,OAAO,QAAQ,WAAW,OAAO,CAAC,KAAK,GAAG,cAAc,oBAAoB,IAAI,CAAC,IAAI;AAAA;AAAA,IAElI,QAAQ,CAAC,UAA4B;AAAA,MACnC,IAAI,iBAAiB,QAAQ,OAAO,SAAS,MAAM,QAAQ,CAAC,GAAG;AAAA,QAC7D,IAAI,sBAAsB,EAAE,MAAM,OAAO,MAAM,OAAO,QAAQ,WAAW,OAAO,CAAC,MAAM;AAAA,UAAW,OAAO;AAAA,QACzG,MAAM,eAAe,oBAAoB,KAAK;AAAA,QAC9C,MAAM,OAAO,cAAc,YAAY;AAAA,QACvC,OAAO,0BAA0B,EAAE,MAAM,IAAI,KAAK,YAAY,GAAG,MAAM,GAAG,OAAO,UAAU,KAAK,GAAG,OAAO,QAAQ,WAAW,UAAU,UAAU,MAAM,OAAO,QAAQ,WAAW,OAAO,CAAC;AAAA,MAC3L;AAAA,MACA,MAAM,QAAQ,OAAO,UAAU,WAAW,iBAAiB,KAAK,MAAM,KAAK,CAAC,IAAI;AAAA,MAChF,IAAI,UAAU,MAAM;AAAA,QAClB,SAAS,OAAO,SAAS,SAAS,UAAU,MAAM,aAAa,eAAe,iBAAiB;AAAA,QAC/F,MAAM,cAAc,OAAO,KAAK,IAAI,UAAY,OAAO,OAAO,IAAI,QAAS,OAAO,WAAW,CAAC,IAAI,OAC9F,QAAQ,YAAY,IAAI,MAAM,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC;AAAA,QACtD,MAAM,SAAS,SAAS,YAAY,KAC/B,SAAS,MAAM,KAAK,MAAM,OAAO,WAAW,IAAI,UAAY,OAAO,iBAAiB,CAAC,IAAI,QAAS,OAAO,iBAAiB,CAAC,IAAI;AAAA,QACpI,IAAI,eAAe,sBAAsB;AAAA,UACvC,MAAM,OAAO,IAAI,OAAQ,cAAc,UAAU,uBAAwB,wBAAwB,oBAAoB;AAAA,UACrH,MAAM,iBAAiB,YAAY,IAAI,OAAO,GAAG,GAAG,EAAE,QAAQ,iBAAiB,EAAE;AAAA,UAIjF,MAAM,MAAM,GAAG,OAAO,QAAQ,WAAW,UAAU,SAAS,WAAW,WAAW,QAAQ,iBAAiB;AAAA,UAC3G,OAAO,0BAA0B,EAAE,MAAM,MAAO,MAAiB,KAAK,GAAG,KAAK,MAAM,OAAO,QAAQ,WAAW,OAAO,CAAC;AAAA,QACxH;AAAA,MACF;AAAA,MACA,MAAM,IAAI,UAAU,EAAE,MAAM,qBAAqB,SAAS,4EAA4E,MAAM,EAAE,MAAM,EAAE,CAAC;AAAA;AAAA,EAE3J,CAAC;AAAA;AAGH,IAAM,YAAyB,mBAAmB,EAAE,OAAO,MAAM,CAAC;AAClE,IAAM,cAA2B,mBAAmB,EAAE,OAAO,KAAK,CAAC;AAQ5D,SAAS,cAAc,CAAC,QAAqE;AAAA,EAClG,MAAM,OAAO,cAAc,EAAE,YAAY,OAAO,WAAW,CAAC;AAAA,EAC5D,OAAO,SAAS,WAAW,cAAc,SAAS,SAAS,YAAY;AAAA;AAIlE,IAAM,iBAA8B,OAAO,OAAO;AAAA,EACvD,QAAQ,CAAC,UAA2B;AAAA,IAClC,MAAM,YAAY,EAAE,MAAM;AAAA,IAC1B,IAAI,qBAAqB,SAAS;AAAA,MAAG,OAAO,UAAU;AAAA,IACtD,MAAM,IAAI,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,EAAE,MAAM;AAAA,IAChB,CAAC;AAAA;AAAA,EAEH,QAAQ,CAAC,UAA2B;AAAA,IAClC,MAAM,YAAY,EAAE,MAAM;AAAA,IAC1B,IAAI,qBAAqB,SAAS;AAAA,MAAG,OAAO,UAAU;AAAA,IACtD,MAAM,IAAI,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,EAAE,MAAM;AAAA,IAChB,CAAC;AAAA;AAEL,CAAC;AAGD,IAAM,kBAA+B;AAAA,EACnC,QAAQ,CAAC,UAAW,OAAO,UAAU,YAAa,QAAQ,IAAI,IAAK;AAAA,EACnE,QAAQ,CAAC,UAAW,OAAO,UAAU,WAAW,UAAU,IAAI;AAChE;AAMA,IAAM,uBAAoC;AAAA,EACxC,QAAQ;AAAA,EACR,QAAQ,CAAC,UAAU,UAAU,MAAM,QAAQ,UAAU,MAAM,OAAO,gBAAgB,OAAO,KAAK;AAChG;AAOO,SAAS,aAAa,CAAC,QAGlB;AAAA,EACV,QAAQ,MAAM,YAAY;AAAA,EAC1B,IAAI;AAAA,IACF,OAAO,KAAK,MAAM,IAAI;AAAA,IACtB,OAAO,OAAO;AAAA,IACd,IAAI,YAAY,WAAW;AAAA,MACzB,MAAM,IAAI,UAAU;AAAA,QAClB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM,KAAK,QAAQ;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,IACA,MAAM,IAAI,UAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,EAAE,OAAO,KAAK;AAAA,MACpB;AAAA,IACF,CAAC;AAAA;AAAA;AAYL,IAAM,YAAyB;AAAA,EAC7B,QAAQ,CAAC,UAAU,KAAK,UAAU,KAAK;AAAA,EACvC,QAAQ,CAAC,UAAU;AAAA,IACjB,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO;AAAA,IACtC,OAAO,cAAc,EAAE,MAAM,MAAM,CAAC;AAAA;AAExC;AAgBO,SAAS,eAAe,CAAC,QAAmC;AAAA,EACjE,QAAQ,UAAU;AAAA,EAClB,IAAI,UAAU,KAAK,CAAC,OAAO,SAAS,KAAK;AAAA,IAAG,OAAO;AAAA,EACnD,MAAM,SAAS,KAAK,OAAO,KAAK;AAAA,EAChC,SAAS,YAAY,EAAG,aAAa,GAAG,aAAa;AAAA,IACnD,MAAM,YAAY,OAAO,MAAM,YAAY,SAAS,CAAC;AAAA,IACrD,IAAI,KAAK,OAAO,SAAS,MAAM;AAAA,MAAQ,OAAO;AAAA,EAChD;AAAA,EACA,OAAO;AAAA;AAUF,IAAM,eAA4B;AAAA,EACvC,QAAQ;AAAA,EACR,QAAQ,CAAC,UAAU;AAAA,IACjB,MAAM,SAAS,OAAO,UAAU,WAAW,OAAO,KAAK,IAAI;AAAA,IAC3D,OAAO,OAAO,WAAW,WAAW,gBAAgB,EAAE,OAAO,OAAO,CAAC,IAAI;AAAA;AAE7E;AAIA,IAAM,kBAAkB,CAAC,SAA2B,SAAS,MAAM,OAAO,SAAS,MAAM,QAAQ;AAGjG,IAAM,gBAAgB,CAAC,SACrB,2BAA2B,KAAK,IAAI,IAAI,IAAI,WAAW,OAAO,KAAK,KAAK,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI;AAevF,SAAS,4BAA4B,CAAC,QAAwE;AAAA,EACnH,QAAQ,OAAO;AAAA,IACb,KAAK;AAAA,MACH,OAAO;AAAA,IACT,KAAK;AAAA,MACH,OAAO;AAAA,IACT,KAAK;AAAA,MACH,OAAO,UAAU;AAAA,IACnB;AAAA,MACE,OAAO;AAAA;AAAA;AAON,IAAM,kBAA8B;AAAA,EACzC,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT;AAGO,IAAM,gBAA4B;AAAA,EACvC,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT;AAGO,IAAM,eAA2B;AAAA,EACtC,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT;AAGO,IAAM,iBAAwD;AAAA,EACnE,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AACT;;;AFx/BA,IAAM,kBAAkB,IAAI;AAC5B,IAAM,oBAAoB,IAAI;AAC9B,IAAM,mBAAmB,IAAI;AAC7B,IAAM,gBAAgB,IAAI;AAGnB,SAAS,iBAAiB,CAAC,QAA0F;AAAA,EAC1H,IAAI,OAAO,SAAS,OAAO;AAAA,IAAO,OAAO;AAAA,EACzC,MAAM,WAAW,kBAAkB,IAAI,OAAO,IAAI;AAAA,EAClD,OAAO,aAAa,aAAa,aAAa,kBAAkB,IAAI,OAAO,KAAK;AAAA;AAGlF,SAAS,eAAe,CAAC,QAAiG;AAAA,EACxH,MAAM,WAAW,kBAAkB,IAAI,OAAO,OAAO;AAAA,EACrD,OAAO,aAAa,YAAY,YAAY,KAAK,UAAU,CAAC,OAAO,MAAM,QAAQ,CAAC;AAAA;AAI7E,SAAS,oBAAoB,CAAC,QAAmF;AAAA,EACtH,OAAO,gBAAgB,IAAI,OAAO,OAAO;AAAA;AAG3C,SAAS,cAAiB,CAAC,QAAwH;AAAA,EACjJ,IAAI,OAAO,aAAa;AAAA,IAAW,gBAAgB,IAAI,OAAO,SAAS,OAAO,OAAO,OAAO,QAAQ,CAAC;AAAA,EACrG,IAAI,OAAO,aAAa;AAAA,IAAW,kBAAkB,IAAI,OAAO,SAAS,OAAO,QAAQ;AAAA,EACxF,OAAO,OAAO;AAAA;AAGhB,SAAS,eAAe,CAAC,QAAmH;AAAA,EAC1I,MAAM,WAAW,gBAAgB,IAAI,OAAO,OAAO;AAAA,EACnD,IAAI,aAAa,aAAc,OAAO,SAAS,QAAQ,SAAS;AAAA,IAAO;AAAA,EACvE,OAAO,KAAK,aAAc,OAAO,SAAS,OAAO,EAAE,MAAM,MAAM,UAAU,MAAM,IAAI,CAAC,MAAQ,OAAO,aAAa,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC,EAAG;AAAA;AAUlJ,SAAS,MAAM,CAAC,UAAmB,SAAwB;AAAA,EACzD,MAAM,IAAI,WAAU,EAAE,MAAM,WAAW,oBAAoB,qBAAqB,QAAQ,CAAC;AAAA;AAQpF,SAAS,kBAAqB,CAAC,QAShC;AAAA,EACJ,IAAI;AAAA,IACF,OAAO,OAAO,QAAQ,OAAO,OAAO,IAAI;AAAA,IACxC,OAAO,OAAO;AAAA,IACd,IAAI,EAAE,iBAAiB,eAAc,MAAM,SAAS;AAAA,MAAqB,MAAM;AAAA,IAC/E,QAAQ,QAAQ,KAAK,UAAU;AAAA,IAC/B,MAAM,QAAQ,WAAW,UAAU,UAAU,YAAY,KAAK,MAAM,YAAY,QAAQ,YAAY,KAAK,WAAW;AAAA,IACpH,MAAM,IAAI,WAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,GAAG,OAAO,UAAU,KAAK,UAAU,MAAM;AAAA,MAClD,MAAM,KAAK,OAAO,MAAM,WAAY,UAAU,YAAY,CAAC,IAAI,EAAE,MAAM,MAAQ,QAAQ,YAAY,CAAC,IAAI,EAAE,IAAI,GAAI,QAAQ,OAAO,OAAO;AAAA,MACxI,OAAO;AAAA,IACT,CAAC;AAAA;AAAA;AAIL,SAAS,MAAS,CAAC,MAAkB,OAAsD;AAAA,EACzF,MAAM,UAAU,CAAC,QAAmE,aAAyB;AAAA,IAC3G,QAAQ,OAAO,YAAY;AAAA,IAC3B,IAAI,UAAU,QAAQ,UAAU;AAAA,MAAW,OAAO,UAAU,cAAc,mDAAmD;AAAA,IAC7H,IAAI,SAAS,YAAY,EAAG,OAAO,UAAU,YAAc,OAAO,UAAU,YAAY,aAAa,KAAK,KAAK,KAAO,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,IAAK;AAAA,MAChL,OAAO,UAAU,+DAA+D;AAAA,IAClF;AAAA,IACA,IAAI,SAAS,aAAa,UAAU,QAAQ,UAAU,SAAS,UAAU,KAAK,UAAU,KAAK,EAAE,CAAC,YAAY,YAAY,YAAY,UAAU,OAAO,UAAU;AAAA,MAAO,OAAO,UAAU,uCAAuC;AAAA,IAC9N,IAAI,SAAS,aAAa,OAAO,UAAU;AAAA,MAAU,OAAO,UAAU,kEAAkE;AAAA,IACxI,KAAK,SAAS,SAAS,SAAS,YAAY,OAAO,UAAU,YAAY,CAAC,kDAAkD,KAAK,KAAK,GAAG;AAAA,MACvI,OAAO,UAAU,WAAW,WAAW;AAAA,IACzC;AAAA,IAEA,MAAM,QAAQ,WAAW,eAAe,SAAS,QAAQ,WAAW,EAAE,SAAS,OAAO,eAAe,SAAS,OAAO,MAAM,OAAO,KAAK,CAAC;AAAA,IAExI,MAAM,QAAQ,SAAS,SAAS,CAAC,YAAY,OAAO,UAAU,WAAW,cAAc,EAAE,MAAM,CAAC,IAAI;AAAA,IACpG,MAAM,SAAS,SAAS,UAAU,OAAO,MAAM,SAAS,WAAW,QAAQ,MAAM,OAAO,KAAK;AAAA,IAC7F,IAAI,CAAC,MAAM,MAAM;AAAA,MAAG,OAAO,UAAU,WAAW,uBAAuB;AAAA,IACvE,OAAO;AAAA;AAAA,EAET,OAAO,eAAe,EAAE,UAAU,KAAK,UAAU,CAAC,UAAU,IAAI,CAAC,GAAG,UAAU,EAAE,QAAQ,MAAM,UAAU,OAAO,MAAM,MAAM,GAAG,SAAS,OAAO,OAAO;AAAA,IACnJ,QAAQ,CAAC,WAA4B,QAAQ,QAAQ,KAAK;AAAA,IAC1D,QAAQ,CAAC,WAAkC;AAAA,MAEzC,MAAM,QAAQ,SAAS,SAAS,OAAO,QAAQ,QAAQ,QAAQ,IAAI;AAAA,MACnE,IAAI,UAAU,aAAa,UAAU;AAAA,QAAM,OAAO,MAAM,cAAc,4CAA4C;AAAA,MAClH,OAAO,eAAe,OAAO,SAAS,MAAM,OAAO,KAAK;AAAA;AAAA,EAE5D,CAAC,EAAE,CAAC;AAAA;AAGN,SAAS,aAAa,CAAC,QAAmC;AAAA,EACxD,QAAQ,UAAU;AAAA,EAClB,IAAI,QAAQ,OAAO,OAAO,gBAAgB,KAAK,QAAQ,CAAC,OAAO,OAAO,gBAAgB;AAAA,IAAG,OAAO,OAAO,4EAA4E;AAAA,EACnL,OAAO,OAAO,KAAK;AAAA;AAGrB,IAAM,gBAAuC,OAAO,UAAU,CAAC,UAAU,OAAO,UAAU,QAAQ;AAClG,IAAM,cAAmC,OAAO,YAAY,CAAC,UAAU,iBAAiB,QAAQ,OAAO,SAAS,MAAM,QAAQ,CAAC,CAAC;AAChI,IAAM,gBAAuC,OAAe,UAAU,CAAC,UAAU,OAAO,UAAU,QAAQ;AAC1G,IAAM,qBAA6B,OAAO,OAAO,gBAAgB;AAGjE,IAAM,sBAA6C,eAAe,EAAE,UAAU,KAAK,UAAU,CAAC,UAAU,UAAU,QAAQ,CAAC,GAAG,UAAU,EAAE,QAAQ,UAAU,UAAU,OAAO,MAAM,MAAM,GAAG,SAAS,OAAO,OAAO;AAAA,EACjN,QAAQ,CAAC,WAAiC;AAAA,IACxC,MAAM,QAAQ,cAAc,OAAO,MAAM;AAAA,IACzC,IAAI,QAAQ,sBAAsB,QAAQ,CAAC;AAAA,MAAoB,OAAO,OAAO,8EAA8E;AAAA,IAC3J,OAAO,OAAO,KAAK;AAAA;AAAA,EAErB,QAAQ,CAAC,WAAkC;AAAA,IACzC,QAAQ,UAAU;AAAA,IAClB,MAAM,SAAS,GAAG,OAAO,KAAK;AAAA,IAC9B,IAAI,OAAO,UAAU,YAAY,CAAC,OAAO,cAAc,KAAK;AAAA,MAAG,OAAO,MAAM,MAAM;AAAA,IAElF,MAAM,UAAU,cAAc,OAAO,MAAM;AAAA,IAC3C,MAAM,QAAQ,OAAO,OAAO,OAAO,CAAC;AAAA,IACpC,IAAI,QAAQ,sBAAsB,QAAQ,CAAC;AAAA,MAAoB,OAAO,MAAM,MAAM;AAAA,IAClF,OAAO;AAAA;AAEX,CAAC,EAAE,CAAC;AACJ,IAAM,kBAAmD,eAAe,EAAE,UAAU,sBAAsB,UAAU,EAAE,QAAQ,YAAY,UAAU,OAAO,MAAM,MAAM,GAAG,SAAS,OAAO,OAAO;AAAA,EAC/L,QAAQ,CAAC,WAA2C;AAAA,IAClD,IAAI,OAAO,UAAU,cAAc,OAAO,UAAU;AAAA,MAAU,OAAO;AAAA,IACrE,IAAI,OAAO,UAAU,eAAe,OAAO,UAAU;AAAA,MAAW,OAAO;AAAA,IACvE,OAAO,YAAY,OAAO,MAAM;AAAA;AAAA,EAElC,QAAQ,CAAC,WAAkC;AAAA,IACzC,IAAI,OAAO,UAAU,cAAc,OAAO,UAAU,aAAa;AAAA,MAC/D,IAAI,OAAO,YAAY;AAAA,QAAY,MAAM,IAAI,WAAU,EAAE,MAAM,+BAA+B,SAAS,mDAAmD,CAAC;AAAA,MAC3J,OAAO,OAAO;AAAA,IAChB;AAAA,IACA,OAAO,YAAY,OAAO,MAAM;AAAA;AAEpC,CAAC,EAAE,CAAC;AAEJ,SAAS,UAAa,CAAC,SAA4D;AAAA,EACjF,OAAO,YAAY,WAAW,OAAO,QAAQ,WAAW;AAAA;AAK1D,SAAS,QAAW,GAAG,WAA2E;AAAA,EAChG,MAAM,SAAS,iBAAiB,IAAI,OAAO;AAAA,EAC3C,IAAI,WAAW;AAAA,IAAW,OAAO;AAAA,EACjC,MAAM,OAAO,CAAC,WAAmC,OAAO,UAAU,OAAO,OAAO,QAAQ,OAAO,MAAM;AAAA,EACrG,MAAM,UAAuC,WAAW,OAAO,IAC3D,eAAe,EAAE,UAAU,gBAAgB,EAAE,SAAS,MAAM,WAAW,CAAC,GAAG,UAAU,gBAAgB,EAAE,SAAS,UAAU,KAAK,CAAC,GAAG,SAAS,OAAO,OAAO;AAAA,IAC1J,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAkC,OAAO,UAAU,OAAO,OAAO,QAAQ,OAAO,MAAM;AAAA,EACjG,CAAC,EAAE,CAAC,IACF,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,EAClC,iBAAiB,IAAI,SAAS,OAAO;AAAA,EACrC,OAAO;AAAA;AAKT,SAAS,KAAQ,GAAG,WAAsE;AAAA,EACxF,MAAM,SAAS,cAAc,IAAI,OAAO;AAAA,EACxC,IAAI,WAAW;AAAA,IAAW,OAAO;AAAA,EACjC,MAAM,gBAAgB,WAAW,OAAO;AAAA,EACxC,MAAM,OAAO,CAAC,WAA8B;AAAA,IAC1C,MAAM,MAAM,OAAO;AAAA,IACnB,IAAI;AAAA,IACJ,IAAI,OAAO,YAAY,cAAc,OAAO,QAAQ,UAAU;AAAA,MAC5D,IAAI;AAAA,QAAe,QAAQ,oBAAoB,EAAE,SAAS,IAAI,CAAC;AAAA,MAC/D,KAAK;AAAA,QACH,MAAM,WAAW,0BAA0B,EAAE,SAAS,IAAI,CAAC;AAAA,QAC3D,IAAI,aAAa,QAAQ,SAAS,KAAK,CAAC,YAAY,MAAM,QAAQ,OAAO,CAAC;AAAA,UAAG,OAAO,OAAO,kEAAkE;AAAA,QAC7J,QAAQ;AAAA;AAAA,IAEZ,EAAE;AAAA,MAAK,QAAQ,YAAY,OAAO,GAAG,KAAK,YAAY,MAAM,MAAM,KAAK,GAAoC,IAAI;AAAA,IAC/G,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,MAAG,OAAO,OAAO,8BAA8B;AAAA,IACvE,OAAO,MAAM,IAAI,CAAC,YAAY,QAAQ,OAAO,KAAK,QAAQ,OAAO,QAAQ,CAAC,CAAC;AAAA;AAAA,EAE7E,MAAM,UAAkC,WAAW,OAAO,IACtD,eAAe,EAAE,UAAU,gBAAgB,EAAE,SAAS,MAAM,QAAQ,CAAC,GAAG,UAAU,gBAAgB,EAAE,SAAS,MAAM,KAAK,CAAC,GAAG,SAAS,OAAO,OAAO;AAAA,IACnJ,QAAQ;AAAA,IACR,QAAQ,CAAC,WAAkC;AAAA,MACzC,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK;AAAA,QAAG,OAAO,MAAM,6BAA6B;AAAA,MAC5E,OAAO,OAAO,MAAM,IAAI,CAAC,UAAU,QAAQ,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA,EAE3E,CAAC,EAAE,CAAC,IACF,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,EAClC,cAAc,IAAI,SAAS,OAAO;AAAA,EAClC,OAAO;AAAA;AAIF,IAAM,SAET,OAAO,OAAO;AAAA,EAChB,OAAO,GAAG,cAA2E,OAAO,OAAO;AAAA,IACjG,QAAQ,CAAC,WAAqE;AAAA,MAC5E,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK;AAAA,QAAG,OAAO,MAAM,6BAA6B;AAAA,MAC5E,OAAO,MAAM,KAAK,OAAO,OAAO,CAAC,UAAU,QAAQ,OAAO,KAAK,QAAQ,MAAM,CAAC,CAAC;AAAA;AAAA,EAEnF,CAAC;AACH,CAAC;AAGM,IAAM,SAwBT,OAAO,OAAO;AAAA,EAChB,QAAQ;AAAA,EACR,SAAS,OAAgB,WAAW,CAAC,UAAU,OAAO,UAAU,SAAS;AAAA,EACzE,KAAK,OAAe,OAAO,CAAC,UAAU,OAAO,UAAU,YAAY,OAAO,cAAc,KAAK,CAAC;AAAA,EAC9F,OAAO,OAAe,SAAS,CAAC,UAAU,OAAO,UAAU,YAAY,OAAO,SAAS,KAAK,CAAC;AAAA,EAC7F,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,SAAS,OAAe,WAAW,CAAC,UAAU,OAAO,UAAU,YAAY,kDAAkD,KAAK,KAAK,CAAC;AAAA,EACxI,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,MAAM,OAAgB,QAAQ,CAAC,UAAU,UAAU,SAAS;AAAA,EAC5D,OAAO,OAAmB,SAAS,CAAC,UAAU,iBAAiB,UAAU;AAAA,EACzE;AAAA,EACA;AAAA,EACA,MAAM,GAA2B,aAAyD;AAAA,IACxF,MAAM,UAAU,IAAI,IAAY,MAAM;AAAA,IACtC,OAAO,eAAe,EAAE,UAAU,KAAK,UAAU,CAAC,QAAQ,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,CAAC,GAAG,UAAU,EAAE,QAAQ,UAAU,UAAU,OAAO,MAAM,MAAM,GAAG,SAAS,OAAO,OAAO;AAAA,MACpK,QAAQ,GAAG,YAA6B,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAK,IAAI,QAAa,OAAO,OAAO,gCAAgC;AAAA,MACrJ,QAAQ,GAAG,YAAmC,OAAO,UAAU,YAAY,QAAQ,IAAI,KAAK,IAAI,QAAQ,OAAO,MAAM,+BAA+B;AAAA,IACtJ,CAAC,EAAE,CAAC;AAAA;AAAA,EAEN,QAAQ,GAAqB,aAAqD;AAAA,IAChF,MAAM,UAAU,OAAO,QAAQ,MAAM;AAAA,IACrC,MAAM,UAAU,CAAC,QAAmE,aAAgC;AAAA,MAClH,IAAI,OAAO,OAAO,UAAU,YAAY,OAAO,UAAU,QAAQ,MAAM,QAAQ,OAAO,KAAK;AAAA,QAAG,OAAO,UAAU,8BAA8B;AAAA,MAC7I,MAAM,MAAM,OAAO;AAAA,MACnB,OAAO,OAAO,YAAY,QAAQ,IAAI,EAAE,MAAM,aAAa;AAAA,QACzD,IAAI,CAAC,OAAO,OAAO,KAAK,IAAI;AAAA,UAAG,OAAO,UAAU,8BAA8B,OAAO;AAAA,QACrF,OAAO,CAAC,MAAM,WAAW,QAAQ,OAAO,KAAK,QAAQ,OAAO,IAAI,MAAM,CAAC,IAAI,mBAAmB,EAAE,SAAS,MAAM,KAAK,QAAQ,OAAO,IAAI,MAAM,GAAG,QAAQ,MAAM,QAAQ,eAAe,CAAC,CAAC;AAAA,OACxL,CAAC;AAAA;AAAA,IAEJ,OAAO,OAAO,OAAO,EAAE,QAAQ,CAAC,WAAmC,QAAQ,QAAQ,KAAK,GAAG,QAAQ,CAAC,WAAkC,QAAQ,QAAQ,IAAI,EAAE,CAAC;AAAA;AAEjK,CAAC;;;AGxSD,IAAM,SAAS,IAAI;AAGZ,SAAS,sBAAsB,CAAC,QAAqD;AAAA,EAC1F,OAAO,IAAI,OAAO,KAAK;AAAA;AAIlB,SAAS,WAAW,CAAC,OAAwB;AAAA,EAClD,WAAW,SAAS;AAAA,IAAQ,IAAI,MAAM,KAAK;AAAA,MAAG,OAAO;AAAA,EACrD,OAAO;AAAA;;;AJ4BT,IAAM,SAAS,IAAI;AACnB,IAAM,SAAS,IAAI;AACnB,IAAM,SAAS,IAAI;AACnB,uBAAuB,EAAE,OAAO,CAAC,UAAU,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,EAAE,CAAC;AAExG,SAAS,OAAO,CAAC,SAAwB;AAAA,EACvC,MAAM,IAAI,WAAU,EAAE,MAAM,mBAAmB,QAAQ,CAAC;AAAA;AAInD,SAAS,UAAU,CAAC,OAA4C;AAAA,EACrE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,IAAI,KAAK;AAAA;AAOjE,SAAS,UAAU,CAAC,OAA4C;AAAA,EACrE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,OAAO,IAAI,KAAK;AAAA;AAIjE,SAAS,cAAiB,CAAC,QAAqD;AAAA,EACrF,IAAI,OAAO,OAAO,SAAS,SAAS,WAAW;AAAA,IAAY,QAAQ,iDAAiD;AAAA,EACpH,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,EAC/C,OAAO,IAAI,OAAO,OAAO,OAAO;AAAA,OAAK,OAAO;AAAA,OACtC,OAAO,SAAS,eAAe,YAAY,CAAC,IAAI,EAAE,YAAY,OAAO,OAAO,CAAC,GAAG,OAAO,SAAS,UAAU,CAAC,EAAE;AAAA,OAC7G,OAAO,SAAS,aAAa,YAAY,CAAC,IAAI,EAAE,UAAU,OAAO,OAAO,KAAK,OAAO,SAAS,SAAS,CAAC,EAAE;AAAA,EAC/G,CAAC,CAAC;AAAA,EACF,OAAO;AAAA;AAIF,SAAS,gBAAgB,CAAC,QAAiF;AAAA,EAChH,MAAM,QAAQ,OAAO;AAAA,EACrB,IAAI,OAAO,UAAU,YAAY,UAAU;AAAA,IAAM,QAAQ,iEAAiE;AAAA,EAC1H,MAAM,WAAW,OAAO,IAAI,KAAK;AAAA,EACjC,IAAI,aAAa;AAAA,IAAW,OAAO;AAAA,EACnC,IAAI,EAAE,YAAY,UAAU,EAAE,YAAY,UAAU,OAAO,MAAM,WAAW,cAAc,OAAO,MAAM,WAAW;AAAA,IAAY,QAAQ,qEAAqE;AAAA,EAC3M,MAAM,UAAU;AAAA,EAChB,MAAM,WAAW,qBAAqB,EAAE,QAAQ,CAAC;AAAA,EACjD,OAAO,OAAO,OAAO,EAAE,SAAS,SAAS,QAAQ,UAAU,UAAU,WAAW,UAAU,UAAU,YAAY,MAAM,MAAM,UAAU,QAAQ,MAAM,CAAC;AAAA;AAOhJ,SAAS,mBAA0C,CAAC,QAAoI;AAAA,EAC7L,IAAI,OAAO,OAAO,aAAa;AAAA,IAAY,QAAQ,qDAAqD;AAAA,EACxG,MAAM,eAAwB,OAAO;AAAA,EACrC,IAAI,OAAO,iBAAiB,YAAY,iBAAiB,QAAQ,MAAM,QAAQ,YAAY;AAAA,IAAG,QAAQ,mDAAmD;AAAA,EACzJ,MAAM,YAAqB,OAAO,eAAe,YAAY;AAAA,EAC7D,IAAI,cAAc,OAAO,aAAa,cAAc;AAAA,IAAM,QAAQ,+CAA+C;AAAA,EACjH,MAAM,OAAO,QAAQ,QAAQ,YAAY;AAAA,EACzC,MAAM,UAAwC,KAAK,IAAI,CAAC,QAAoC;AAAA,IAC1F,IAAI,OAAO,QAAQ,YAAY,IAAI,WAAW,KAAK,IAAI,SAAS,MAAI;AAAA,MAAG,QAAQ,sDAAsD;AAAA,IACrI,MAAM,aAAa,OAAO,yBAAyB,cAAc,GAAG;AAAA,IACpE,IAAI,EAAE,WAAW;AAAA,MAAa,QAAQ,iDAAiD;AAAA,IACvF,OAAO,CAAC,KAAK,iBAAiB,EAAE,OAAO,WAAW,MAAoD,CAAC,CAAC;AAAA,GACzG;AAAA,EACD,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,EAC/C,OAAO,IAAI,OAAO,EAAE,MAAM,MAAM,MAAM,OAAO,OAAO,QAAQ,IAAI,EAAE,SAAS,GAAG,CAAC,GAAG,UAAU,OAAO,SAAS,CAAC;AAAA,EAC7G,MAAM,SAA4C,OAAO,OAAO,IAAI;AAAA,EACpE,YAAY,KAAK,aAAa,SAAS;AAAA,IACrC,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,IAC/C,OAAO,IAAI,OAAO,EAAE,OAAO,KAAK,SAAS,CAAC;AAAA,IAC1C,OAAO,OAAO;AAAA,EAChB;AAAA,EACA,OAAO,EAAE,OAAO,QAAQ,OAAO,OAAO,MAAM,EAAuB;AAAA;AAI9D,SAAS,iBAAiB,CAAC,QAAwC;AAAA,EACxE,MAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,uCAAuC;AAAA,EACzF,MAAM,OAAO;AAAA;AAIR,SAAS,sBAAsB,CAAC,QAA4C;AAAA,EACjF,MAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,uCAAuC;AAAA,EACzF,IAAI,OAAO,IAAI,MAAM,KAAK,GAAG,SAAS;AAAA,IAAM,QAAQ,8DAA8D;AAAA;AAI7G,SAAS,gBAAgB,CAAC,QAAwD;AAAA,EACvF,QAAQ,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,uCAAuC,GAAG;AAAA;AAIjF,SAAS,WAAW,CAAC,QAAoE;AAAA,EAC9F,MAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,uCAAuC;AAAA,EACzF,IAAI,MAAM,UAAU,OAAO;AAAA,IAAO,QAAQ,gEAAgE;AAAA,EAC1G,OAAO,MAAM;AAAA;AAIR,SAAS,mBAAmB,CAAC,QAA0D;AAAA,EAC5F,MAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,uCAAuC;AAAA,EACzF,OAAO,MAAM,SAAS,OAAO,KAAK;AAAA;AAI7B,SAAS,iBAAiB,CAAC,QAAqD;AAAA,EACrF,MAAM,QAAQ,OAAO,IAAI,OAAO,KAAK,KAAK,QAAQ,uCAAuC;AAAA,EACzF,IAAI,MAAM;AAAA,IAAM,QAAQ,qDAAqD;AAAA,EAC7E,OAAO,MAAM;AAAA;;;ADzIR,SAAS,gBAAgB,CAAC,OAAgB,YAAiC,IAAI,KAAO,UAAgD;AAAA,EAC3I,MAAM,UAAU,CAAC,YAA2B;AAAA,IAAE,MAAM,IAAI,WAAU,EAAE,MAAM,mBAAmB,QAAQ,CAAC;AAAA;AAAA,EACtG,IAAI,WAAW,KAAK;AAAA,IAAG,OAAO,QAAQ,wEAAwE;AAAA,EAC9G,IAAI,OAAO,UAAU,YAAY,UAAU,SAAS,YAAY,KAAK,KAAK,WAAW,KAAK;AAAA,IAAI,OAAO,QAAQ,kFAAkF;AAAA,EAC/L,IAAI,UAAU;AAAA,IAAW,OAAO,QAAQ,qEAAqE;AAAA,EAC7G,IAAI,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACnH,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO;AAAA,EACtC,IAAI,iBAAiB;AAAA,IAAM,OAAO,OAAO,SAAS,MAAM,QAAQ,CAAC,IAAI,mBAAmB,EAAE,MAAM,MAAM,CAAC,IAAI,QAAQ,0BAA0B;AAAA,EAC7I,IAAI,iBAAiB;AAAA,IAAY,OAAO,IAAI,WAAW,KAAK;AAAA,EAC5D,IAAI,OAAO,UAAU;AAAA,IAAU,OAAO,QAAQ,iCAAiC;AAAA,EAC/E,IAAI,UAAU,IAAI,KAAK;AAAA,IAAG,OAAO,QAAQ,6CAA6C;AAAA,EACtF,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,EACjC,MAAM,YAAqB,OAAO,eAAe,KAAK;AAAA,EACtD,IAAI,QAAQ,cAAc,MAAM,YAAY,cAAc,OAAO,aAAa,cAAc;AAAA,IAAM,OAAO,QAAQ,yDAAyD;AAAA,EAC1K,MAAM,SAAS,IAAI,IAAI,CAAC,GAAG,WAAW,KAAK,CAAC;AAAA,EAC5C,MAAM,WAAmB,QAAQ,CAAC,IAAI,OAAO,OAAO,cAAc,OAAO,OAAO,OAAO,SAAS;AAAA,EAChG,WAAW,OAAO,QAAQ,QAAQ,KAAK,GAAG;AAAA,IACxC,MAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG;AAAA,IAC7D,IAAI,EAAE,WAAW;AAAA,MAAa,OAAO,QAAQ,2DAA2D;AAAA,IACxG,OAAO,eAAe,UAAU,KAAK,KAAK,YAAY,OAAO,iBAAiB,WAAW,OAAO,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACrH;AAAA,EACA,OAAO;AAAA;;;ADJT,IAAM,aAAa,IAAI;AACvB,IAAM,WAAW,IAAI;AAErB,SAAS,QAAO,CAAC,SAAwB;AAAA,EACvC,MAAM,IAAI,WAAU,EAAE,MAAM,mBAAmB,QAAQ,CAAC;AAAA;AAE1D,SAAS,WAAW,CAAC,SAAwB;AAAA,EAC3C,MAAM,IAAI,WAAU,EAAE,MAAM,+BAA+B,QAAQ,CAAC;AAAA;AAI/D,SAAS,qBAAqB,CAAC,QAAmD;AAAA,EACvF,IAAI,2BAA2B,OAAO,KAAK;AAAA,IAAG,OAAO,EAAE,MAAM,qBAAqB,MAAM,OAAO,MAAM,KAAK;AAAA,EAC1G,IAAI,oBAAoB,OAAO,KAAK;AAAA,IAAG,OAAO,EAAE,MAAM,aAAa,SAAS,OAAO,MAAM,SAAS,OAAO,OAAO,OAAO,MAAM,UAAU,SAAS;AAAA,EAChJ,OAAO,EAAE,MAAM,QAAQ;AAAA;AAIlB,SAAS,2BAA2B,CAAC,QAAgG;AAAA,EAC1I,QAAQ,SAAS,aAAa,cAAc;AAAA,EAC5C,IAAI,UAAU,SAAS;AAAA,IAAS,OAAO;AAAA,EACvC,IAAI,CAAC,QAAQ,aAAa;AAAA,IAAc,MAAM,uBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,eAAe,CAAC;AAAA,EACtH,IAAI,UAAU,SAAS;AAAA,IAAqB,OAAO,GAAG,gBAAgB,QAAQ,WAAW,EAAE,MAAM,UAAU,KAAK,UAAU,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,UAAU,KAAK,KAAK,CAAC;AAAA,EAChL,OAAO,GAAG,sBAAsB,UAAU,UAAU,UAAU,QAAQ,OAAO;AAAA;AAIxE,SAAS,qBAAqB,CAAC,QAAqC;AAAA,EACzE,IAAI,2BAA2B,OAAO,KAAK;AAAA,IAAG,OAAO,OAAO,MAAM;AAAA,EAClE,IAAI,oBAAoB,OAAO,KAAK;AAAA,IAAG,OAAO,OAAO,OAAO,MAAM,UAAU,WAAW,OAAO,MAAM,QAAQ,iBAAiB,EAAE,QAAQ,OAAO,MAAM,MAAM,CAAC;AAAA,EAC3J,OAAO,OAAO;AAAA;AAIT,SAAS,qBAAqB,CAAC,QAAgD;AAAA,EACpF,OAAO,WAAW,IAAI,OAAO,SAAS;AAAA;AAIjC,SAAS,yBAAyB,CAAC,QAAwF;AAAA,EAChI,kBAAkB,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,EACzC,IAAI,WAAW,IAAI,OAAO,SAAS;AAAA,IAAG,SAAQ,4CAA4C;AAAA,EAC1F,WAAW,IAAI,OAAO,WAAW,EAAE,SAAS,OAAO,SAAS,OAAO,OAAO,OAAO,OAAO,CAAC,GAAG,WAAW,IAAI,KAAO,MAAM,IAAI,IAAM,CAAC;AAAA;AAGrI,SAAS,aAAa,CAAC,UAAoC;AAAA,EACzD,OAAO,KAAK,UAAU;AAAA,IAAE,QAAQ,SAAS;AAAA,IAAQ,UAAU,SAAS;AAAA,IAAU,MAAM,SAAS;AAAA,IAAM,YAAY,SAAS;AAAA,IACtH,YAAY,SAAS;AAAA,IAAY,UAAU,SAAS,aAAa,YAAY,YAAY,CAAC,SAAS,SAAS,WAAW,SAAS,SAAS,IAAI;AAAA,IAAG,aAAa,SAAS;AAAA,EAAY,CAAC;AAAA;AAGvL,SAAS,YAAY,CAAC,MAAwB,OAAkC;AAAA,EAC9E,OAAO,KAAK,YAAY,MAAM,WAAW,KAAK,mBAAmB,MAAM,kBAAkB,cAAc,IAAI,MAAM,cAAc,KAAK;AAAA;AAI/H,SAAS,gBAAgB,CAAC,QAQtB;AAAA,EACT,MAAM,QAAQ,WAAW,IAAI,OAAO,SAAS,KAAK,SAAQ,oEAAoE;AAAA,EAC9H,IAAI;AAAA,EACJ,IAAI,OAAO,OAAO,SAAS,SAAS;AAAA,IAClC,MAAM,YAAY,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,IACpE,IAAI,OAAO,aAAa;AAAA,MAAW,SAAQ,yDAAyD;AAAA,IACpG,MAAM,WAAW,MAAM,UAAU,IAAI,GAAG;AAAA,IACxC,IAAI,aAAa,aAAa,CAAC,aAAa,UAAU,OAAO,QAAQ;AAAA,MAAG,SAAQ,cAAc,0CAA0C;AAAA,IACxI,MAAM,UAAU,IAAI,KAAK,OAAO,QAAQ;AAAA,IACxC,MAAM,KAAK,IAAI,GAAG;AAAA,EACpB;AAAA,EACA,MAAM,YAAmC,OAAO,UAAU,SAAS,sBAC/D,OAAO,OAAO,KAAK,OAAO,WAAW,MAAM,OAAO,OAAO,KAAK,OAAO,UAAU,KAAK,CAAC,EAAE,CAAC,IAAI,OAAO,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,EACrI,MAAM,SAA2B,OAAO,OAAO,SAAS,YAAY,OAAO,OAAO,EAAE,MAAM,WAAW,OAAO,iBAAiB,OAAO,OAAO,KAAK,EAAE,CAAC,IAAI,OAAO,OAAO,KAAK,OAAO,OAAO,CAAC;AAAA,EACzL,MAAM,cAAc,OAAO,UAAU,QAAQ;AAAA,EAC7C,MAAM,OAAO,4BAA4B,EAAE,SAAS,MAAM,SAAS,aAAa,UAAU,CAAC;AAAA,EAC3F,MAAM,MAAM,KAAK,OAAO,OAAO,EAAE,MAAM,QAAQ,QAAQ,KAAK,WAAW,QAAQ,OAAO,QAAQ,YAAY,OAAO,eAAe,SAAU,OAAO,aAAa,YAAY,CAAC,IAAI,EAAE,UAAU,OAAO,SAAS,EAAG,CAAC,CAAC;AAAA,EAChN,OAAO;AAAA;AAIF,SAAS,qBAAqB,CAAC,QAAgE;AAAA,EACpG,MAAM,QAAQ,WAAW,IAAI,OAAO,SAAS,KAAK,SAAQ,qCAAqC;AAAA,EAC/F,MAAM,MAAM,KAAK,OAAO,OAAO,EAAE,MAAM,SAAS,OAAO,OAAO,MAAM,CAAC,CAAC;AAAA;AAIjE,SAAS,0BAA0B,CAAC,QAA0D;AAAA,EACnG,MAAM,QAAQ,WAAW,IAAI,OAAO,SAAS,KAAK,SAAQ,qCAAqC;AAAA,EAC/F,MAAM,OAAO,kBAAkB,EAAE,OAAO,MAAM,MAAM,CAAC;AAAA,EACrD,WAAW,OAAO;AAAA,IAAM,IAAI,CAAC,MAAM,KAAK,IAAI,GAAG;AAAA,MAAG,SAAQ,uBAAuB,sCAAsC;AAAA,EACvH,MAAM,UAAU,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,EACjD,SAAS,IAAI,SAAS,EAAE,SAAS,MAAM,SAAS,MAAM,OAAO,OAAO,OAAO,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC;AAAA,EAC9F,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,QAAoH;AAAA,EACzI,MAAM,QAAQ,OAAO,UAAU,aAAa,OAAO,KAAK,WAAW,IAAI,OAAO,OAAO,IAAI,IAAc,OAAO;AAAA,EAC9G,IAAI,OAAO,UAAU,YAAY,UAAU,QAAQ,MAAM,QAAQ,KAAK;AAAA,IAAG,SAAQ,uDAAuD;AAAA,EACxI,MAAM,YAAqB,OAAO,eAAe,KAAK;AAAA,EACtD,IAAI,cAAc,OAAO,aAAa,cAAc;AAAA,IAAM,SAAQ,yEAAyE;AAAA,EAC3I,MAAM,MAAM,QAAQ,QAAQ,KAAK;AAAA,EACjC,IAAI,IAAI,WAAW,OAAO,KAAK,UAAU,IAAI,KAAK,CAAC,QAAQ,OAAO,QAAQ,YAAY,CAAC,OAAO,KAAK,SAAS,GAAG,CAAC;AAAA,IAAG,SAAQ,iEAAiE;AAAA,EAC5L,MAAM,cAAc,OAAO,KAAK,IAAI,CAAC,QAAQ;AAAA,IAC3C,MAAM,aAAa,OAAO,yBAAyB,OAAO,GAAG;AAAA,IAC7D,IAAI,eAAe,aAAa,EAAE,WAAW,eAAe,WAAW,UAAU;AAAA,MAAW,SAAQ,cAAc,2CAA2C;AAAA,IAC7J,OAAO,EAAE,KAAK,OAAO,WAAW,MAAiB;AAAA,GAClD;AAAA,EACD,MAAM,WAAoC,OAAO,OAAO,IAAI;AAAA,EAE5D,WAAW,SAAS;AAAA,IAAa,SAAS,MAAM,OAAO,iBAAiB,MAAM,OAAO,IAAI,KAAO,OAAO,QAAQ;AAAA,EAC/G,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,MAA6B,OAAuC;AAAA,EACzF,IAAI,KAAK,SAAS,MAAM;AAAA,IAAM,OAAO;AAAA,EACrC,IAAI,KAAK,SAAS,uBAAuB,MAAM,SAAS;AAAA,IAAqB,OAAO,KAAK,KAAK,cAAc,MAAM,KAAK,aAAa,KAAK,KAAK,SAAS,MAAM,KAAK;AAAA,EAClK,IAAI,KAAK,SAAS,eAAe,MAAM,SAAS;AAAA,IAAa,OAAO,KAAK,YAAY,MAAM,WAAW,KAAK,UAAU,MAAM;AAAA,EAC3H,OAAO;AAAA;AAIF,SAAS,qBAAqB,CAAC,QAA2G;AAAA,EAC/I,MAAM,QAAQ,SAAS,IAAI,OAAO,OAAO,KAAK,SAAQ,2CAA2C;AAAA,EACjG,MAAM,SAAS,cAAc,EAAE,MAAM,MAAM,MAAM,OAAO,OAAO,QAAQ,UAAU,OAAO,SAAS,CAAC;AAAA,EAClG,MAAM,gBAAgB,IAAI;AAAA,EAC1B,MAAM,SAAoB,CAAC;AAAA,EAC3B,WAAW,QAAQ,MAAM,OAAO;AAAA,IAC9B,IAAI,KAAK,SAAS,SAAS;AAAA,MAAE,KAAK,MAAM;AAAA,MAAG;AAAA,IAAU;AAAA,IACrD,MAAM,QAAQ,KAAK,OAAO,SAAS,YAAY,KAAK,OAAO,QAAQ,OAAO,KAAK;AAAA,IAC/E,KAAK,WAAW,KAAK;AAAA,IACrB,IAAI,KAAK,cAAc,UAAU;AAAA,MAAM,SAAQ,qEAAqE;AAAA,IACpH,IAAI;AAAA,IACJ,IAAI,KAAK,QAAQ,aAAa,cAAc,IAAI,KAAK,GAAG;AAAA,MAAG,UAAU,cAAc,IAAI,KAAK,GAAG;AAAA,IAC/F,KAAK;AAAA,MACH,UAAU,iBAAiB,KAAK,OAAO,EAAE,OAAO,iBAAiB,KAAK,GAAG,SAAS,MAAM,QAAQ,CAAC,CAAC;AAAA,MAClG,IAAI,KAAK,QAAQ;AAAA,QAAW,cAAc,IAAI,KAAK,KAAK,OAAO;AAAA;AAAA,IAEjE,KAAK,WAAW,OAAO;AAAA,IACvB,IAAI,KAAK,cAAc,YAAY;AAAA,MAAM,SAAQ,4EAA4E;AAAA,IAC7H,IAAI,YAAY,QAAQ,CAAC,cAAc,KAAK,WAAW,sBAAsB,EAAE,OAAO,QAAQ,CAAC,CAAC;AAAA,MAAG,YAAY,yEAAyE;AAAA,IACxL,OAAO,KAAK,iBAAiB,sBAAsB,EAAE,OAAO,QAAQ,CAAC,CAAC,CAAC;AAAA,EACzE;AAAA,EACA,OAAO;AAAA;;;ADxKF,MAAM,eAAe;AAAA,EACT;AAAA,EACT,WAAmB;AAAA,EAClB;AAAA,EAET,WAAW,CAAC,SAAqB;AAAA,IAC/B,KAAK,UAAU;AAAA,IACf,KAAK,SAAS,CAAC;AAAA;AAAA,EAIjB,OAAO,GAAW;AAAA,IAChB,MAAM,QAAQ,sBAAsB,EAAE,WAAW,KAAK,CAAC,IAAI,EAAE,KAAK,WAAW,KAAK,OAAO;AAAA,IACzF,OAAO,KAAK,QAAQ,YAAY,EAAE,MAAM,CAAC;AAAA;AAAA,EAI3C,KAAK,GAAW;AAAA,IACd,OAAO,sBAAsB,EAAE,WAAW,KAAK,CAAC,IAAI,KAAK,WAAW,KAAK,OAAO;AAAA;AAAA,EAIlF,GAAG,CAAC,OAAwB;AAAA,IAC1B,MAAM,YAAY,sBAAsB,EAAE,MAAM,CAAC;AAAA,IACjD,IAAI,sBAAsB,EAAE,WAAW,KAAK,CAAC;AAAA,MAAG,OAAO,iBAAiB;AAAA,QACtE,WAAW;AAAA,QAAM,QAAQ,EAAE,MAAM,WAAW,MAAM;AAAA,QAAG;AAAA,QAAW,QAAQ,CAAC,WAAW,OAAO;AAAA,MAC7F,CAAC;AAAA,IACD,IAAI,UAAU,SAAS,WAAW,CAAC,KAAK,QAAQ,aAAa;AAAA,MAAc,MAAM,uBAAsB,EAAE,SAAS,KAAK,QAAQ,MAAM,SAAS,eAAe,CAAC;AAAA,IAC9J,KAAK,OAAO,KAAK,sBAAsB,EAAE,MAAM,CAAC,CAAC;AAAA,IACjD,OAAO,4BAA4B,EAAE,SAAS,KAAK,SAAS,aAAa,KAAK,QAAQ,GAAG,UAAU,CAAC;AAAA;AAAA,EAItG,OAAO,CAAC,QAAsC;AAAA,IAC5C,OAAO,OAAO,IAAI,CAAC,UAAU,KAAK,IAAI,KAAK,CAAC;AAAA;AAEhD;;;ADrBO,SAAS,wBAAwB,CAAC,QAA6F;AAAA,EACpI,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,uBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,kBAAkB,CAAC;AAAA,EAChI,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,WAAW,OAAO,QAAQ,IAAI,CAAC,QAAQ,cAAc,EAAE,UAAU,MAAM,OAAO,MAAM,WAAW,OAAO,WAAW,MAAM,OAAO,MAAM,QAAQ,OAAO,SAAS,WAAW,OAAO,SAAS,KAAK,EAAE;AAAA,EAEpM,MAAM,UAAU,UAAU,IAAI,KAAK,UAAU,QAAQ,CAAC;AAAA,EACtD,MAAM,OAAO;AAAA,qCACsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkCnC,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;;AS7D7D,kCAAS;AAeF,SAAS,6BAA6B,CAAC,QAAwG;AAAA,EACpJ,QAAQ,YAAY;AAAA,EACpB,IAAI,QAAQ,SAAS;AAAA,IAAY,MAAM,uBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,0BAA0B,CAAC;AAAA,EAC1H,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,YAAY,UAAU,IAAI,OAAO,SAAS;AAAA,EAChD,MAAM,uBAAuB,sOAAsO;AAAA,EACnQ,IAAI;AAAA,EACJ,QAAQ,OAAO;AAAA,IACb,KAAK;AAAA,MAAU,OAAO,8mBAA8mB,oFAAoF;AAAA,MAA4C;AAAA,IACpwB,KAAK;AAAA,MAAS,OAAO,wEAAwE,iBAAiB;AAAA,MAA4C;AAAA,IAC1J,KAAK;AAAA,MAAW,OAAO,60BAA60B,kKAAkK;AAAA,MAAmD;AAAA,IACzjC,KAAK;AAAA,MAAe,OAAO,igBAAigB;AAAA,MAAmD;AAAA,IAC/kB,KAAK;AAAA,MAAU,OAAO,+RAA+R;AAAA,MAA4C;AAAA,IACjW,KAAK;AAAA,MAAe,OAAO,0iCAA0iC;AAAA,MAAoD;AAAA,IACznC,KAAK;AAAA,MAAS,OAAO,wPAAwP;AAAA,MAAqL;AAAA,IAClc,KAAK;AAAA,MAAW,OAAO,qiCAAqiC;AAAA,MAA2C;AAAA;AAAA,EAEzmC,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;;AC5B7D,kCAAS;AAQF,SAAS,wBAAwB,CAAC,QAAgD;AAAA,EACvF,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,uBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACrI,OAAO,EAAE,MAAM,8JAA8J,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAItM,SAAS,wBAAwB,CAAC,QAAkE;AAAA,EACzG,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,uBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACrI,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,OAAO,EAAE,MAAM,uCAAuC,UAAU,IAAI,OAAO,QAAQ,uBAAuB,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAIjJ,SAAS,uBAAuB,CAAC,QAAwI;AAAA,EAC9K,QAAQ,YAAY;AAAA,EACpB,IAAI,QAAQ,SAAS;AAAA,IAAY,MAAM,uBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACvH,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,QAAQ,OAAO,UAAU,YAC3B,GAAG,OAAO,sBAAsB,OAAO,MAAM,cAAc,YAAY,2CAA2C,eAAe,UAAU,IAAI,OAAO,MAAM,SAAS,uBAAuB,UAAU,IAAI,OAAO,MAAM,IAAI,MAC3N,OAAO,eAAe,YACpB,kFACA,OAAO,WAAW,WAAW,IAAI,UAAU,iBAAiB,CAAC,GAAG,IAAI,IAAI,OAAO,UAAU,CAAC,EAAE,IAAI,CAAC,cAAc,UAAU,IAAI,SAAS,CAAC,EAAE,KAAK,IAAI;AAAA,EAIxJ,MAAM,oBAAoB,8JAA8J,OAAO,qBAAqB,iDAAiD;AAAA,EACrQ,MAAM,oBAAoB,OAAO,qBAAqB,wvBAAwvB;AAAA,EAC9yB,MAAM,kBAAkB,OAAO,qBAAqB,4HAA4H;AAAA,EAChL,OAAO;AAAA,IACL,MAAM,oeAAoe,2ZAA2Z,wJAAwJ,2BAA2B;AAAA,IACxjC,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;;AC5CF,sBAAS,0DAAgC;AAYlC,SAAS,kBAAkB,CAAC,QAItB;AAAA,EACX,QAAQ,SAAS,SAAS,WAAW;AAAA,EACrC,MAAM,mBAAmB,QAAQ,KAAK,CAAC,WAAW,OAAO,kBAAkB,SAAS;AAAA,EACpF,IAAI,oBAAoB,CAAC,QAAQ,aAAa;AAAA,IAAsB,MAAM,uBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EAC1J,IAAI,oBAAoB;AAAA,IAAQ,MAAM,uBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,8BAA8B,MAAM,qEAAqE,CAAC;AAAA,EACxM,OAAO,QAAQ,IAAI,CAAC,WAAW;AAAA,IAC7B,MAAM,gBAAgB,OAAO;AAAA,IAC7B,IAAI,kBAAkB,aAAa,CAAC,oBAAoB,EAAE,MAAM,SAAS,MAAM,cAAc,CAAC,GAAG;AAAA,MAC/F,MAAM,IAAI,WAAU,EAAE,MAAM,uBAAuB,SAAS,yEAAyE,MAAM,EAAE,MAAM,iCAAiC,QAAQ,OAAO,KAAK,EAAE,CAAC;AAAA,IAC7M;AAAA,IACA,MAAM,MAAM,kBAAkB,YAAY,KAAK,IAAI,QAAQ,WAAW,EAAE,MAAM,cAAc,UAAU,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,cAAc,KAAK,CAAC;AAAA,IAC3J,OAAO,GAAG,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC,IAAI,MAAM,OAAO,OAAO,UAAU;AAAA,GACrF;AAAA;;AC5BH,sBAAS,+FAAoE;;;AC+B7E,sBAAS,oFAA2D,8EAAoD;AAoBjH,SAAS,eAAe,CAAC,QASrB;AAAA,EACT,4BAA4B,EAAE,WAAW,OAAO,WAAW,SAAS,OAAO,QAAQ,MAAM,OAAO,OAAO,OAAO,OAAO,OAAO,MAAM,CAAC;AAAA,EACnI,IAAI,OAAO,UAAU,wBAAwB,CAAC,OAAO,QAAQ,aAAa;AAAA,IAAsB,MAAM,uBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EAC7L,IAAI,OAAO,UAAU,oBAAoB,CAAC,OAAO,QAAQ,aAAa,gBAAgB;AAAA,IACpF,MAAM,uBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,iBAAiB,CAAC;AAAA,EACzF;AAAA,EACA,MAAM,UAAyB;AAAA,IAC7B,OAAO,OAAO;AAAA,IACd,SAAS,OAAO;AAAA,IAChB,OAAO,OAAO,SAAS,CAAC;AAAA,IACxB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,EACf;AAAA,EACA,OAAO,WAAW,EAAE,MAAM,OAAO,WAAW,QAAQ,CAAC;AAAA;AAIhD,SAAS,sBAAsB,GAAG,YAAY,OAAO,SAAS,QAAQ,CAAC,GAAG,OAAO,QAOhB;AAAA,EACtE,4BAA4B,EAAE,YAAY,SAAS,QAAQ,MAAM,OAAO,MAAM,CAAC;AAAA,EAC/E,MAAM,UAAyB,EAAE,OAAO,SAAS,OAAO,OAAO,KAAK;AAAA,EACpE,QAAQ,MAAM,eAAe,iBAAiB,EAAE,YAAY,QAAQ,CAAC;AAAA,EACrE,OAAO,EAAE,MAAM,WAAW;AAAA;AAc5B,IAAM,aAA4D;AAAA,EAChE,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,KAAK;AAAA,EACL,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEA,IAAM,iBAAmD;AAAA,EACvD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AACP;AAGA,IAAM,gBAAwB;AAE9B,IAAM,gBAAwB;AAE9B,IAAM,YAAY,CAAC;AACnB,IAAM,YAAY;AAClB,IAAM,YAAY,EAAE,MAAM;AAC1B,IAAM,YAAY,MAAM,MAAM;AAE9B,SAAS,OAAM,CAAC,QAKN;AAAA,EACR,QAAQ,SAAS,MAAM,YAAY;AAAA,EACnC,MAAM,IAAI,WAAU;AAAA,IAClB,MAAM;AAAA,IACN,SAAS,GAAG,QAAQ,YAAY,QAAQ,MAAM,UAAU;AAAA,IACxD,MAAM,EAAE,MAAM,OAAO,QAAQ,MAAM,MAAM,MAAM,QAAQ,SAAU,OAAO,QAAQ,CAAC,EAAG;AAAA,EACtF,CAAC;AAAA;AAIH,SAAS,WAAW,CAAC,QAA4F;AAAA,EAC/G,QAAQ,MAAM,QAAQ,YAAY;AAAA,EAElC,KAAK,KAAK,SAAS,SAAS,KAAK,SAAS,SAAS,KAAK,SAAS,WAAW,GAAG;AAAA,IAC7E,OAAO,YAAY,EAAE,MAAM,KAAK,SAAS,IAAK,QAAQ,QAAQ,CAAC;AAAA,EACjE;AAAA,EACA,MAAM,OAAO,WAAW,EAAE,MAAM,QAAQ,CAAC;AAAA,EACzC,OAAO,WAAW,KAAK,QAAQ,WAAW,UAAU,IAAI,UAAU;AAAA;AAGpE,SAAS,UAAU,CAAC,QAA+D;AAAA,EACjF,QAAQ,MAAM,YAAY;AAAA,EAE1B,QAAQ,KAAK;AAAA,IACX,KAAK;AAAA,IACL,KAAK,MAAM;AAAA,MACT,IAAI,KAAK,SAAS,WAAW,GAAG;AAAA,QAC9B,QAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN,SAAS,GAAG,KAAK,SAAS,QAAQ,UAAU;AAAA,QAC9C,CAAC;AAAA,MACH;AAAA,MACA,IAAI,KAAK,SAAS,WAAW;AAAA,QAAG,OAAO,WAAW,EAAE,MAAM,KAAK,SAAS,IAAK,QAAQ,CAAC;AAAA,MACtF,MAAM,YAAY,KAAK,SAAS,QAAQ,UAAU;AAAA,MAClD,OAAO,KAAK,SACT,IAAI,CAAC,YAAY,YAAY,EAAE,MAAM,SAAS,QAAQ,KAAK,MAAM,QAAQ,CAAC,CAAC,EAC3E,KAAK,SAAS;AAAA,IACnB;AAAA,IAEA,KAAK;AAAA,MACH,OAAO,OAAO,YAAY,EAAE,MAAM,KAAK,SAAS,QAAQ,OAAO,QAAQ,CAAC;AAAA,IAE1E,KAAK;AAAA,MACH,OAAO,YAAY,WAAW,EAAE,MAAM,KAAK,SAAS,QAAQ,CAAC;AAAA,IAE/D,KAAK,UAAU;AAAA,MAGb,MAAM,QAAQ,aAAa,EAAE,MAAM,KAAK,MAAM,MAAM,SAAS,UAAU,KAAK,CAAC;AAAA,MAC7E,OAAO,GAAG,YAAY,EAAE,OAAO,QAAQ,CAAC,QAAQ,KAAK,WAAW,OAAO,aAAa;AAAA,IACtF;AAAA,IAEA,KAAK,WAAW;AAAA,MACd,MAAM,OAAO,iBAAiB,EAAE,YAAY,KAAK,MAAM,QAAQ,CAAC;AAAA,MAChE,MAAM,QAAQ,cAAc,EAAE,SAAS,KAAK,OAAO,MAAM,QAAQ,CAAC;AAAA,MAClE,OAAO,GAAG,KAAK,QAAQ,eAAe,KAAK,OAAO;AAAA,IACpD;AAAA,IAEA,KAAK,UAAU;AAAA,MACb,IAAI,KAAK,OAAO,WAAW,GAAG;AAAA,QAC5B,QAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN,SAAS,WAAW,KAAK,MAAM;AAAA,UAC/B,MAAM,EAAE,OAAO,KAAK,MAAM,KAAK;AAAA,QACjC,CAAC;AAAA,MACH;AAAA,MACA,MAAM,QAAQ,aAAa,EAAE,MAAM,KAAK,MAAM,MAAM,QAAQ,CAAC;AAAA,MAC7D,MAAM,SAAS,KAAK,OACjB,IAAI,CAAC,UAAU,cAAc,EAAE,OAAO,YAAY,gBAAgB,EAAE,OAAO,QAAQ,CAAC,GAAG,WAAW,MAAM,MAAM,QAAQ,CAAC,CAAC,EACxH,KAAK,IAAI;AAAA,MACZ,OAAO,GAAG,cAAc,EAAE,OAAO,QAAQ,CAAC,KAAK,KAAK,WAAW,OAAO,WAAW,SAAS;AAAA,IAC5F;AAAA;AAAA;AAOJ,SAAS,YAAY,CAAC,QAA+E;AAAA,EACnG,QAAQ,MAAM,YAAY;AAAA,EAC1B,MAAM,QAAQ,QAAQ,MAAM,OAAO,KAAK,CAAC,cAAc,UAAU,SAAS,IAAI;AAAA,EAE9E,IAAI,UAAU,WAAW;AAAA,IACvB,QAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS,qBAAqB;AAAA,MAC9B,MAAM,EAAE,OAAO,KAAK;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EACA,IAAI,MAAM,QAAQ;AAAA,IAChB,QAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS,yBAAyB;AAAA,MAClC,MAAM,EAAE,OAAO,KAAK;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EACA,IAAI,MAAM,kBAAkB,MAAM;AAAA,IAChC,QAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS,eAAe,0BAA0B,MAAM,cAAc;AAAA,MACtE,MAAM,EAAE,OAAO,KAAK;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EACA,IAAI,OAAO,aAAa,SAAS,MAAM,SAAS,UAAU,MAAM,SAAS,UAAU;AAAA,IACjF,QAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS,cAAc,MAAM,gBAAgB,gBAAW,MAAM;AAAA,MAC9D,MAAM,EAAE,OAAO,MAAM,MAAM,MAAM,KAAK;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EAKA,IACE,QAAQ,UAAU,WAClB,QAAQ,QAAQ,SAAS,WACzB,MAAM,SAAS,SAAS,iBACxB;AAAA,IACA,MAAM,uBAAsB;AAAA,MAC1B,SAAS;AAAA,MACT,SAAS,uDAAuD,QAAQ,MAAM,QAAQ;AAAA,MACtF,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAIT,SAAS,WAAW,CAAC,QAA4D;AAAA,EAC/E,QAAQ,OAAO,YAAY;AAAA,EAC3B,OAAO,QAAQ,QAAQ,WAAW,EAAE,MAAM,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA;AAYxE,SAAS,aAAa,CAAC,QAA4D;AAAA,EACjF,QAAQ,OAAO,YAAY;AAAA,EAC3B,MAAM,SAAS,YAAY,EAAE,OAAO,QAAQ,CAAC;AAAA,EAC7C,OAAO,QAAQ,QAAQ,SAAS,YAAY,MAAM,SAAS,YACvD,QAAQ,oBACR;AAAA;AAYN,SAAS,eAAe,GAAG,OAAO,WAA4E;AAAA,EAC5G,IAAI,iBAAiB,EAAE,MAAM,CAAC;AAAA,IAAG,OAAO,EAAE,MAAM,MAAM,MAAM,YAAY,YAAY;AAAA,EACpF,IAAI,QAAQ,QAAQ,SAAS,cAAc,MAAM,SAAS,YAAY,MAAM,YAAY,KAAK,EAAE,YAAY,MAAM;AAAA,IAAQ,OAAO,EAAE,MAAM,UAAU,YAAY,aAAa;AAAA,EAC3K,OAAO,EAAE,MAAM,MAAM,KAAK;AAAA;AAG5B,SAAS,cAAc,GAAG,cAA2D;AAAA,EACnF,OAAO,WAAW,eAAe,cAAc,cAAc,kBAAkB,EAAE,MAAM,WAAW,KAAK,CAAC;AAAA;AAG1G,IAAM,iBAAkE;AAAA,EACtE,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAGA,SAAS,sBAAsB,GAAG,MAAM,OAAO,QAA0G;AAAA,EACvJ,OAAO,IAAI,QAAQ,eAAe,SAAS;AAAA;AAG7C,SAAS,gBAAgB,GAAG,YAAY,WAA4F;AAAA,EAClI,QAAQ,WAAW;AAAA,IACjB,KAAK,SAAS;AAAA,MACZ,MAAM,QAAQ,aAAa,EAAE,MAAM,WAAW,MAAM,QAAQ,CAAC;AAAA,MAC7D,OAAO,EAAE,MAAM,cAAc,EAAE,OAAO,QAAQ,CAAC,GAAG,YAAY,gBAAgB,EAAE,OAAO,QAAQ,CAAC,GAAG,WAAW,MAAM,KAAK;AAAA,IAC3H;AAAA,IACA,KAAK,YAAY;AAAA,MACf,MAAM,QAAQ,aAAa,EAAE,MAAM,WAAW,MAAM,MAAM,SAAS,UAAU,KAAK,CAAC;AAAA,MACnF,IAAI,MAAM,SAAS;AAAA,QAAQ,QAAO,EAAE,SAAS,MAAM,2BAA2B,SAAS,+CAA+C,MAAM,QAAQ,CAAC;AAAA,MACrJ,IAAI,CAAC,MAAM,QAAQ,WAAW,IAAI,KAAK,MAAM,KAAK,WAAW,IAAI,EAAE,KAAK,CAAC,YAAqB,OAAO,YAAY,YAAY,QAAQ,SAAS,MAAQ,CAAC,GAAG;AAAA,QACxJ,QAAO,EAAE,SAAS,MAAM,uBAAuB,SAAS,yDAAyD,CAAC;AAAA,MACpH;AAAA,MACA,MAAM,OAAO,WAAW,KAAK,IAAI,CAAC,UAAU,QAAQ,QAAQ,mBAAmB,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,MACpG,OAAO,EAAE,MAAM,IAAI,YAAY,EAAE,OAAO,QAAQ,CAAC,eAAe,kBAAkB,YAAY,EAAE,MAAM,SAAS,GAAG,WAAW,MAAM,KAAK;AAAA,IAC1I;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,SAAS;AAAA,MACZ,MAAM,QAAQ,iBAAiB,EAAE,YAAY,WAAW,YAAY,QAAQ,CAAC;AAAA,MAC7E,IAAI,MAAM,WAAW,SAAS,YAAY,MAAM,WAAW,eAAe,aAAa;AAAA,QACrF,QAAO,EAAE,SAAS,MAAM,2BAA2B,SAAS,GAAG,WAAW,uEAAuE,MAAM,EAAE,OAAO,MAAM,UAAU,EAAE,CAAC;AAAA,MACrL;AAAA,MAEA,OAAO,EAAE,MAAM,GAAG,WAAW,QAAQ,MAAM,SAAS,YAAY,EAAE,MAAM,WAAW,SAAS,WAAW,QAAQ,SAAS,GAAG,WAAW,MAAM,UAAU;AAAA,IACxJ;AAAA,IACA,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,OAAO;AAAA,MACV,MAAM,OAAO,iBAAiB,EAAE,YAAY,WAAW,MAAM,QAAQ,CAAC;AAAA,MACtE,MAAM,OAAO,KAAK,WAAW;AAAA,MAC7B,IAAI,SAAS,SAAS,SAAS,YAAY,SAAS,WAAW,SAAS,WAAW;AAAA,QACjF,QAAO,EAAE,SAAS,MAAM,2BAA2B,SAAS,GAAG,WAAW,wDAAwD,MAAM,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;AAAA,MACrK;AAAA,MACA,MAAM,QAAQ,cAAc,EAAE,SAAS,WAAW,OAAO,MAAM,QAAQ,CAAC;AAAA,MAExE,MAAM,OAAO,QAAQ,QAAQ,SAAS,WAClC,uBAAuB,EAAE,MAAM,KAAK,MAAM,OAAO,MAAM,WAAW,MAAM,KAAK,CAAC,IAC9E,IAAI,KAAK,QAAQ,eAAe,WAAW,SAAS;AAAA,MACxD,OAAO,EAAE,MAAM,YAAY,EAAE,KAAK,GAAG,WAAW,KAAK,UAAU;AAAA,IACjE;AAAA;AAAA;AAIJ,SAAS,aAAa,GAAG,SAAS,MAAM,WAI7B;AAAA,EACT,IAAI,QAAQ,SAAS;AAAA,IAAS,OAAO,cAAc,EAAE,OAAO,SAAS,YAAY,KAAK,YAAY,WAAW,KAAK,WAAW,QAAQ,CAAC;AAAA,EAEtI,MAAM,QAAQ,iBAAiB,EAAE,YAAY,SAAS,QAAQ,CAAC;AAAA,EAC/D,MAAM,WAAW,eAAe,EAAE,YAAY,KAAK,WAAW,CAAC;AAAA,EAC/D,MAAM,YAAY,eAAe,EAAE,YAAY,MAAM,WAAW,CAAC;AAAA,EACjE,IAAI,aAAa,WAAW;AAAA,IAC1B,QAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS,aAAa,KAAK,eAAe,mBAAmB,MAAM,eAAe;AAAA,MAClF,MAAM,EAAE,OAAO,KAAK,WAAW,OAAO,MAAM,WAAW,WAAW,UAAU,WAAW,UAAU;AAAA,IACnG,CAAC;AAAA,EACH;AAAA,EACA,OAAO,MAAM;AAAA;AAIf,SAAS,aAAa,CAAC,QAKZ;AAAA,EACT,QAAQ,YAAY,WAAW,YAAY;AAAA,EAC3C,QAAQ,UAAU,OAAO;AAAA,EACzB,MAAM,OAAO,WAAW;AAAA,EAExB,MAAM,eAAe,CAAC,aACpB,QAAO;AAAA,IACL;AAAA,IACA,MAAM;AAAA,IACN,SAAS,YAAY,kBAAkB,EAAE,KAAK,CAAC,YAAY,mBAAmB,SAAS,EAAE,MAAM,CAAC,MAAM;AAAA,IACtG,MAAM,EAAE,OAAO,WAAW,WAAW,kBAAkB,EAAE,KAAK,CAAC,GAAG,MAAM;AAAA,EAC1E,CAAC;AAAA,EAEH,IAAI,WAAW,IAAI,GAAG;AAAA,IACpB,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO,aAAa,QAAQ,KAAK,gDAAgD;AAAA,IAChH,MAAM,WAAW,QAAQ,MAAM,KAAK,CAAC,UAAU,MAAM,SAAS,KAAK,IAAI;AAAA,IACvE,IAAI,aAAa,aAAa,CAAC,SAAS,OAAO,SAAS,KAAK,GAAG;AAAA,MAC9D,QAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,SAAS,aAAa,oBAAoB,yCAAyC,KAAK,SAAS,SAAS,OAAO,KAAK,IAAI;AAAA,QAC1H,MAAM,EAAE,OAAO,WAAW,MAAM,KAAK,MAAM,OAAO,SAAS,CAAC,GAAG,SAAS,MAAM,EAAE;AAAA,MAClF,CAAC;AAAA,IACH;AAAA,IACA,OAAO,cAAc,EAAE,OAAO,SAAS,UAAU,CAAC;AAAA,EACpD;AAAA,EAEA,QAAQ;AAAA,IACN,KAAK;AAAA,MACH,IAAI,OAAO,UAAU;AAAA,QAAU,OAAO,aAAa,wCAAwC;AAAA,MAC3F,IAAI,WAAW,eAAe,eAAe,CAAC,sBAAqB,EAAE,MAAM,CAAC,GAAG;AAAA,QAC7E,QAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN,SAAS,8BAA8B;AAAA,UACvC,MAAM,EAAE,OAAO,WAAW,MAAM;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,MACA,OAAO,cAAc,EAAE,OAAO,SAAS,UAAU,CAAC;AAAA,IAEpD,KAAK;AAAA,MACH,IAAI,OAAO,UAAU;AAAA,QAAW,OAAO,aAAa,0CAA0C;AAAA,MAC9F,OAAO,QAAQ,QAAQ,QAAQ,eAAe,OAAO,QAAQ,QAAQ,eAAe;AAAA,IAEtF,KAAK;AAAA,MACH,OAAO,eAAe,EAAE,OAAO,WAAW,SAAS,KAAK,WAAW,KAAK,WAAW,OAAO,MAAM,CAAC;AAAA,IAEnG,KAAK;AAAA,MACH,OAAO,eAAe,EAAE,OAAO,WAAW,SAAS,KAAK,WAAW,KAAK,WAAW,OAAO,SAAS,CAAC;AAAA,IAEtG,KAAK,SAAS;AAAA,MACZ,IAAI,OAAO,UAAU;AAAA,QAAU,OAAO,aAAa,+BAA+B;AAAA,MAClF,IAAI,CAAC,OAAO,SAAS,KAAK,GAAG;AAAA,QAC3B,QAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN,SAAS,aAAa,mBAAmB,OAAO,KAAK;AAAA,UACrD,MAAM,EAAE,OAAO,WAAW,OAAO,OAAO,KAAK,EAAE;AAAA,QACjD,CAAC;AAAA,MACH;AAAA,MACA,OAAO,OAAO,KAAK;AAAA,IACrB;AAAA,IAEA,KAAK,WAAW;AAAA,MAKd,IAAI,OAAO,UAAU,UAAU;AAAA,QAC7B,OAAO,aAAa,2GAA0G;AAAA,MAChI;AAAA,MACA,IAAI,CAAC,cAAc,KAAK,KAAK,GAAG;AAAA,QAC9B,QAAO;AAAA,UACL;AAAA,UACA,MAAM;AAAA,UACN,SAAS,aAAa,oBAAoB;AAAA,UAC1C,MAAM,EAAE,OAAO,WAAW,MAAM;AAAA,QAClC,CAAC;AAAA,MACH;AAAA,MACA,OAAO;AAAA,IACT;AAAA,IAEA,KAAK;AAAA,MAMH,QAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,SAAS,4BAA4B;AAAA,QACrC,MAAM,EAAE,OAAO,UAAU;AAAA,MAC3B,CAAC;AAAA,IAEH,KAAK;AAAA,IACL,KAAK;AAAA,MAGH,OAAO,aAAa,GAAG,wCAAwC;AAAA;AAAA;AAIrE,SAAS,cAAc,CAAC,QAOb;AAAA,EACT,QAAQ,OAAO,WAAW,SAAS,KAAK,KAAK,UAAU;AAAA,EAEvD,IAAI;AAAA,EACJ,IAAI,OAAO,UAAU,UAAU;AAAA,IAC7B,IAAI,CAAC,OAAO,cAAc,KAAK,GAAG;AAAA,MAChC,QAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,SAAS,aAAa,mBAAmB,OAAO,KAAK,SAAS;AAAA,QAC9D,MAAM,EAAE,OAAO,WAAW,OAAO,OAAO,KAAK,EAAE;AAAA,MACjD,CAAC;AAAA,IACH;AAAA,IACA,OAAO,OAAO,KAAK;AAAA,EACrB,EAAE,KAAK,IAAI,OAAO,UAAU,UAAU;AAAA,IACpC,IAAI,CAAC,cAAc,KAAK,KAAK,GAAG;AAAA,MAC9B,QAAO;AAAA,QACL;AAAA,QACA,MAAM;AAAA,QACN,SAAS,aAAa,oBAAoB;AAAA,QAC1C,MAAM,EAAE,OAAO,WAAW,MAAM;AAAA,MAClC,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA,EACT,EAAE,KAAK;AAAA,IACL,QAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS,YAAY,gBAAgB,mBAAmB,SAAS,EAAE,MAAM,CAAC,SAAS;AAAA,MACnF,MAAM,EAAE,OAAO,WAAW,MAAM;AAAA,IAClC,CAAC;AAAA;AAAA,EAGH,MAAM,SAAS,OAAO,IAAI;AAAA,EAC1B,IAAI,SAAS,OAAO,SAAS,KAAK;AAAA,IAChC,QAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS,aAAa,mBAAmB,uCAAuC,0BAA0B,YAAO;AAAA,MACjH,MAAM,EAAE,OAAO,WAAW,OAAO,KAAK;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,aAAa,CAAC,QAA8E;AAAA,EACnG,QAAQ,OAAO,SAAS,cAAc;AAAA,EAItC,IAAI,MAAM,SAAS,MAAQ,GAAG;AAAA,IAC5B,QAAO;AAAA,MACL;AAAA,MACA,MAAM;AAAA,MACN,SAAS,aAAa;AAAA,MACtB,MAAM,EAAE,OAAO,UAAU;AAAA,IAC3B,CAAC;AAAA,EACH;AAAA,EACA,OAAO,QAAQ,QAAQ,mBAAmB,EAAE,MAAM,CAAC;AAAA;AAGrD,SAAS,QAAQ,CAAC,QAAoC;AAAA,EACpD,QAAQ,UAAU;AAAA,EAClB,OAAO,OAAO,UAAU,WAAW,cAAc,KAAK,UAAU,KAAK,MAAM,OAAO,OAAO,SAAS,OAAO,KAAK;AAAA;;;ACvjBhH,kCAAS;;;ACAT,sBAAS;AAuBF,SAAS,qBAAqB,GAAG,KAAK,mBAAmB,SAG5B;AAAA,EAClC,MAAM,SAAiC,CAAC;AAAA,EACxC,IAAI,QAAQ;AAAA,EACZ,SAAS,QAAQ,EAAG,QAAQ,IAAI,UAAS;AAAA,IACvC,MAAM,OAAO,IAAI;AAAA,IACjB,IAAI,KAAK,KAAK,IAAI,GAAG;AAAA,MAAE;AAAA,MAAS;AAAA,IAAU;AAAA,IAC1C,IAAK,SAAS,OAAO,IAAI,QAAQ,OAAO,OAAQ,SAAS,KAAK;AAAA,MAC5D,MAAM,MAAM,IAAI,QAAQ;AAAA,GAAM,QAAQ,CAAC;AAAA,MACvC,QAAQ,MAAM,IAAI,IAAI,SAAS,MAAM;AAAA,MACrC;AAAA,IACF;AAAA,IACA,IAAI,SAAS,OAAO,IAAI,QAAQ,OAAO,KAAK;AAAA,MAC1C,MAAM,MAAM,IAAI,QAAQ,MAAM,QAAQ,CAAC;AAAA,MACvC,IAAI,MAAM;AAAA,QAAG,MAAM,YAAY;AAAA,MAC/B,QAAQ,MAAM;AAAA,MACd;AAAA,IACF;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,IAAI,SAAS,OAAO,SAAS,OAAO,SAAS,OAAO,SAAS,KAAK;AAAA,MAChE,MAAM,QAAQ,SAAS,MAAM,MAAM;AAAA,MACnC,IAAI,QAAQ;AAAA,MACZ,IAAI,SAAS;AAAA,MACb;AAAA,MACA,OAAO,QAAQ,IAAI,QAAQ;AAAA,QACzB,MAAM,UAAU,IAAI;AAAA,QACpB,IAAI,oBAAoB,YAAY,SAAS,SAAS,OAAO,SAAS,MAAM;AAAA,UAC1E,IAAI,SAAS,IAAI;AAAA,YAAQ,MAAM,YAAY;AAAA,UAC3C,SAAS,IAAI;AAAA,QACf,EAAE,KAAK,IAAI,YAAY,OAAO;AAAA,UAC5B,IAAI,UAAU,OAAO,IAAI,WAAW,OAAO;AAAA,YAAE,SAAS;AAAA,YAAO;AAAA,UAAS,EACtE,KAAK;AAAA,YAAE,SAAS;AAAA,YAAM;AAAA;AAAA,QACxB,EAAE;AAAA,UAAK,SAAS;AAAA,MAClB;AAAA,MACA,IAAI,CAAC;AAAA,QAAQ,MAAM,YAAY;AAAA,MAC/B,OAAO,KAAK,EAAE,OAAO,MAAM,SAAS,MAAM,YAAY,UAAU,OAAO,KAAK,OAAO,MAAM,CAAC;AAAA,MAC1F;AAAA,IACF;AAAA,IACA,IAAI,kBAAkB,KAAK,IAAI,GAAG;AAAA,MAChC;AAAA,MACA,OAAO,QAAQ,IAAI,UAAU,kBAAkB,KAAK,IAAI,MAAO;AAAA,QAAG;AAAA,MAClE,OAAO,KAAK,EAAE,OAAO,IAAI,MAAM,OAAO,KAAK,GAAG,MAAM,QAAQ,OAAO,KAAK,OAAO,MAAM,CAAC;AAAA,MACtF;AAAA,IACF;AAAA,IACA,IAAI,SAAS,KAAK;AAAA,MAChB;AAAA,MACA,IAAI,QAAQ;AAAA,QAAG,MAAM,YAAY;AAAA,IACnC;AAAA,IACA,OAAO,KAAK,EAAE,OAAO,MAAM,MAAM,UAAU,OAAO,KAAK,EAAE,OAAO,MAAM,CAAC;AAAA,IACvE,IAAI,SAAS;AAAA,MAAK;AAAA,EACpB;AAAA,EACA,IAAI,UAAU;AAAA,IAAG,MAAM,YAAY;AAAA,EACnC,OAAO;AAAA;AAIF,SAAS,oBAAoB,GAAG,KAAK,oBAGnB;AAAA,EACvB,MAAM,SAAS,sBAAsB,EAAE,KAAK,iBAAiB,CAAC;AAAA,EAC9D,MAAM,QAAQ,OAAO,OAAO,CAAC,UAAU,MAAM,UAAU,CAAC;AAAA,EACxD,IAAI,MAAM,IAAI,SAAS,UAAU,MAAM,GAAG,MAAM,YAAY,MAAM;AAAA,IAAU,MAAM,YAAY;AAAA,EAC9F,MAAM,gBAAgB,sBAAsB,KAAK,MAAM,IAAI,SAAS,EAAE,IAAI,IAAI;AAAA,EAC9E,IAAI,MAAM,gBAAgB,SAAS,UAAU,MAAM,eAAe,MAAM,YAAY,MAAM;AAAA,IAAS,MAAM,YAAY;AAAA,EACrH,MAAM,OAAO,MAAM,KAAK,CAAC,UAAU,MAAM,SAAS,YAAY,MAAM,UAAU,GAAG;AAAA,EACjF,IAAI,SAAS;AAAA,IAAW,MAAM,YAAY;AAAA,EAC1C,MAAM,QAAQ,MAAM,KAAK,CAAC,UAAU,MAAM,QAAQ,KAAK,SAAS,MAAM,SAAS,YAAY,MAAM,UAAU,GAAG;AAAA,EAC9G,IAAI,UAAU;AAAA,IAAW,MAAM,YAAY;AAAA,EAC3C,MAAM,aAAa,OAAO,OAAO,CAAC,UAAU,MAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,UAAU,KAAK,MAAM,SAAS,YAAY,MAAM,UAAU,GAAG;AAAA,EACxK,MAAM,UAAoB,CAAC;AAAA,EAC3B,IAAI,QAAQ,KAAK;AAAA,EACjB,WAAW,aAAa,CAAC,GAAG,YAAY,KAAK,GAAG;AAAA,IAC9C,MAAM,SAAS,IAAI,MAAM,OAAO,UAAU,KAAK,EAAE,KAAK;AAAA,IACtD,IAAI,OAAO,WAAW;AAAA,MAAG,MAAM,YAAY;AAAA,IAC3C,QAAQ,KAAK,MAAM;AAAA,IACnB,QAAQ,UAAU;AAAA,EACpB;AAAA,EACA,OAAO,EAAE,SAAS,QAAQ,IAAI,MAAM,MAAM,GAAG,EAAE;AAAA;AAGjD,SAAS,WAAW,GAAc;AAAA,EAChC,OAAO,IAAI,WAAU,EAAE,MAAM,kBAAkB,SAAS,oCAAoC,MAAM,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AAAA;AAOzI,SAAS,kBAAkB,GAAG,KAAK,kBAAkB,QAAQ,SAIlC;AAAA,EAChC,MAAM,UAAgC,CAAC;AAAA,EACvC,WAAW,QAAQ,qBAAqB,EAAE,KAAK,iBAAiB,CAAC,EAAE,SAAS;AAAA,IAC1E,MAAM,QAAQ,sBAAsB,EAAE,KAAK,MAAM,iBAAiB,CAAC,EAAE;AAAA,IACrE,IAAI,UAAU,aAAa,MAAM,SAAS;AAAA,MAAU,MAAM,YAAY;AAAA,IACtE,IAAI,MAAM,SAAS,UAAU,+CAA+C,KAAK,MAAM,KAAK;AAAA,MAAG;AAAA,IAC/F,IAAI,SAAS,MAAM,SAAS,UAAU,kCAAkC,KAAK,MAAM,KAAK;AAAA,MAAG;AAAA,IAC3F,QAAQ,KAAK,EAAE,MAAM,MAAM,OAAO,KAAK,KAAK,CAAC;AAAA,EAC/C;AAAA,EACA,OAAO;AAAA;AAIF,SAAS,mBAAmB,GAAG,OAAgE;AAAA,EACpG,OAAO,mBAAmB,EAAE,IAAI,CAAC;AAAA;;;AC5H5B,SAAS,mBAAmB,GAAG,KAAK,MAAM,OAAO,QAAQ,UAAU,OAAO,gBAAgB,WAOtD;AAAA,EACzC,MAAM,SAAS,OAAO,OAAO,CAAC,UAAU,MAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,UAAU,KAAK,QAAQ,KAAK,MAAM,SAAS,YAAY,MAAM,UAAU,GAAG;AAAA,EACjL,MAAM,OAA0B,CAAC;AAAA,EACjC,IAAI,QAAQ,KAAK;AAAA,EACjB,WAAW,aAAa,CAAC,GAAG,QAAQ,KAAK,GAAG;AAAA,IAC1C,MAAM,aAAa,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,SAAS,MAAM,OAAO,UAAU,KAAK;AAAA,IAChG,IAAI,WAAW,WAAW;AAAA,MAAG;AAAA,IAC7B,MAAM,OAAO,WAAW,GAAG,EAAE;AAAA,IAC7B,MAAM,SAAS,KAAK,UAAU,KAAK,QAAQ,KAAK,KAAK,SAAS,UAAU,gBAAgB,KAAK,KAAK,KAAK;AAAA,IACvG,MAAM,OAAO,UAAU,UAAU,KAAK,KAAK,KAAK;AAAA,IAChD,MAAM,aAAa,SAAS,WAAW,MAAM,GAAG,EAAE,IAAI;AAAA,IACtD,MAAM,QAAQ,WAAW;AAAA,IACzB,MAAM,MAAM,WAAW,GAAG,EAAE;AAAA,IAC5B,IAAI,UAAU,aAAa,QAAQ;AAAA,MAAW;AAAA,IAC9C,IAAI,WAAW,WAAW,MAAM,MAAM,SAAS,UAAU,MAAM,SAAS,WAAW;AAAA,MACjF,KAAK,KAAK,EAAE,MAAM,SAAS,MAAM,MAAM,OAAO,KAAK,CAAC;AAAA,IACtD,EAAE,KAAK;AAAA,MACL,MAAM,MAAM,WAAW,OAAO,CAAC,UAAU,MAAM,UAAU,KAAK,QAAQ,CAAC;AAAA,MAEvE,IAAI,IAAI,KAAK,CAAC,UAAU,MAAM,SAAS,UAAU,qBAAqB,KAAK,MAAM,KAAK,CAAC;AAAA,QAAG;AAAA,MAC1F,IAAI,MAAM,SAAS,YAAY,MAAM,UAAU,OAAO,IAAI,SAAS,YAAY,IAAI,UAAU,OAAO,IAAI,UAAU,MAAM,OAAO;AAAA,QAC7H,IAAI,IAAI,WAAW;AAAA,UAAG;AAAA,QACtB,MAAM,OAAO,IAAI,MAAM,gBAAgB,MAAM,MAAM,OAAO,gBAAgB,IAAI,QAAQ,SAAS,KAAK,QAAQ,UAAU,KAAK,EAAE,KAAK;AAAA,QAClI,IAAI,CAAC;AAAA,UAAM;AAAA,QACX,KAAK,KAAK,EAAE,MAAM,cAAc,MAAM,KAAK,CAAC;AAAA,MAC9C,EAAE,KAAK;AAAA,QACL,IAAI;AAAA,UAAS;AAAA,QACb,MAAM,OAAO,IAAI,MAAM,OAAO,SAAS,KAAK,QAAQ,UAAU,KAAK,EAAE,KAAK;AAAA,QAC1E,IAAI,CAAC,QAAQ,WAAW,KAAK,CAAC,UAAU,MAAM,UAAU,KAAK,QAAQ,KAAK,MAAM,SAAS,UAAU,gBAAgB,KAAK,MAAM,KAAK,CAAC;AAAA,UAAG;AAAA,QACvI,KAAK,KAAK,EAAE,MAAM,cAAc,MAAM,KAAK,CAAC;AAAA;AAAA;AAAA,IAGhD,QAAQ,UAAU;AAAA,EACpB;AAAA,EACA,OAAO,KAAK,WAAW,IAAI,YAAY;AAAA;AAOlC,SAAS,0BAA0B,GAAG,YAAY,OAAO,WAAW,OAAO,YAMvC;AAAA,EACzC,MAAM,SAAS,sBAAsB,EAAE,KAAK,WAAW,CAAC;AAAA,EACxD,MAAM,MAAM,OAAO,OAAO,CAAC,UAAU,MAAM,UAAU,CAAC;AAAA,EACtD,IAAI,WAAW;AAAA,EACf,MAAM,OAAO,GAAG,YAAiD;AAAA,IAC/D,MAAM,QAAQ,IAAI;AAAA,IAClB,IAAI,OAAO,SAAS,UAAU,MAAM,MAAM,YAAY,MAAM;AAAA,MAAO,OAAO;AAAA,IAC1E;AAAA,IACA,OAAO;AAAA;AAAA,EAET,IAAI,CAAC,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,IAAG;AAAA,EAChC,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,EACxB,IAAI,CAAC,KAAK,EAAE,OAAO,QAAQ,CAAC;AAAA,IAAG;AAAA,EAC/B,IAAI,KAAK,EAAE,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,SAAS,CAAC;AAAA,IAAI;AAAA,EACtF,IAAI,OAAO,IAAI;AAAA,EACf,IAAI,IAAI,WAAW,UAAU,KAAK;AAAA,IAAE;AAAA,IAAY,OAAO,IAAI;AAAA,EAAa;AAAA,EACxE,IAAI,SAAS,aAAa,CAAC,CAAC,UAAU,MAAM,EAAE,SAAS,KAAK,IAAI,KAAK,KAAK,UAAU,SAAS,CAAC,KAAK,EAAE,OAAO,KAAK,CAAC;AAAA,IAAG;AAAA,EACrH,MAAM,QAAQ,IAAI;AAAA,EAClB,IAAI,UAAU,aAAa,CAAC,CAAC,UAAU,MAAM,EAAE,SAAS,MAAM,IAAI;AAAA,IAAG;AAAA,EACrE,IAAI,IAAI,WAAW,UAAU,KAAK;AAAA,IAAE;AAAA,IAAY,IAAI,IAAI,gBAAgB;AAAA,MAAW;AAAA,EAAkB;AAAA,EACrG,IAAI,KAAK,EAAE,OAAO,QAAQ,CAAC,GAAG;AAAA,IAC5B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,OAAO,QAAQ,CAAC;AAAA,MAAG;AAAA,EAC9C;AAAA,EACA,MAAM,OAAO,IAAI;AAAA,EACjB,MAAM,QAAQ,IAAI;AAAA,EAClB,IAAI,MAAM,SAAS,YAAY,KAAK,UAAU,OAAO,OAAO,SAAS,YAAY,MAAM,UAAU;AAAA,IAAK;AAAA,EAGtG,IAAI,gBAAgB;AAAA,EACpB,IAAI,YAAY,KAAK,EAAE,OAAO,UAAU,CAAC,GAAG;AAAA,IAC1C,MAAM,cAAc,IAAI;AAAA,IACxB,MAAM,eAAe,IAAI;AAAA,IACzB,IAAI,aAAa,SAAS,YAAY,YAAY,UAAU,OAAO,cAAc,SAAS,YAAY,aAAa,UAAU;AAAA,MAAK;AAAA,IAClI,gBAAgB,IAAI,OAAO,OAAO,CAAC,UAAU,MAAM,QAAQ,YAAY,SAAS,MAAM,QAAQ,aAAa,SAAS,MAAM,UAAU,KAAK,MAAM,UAAU,GAAG,EAAE;AAAA,EAChK;AAAA,EACA,IAAI,mBAAmB,YAAY;AAAA,IAAI;AAAA,EACvC,IAAI,YAAY,KAAK,EAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,WAAW,CAAC;AAAA,IAAI;AAAA,EACvG,MAAM,OAAO,IAAI;AAAA,EACjB,IAAI,SAAS,aAAa,EAAE,KAAK,SAAS,UAAU,KAAK,MAAM,YAAY,MAAM,YAAY,EAAE,KAAK,UAAU,OAAO,aAAa,IAAI,SAAS;AAAA,IAAI;AAAA,EACnJ,MAAM,OAAO,oBAAoB,EAAE,KAAK,YAAY,MAAM,OAAO,QAAQ,eAAe,SAAS,CAAC;AAAA,EAClG,IAAI,YAAY,SAAS,WAAW;AAAA,IAClC,MAAM,aAAa,OAAO,OAAO,CAAC,UAAU,MAAM,QAAQ,KAAK,SAAS,MAAM,QAAQ,MAAM,SAAS,MAAM,UAAU,KAAK,MAAM,UAAU,GAAG;AAAA,IAC7I,IAAI,QAAQ,KAAK;AAAA,IACjB,WAAW,aAAa,CAAC,GAAG,YAAY,KAAK,GAAG;AAAA,MAC9C,MAAM,SAAS,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,SAAS,MAAM,OAAO,UAAU,SAAS,MAAM,UAAU,CAAC;AAAA,MACjH,IAAI,OAAO,SAAS,MAAM,OAAO,IAAI,SAAS,UAAU,OAAO,IAAI,SAAS,cAAc,OAAO,IAAI,SAAS,YAAY,OAAO,IAAI,SAAS,UAAU,CAAC,gBAAgB,KAAK,OAAO,GAAG,KAAK;AAAA,QAAI;AAAA,MACjM,QAAQ,UAAU;AAAA,IACpB;AAAA,IAEA,MAAM,SAAS,OAAO,OAAO,CAAC,UAAU,MAAM,SAAS,KAAK,OAAO,MAAM,OAAO,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,IAChH,IAAI,OAAO,KAAK,CAAC,OAAO,YAAY,OAAO,UAAU,IAAI,UAAU,QAAQ,MAAM,SAAS,YAAY,MAAM,SAAS,UAAU,CAAC,gBAAgB,KAAK,MAAM,KAAK,EAAE;AAAA,MAAG;AAAA,EACvK;AAAA,EACA,OAAO;AAAA;AAOF,SAAS,sBAAsB,GAAG,YAAY,SAGV;AAAA,EACzC,OAAO,2BAA2B,EAAE,YAAY,MAAM,CAAC;AAAA;;;AFlHlD,SAAS,wBAAwB,GAAG,YAAY,OAAO,YAKnB;AAAA,EACzC,OAAO,2BAA2B,EAAE,YAAY,OAAO,UAAU,SAAU,aAAa,YAAY,CAAC,IAAI,EAAE,SAAS,EAAG,CAAC;AAAA;AAOnH,SAAS,kCAAkC,MAAM,UAAgE;AAAA,EACtH,QAAQ,SAAS,WAAW,UAAU;AAAA,EACtC,IAAI,cAAc;AAAA,IAAW,OAAO,CAAC,EAAE,MAAM,+JAA+J,QAAQ,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA,EAC3O,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA,EACtD,IAAI,cAAc;AAAA,IAAQ,OAAO,CAAC,wBAAwB,EAAE,SAAS,OAAO,EAAE,WAAW,WAAW,MAAM,MAAM,MAAM,GAAG,oBAAoB,KAAK,CAAC,CAAC;AAAA,EACpJ,IAAI,cAAc;AAAA,IAAQ,OAAO,CAAC,EAAE,MAAM,sBAAsB,SAAS,QAAQ,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA,EACxG,IAAI,cAAc,SAAS;AAAA,IACzB,IAAI,OAAO,UAAU;AAAA,MAAW,MAAM,uBAAsB,EAAE,SAAS,YAAY,SAAS,6BAA6B,CAAC;AAAA,IAC1H,OAAO,CAAC,EAAE,MAAM,qBAAqB,eAAe,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,UAAU,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,KAAK,CAAC,wGAAwG,QAAQ,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA,EACnS;AAAA,EACA,IAAI,OAAO,SAAS;AAAA,IAAW,MAAM,uBAAsB,EAAE,SAAS,YAAY,SAAS,2BAA2B,CAAC;AAAA,EACvH,IAAI,OAAO,qBAAqB,QAAQ,OAAO,WAAW;AAAA,IAAM,MAAM,uBAAsB,EAAE,SAAS,YAAY,SAAS,4BAA4B,CAAC;AAAA,EACzJ,MAAM,OAAO,gBAAgB,EAAE,SAAS,MAAM,OAAO,MAAM,QAAQ,OAAO,WAAW,KAAK,CAAC;AAAA,EAC3F,OAAO,CAAC,EAAE,MAAM,UAAU,OAAO,SAAS,YAAY,WAAW,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAM,CAAC,gBAAgB,UAAU,KAAK,KAAK,IAAI,KAAK,OAAO,mBAAmB,wBAAwB,KAAK,OAAO,UAAU,YAAY,KAAK,UAAU,OAAO,WAAW,QAAQ,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA;;;AGrC5S,mFAA0D;;;ACA1D,sBAAS,sCAAW;;;ACApB,sBAAS;AAQF,SAAS,iCAAiC,GAAG,aAEzC;AAAA,EACT,OAAO,wBAAwB,UAAU;AAAA;AAG3C,SAAS,YAAW,GAAG,UAAkD;AAAA,EACvE,OAAO,IAAI,WAAU,EAAE,MAAM,kBAAkB,SAAS,mDAAmD,WAAW,MAAM,EAAE,QAAQ,oCAAoC,OAAO,EAAE,CAAC;AAAA;AAO/K,SAAS,+BAA+B,GAAG,YAAY,QAAQ,mBAAmB,OAAO,QAAQ,SAK/D;AAAA,EACvC,MAAM,UAAU,mBAAmB,EAAE,KAAK,YAAY,kBAAkB,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,OAAO,SAAS,MAAM;AAAA,EAC1H,IAAI,QAAQ,WAAW;AAAA,IAAG,MAAM,aAAY,EAAE,OAAO,CAAC;AAAA,EACtD,MAAM,YAAY,QAAQ,GAAI;AAAA,EAC9B,MAAM,SAAS,sBAAsB,EAAE,KAAK,WAAW,iBAAiB,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,UAAU,CAAC;AAAA,EAC9G,MAAM,OAAO,OAAO;AAAA,EACpB,IAAI;AAAA,EACJ,SAAS,QAAQ,EAAG,QAAQ,OAAO,QAAQ,SAAS;AAAA,IAClD,MAAM,QAAQ,OAAO;AAAA,IACrB,IAAI,MAAM,SAAS,UAAU,MAAM,MAAM,YAAY,MAAM;AAAA,MAAM;AAAA,IACjE,MAAM,OAAO,OAAO,QAAQ;AAAA,IAC5B,MAAM,QAAQ,OAAO,QAAQ;AAAA,IAC7B,IAAI,MAAM,SAAS,YAAY,KAAK,UAAU,OAAO,OAAO,SAAS,YAAY,MAAM,UAAU;AAAA,MAAK,MAAM,aAAY,EAAE,OAAO,CAAC;AAAA,IAClI,IAAI,WAAW;AAAA,MAAW,MAAM,aAAY,EAAE,OAAO,CAAC;AAAA,IACtD,MAAM,aAAa,UAAU,MAAM,KAAK,KAAK,MAAM,KAAK,EAAE,KAAK;AAAA,IAC/D,IAAI,WAAW,WAAW,KAAK,WAAW,SAAS,MAAI;AAAA,MAAG,MAAM,aAAY,EAAE,OAAO,CAAC;AAAA,IACtF,MAAM,YAAY,OAAO,QAAQ;AAAA,IACjC,MAAM,YAAY,WAAW,SAAS,UAAU,UAAU,MAAM,YAAY,MAAM,WAAW,OAAO,QAAQ,KAAK;AAAA,IACjH,MAAM,WAAW,WAAW,SAAS,UAAU,UAAU,MAAM,YAAY,MAAM;AAAA,IACjF,IAAI,WAAW,SAAS,UAAU,UAAU,MAAM,YAAY,MAAM,YAAY,CAAC;AAAA,MAAU,MAAM,aAAY,EAAE,OAAO,CAAC;AAAA,IACvH,MAAM,OAAO,OAAO,QAAQ;AAAA,IAC5B,MAAM,UAAU,MAAM,SAAS,UAAU,KAAK,MAAM,YAAY,MAAM,WAAW,WAAW;AAAA,IAC5F,SAAS,EAAE,YAAY,SAAS,WAAW,SAAS,UAAU,MAAM,KAAK,KAAK,WAAW,UAAU,QAAQ,MAAM,KAAK,EAAE,KAAK,EAAE;AAAA,IAC/H,SAAS;AAAA,EACX;AAAA,EACA,IAAI,WAAW,aAAa,OAAO,KAAK,CAAC,OAAO,UAAU,MAAM,SAAS,UAAU,MAAM,MAAM,YAAY,MAAM,eAAe,OAAO,QAAQ,IAAI,SAAS,UAAU,OAAO,QAAQ,IAAI,MAAM,YAAY,MAAM,QAAQ;AAAA,IAAG,MAAM,aAAY,EAAE,OAAO,CAAC;AAAA,EACxP,OAAO;AAAA;AAIF,SAAS,4BAA4B,GAAG,YAAY,UAGlB;AAAA,EACvC,OAAO,gCAAgC,EAAE,YAAY,OAAO,CAAC;AAAA;;;ADjDxD,SAAS,gCAAgC,GAAG,aAExC;AAAA,EACT,OAAO,wBAAwB,UAAU;AAAA;AAYpC,SAAS,+BAA+B,GAAG,SAAS,SAGzC;AAAA,EAChB,IAAI,QAAQ,SAAS;AAAA,IAAS,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,gCAAgC,CAAC;AAAA,EAC7H,IAAI,MAAM,cAAc;AAAA,IAAW,OAAO,EAAE,MAAM,wCAAwC,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA,EACxH,MAAM,IAAI,GAAG,WAA8C,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACtF,MAAM,OAAO,EAAE,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA,EACpC,IAAI;AAAA,EACJ,QAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,MAAS,OAAO,0BAA0B,aAAa,EAAE,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,MAAM,MAAM,KAAK,CAAC;AAAA,MAAK;AAAA,IACnI,KAAK;AAAA,MAAQ,OAAO,qBAAqB,MAAM,UAAU,YAAY,OAAO,GAAG,EAAE,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,MAAM,MAAM,KAAK,CAAC;AAAA,MAAO;AAAA,IACxJ,KAAK;AAAA,MAAQ,OAAO,wBAAwB;AAAA,MAAQ;AAAA,IACpD,KAAK,UAAU;AAAA,MACb,MAAM,QAAQ,qBAAqB,EAAE,KAAK,MAAM,YAAY,kBAAkB,MAAM,iBAAiB,CAAC;AAAA,MACtG,MAAM,UAAU,mBAAmB,EAAE,KAAK,MAAM,YAAY,kBAAkB,MAAM,kBAAkB,OAAO,KAAK,CAAC;AAAA,MACnH,MAAM,UAAU,QAAQ,OAAO,CAAC,WAAW,OAAO,SAAS,MAAM,MAAM;AAAA,MACvE,IAAI,QAAQ,SAAS;AAAA,QAAG,MAAM,aAAY,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,MAClE,MAAM,mBAAmB,4BAA4B,EAAE,YAAY,gBAAgB,SAAS,MAAM,qBAAqB,QAAQ,MAAM,QAAQ,kBAAkB,MAAM,iBAAiB,CAAC;AAAA,MACvL,IAAI,kBAAkB,YAAY;AAAA,QAAU,MAAM,aAAY,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,MACtF,MAAM,UAAU,CAAC,GAAG,MAAM,OAAO;AAAA,MACjC,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,QAAQ,QAAQ,QAAQ,QAAQ,GAAI,GAAG,KAAK,MAAM;AAAA,MACpD,EAAE,KAAK,IAAI,MAAM,UAAU,WAAW;AAAA,QACpC,MAAM,QAAQ,QAAQ,OAAO,CAAC,WAAW,OAAO,SAAS,MAAM,KAAK;AAAA,QACpE,IAAI,MAAM,WAAW;AAAA,UAAG,MAAM,aAAY,EAAE,QAAQ,MAAM,MAAM,CAAC;AAAA,QACjE,QAAQ,OAAO,QAAQ,QAAQ,MAAM,GAAI,GAAG,IAAI,GAAG,GAAG,MAAM,gBAAgB;AAAA,MAC9E,EAAE,KAAK;AAAA,QACL,MAAM,OAAO,QAAQ,GAAG,EAAE;AAAA,QAC1B,IAAI,SAAS;AAAA,UAAW,MAAM,aAAY,EAAE,QAAQ,MAAM,OAAO,CAAC;AAAA,QAClE,QAAQ,OAAO,QAAQ,QAAQ,KAAK,GAAG,IAAI,GAAG,GAAG,MAAM,gBAAgB;AAAA;AAAA,MAEzE,OAAO,0BAA0B;AAAA,EAAW,QAAQ,KAAK;AAAA,CAAK;AAAA,GAAO,MAAM;AAAA,MAC3E;AAAA,IACF;AAAA;AAAA,EAEF,OAAO,EAAE,MAAM,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAG/C,SAAS,YAAW,GAAG,UAAkD;AAAA,EACvE,OAAO,IAAI,YAAU,EAAE,MAAM,kBAAkB,SAAS,2DAA2D,WAAW,MAAM,EAAE,QAAQ,oCAAoC,OAAO,EAAE,CAAC;AAAA;AAIvL,SAAS,2BAA2B,GAAG,YAAY,QAAQ,oBAIzB;AAAA,EACvC,OAAO,gCAAgC,EAAE,YAAY,QAAQ,kBAAkB,OAAO,KAAK,CAAC;AAAA;;;AD7DvF,SAAS,0BAA0B,GAAG,OAAO,SAI3C;AAAA,EACP,MAAM,QAAQ,mBAAmB,EAAE,OAAO,MAAM,CAAC;AAAA,EACjD,IAAI,MAAM,SAAS;AAAA,IAAW,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,MAAM,SAAS,MAAM,GAAG,MAAM,QAAQ,MAAM,+IAA+I,CAAC;AAAA,EACnR,IAAI,MAAM,SAAS,WAAW,MAAM,QAAQ,4BAA4B;AAAA,IAAO,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,2BAA2B,MAAM,gCAAgC,MAAM,6CAA6C,4BAA4B,uEAAuE,CAAC;AAAA;AAO3V,SAAS,qBAAqB,GAAG,YAAY,OAAO,oBAIhB;AAAA,EACzC,MAAM,WAAW,qBAAqB,EAAE,KAAK,YAAY,iBAAiB,CAAC,EAAE,QAAQ,QAAQ,CAAC,QAAQ;AAAA,IACpG,MAAM,SAAS,sBAAsB,EAAE,KAAK,iBAAiB,CAAC;AAAA,IAC9D,MAAM,MAAM,OAAO,OAAO,CAAC,UAAU,MAAM,UAAU,CAAC;AAAA,IACtD,IAAI,WAAW,IAAI,IAAI,SAAS,UAAU,IAAI,GAAG,MAAM,YAAY,MAAM,WAAW,IAAI;AAAA,IACxF,MAAM,MAAM,IAAI;AAAA,IAChB,IAAI,KAAK,SAAS,UAAU,CAAC,iBAAiB,KAAK,IAAI,KAAK;AAAA,MAAG,OAAO,CAAC;AAAA,IACvE,MAAM,OAAO,IAAI;AAAA,IACjB,IAAI,SAAS,aAAa,CAAC,CAAC,QAAQ,QAAQ,EAAE,SAAS,KAAK,IAAI,KAAK,KAAK,UAAU;AAAA,MAAO,OAAO,CAAC;AAAA,IACnG,IAAI,IAAI,WAAW,SAAS,UAAU,IAAI,WAAW,MAAM,YAAY,MAAM,SAAS;AAAA,MACpF;AAAA,MACA,IAAI,IAAI,aAAa,MAAM,YAAY,MAAM;AAAA,QAAS,OAAO,CAAC,EAAE,KAAK,QAAQ,MAAM,WAAW,OAAO,UAAU,CAAC;AAAA,IAClH;AAAA,IACA,MAAM,OAAO,IAAI;AAAA,IACjB,MAAM,QAAQ,IAAI;AAAA,IAClB,MAAM,OAAO,IAAI,MAAM,QAAQ;AAAA,IAC/B,MAAM,YAAY,KAAK,WAAW,KAAK,KAAK,WAAW,KAAK,KAAK,IAAI,MAAM,YAAY,MAAM,aAAa,KAAK,WAAW,KAAK,KAAK,IAAI,MAAM,YAAY,MAAM,WAAW,KAAK,IAAI,MAAM,YAAY,MAAM;AAAA,IAC5M,OAAO,CAAC,EAAE,KAAK,QAAQ,MAAM,aAAa,MAAM,UAAU,MAAM,OAAO,WAAW,OAAO,OAAO,UAAU,MAAM,QAAQ,UAAU,CAAC;AAAA,GACpI;AAAA,EACD,IAAI,SAAS,WAAW;AAAA,IAAG;AAAA,EAC3B,MAAM,SAAS,SAAS;AAAA,EACxB,IAAI,OAAO,SAAS,aAAa,OAAO,UAAU;AAAA,IAAW;AAAA,EAC7D,OAAO,oBAAoB,KAAK,QAAQ,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,SAAS,KAAK,CAAC;AAAA;AAO1F,SAAS,+BAA+B,MAAM,UAAgE;AAAA,EACnH,QAAQ,SAAS,OAAO,cAAc;AAAA,EACtC,IAAI,cAAc;AAAA,IAAW,OAAO,CAAC,EAAE,MAAM,+JAA+J,QAAQ,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA,EAC3O,IAAI,cAAc,SAAS;AAAA,IACzB,IAAI,OAAO,UAAU;AAAA,MAAW,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,6BAA6B,CAAC;AAAA,IACvH,OAAO,CAAC,gCAAgC,EAAE,SAAS,OAAO,EAAE,WAAW,SAAS,OAAO,MAAM,OAAO,OAAO,OAAO,MAAM,EAAE,CAAC,CAAC;AAAA,EAC9H;AAAA,EACA,IAAI,cAAc,UAAU,cAAc;AAAA,IAAQ,OAAO,CAAC,gCAAgC,EAAE,SAAS,OAAO,EAAE,WAAW,OAAO,MAAM,MAAM,EAAE,CAAC,CAAC;AAAA,EAChJ,IAAI,OAAO,eAAe,aAAa,OAAO,SAAS;AAAA,IAAW,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,iCAAiC,CAAC;AAAA,EAC7J,IAAI,OAAO,UAAU,aAAa,OAAO,qBAAqB;AAAA,IAAM,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,2CAA2C,CAAC;AAAA,EACzK,IAAI,OAAO,qBAAqB;AAAA,IAAW,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,+BAA+B,MAAM,4EAA4E,CAAC;AAAA,EACtN,MAAM,QAAQ,qBAAqB,EAAE,KAAK,OAAO,YAAY,kBAAkB,OAAO,iBAAiB,CAAC;AAAA,EACxG,MAAM,UAAU,MAAM,QAAQ,OAAO,CAAC,QAAQ;AAAA,IAC5C,MAAM,MAAM,sBAAsB,EAAE,KAAK,kBAAkB,OAAO,iBAAiB,CAAC,EAAE,OAAO,CAAC,UAAU,MAAM,UAAU,CAAC;AAAA,IACzH,MAAM,WAAW,IAAI,IAAI,SAAS,UAAU,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI;AAAA,IACjF,OAAO,EAAE,IAAI,WAAW,SAAS,UAAU,iBAAiB,KAAK,IAAI,UAAW,KAAK,KAAK,IAAI,WAAW,IAAI,UAAU,MAAM;AAAA,GAC9H;AAAA,EACD,MAAM,OAAO,gBAAgB,EAAE,SAAS,MAAM,OAAO,MAAM,QAAQ,OAAO,WAAW,KAAK,CAAC;AAAA,EAC3F,QAAQ,KAAK,GAAG,OAAO,SAAS,YAAY,SAAS,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAM,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI;AAAA,EACrH,OAAO,CAAC,EAAE,MAAM,0BAA0B,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA,EAAQ,QAAQ,KAAK;AAAA,CAAK;AAAA,GAAO,MAAM,UAAU,QAAQ,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA;;;ALlD7J,SAAS,gBAAgB,GAAG,OAAO,OAAO,SAAS,QAAQ,CAAC,GAAG,QAMvC;AAAA,EAC7B,MAAM,WAAW,kBAAkB,EAAE,MAAM,CAAC;AAAA,EAC5C,IAAI;AAAA,IAAU,sBAAsB,EAAE,OAAO,MAAM,CAAC;AAAA,EACpD,MAAM,QAAQ,cAAc,EAAE,MAAM,CAAC;AAAA,EACrC,IAAI,YAAY,MAAM,UAAU,aAAa,CAAC,QAAQ,aAAa;AAAA,IAAgB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,iBAAiB,CAAC;AAAA,EACnK,IAAI,YAAY,MAAM,qBAAqB,QAAQ,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,mBAAmB,CAAC;AAAA,EAClK,IAAI,YAAY,CAAC,QAAQ,aAAa;AAAA,IAAmB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,oBAAoB,CAAC;AAAA,EAC5I,IAAI,aAAa,MAAM,OAAO,WAAW,KAAK,CAAC,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,OAAO;AAAA,IAAI,MAAM,SAAQ,EAAE,MAAM,QAAQ,yBAAyB,CAAC;AAAA,EACrJ,IAAI,MAAM,WAAW;AAAA,IAAG,MAAM,SAAQ,EAAE,MAAM,QAAQ,mBAAmB,CAAC;AAAA,EAC1E,IAAI,aAAa,MAAM,eAAe,aAAa,MAAM,mBAAmB;AAAA,IAAY,MAAM,SAAQ,EAAE,MAAM,QAAQ,4BAA4B,CAAC;AAAA,EACnJ,IAAI,aAAa,MAAM,SAAS,WAAW,MAAM,SAAS,YAAY,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,WAAW,KAAK,MAAM,kBAAkB,SAAS;AAAA,IAAI,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,iCAAiC,CAAC;AAAA,EAC9P,MAAM,OAAO,MAAM,IAAI,CAAC,SAA0B;AAAA,IAChD,IAAI,KAAK,SAAS,SAAS;AAAA,MACzB,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,cAAc,UAAU,SAAS,KAAK,MAAM,IAAI;AAAA,MACjF,IAAI,UAAU;AAAA,QAAW,MAAM,SAAQ,EAAE,MAAM,QAAQ,sBAAsB,CAAC;AAAA,MAC9E,OAAO,EAAE,MAAM,SAAS,MAAM,MAAM,UAAU,MAAM,MAAM,MAAM,KAAK,MAAM,SAAS,WAAY,QAAQ,SAAS,YAAY,MAAM,SAAS,YAAY,EAAE,SAAS,KAAK,IAAI,CAAC,MAAQ,KAAK,MAAM,kBAAkB,YAAY,CAAC,IAAI,EAAE,eAAe,KAAK,MAAM,cAAc,EAAG;AAAA,IAClR;AAAA,IACA,IAAI,KAAK,SAAS,OAAO;AAAA,MACvB,IAAI,MAAM,SAAS,aAAa,OAAO,KAAK,QAAQ,YAAY,CAAC,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,SAAS,MAAI;AAAA,QAAG,MAAM,SAAQ,EAAE,MAAM,QAAQ,uBAAuB,CAAC;AAAA,MACnK,OAAO,EAAE,MAAM,cAAc,MAAM,KAAK,KAAK,MAAM,KAAK,SAAS,OAAO;AAAA,IAC1E;AAAA,IACA,MAAM,WAAW,uBAAuB,EAAE,YAAY,KAAK,YAAY,OAAO,SAAS,OAAO,OAAO,mBAAmB,KAAK,CAAC;AAAA,IAC9H,IAAI,CAAC,CAAC,SAAS,SAAS,OAAO,OAAO,KAAK,EAAE,SAAS,KAAK,WAAW,IAAI;AAAA,MAAG,MAAM,SAAQ,EAAE,MAAM,QAAQ,wBAAwB,CAAC;AAAA,IACpI,IAAI,SAAS,WAAW,eAAe,aAAa,OAAO,SAAS,WAAW,SAAS,YAAY,CAAC,CAAC,UAAU,OAAO,UAAU,SAAS,SAAS,EAAE,SAAS,SAAS,WAAW,IAAI;AAAA,MAAG,MAAM,SAAQ,EAAE,MAAM,QAAQ,0BAA0B,CAAC;AAAA,IAClP,OAAO,EAAE,MAAM,cAAc,MAAM,SAAS,MAAM,MAAM,KAAK,SAAS,OAAO;AAAA,GAC9E;AAAA,EACD,IAAI,YAAY,QAAQ,SAAS;AAAA,IAAS,2BAA2B,EAAE,SAAS,OAAO,MAAM,CAAC;AAAA,EAC9F,OAAO;AAAA;AAIF,SAAS,eAAe,GAAG,SAAS,MAAM,UAI3B;AAAA,EACpB,IAAI,KAAK,WAAW;AAAA,IAAG,MAAM,SAAQ,EAAE,MAAM,SAAS,QAAQ,mBAAmB,CAAC;AAAA,EAClF,MAAM,WAAW,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,YAAY;AAAA,EAC7D,IAAI,YAAY,CAAC,QAAQ,aAAa;AAAA,IAAmB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,oBAAoB,CAAC;AAAA,EAC5I,IAAI,YAAY,KAAK,KAAK,CAAC,QAAQ,IAAI,SAAS,WAAW,IAAI,kBAAkB,SAAS;AAAA,IAAG,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,iCAAiC,CAAC;AAAA,EAC7L,OAAO,KAAK,IAAI,CAAC,QAAQ;AAAA,IACvB,IAAI,IAAI,SAAS,SAAS;AAAA,MACxB,IAAI,QAAQ,SAAS,YAAY,IAAI,YAAY;AAAA,QAAM,OAAO,QAAQ,QAAQ,WAAW,EAAE,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,OAAO,UAAU;AAAA,MAC7I,OAAO,mBAAmB,EAAE,SAAS,SAAS,CAAC,GAAG,GAAG,OAAO,CAAC,EAAE;AAAA,IACjE;AAAA,IACA,IAAI,CAAC,IAAI,KAAK,KAAK,KAAK,IAAI,KAAK,SAAS,MAAI;AAAA,MAAG,MAAM,SAAQ,EAAE,MAAM,SAAS,QAAQ,uBAAuB,CAAC;AAAA,IAChH,MAAM,aAAa,QAAQ,SAAS,WAAW,IAAI,OAAO,IAAI,IAAI;AAAA,IAClE,OAAO,GAAG,aAAa,IAAI,OAAO,UAAU;AAAA,GAC7C;AAAA;AASI,SAAS,gBAAgB,GAAG,SAAS,YAAY,OAAO,mBAAmB,MAAM,YAM7C;AAAA,EACzC,QAAQ;AAAA,IACN,KAAK;AAAA,MAAY,OAAO,yBAAyB,EAAE,YAAY,UAAW,aAAa,YAAY,CAAC,IAAI,EAAE,SAAS,EAAG,CAAC;AAAA,IACvH,KAAK;AAAA,MAAU,OAAO,uBAAuB,EAAE,YAAY,MAAM,CAAC;AAAA,IAClE,KAAK;AAAA,MAAS,OAAO,sBAAsB,EAAE,YAAY,OAAO,iBAAiB,CAAC;AAAA;AAAA;AAK/E,SAAS,0BAA0B,MAAM,UAAgE;AAAA,EAC9G,IAAI,OAAO,cAAc,aAAa,OAAO,QAAQ,SAAS;AAAA,IAAU,OAAO,CAAC,EAAE,MAAM,sCAAsC,QAAQ,CAAC,GAAG,WAAW,OAAO,CAAC;AAAA,EAC7J,IAAI,CAAC,OAAO,QAAQ,aAAa;AAAA,IAAmB,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,oBAAoB,CAAC;AAAA,EAC9I,QAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AAAA,MAAY,OAAO,mCAAmC,MAAM;AAAA,IACjE,KAAK;AAAA,MAAS,OAAO,gCAAgC,MAAM;AAAA,IAC3D,KAAK;AAAA,MAAU,MAAM,wBAAsB,EAAE,SAAS,UAAU,SAAS,qCAAqC,MAAM,yFAAyF,CAAC;AAAA;AAAA;AAK3M,SAAS,4BAA4B,GAAG,SAAS,WAG/C;AAAA,EACP,IAAI,YAAY;AAAA,IAAY;AAAA,EAC5B,MAAM,QAAQ,QAAQ,MAAM,mCAAmC;AAAA,EAC/D,MAAM,QAAQ,OAAO,MAAM,GAAG,CAAC,EAAE,IAAI,MAAM;AAAA,EAC3C,MAAM,UAAU,YAAY,UAAU,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,CAAC;AAAA,EAC3D,MAAM,WAAW,UAAU,aAAa,CAAC,WAAW,KAAK,OAAO,KAAK,MAAM,KAAK,CAAC,MAAM,YAAY,OAAO,QAAQ,YAAa,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,CAAC,QAAQ,aAAa,WAAW,QAAQ,SAAS,CAAC,KAAK,UAAU,aAAa,MAAM,MAAM,CAAC,MAAM,YAAY,SAAS,QAAQ,QAAQ;AAAA,EACpS,IAAI,CAAC;AAAA,IAAU,MAAM,wBAAsB,EAAE,SAAS,SAAS,gCAAgC,MAAM,sCAAsC,4BAA4B,QAAQ,KAAK,GAAG,eAAe,KAAK,UAAU,OAAO,IAAI,CAAC;AAAA;AAGnO,SAAS,QAAO,GAAG,MAAM,UAAyE;AAAA,EAChG,OAAO,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,yBAAyB,SAAS,UAAU,MAAM,EAAE,MAAM,QAAQ,KAAK,EAAE,CAAC;AAAA;;AQ3HlI,SAAS,2BAA2B,CAAC,QAAkG;AAAA,EAC5I,QAAQ,SAAS,cAAc;AAAA,EAC/B,IAAI,UAAU,SAAS;AAAA,IAAc,OAAO,QAAQ,SAAS,UAAU,EAAE,MAAM,gCAAgC,QAAQ,CAAC,GAAG,WAAW,OAAO,IAAI;AAAA,EACjJ,IAAI,QAAQ,SAAS,YAAY,UAAU,OAAO,WAAW;AAAA,IAAG;AAAA,EAChE,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,QAAQ,UAAU,OAAO,IAAI,CAAC,OAAO,UAAU,UAAU,UAAU,IAAI,UAAU,SAAS,IAAI,UAAU,IAAI,kBAAkB,OAAO,UAAU,IAAI,KAAK,IAAI,UAAU,IAAI,mBAAmB,IAAI,EAAE,KAAK,aAAa;AAAA,EAC3N,MAAM,KAAK,QAAQ,SAAS;AAAA,EAG5B,MAAM,UAAU,GAAG,aAAyC,KAAK,SAAS,yCAAyC,iBAAiB;AAAA,EACpI,MAAM,UAAU,GAAG,WAAW,YAA0D,8CAA8C,QAAQ,EAAE,QAAQ,UAAU,CAAC,OAAO,QAAQ,EAAE,QAAQ,cAAc,CAAC,SAAS,QAAQ,EAAE,QAAQ,MAAM,CAAC,OAAO,QAAQ,EAAE,QAAQ,eAAe,CAAC;AAAA,EACtR,MAAM,kBAAkB,KAAK,eAAe;AAAA,EAC5C,MAAM,cAAc,KAAK,cAAc;AAAA,EACvC,MAAM,kBAAkB,KAAK,eAAe;AAAA,EAC5C,MAAM,cAAc,KAAK,cAAc;AAAA,EACvC,MAAM,OAAO,KACT,kRACA;AAAA,EACJ,OAAO;AAAA,IACL,MAAM,yBAAyB;AAAA,wBACX,KAAK,eAAe,4CAA4C,wCAAwC,gCAAgC,wCAAwC,gCAAgC,QAAQ,EAAE,WAAW,iBAAiB,OAAO,YAAY,CAAC,sBAAsB,QAAQ,EAAE,WAAW,iBAAiB,OAAO,YAAY,CAAC,0BAA0B;AAAA;AAAA;AAAA,IAGxY,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;;ACzBF,IAAM,kBAAkB,CAAC,SAAiB,UACxC,mEAAmE,oCAAoC;AAYzG,IAAM,0BAA0B,qFAAqF,gBAAgB,gBAAgB,OAAO,+IAA+I,gBAAgB,YAAY,OAAO,8FAA8F,gBAAgB,WAAW,OAAO,sPAAsP,gBAAgB,WAAW,OAAO;AAG/tB,SAAS,wBAAwB,CAAC,QAA8F;AAAA,EACrI,QAAQ,YAAY;AAAA,EACpB,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,YAAY,UAAU,IAAI,OAAO,SAAS;AAAA,EAChD,IAAI,QAAQ,SAAS;AAAA,IAAY,OAAO,EAAE,MAAM,2MAA2M;AAAA,gLAC7E;AAAA,yLACS;AAAA,uOAC8C,iDAAiD,gBAAgB,YAAY,OAAO;AAAA,+HAC5L,wGAAwG,2BAA2B,OAAO,qBAAqB,YAAY,KAAK,qBAAqB,UAAU,IAAI,OAAO,gBAAgB,OAAO,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EAC1Z,IAAI,QAAQ,SAAS;AAAA,IAAS,OAAO,EAAE,MAAM,yJAAyJ;AAAA,+GACzF,UAAU,IAAI,OAAO,SAAS;AAAA,gIACb,UAAU,IAAI,OAAO,SAAS,oCAAoC,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EAC5O,OAAO,EAAE,MAAM,mHAAmH,yGAAyG,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;;ACtCzR,sDAA6B;AAOtB,IAAM,kBAAqG,OAAO,OAAO,EAAE,QAAQ,mBAAmB,OAAO,gBAAgB,MAAM,YAAY,gBAAgB,GAAG,CAAC;AAGnN,IAAM,sBAAgH,OAAO,OAAO;AAAA,EACzI,UAAU,OAAO,OAAO,EAAE,oBAAoB,MAAM,WAAW,KAAK,CAAC;AAAA,EACrE,OAAO,OAAO,OAAO,EAAE,oBAAoB,MAAM,WAAW,KAAK,CAAC;AAAA,EAClE,QAAQ,OAAO,OAAO,EAAE,oBAAoB,OAAO,WAAW,MAAM,CAAC;AACvE,CAAC;AAeM,SAAS,qBAAqB,CAAC,QAAuF;AAAA,EAC3H,QAAQ,SAAS,cAAc;AAAA,EAC/B,IAAI,CAAC,oBAAoB,QAAQ,MAAM;AAAA,IAAoB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,6BAA6B,CAAC;AAAA,EACvJ,MAAM,KAAK,QAAQ,SAAS;AAAA,EAC5B,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,SAAS,KAAK,GAAG,QAAQ,WAAW,EAAE,MAAM,gBAAgB,OAAO,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,gBAAgB,MAAM,CAAC,MAAM,QAAQ,WAAW,EAAE,MAAM,gBAAgB,MAAM,CAAC;AAAA,EACzL,MAAM,SAAS,CAAC,SAA2C,CAAC,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO,CAAC;AAAA,EACjH,QAAQ,UAAU;AAAA,IAMhB,KAAK;AAAA,MAAkB,OAAO,OAAO,mBAAmB,QAAQ,WAAW,EAAE,MAAM,UAAU,KAAK,CAAC,IAAI,KAAK,wBAAwB,IAAI;AAAA,IACxI,KAAK;AAAA,MAAgB,OAAO,OAAO,iBAAiB,QAAQ,WAAW,EAAE,MAAM,UAAU,KAAK,CAAC,GAAG;AAAA,IAClG,KAAK;AAAA,MAAY,OAAO,OAAO,KAC3B,uLACA,yGAAyG;AAAA,IAC7G,KAAK;AAAA,MAAQ,OAAO,OAAO,KACvB,sCAAsC,UAAU,IAAI,gBAAgB,IAAI,OACxE,mBAAmB,UAAU,IAAI,kBAAkB,UAAU,UAAU,MAAM,UAAU,IAAI,gBAAgB,cAAc,gBAAgB;AAAA,IAC7I,KAAK;AAAA,MAAU,OAAO,OAAO,KACzB,wCAAwC,UAAU,IAAI,gBAAgB,IAAI,mBAC1E,uBAAuB,UAAU,IAAI,kBAAkB,UAAU,UAAU,gBAAgB;AAAA,IAC/F,KAAK;AAAA,MAAgB,OAAO,OAAO,KAC/B,kIAAkI,UAAU,IAAI,gBAAgB,MAAM,qBAAqB,UAAU,IAAI,gBAAgB,KAAK,MAC9N,6GAA6G,UAAU,IAAI,gBAAgB,KAAK,GAAG;AAAA,IACvJ,KAAK;AAAA,MAAc,OAAO,OAAO,uBAAuB,QAAQ;AAAA,IAChE,KAAK;AAAA,MAAiB,OAAO,OAAO,gJAAgJ,KAAK,UAAU,IAAI,gBAAgB,MAAM,IAAI,iCAAiC,UAAU,IAAI,gBAAgB,KAAK,SAAS,KAC1S,i3BACA,0hBAA0hB,UAAU,IAAI,gBAAgB,KAAK,gIAAgI,UAAU,IAAI,gBAAgB,KAAK;AAAA,0BAC9sB;AAAA,IACtB,KAAK,UAAU;AAAA,MACb,IAAI;AAAA,QAAI,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,wBAAwB,CAAC;AAAA,MAC/F,OAAO,OAAO,8BAA8B;AAAA,IAC9C;AAAA,IACA,KAAK;AAAA,MAAgB,OAAO,KACxB,CAAC,EAAE,MAAM,iBAAiB,QAAQ,WAAW,EAAE,MAAM,gBAAgB,OAAO,CAAC,KAAK,QAAQ,CAAC,GAAG,WAAW,OAAO,GAAG,EAAE,MAAM,gBAAgB,kCAAkC,QAAQ,CAAC,GAAG,WAAW,OAAO,CAAC,IAC5M,OAAO,gBAAgB,kDAAkD;AAAA,IAC7E,KAAK;AAAA,MAAe,OAAO,OAAO,UAAU,SAAS,eAAe,4BAA4B,UAAU,IAAI,UAAU,KAAK,OAAO,UAAU,wBAAwB,UAAU,IAAI,UAAU,KAAK,GAAG;AAAA,IACtM,KAAK;AAAA,MAAW,OAAO,OAAO,sDAAsD,QAAQ,WAAW,EAAE,MAAM,mBAAmB,CAAC,iBAAiB;AAAA,IACpJ,KAAK;AAAA,MAAa,OAAO,OAAO,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA,wDAKe,gBAAgB,sMAAsM,gBAAgB;AAAA,8NAChE,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6XAQtO;AAAA;AAAA;AAAA;AAAA,qQAI6P;AAAA,IACjQ,KAAK;AAAA,IACL,KAAK,0BAA0B;AAAA,MAC7B,IAAI,CAAC;AAAA,QAAI,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,sBAAsB,CAAC;AAAA,MAG9F,MAAM,QAAQ,UAAU,SAAS,2BAA2B,UAAU,kBAAkB,CAAC;AAAA,MACzF,WAAW,aAAa;AAAA,QAAO,mBAAmB,EAAE,WAAW,SAAS,YAAY,aAAa,MAAM,CAAC;AAAA,MACxG,OAAO;AAAA,QACL,GAAG,MAAM,IAAI,CAAC,eAA8B,EAAE,MAAM,yBAAyB,QAAQ,WAAW,EAAE,MAAM,UAAU,CAAC,aAAa,QAAQ,CAAC,GAAG,WAAW,OAAO,EAAE;AAAA,QAChK,EAAE,MAAM,gCAAgC,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA,QACtE,EAAE,MAAM,0BAA0B,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA,MAClE;AAAA,IACF;AAAA,IACA,KAAK,oBAAoB;AAAA,MACvB,IAAI;AAAA,QAAI,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,mBAAmB,CAAC;AAAA,MAC1F,OAAO,OAAO,4BAA4B,UAAU,UAAU,MAAM,KAAK;AAAA,IAC3E;AAAA,IACA,KAAK,mBAAmB;AAAA,MACtB,IAAI;AAAA,QAAI,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,mBAAmB,CAAC;AAAA,MAC1F,OAAO,OAAO,QAAQ,UAAU,UAAU,QAAQ,WAAW,EAAE,MAAM,UAAU,KAAK,CAAC,GAAG;AAAA,IAC1F;AAAA;AAAA;;AC7GJ,sBAAS,sCAAW;AAcb,IAAM,6BAA+F,OAAO,OAAO;AAAA,EACxH,UAAU,OAAO,OAAO,EAAE,gBAAgB,KAAK,CAAC;AAAA,EAChD,OAAO,OAAO,OAAO,EAAE,gBAAgB,MAAM,CAAC;AAAA,EAC9C,QAAQ,OAAO,OAAO,EAAE,gBAAgB,MAAM,CAAC;AACjD,CAAC;AAGM,IAAM,gCAAwC;AA6BrD,IAAM,OAAO,IAAI,OAAO,6BAA6B;AACrD,IAAM,SAAS;AACf,IAAM,OAAO;AACb,IAAM,SAAS;AAEf,SAAS,MAAM,CAAC,YAA4B;AAAA,EAC1C,OAAO,uBAAuB;AAAA;AAGhC,SAAS,eAAe,CAAC,OAAwB;AAAA,EAC/C,OAAO,OAAO,cAAc,KAAK,KAAK,QAAQ;AAAA;AAQzC,SAAS,yBAAyB,CAAC,QAAmD;AAAA,EAC3F,QAAQ,WAAW;AAAA,EACnB,IAAI,CAAC,KAAK,KAAK,OAAO,QAAQ,KAAK,CAAC,gBAAgB,OAAO,QAAQ,KAAK,CAAC,gBAAgB,OAAO,GAAG,KAAM,OAAO,iBAAiB,QAAQ,CAAC,OAAO,KAAK,OAAO,YAAY,KAAM,CAAC,OAAO,KAAK,OAAO,OAAO,KAAK,CAAC,KAAK,KAAK,OAAO,IAAI,GAAG;AAAA,IACtO,MAAM,IAAI,YAAU,EAAE,MAAM,iBAAiB,SAAS,kEAAkE,MAAM,EAAE,QAAQ,yBAAyB,UAAU,OAAO,SAAS,EAAE,CAAC;AAAA,EAChM;AAAA,EACA,OAAO,yDAAyD,OAAO,wBAAwB,OAAO,2BAA2B,OAAO,iBAAiB,OAAO,SAAS,IAAI,OAAO,8BAA8B,OAAO,oBAAoB,OAAO,eAAe,OAAO;AAAA;AAIrQ,SAAS,0BAA0B,CAAC,QAA8D;AAAA,EACvG,IAAI,OAAO,OAAO,SAAS;AAAA,IAAU;AAAA,EACrC,MAAM,QAAQ,OAAO,KAAK,OAAO,IAAI;AAAA,EACrC,IAAI,UAAU;AAAA,IAAM;AAAA,EACpB,MAAM,SAAgC,EAAE,UAAU,MAAM,IAAK,UAAU,OAAO,MAAM,EAAE,GAAG,cAAc,MAAM,MAAM,MAAM,SAAS,MAAM,IAAK,MAAM,MAAM,IAAK,KAAK,OAAO,MAAM,EAAE,EAAE;AAAA,EACpL,OAAO,KAAK,KAAK,OAAO,QAAQ,KAAK,gBAAgB,OAAO,QAAQ,KAAK,gBAAgB,OAAO,GAAG,IAAI,SAAS;AAAA;AAI3G,SAAS,8BAA8B,CAAC,QAAqF;AAAA,EAClI,QAAQ,SAAS,cAAc;AAAA,EAC/B,IAAI,CAAC,2BAA2B,QAAQ,MAAM;AAAA,IAAgB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,yBAAyB,MAAM,uEAAuE,CAAC;AAAA,EACnO,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,SAAS,CAAC,UAAiC,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EACrG,QAAQ,UAAU;AAAA,IAChB,KAAK;AAAA,MAAW,OAAO,OAAO,sDAAsD,OAAO,iBAAiB,+FAA+F,OAAO,kCAAkC,UAAU;AAAA,IAC9P,KAAK;AAAA,MAAQ,OAAO,OAAO,uBAAuB,QAAQ,WAAW,EAAE,MAAM,UAAU,OAAO,SAAS,CAAC,SAAS,0BAA0B,EAAE,QAAQ,UAAU,OAAO,CAAC,IAAI;AAAA,IAC3K,KAAK;AAAA,MAAQ,OAAO,OAAO,8LAA8L,OAAO,kCAAkC,4DAA4D,UAAU,IAAI,6BAA6B,sBAAsB;AAAA,IAC/X,KAAK;AAAA,MAAY,OAAO,OAAO,iBAAiB,OAAO,iBAAiB,iDAAiD;AAAA;AAAA;;AC/F7H,sBAAS,sCAAW;AAcb,IAAM,6BAAkG,OAAO,OAAO;AAAA,EAC3H,UAAU,OAAO,OAAO,EAAE,mBAAmB,KAAK,CAAC;AAAA,EACnD,OAAO,OAAO,OAAO,EAAE,mBAAmB,MAAM,CAAC;AAAA,EACjD,QAAQ,OAAO,OAAO,EAAE,mBAAmB,MAAM,CAAC;AACpD,CAAC;AAMM,IAAM,+BAAuC;AAKpD,IAAM,kBAAkB;AACxB,IAAM,eAAe;AACrB,IAAM,UAAS;AAEf,SAAS,QAAO,CAAC,QAAmE;AAAA,EAClF,MAAM,IAAI,YAAU,EAAE,MAAM,mBAAmB,SAAS,OAAO,SAAS,MAAM,OAAO,KAAK,CAAC;AAAA;AAItF,SAAS,uBAAuB,CAAC,QAAiD;AAAA,EACvF,QAAQ,WAAW;AAAA,EACnB,IAAI,OAAO,WAAW,YAAY,CAAC,6BAA6B,KAAK,MAAM,GAAG;AAAA,IAC5E,OAAO;AAAA,EACT;AAAA,EACA;AAAA;AAIK,SAAS,gBAAgB,CAAC,QAAwE;AAAA,EACvG,QAAQ,QAAQ,SAAS;AAAA,EACzB,IAAI,wBAAwB,EAAE,OAAO,CAAC,MAAM,aAAa,CAAC,KAAK,WAAW,MAAM;AAAA,IAAG;AAAA,EACnF,MAAM,SAAS,KAAK,MAAM,OAAO,MAAM;AAAA,EACvC,IAAI,gBAAgB,KAAK,MAAM;AAAA,IAAG,OAAO;AAAA,EACzC,IAAI,aAAa,KAAK,MAAM;AAAA,IAAG,OAAO;AAAA,EACtC;AAAA;AAIK,SAAS,kBAAkB,CAAC,QAA8D;AAAA,EAC/F,IAAI,iBAAiB,MAAM,MAAM;AAAA,IAAS;AAAA,EAC1C,MAAM,QAAQ,aAAa,KAAK,OAAO,KAAK,MAAM,OAAO,OAAO,MAAM,CAAC;AAAA,EACvE,MAAM,UAAU,UAAU,OAAO,OAAO,MAAM,OAAO,SAAS,MAAM,IAAK,EAAE;AAAA,EAC3E,OAAO,OAAO,cAAc,OAAO,IAAI,UAAU;AAAA;AAI5C,SAAS,uBAAuB,CAAC,QAA+C;AAAA,EACrF,IAAI,OAAO,OAAO,SAAS;AAAA,IAAU;AAAA,EACrC,MAAM,QAAQ,QAAO,KAAK,OAAO,IAAI;AAAA,EACrC,MAAM,UAAU,UAAU,OAAO,OAAO,MAAM,OAAO,MAAM,EAAE;AAAA,EAC7D,OAAO,OAAO,cAAc,OAAO,IAAI,UAAU;AAAA;AAQnD,SAAS,OAAO,CAAC,QAA2E;AAAA,EAC1F,QAAQ,QAAQ,SAAS;AAAA,EACzB,MAAM,QAAQ,wBAAwB,EAAE,OAAO,CAAC;AAAA,EAChD,IAAI,UAAU;AAAA,IAAW,SAAQ,EAAE,SAAS,OAAO,MAAM,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AAAA,EACrG,MAAM,OAAO,OAAO,SAAS,WAAW,iBAAiB,EAAE,QAAQ,KAAK,CAAC,IAAI;AAAA,EAC7E,IAAI,SAAS,aAAc,OAAO,SAAS,aAAa,SAAS,OAAO,MAAO;AAAA,IAC7E,SAAQ;AAAA,MACN,SAAS,yCAAyC,KAAK,UAAU,OAAO,IAAI,EAAE,MAAM,GAAG,EAAE,CAAC,WAAW,OAAO,QAAQ,+CAA+C;AAAA,MACnK,MAAM,EAAE,QAAQ,gCAAgC,QAAQ,MAAM,OAAO,IAAI,EAAE,MAAM,GAAG,EAAE,EAAE;AAAA,IAC1F,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AA4BF,SAAS,2BAA2B,CAAC,QAAkF;AAAA,EAC5H,QAAQ,SAAS,cAAc;AAAA,EAC/B,IAAI,CAAC,2BAA2B,QAAQ,MAAM,mBAAmB;AAAA,IAC/D,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,yBAAyB,MAAM,sHAAiH,CAAC;AAAA,EACjN;AAAA,EACA,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,SAAS,CAAC,UAAiC,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EACrG,MAAM,QAAQ,CAAC,MAAc,SAAoC,QAAQ,WAAW,EAAE,MAAM,QAAQ,EAAE,QAAQ,UAAU,QAAQ,SAAU,SAAS,YAAY,CAAC,IAAI,EAAE,KAAK,EAAG,CAAC,EAAE,CAAC;AAAA,EAClL,MAAM,WAAW;AAAA,EACjB,MAAM,MAAM;AAAA,EACZ,QAAQ,UAAU;AAAA,IAChB,KAAK;AAAA,MAAS,OAAO,OAAO,wGAAwG,aAAa,gFAAgF,UAAU,IAAI,QAAQ,EAAE,QAAQ,UAAU,QAAQ,MAAM,UAAU,KAAK,CAAC,CAAC,GAAG;AAAA,IAC7S,KAAK;AAAA,MAAkB,OAAO,OAAO,mBAAmB,MAAM,UAAU,MAAM,UAAU,sBAAsB;AAAA,IAC9G,KAAK,gBAAgB;AAAA,MACnB,IAAI,CAAC,OAAO,cAAc,UAAU,OAAO,KAAK,UAAU,UAAU;AAAA,QAAG,SAAQ,EAAE,SAAS,8DAA8D,MAAM,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AAAA,MAC1M,OAAO,OAAO,uBAAuB,MAAM,UAAU,MAAM,UAAU,kCAAkC,UAAU,UAAU;AAAA,IAC7H;AAAA,IACA,KAAK;AAAA,MAAgB,OAAO,OAAO,kBAAkB,MAAM,UAAU,MAAM,UAAU,UAAU,UAAU,WAAW,6CAA6C,qBAAqB;AAAA,IACtL,KAAK;AAAA,MAAS,OAAO,OAAO,mBAAmB,MAAM,UAAU,MAAM,OAAO,cAAc,MAAM,UAAU,UAAU,UAAU,GAAG;AAAA,IACjI,KAAK;AAAA,MAAQ,OAAO,OAAO,iBAAiB,MAAM,UAAU,MAAM,UAAU,UAAU,OAAO,UAAU,SAAS,IAAI,UAAU,UAAU,OAAO,kBAAkB,IAAI;AAAA,IACrK,KAAK,QAAQ;AAAA,MACX,MAAM,QAAQ,wBAAwB,EAAE,QAAQ,UAAU,OAAO,CAAC;AAAA,MAClE,IAAI,UAAU;AAAA,QAAW,SAAQ,EAAE,SAAS,OAAO,MAAM,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AAAA,MACrG,OAAO,OAAO,iIAAiI,aAAa,wEAAwE,UAAU,IAAI,UAAU,MAAM,uBAAuB;AAAA,IAC3R;AAAA;AAAA;;ACxIG,IAAM,wBAAgC;AAGtC,SAAS,mBAAmB,CAAC,QAOI;AAAA,EACtC,QAAQ,SAAS,cAAc;AAAA,EAC/B,MAAM,IAAI,CAAC,SAAyB,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EAC/D,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,EAC5B,MAAM,SAAS,EAAE,qBAAqB;AAAA,EACtC,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,IAAI;AAAA,EACJ,QAAQ,UAAU;AAAA,IAChB,KAAK;AAAA,MACH,OAAO,QAAQ,SAAS,WAAW,qBAAqB,WACpD,mFAAmF,QAAQ,SAAS,aAAa,qBAAqB,iCAAiC,UAAU,IAAI,OAAO,KAAK;AAAA,MACrM;AAAA,IACF,KAAK;AAAA,MACH,OAAO,eAAe,oBAAoB,UAAU,QAAQ,SAAS,UAAU,aAAa;AAAA,MAC5F;AAAA,IACF,KAAK;AAAA,MAAQ,OAAO,iBAAiB,kBAAkB,EAAE,IAAI;AAAA,MAAK;AAAA,IAClE,KAAK;AAAA,MACH,OAAO,eAAe,UAAU,CAAC,QAAQ,YAAY,mBAAmB,qBAAqB,EAAE,IAAI,CAAC,EAAE,KAAK,IAAI,cAAc,UAAU,QAAQ,CAAC,UAAU,MAAM,UAAU,UAAU,UAAU,OAAO,UAAU,KAAK,CAAC,EAAE,KAAK,IAAI;AAAA,MAChO;AAAA,IACF,KAAK;AAAA,MAAY,OAAO,UAAU,aAAa,YAAY,UAAU,IAAI,UAAU,KAAK,WAAW,EAAE,MAAM,OAAO,UAAU,IAAI,UAAU,IAAI;AAAA,MAAK;AAAA;AAAA,EAErJ,OAAO,EAAE,MAAM,QAAQ,UAAU,OAAO;AAAA;;AClC1C;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACSA,sBAAS;AAMF,SAAS,WAAW,CAAC,QAAkC;AAAA,EAC5D,IAAI,OAAO,KAAK,SAAS,MAAQ,GAAG;AAAA,IAClC,MAAM,IAAI,YAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS;AAAA,MACT,MAAM,EAAE,MAAM,OAAO,KAAK,WAAW,QAAU,KAAK,EAAE;AAAA,IACxD,CAAC;AAAA,EACH;AAAA,EACA,OAAO,OAAO;AAAA;;;ACVT,IAAM,gBAA4B;AAAA,EACvC,MAAM;AAAA,EACN,cAAc;AAAA,EAEd,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,aAAa;AAAA,EACb,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EAGxB,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,YAAY;AAAA,EASZ,qBAAqB;AAAA,IACnB,gBAAgB,CAAC;AAAA,IACjB,uBAAuB;AAAA,IAIvB,0BAA0B;AAAA,EAC5B;AAAA,EACA,gBAAgB,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,EACpD,eAAe;AAAA,EACf,iBAAiB;AAAA,EAGjB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,qBAAqB,EAAE,WAAW,KAAK;AAAA,EACvC,kBAAkB;AAAA,EASlB,cAAc;AAAA,EACd,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,eAAe;AAAA,EACf,gBAAgB,OAAO,OAAO,EAAE,QAAQ,QAAQ,SAAS,WAAW,KAAK,WAAW,QAAQ,WAAW,OAAO,QAAQ,SAAS,QAAQ,UAAU,QAAQ,MAAM,QAAQ,OAAO,OAAO,CAAC;AAAA,EACtL,iBAAiB;AAAA,EAKjB,eAAe;AAAA,EACf,uBAAuB;AAAA,EAGvB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,aAAa,EAAE,MAAM,iBAAiB,gBAAgB,MAAM;AAAA,EAE5D,gBAAgB;AAAA,EAChB,aAAa;AAAA,EAIb,gBAAgB,EAAE,MAAM,KAAK,OAAO,IAAI;AAAA,EAExC,UAAU,GAAG,QAAQ;AAAA,IACnB,OAAO,IAAI,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,IAAI;AAAA;AAAA,EAIvD,kBAAkB,GAAG,SAAS;AAAA,IAC5B,OAAO,IAAI,MAAM,WAAW,KAAK,IAAI;AAAA;AAAA,EAEvC,iBAAiB,GAAG,UAAU;AAAA,IAC5B,OAAO;AAAA;AAAA,EAET,gBAAgB,GAAG,IAAI,UAAU;AAAA,IAC/B,OAAO,GAAG,OAAO,QAAQ,QAAQ,SAAS;AAAA;AAAA,EAE5C,WAAW,GAAG;AAAA,IACZ,OAAO;AAAA;AAAA,EAET,kBAAkB,GAAG,cAAsB;AAAA,IACzC,OAAO;AAAA;AAAA,EAET,WAAW,GAAG,eAAe,aAAa;AAAA,IAKxC,IAAI,kBAAkB;AAAA,MAAG,OAAO;AAAA,IAChC,OAAO,yCAAyC,UAAU,IAAI,aAAa;AAAA;AAAA,EAE7E,gBAAgB,GAAG,MAAM,SAAS;AAAA,IAChC,MAAM,MAAM,CAAC,UAAsC,MAAM,WAAW,IAAK,MAAM,KAAgB,IAAI,MAAM,KAAK,IAAI;AAAA,IAClH,OAAO,GAAG,IAAI,IAAI,YAAY,IAAI,KAAK;AAAA;AAE3C;;;AClIA,SAAS,gBAAgB,CAAC,QAA2I;AAAA,EACnK,MAAM,QAAQ,CAAC,SAAyB,cAAc,WAAW,EAAE,KAAK,CAAC;AAAA,EACzE,MAAM,UAAU,OAAO,QAAQ,IAAI,CAAC,WAAW,MAAM,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,EACvE,MAAM,YAAY,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,EAClF,MAAM,YAAY,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,MAAM,GAAG,EAAE,KAAK,IAAI;AAAA,EAClF,MAAM,UAAU;AAAA,IACd;AAAA,IACA,GAAG,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,MAAM,MAAM,+BAA+B,MAAM,MAAM,kBAAkB;AAAA,EACpH,EAAE,KAAK,MAAM;AAAA,EACb,MAAM,SAAS,GAAG,MAAM,GAAG,OAAO,aAAa,qBAAqB,MAAM,OAAO,KAAK;AAAA,EACtF,MAAM,OAAO;AAAA,gBAAwB,MAAM,OAAO,QAAQ,KAAK,MAAM,OAAO,QAAQ,aAAa,yCAAyC;AAAA,gBAA8B,MAAM,OAAO,QAAQ,YAAY,+BAA+B;AAAA;AAAA,EACxO,MAAM,OAAO,GAAG,gBAAgB,YAAY;AAAA,EAC5C,OAAO;AAAA,IACL,QAAQ,gCAAgC;AAAA,IACxC,YAAY,kBAAkB;AAAA,IAC9B,kBAAkB,kBAAkB,UAAU;AAAA,EAChD;AAAA;AAIK,SAAS,4BAA4B,CAAC,QAIgB;AAAA,EAC3D,QAAQ,QAAQ,eAAe,iBAAiB,MAAM;AAAA,EACtD,OAAO,EAAE,QAAQ,WAAW;AAAA;AAIvB,SAAS,sBAAsB,CAAC,QAarC;AAAA,EACA,MAAM,SAAS;AAAA,EAGf,MAAM,OAAO,IAAI,OAAO,0BAA0B,cAAc,oBAAoB,cAAc,kDAAkD,GAAG;AAAA,EACvJ,WAAW,SAAS,OAAO,OAAO,SAAS,IAAI,GAAG;AAAA,IAChD,MAAM,WAAW,oBAAoB,EAAE,KAAK,mBAAmB,MAAM,MAAM,CAAC,EAAE,GAAI;AAAA,IAClF,MAAM,UAAU,oBAAoB,EAAE,KAAK,mBAAmB,MAAM,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,OAAO,IAAI;AAAA,IACxG,IAAI,OAAO,SAAS,GAAG;AAAA,MAAe;AAAA,IACtC,MAAM,aAAa,iBAAiB,EAAE,OAAO,OAAO,OAAO,UAAU,QAAQ,CAAC;AAAA,IAC9E,IAAI,OAAO,WAAW,WAAW;AAAA,MAAQ;AAAA,IACzC,MAAM,YAAY,OAAO,cAAc,WAAW,mBAAmB,WACjE,OAAO,cAAc,WAAW,aAAa,YAAY;AAAA,IAC7D,IAAI,cAAc;AAAA,MAAW;AAAA,IAC7B,IAAI,OAAO,oBAAoB;AAAA,MAAW,OAAO,EAAE,MAAM,iBAAiB,SAAS;AAAA,IACnF,MAAM,YAAY,GAAG,cAAc,WAAW,EAAE,MAAM,SAAS,CAAC,gBAAgB,QAAQ,IAAI,CAAC,SAAS,cAAc,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,cAAc,cAAc,mBAAmB,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,IACzN,IAAI,OAAO,oBAAoB,wBAAwB,eAAe,OAAO,oBAAoB,sCAAsC;AAAA,MAAc;AAAA,IACrJ,OAAO,EAAE,MAAM,cAAc,UAAU,kBAAkB,WAAW,kBAAkB,mBAAmB,WAAW,YAAY,MAAM,0BAA0B,cAAc,WAAW,EAAE,MAAM,GAAG,cAAc,CAAC,MAAM,UAAU;AAAA,EACrO;AAAA,EACA;AAAA;;AChEK,IAAM,qBASR,OAAO,OAAO;AAAA,EACjB,aAAa;AAAA,EACb,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,OAAO;AAAA,EACP,eAAe;AACjB,CAAC;;ACnBD,sBAAS;AAmBT,IAAM,YAAY,IAAI;AACtB,uBAAuB,EAAE,OAAO,CAAC,UAAU,UAAU,IAAI,KAAK,EAAE,CAAC;AAEjE,SAAS,QAAO,CAAC,SAAwB;AAAA,EACvC,MAAM,IAAI,YAAU,EAAE,MAAM,mBAAmB,QAAQ,CAAC;AAAA;AAG1D,SAAS,SAAS,CAAC,OAAqC;AAAA,EACtD,MAAM,WAAW,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC;AAAA,EACzC,MAAM,WAAW,OAAO,OAAO,OAAO,eAAe,OAAO,OAAO,IAAI,GAAG,UAAU;AAAA,IAClF,OAAO,OAAmC,EAAE,OAAO,SAAS;AAAA,EAC9D,CAAC,CAAC;AAAA,EACF,UAAU,IAAI,UAAU,QAAQ;AAAA,EAChC,OAAO;AAAA;AAIF,SAAS,aAAa,CAAC,OAAsC;AAAA,EAClE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,UAAU,IAAI,KAAK;AAAA;AAG3E,SAAS,OAAO,CAAC,OAAqC;AAAA,EACpD,OAAO,UAAU,IAAI,KAAK,KAAK,SAAQ,qCAAqC;AAAA;AAI9E,SAAS,gBAAgB,CAAC,UAAgC;AAAA,EACxD,OAAO,QAAQ,QAAQ,EAAE,KAAK,CAAC,SAAS,OAAO,SAAS,aAAY,cAAc,KAAI;AAAA;AAGxF,SAAS,UAAU,CAAC,OAAgC;AAAA,EAClD,IAAI,CAAC,MAAM,QAAQ,KAAK,KAAK,MAAM,WAAW,KAAK,MAAM,KAAK,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,WAAW,KAAK,KAAK,SAAS,MAAI,CAAC,GAAG;AAAA,IAC7I,SAAQ,6DAA6D;AAAA,EACvE;AAAA;AA4BF,SAAS,QAAQ,CAAC,YAAkC,QAAyC;AAAA,EAC3F,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,GAAG,KAAK,QAAQ,WAAW,OAAO,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAAA,IACtJ,SAAQ,2BAA2B;AAAA,EACrC;AAAA,EACA,MAAM,QAAgB,CAAC;AAAA,EACvB,SAAS,QAAQ,EAAG,QAAQ,QAAQ,QAAQ,SAAS;AAAA,IACnD,MAAM,KAAK,QAAQ,MAAO;AAAA,IAC1B,IAAI,QAAQ,OAAO,QAAQ;AAAA,MACzB,MAAM,QAAQ,OAAO;AAAA,MACrB,IAAI,cAAc,KAAK;AAAA,QAAG,MAAM,KAAK,GAAG,QAAQ,KAAK,CAAC;AAAA,MACtD;AAAA,QAAK,MAAM,KAAK,OAAO,OAAO,EAAE,OAAO,iBAAiB,KAAK,EAAE,CAAC,CAAC;AAAA,IACnE;AAAA,EACF;AAAA,EACA,OAAO,UAAU,KAAK;AAAA;AAIjB,IAAM,MAAc,OAAO,OAAO,OAAO,OAAO,UAAU;AAAA,EAC/D,MAAM,GAAG,WAA0C;AAAA,IACjD,IAAI,OAAO,SAAS,YAAY,KAAK,SAAS,MAAI;AAAA,MAAG,SAAQ,oCAAoC;AAAA,IACjG,OAAO,UAAU,CAAC,IAAI,CAAC;AAAA;AAAA,EAEzB,OAAO,GAAG,YAAuD;AAAA,IAC/D,WAAW,KAAK;AAAA,IAChB,OAAO,UAAU,CAAC,OAAO,OAAO,EAAE,OAAO,OAAO,OAAO,CAAC,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA;AAAA,EAExE,OAAO,GAAM,OAAO,cAClB,UAAU,CAAC,OAAO,OAAO,EAAE,OAAO,iBAAiB,KAAK,MAAO,YAAY,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAG,CAAC,CAAC,CAAC;AAAA,EAC9G,MAAM,CAAC,OAAoF,WAAsC;AAAA,IAC/H,MAAM,aAAa,MAAM,QAAQ,KAAK;AAAA,IACtC,MAAM,QAAQ,aAAa,QAAS,OAAkD;AAAA,IACtF,MAAM,YAAY,aAAa,SAAU,MAAsC;AAAA,IAC/E,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,MAAG,SAAQ,0FAA0F;AAAA,IAC7H,IAAI,CAAC,cAAc,WAAW;AAAA,MAAW,SAAQ,sEAAsE;AAAA,IACvH,IAAI,cAAc,aAAa,CAAC,cAAc,SAAS;AAAA,MAAG,SAAQ,2DAAsD;AAAA,IACxH,MAAM,UAAU,cAAc,YAAY,CAAC,IAAI,IAAI,QAAQ,SAAS;AAAA,IACpE,MAAM,QAAgB,CAAC;AAAA,IACvB,MAAM,QAAQ,CAAC,OAAO,UAAU;AAAA,MAC9B,IAAI,QAAQ;AAAA,QAAG,MAAM,KAAK,GAAG,OAAO;AAAA,MACpC,MAAM,KAAK,GAAI,cAAc,KAAK,IAAI,QAAQ,KAAK,IAAI,CAAC,OAAO,OAAO,EAAE,OAAO,iBAAiB,KAAK,EAAE,CAAC,CAAC,CAAE;AAAA,KAC5G;AAAA,IACD,OAAO,UAAU,KAAK;AAAA;AAAA,EAExB,KAAK,CAAC,UAA6D,WAAW,EAAE,OAAO,QAAQ,WAAW,UAAU,SAAS,OAAO,OAAO,CAAC;AAAA,EAC5I,IAAI,CAAC,UAA6D,WAAW,EAAE,OAAO,QAAQ,UAAU,UAAU,QAAQ,OAAO,QAAQ,CAAC;AAAA,EAC1I,UAAU,GAAG,aAA8C;AAAA,IACzD,WAAW,CAAC,MAAM,CAAC;AAAA,IACnB,OAAO,UAAU,CAAC,OAAO,OAAO,EAAE,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC;AAAA;AAAA,EAE/D,UAAU,GAAG,aAA8C;AAAA,IACzD,WAAW,CAAC,MAAM,CAAC;AAAA,IACnB,OAAO,UAAU,CAAC,OAAO,OAAO,EAAE,KAAK,YAAY,OAAO,CAAC,CAAC,CAAC;AAAA;AAAA,EAE/D,UAAU,GAAG,aAA8D;AAAA,IACzE,IAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,KAAK,OAAO,KAAK,CAAC,UAAU,CAAC,cAAc,KAAK,CAAC;AAAA,MAAG,SAAQ,yCAAyC;AAAA,IACrJ,OAAO,UAAU,CAAC,OAAO,OAAO,EAAE,UAAU,OAAO,OAAO,CAAC,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;AAAA;AAE9E,CAAC,CAAC;AAGF,SAAS,UAAU,CAAC,QAA0F;AAAA,EAC5G,QAAQ,OAAO,WAAW;AAAA,EAC1B,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,IAAG,SAAQ,GAAG,qDAAgD;AAAA,EACtF,MAAM,UAAW,MAA6B,OAAO,CAAC,SAAS,SAAS,SAAS;AAAA,EACjF,IAAI,QAAQ,KAAK,CAAC,SAAS,CAAC,cAAc,IAAI,CAAC;AAAA,IAAG,SAAQ,GAAG,uGAAkG;AAAA,EAC/J,IAAI,QAAQ,WAAW;AAAA,IAAG,OAAO,UAAU,CAAC,OAAO,KAAK,CAAC;AAAA,EACzD,MAAM,MAAc,CAAC;AAAA,EACrB,QAAQ,QAAQ,CAAC,MAAM,UAAU;AAAA,IAC/B,IAAI,KAAK,UAAU,IAAI,MAAM,IAAI,OAAO,aAAa,GAAG,QAAQ,IAAmB,CAAC;AAAA,GACrF;AAAA,EACD,IAAI,KAAK,GAAG;AAAA,EACZ,OAAO,UAAU,GAAG;AAAA;AAIf,SAAS,iBAAiB,CAAC,QAMvB;AAAA,EACT,QAAQ,SAAS,WAAW,aAAa;AAAA,EACzC,MAAM,SAAS,CAAC,aAAkC,kBAAkB,KAAK,QAAQ,SAAS,CAAC;AAAA,EAC3F,MAAM,SAAS,CAAC,SAA0F;AAAA,IACxG,IAAI,KAAK,UAAU;AAAA,MAAW,SAAQ,yDAAyD;AAAA,IAG/F,OAAO,iBAAiB,KAAK,YAAY,YAAY,KAAK,QAAQ,KAAK,QAAQ,OAAO,EAAE,OAAO,iBAAiB,KAAK,KAAK,GAAG,SAAS,QAAQ,KAAK,CAAC,CAAC;AAAA;AAAA,EAEvJ,MAAM,YAAY,sBAAsB,EAAE,UAAU,CAAC;AAAA,EACrD,MAAM,cAAc,CAAC,SAAyF,iBAAiB;AAAA,IAC7H;AAAA,IAAW,QAAQ,EAAE,MAAM,WAAW,OAAO,KAAK,MAAM;AAAA,IACxD,WAAW,KAAK,YAAY,YAAY,sBAAsB,EAAE,OAAO,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,QAAQ;AAAA,IACvG,QAAQ,GAAG,OAAO,SAAS,aAAa,KAAK,YAAY,YAAY,QAAQ,KAAK,QAAQ,OAAO,EAAE,OAAO,SAAS,OAAO,KAAK,CAAC;AAAA,EAClI,CAAC;AAAA,EAOD,MAAM,eAAe,CAAC,aAAkC;AAAA,IACtD,MAAM,QAAQ,QAAQ,QAAQ,EAAE,OAAO,CAAC,SAAS,SAAS,EAAE;AAAA,IAC5D,MAAM,OAAO,MAAM,WAAW,IAAI,MAAM,KAAK;AAAA,IAC7C,IAAI,aAAa,SAAS,aAAa,OAAO,SAAS,YAAY,WAAW,MAAM;AAAA,MAClF,IAAI,KAAK,YAAY,aAAa,qBAAqB,EAAE,SAAS,KAAK,QAAQ,CAAC,MAAM;AAAA,QAAW,MAAM,IAAI,YAAU,EAAE,MAAM,+BAA+B,SAAS,4FAA4F,CAAC;AAAA,MAClQ,IAAI,KAAK,UAAU,MAAM;AAAA,QACvB,IAAI,KAAK,YAAY;AAAA,UAAW,sBAAsB,EAAE,WAAW,OAAO,MAAM;AAAA,YAC9E,IAAI,OAAO,KAAK,MAAM,OAAO,iBAAiB,KAAK,KAAK,EAAE,CAAC,MAAM;AAAA,cAAM,MAAM,IAAI,YAAU,EAAE,MAAM,+BAA+B,SAAS,kEAAkE,CAAC;AAAA,YAC9M,CAAC;AAAA,QACH,OAAO;AAAA,MACT;AAAA,MACA,MAAM,OAAO,YAAY,IAAI;AAAA,MAC7B,OAAO,QAAQ,iBAAiB,kBAAkB,WAAW,UAAU;AAAA,IACzE;AAAA,IACA,MAAM,QAAQ,SAAS,aAAa,OAAO,SAAS,YAAY,WAAW,OAAO,EAAE,SAAS,OAAO,IAAI,EAAE,IAAI;AAAA,IAC9G,IAAI,UAAU,aAAa,MAAM,YAAY;AAAA,MAAM,OAAO;AAAA,IAC1D,MAAM,OAAO,UAAU,YAAY,OAAO,QAAQ,IAAI,UAAU,IAAI,MAAM,OAAO;AAAA,IACjF,OAAO,QAAQ,iBAAiB,kBAAkB,WAAW,UAAU;AAAA;AAAA,EAEzE,OAAO,QAAQ,OAAO,QAAQ,EAAE,IAAI,CAAC,SAAS;AAAA,IAC5C,IAAI,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IACrC,IAAI,WAAW;AAAA,MAAM,OAAO,YAAY,YAAY,IAAI,IAAI,UAAU,IAAI,OAAO,IAAI,CAAC;AAAA,IACtF,IAAI,WAAW;AAAA,MAAM,OAAO,KAAK,MAAM,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA,IAC3F,IAAI,SAAS,MAAM;AAAA,MACjB,IAAI,aAAa;AAAA,QAAW,SAAQ,4DAA4D;AAAA,MAChG,MAAM,OAAO,SAAS,YAAY,YAAY,KAAK,SAAS,SAAS,QAAQ,KAAK;AAAA,MAClF,IAAI,SAAS;AAAA,QAAW,SAAQ,sCAAsC,KAAK,SAAS;AAAA,MACpF,MAAM,MAAM,QAAQ;AAAA,MACpB,MAAM,YAAY,KAAK,QAAQ,aAAa,QAAQ,WAAW,EAAE,MAAM,SAAS,MAAM,CAAC,IACnF,IAAI,SAAS,YAAY,IAAI,OAAO,QAAQ,WAAW,EAAE,MAAM,IAAI,MAAM,CAAC;AAAA,MAC9E,OAAO,GAAG,aAAa,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,IACpD;AAAA,IAEA,IAAI,QAAQ,iBAAiB;AAAA,MAAU,OAAO,YAAY,KAAK,SAAS,IAAI,MAAM,EAAE,KAAK,IAAI;AAAA,IAK7F,IAAI,CAAC,KAAK,SAAS,KAAK,gBAAgB,GAAG;AAAA,MACzC,OAAO,OAAO,KAAK,SAAS,OAAO,CAAC,MAAM,UAAU,iBAAiB,qBAAqB,cAAc,sBAAsB,aAAa,WAAW,cAAc,aAAa,YAAY,CAAC;AAAA,IAChM;AAAA,IACA,OAAO,MAAM,SAAS,KAAK,SAAS,IAAI,YAAY;AAAA,IAGpD,OAAO,GAAG,GAAG,SAAS,CAAC,KAAK,KAAK,GAAG,EAAE,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC;AAAA,IAChF,OAAO,qBAAqB,kBAAkB,UAAU,kBAAkB,UAAU,QAAQ,UAAU,UAAU,sBAAsB,WAAW,MAAM,YAAY,SAAS;AAAA,GAC7K,EAAE,KAAK,EAAE;AAAA;AAIL,SAAS,kBAAkB,CAAC,QAA2F;AAAA,EAC5H,OAAO,UAAU,QAAQ,OAAO,QAAQ,EAAE,IAAI,CAAC,SAAe;AAAA,IAC5D,IAAI,OAAO,SAAS;AAAA,MAAU,OAAO;AAAA,IACrC,IAAI,SAAS,MAAM;AAAA,MACjB,MAAM,SAAS,OAAO,OAAO,OAAO,SAAS,KAAK,MAAM,IAAI,OAAO,QAAQ,KAAK,UAAU;AAAA,MAC1F,IAAI,WAAW;AAAA,QAAW,SAAQ,sCAAsC,KAAK,SAAS;AAAA,MACtF,OAAO,OAAO,OAAO,KAAK,MAAM,OAAO,CAAC;AAAA,IAC1C;AAAA,IACA,IAAI,cAAc;AAAA,MAAM,OAAO,OAAO,OAAO,EAAE,UAAU,OAAO,OAAO,KAAK,SAAS,IAAI,CAAC,aAAa,mBAAmB,KAAK,QAAQ,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;AAAA,IACtJ,OAAO;AAAA,GACR,CAAC;AAAA;AAIG,SAAS,UAAU,CAAC,QAA0F;AAAA,EACnH,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,OAAO,kBAAkB,EAAE,SAAS,OAAO,SAAS,UAAU,OAAO,OAAO,UAAU,CAAC;AAAA,EAC7F,OAAO,EAAE,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAWnC,MAAM,iBAAiB;AAAA,EACnB;AAAA,EACA;AAAA,EACT,WAAW,CAAC,SAA+B,QAA4B;AAAA,IACrE,KAAK,UAAU;AAAA,IACf,KAAK,SAAS;AAAA;AAElB;AAQA,IAAM,qBAAqB,IAAI;AAE/B,SAAS,cAAc,CAAC,SAA+B,QAAkC;AAAA,EACvF,IAAI,CAAC,MAAM,QAAQ,OAAO,KAAK,CAAC,MAAM,QAAQ,QAAQ,GAAG,KAAK,QAAQ,WAAW,OAAO,SAAS,KAAK,QAAQ,KAAK,CAAC,SAAS,OAAO,SAAS,QAAQ,GAAG;AAAA,IACtJ,SAAQ,2BAA2B;AAAA,EACrC;AAAA;AAQK,SAAS,kBAAkB,CAAC,QAAuG;AAAA,EACxI,QAAQ,SAAS,WAAW;AAAA,EAC5B,WAAW,SAAS;AAAA,IAAQ,IAAI,cAAc,KAAK;AAAA,MAAG,OAAO,SAAS,SAAS,GAAG,MAAM;AAAA,EAExF,IAAI,CAAC,mBAAmB,IAAI,OAAO,KAAK,QAAQ,WAAW,OAAO,SAAS;AAAA,IAAG,eAAe,SAAS,MAAM;AAAA,EAC5G,MAAM,YAAY,OAAO,IAAI,CAAC,UAAU,iBAAiB,KAAK,CAAC;AAAA,EAC/D,IAAI,QAAQ;AAAA,EACZ,WAAW,SAAS;AAAA,IAAW,IAAI,sBAAsB,EAAE,MAAM,CAAC,EAAE,SAAS;AAAA,MAAS,QAAQ;AAAA,EAC9F,IAAI;AAAA,IAAO,OAAO,IAAI,iBAAiB,SAAS,SAAS;AAAA,EACzD,MAAM,QAAgB,CAAC;AAAA,EACvB,SAAS,QAAQ,EAAG,QAAQ,QAAQ,QAAQ,SAAS;AAAA,IACnD,MAAM,KAAK,QAAQ,MAAO;AAAA,IAC1B,IAAI,QAAQ,UAAU;AAAA,MAAQ,MAAM,KAAK,OAAO,OAAO,EAAE,OAAO,UAAU,OAAO,CAAC,CAAC;AAAA,EACrF;AAAA,EACA,OAAO,UAAU,KAAK;AAAA;AAIjB,SAAS,kBAAkB,CAAC,QAA6G;AAAA,EAC9I,QAAQ,SAAS,UAAU;AAAA,EAC3B,IAAI,EAAE,iBAAiB;AAAA,IAAmB,OAAO,WAAW,EAAE,SAAS,MAAM,CAAC;AAAA,EAC9E,QAAQ,YAAY;AAAA,EAGpB,MAAM,SAAS,MAAM,OAAO,IAAI,CAAC,UAAU,iBAAiB,KAAK,CAAC;AAAA,EAElE,MAAM,SAAS,mBAAmB,IAAI,OAAO,GAAG,IAAI,OAAO;AAAA,EAC3D,IAAI,WAAW;AAAA,IAAW,OAAO,EAAE,MAAM,QAAQ,OAAO;AAAA,EACxD,MAAM,SAAS,OAAO,SAAS,OAAO;AAAA,EACtC,IAAI,CAAC;AAAA,IAAQ,eAAe,SAAS,MAAM,MAAM;AAAA,EACjD,IAAI,OAAO,QAAQ;AAAA,EACnB,SAAS,QAAQ,EAAG,QAAQ,QAAQ,QAAQ;AAAA,IAAS,QAAQ,QAAQ,YAAY,EAAE,MAAM,CAAC,IAAI,QAAQ;AAAA,EACtG,IAAI,QAAQ;AAAA,IACV,IAAI,YAAY,mBAAmB,IAAI,OAAO;AAAA,IAC9C,IAAI,cAAc,WAAW;AAAA,MAC3B,YAAY,IAAI;AAAA,MAChB,mBAAmB,IAAI,SAAS,SAAS;AAAA,IAC3C;AAAA,IACA,UAAU,IAAI,SAAS,IAAI;AAAA,EAC7B;AAAA,EACA,OAAO,EAAE,MAAM,OAAO;AAAA;AAIjB,SAAS,eAAe,CAAC,QAA4C;AAAA,EAC1E,OAAO,QAAQ,OAAO,QAAQ,EAAE,KAAK,CAAC,SAAS,OAAO,SAAS,cAC3D,SAAS,SAAQ,KAAK,QAAQ,eAAgB,cAAc,SAAQ,KAAK,SAAS,KAAK,CAAC,aAAa,gBAAgB,EAAE,SAAS,CAAC,CAAC,EAAG;AAAA;;AC9U3I,kCAAS;;;ACWF,SAAS,wBAAwB,CAAC,QAAsE;AAAA,EAC7G,MAAM,IAAI,CAAC,SAAyB,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACtE,MAAM,SAAS,EAAE,oBAAoB;AAAA,EACrC,MAAM,OAAO,EAAE,kBAAkB;AAAA,EACjC,MAAM,QAAQ,EAAE,mBAAmB;AAAA,EACnC,MAAM,QAAQ,EAAE,mBAAmB;AAAA,EACnC,MAAM,SAAS,EAAE,oBAAoB;AAAA,EACrC,OAAO,MAAM,IAAI,UAAU,KAAK,MAAM,MAAM,QAAQ,CAAC,QAAQ,MAAM,UAAU,OAAO,QAAQ,QAAQ,MAAM,EAAE,IAAI,CAAC;AAAA,EACjH,MAAM,OAAO,GAAG,UAAU,EAAE,MAAM;AAAA,EAClC,MAAM,QAAQ,GAAG,UAAU,EAAE,OAAO;AAAA,EACpC,OAAO,qBAAqB,6CACxB,kBAAkB,cAClB,eAAe,SAAS,OAAO,aAAa,QAAQ,SAAS,4CAA4C,cAAc,2BACvH,0BAA0B,SAAS,OAAO,aAAa,QAAQ,SAAS,uBAAuB,WAC/F,MAAM,UAAU,SAAS,OAAO,SAAS,SAAS,eAClD,UAAU,SAAS,qBAAqB,SAAS,aAAa,cAAc,sBAC5E,oBAAoB,SAAS,SAAS,SAAS,mBAAmB,UAAU,iBAAiB,SAAS,SAAS,SAAS,SAAS,SAAS,UAC1I,QAAQ,WAAW,cAAc,YAAY,aAAa,SAAS,UAAU,UAAU,YAAY,SAAS,cAAc,UAAU,OACpI,mBAAmB,kBAAkB,mBAAmB,kDAAkD,aAAa,mBAAmB,eAC1I,sBAAsB,OAAO,WAAW,EAAE,MAAM,MAAM,OAAO,YAAY,EAAE,OAAO,SAAS;AAAA;;;AC3B1F,IAAM,iBAAkD,OAAO,OAAO,EAAE,WAAW,IAAI,CAAC;AAGxF,SAAS,oBAAoB,CAAC,QAAoC;AAAA,EACvE,QAAQ,WAAW;AAAA,EACnB,OAAO,OAAO,SAAS,OAAO;AAAA;;;ACRhC,+BAAS,8CAAoB;AA0C7B,IAAM,UAAwG,OAAO,OAAO;AAAA,EAC1H,kBAAkB,EAAE,SAAS,YAAY,MAAM,6CAA6C;AAAA,EAC5F,uBAAuB,EAAE,SAAS,YAAY,MAAM,gFAAgF;AAAA,EACpI,gBAAgB,EAAE,SAAS,UAAU,MAAM,uEAAuE;AACpH,CAAC;AAGM,SAAS,gBAAgB,CAAC,QAA6E;AAAA,EAC5G,MAAM,QAAQ,QAAQ,OAAO;AAAA,EAC7B,IAAI,OAAO,QAAQ,SAAS,MAAM,SAAS;AAAA,IACzC,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,OAAO,OAAO,MAAM,4BAA4B,MAAM,UAAU,CAAC;AAAA,EACxI;AAAA,EACA,OAAO,EAAE,MAAM,MAAM,MAAM,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAIpD,SAAS,iBAAiB,CAAC,QAA4F;AAAA,EAC5H,OAAO,OAAO,OAAO,SAAS,OAAO,KAAK;AAAA;AAa5C,IAAM,wBAAwB;AAUvB,SAAS,sBAAsB,CAAC,QAA0F;AAAA,EAC/H,QAAQ,SAAS,WAAW;AAAA,EAC5B,IAAI,QAAQ,SAAS,YAAY;AAAA,IAC/B,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,4BAA4B,MAAM,8DAA8D,CAAC;AAAA,EACjK;AAAA,EACA,MAAM,UAAU,OAAO,IAAI,CAAC,OAAO,UAAU;AAAA,IAC3C,QAAQ,MAAM,cAAc,MAAM;AAAA,IAClC,IAAI,cAAc;AAAA,MAAW,oBAAmB,EAAE,WAAW,SAAS,QAAQ,KAAK,CAAC;AAAA,IACpF,MAAM,WAAW,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,IAC5C,OAAO,EAAE,OAAO,OAAO,OAAO,cAAc,YAAY,WAAW,GAAG,QAAQ,WAAW,EAAE,MAAM,UAAU,CAAC,KAAK,YAAY,SAAS,CAAC,GAAG,MAAM,OAAO,EAAE;AAAA,GAC1J;AAAA,EACD,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,OAAO,EAAE,MAAM,sBAAsB,QAAQ,YAAY,UAAU,IAAI,KAAK,UAAU,OAAO,CAAC,CAAC,GAAG,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;;;AC9EhJ,sBAAS,sCAAW;AA0Bb,SAAS,qBAAqB,CAAC,QAIpB;AAAA,EAChB,QAAQ,SAAS,OAAO,YAAY;AAAA,EACpC,gBAAgB,EAAE,SAAS,SAAS,kCAAkC,CAAC;AAAA,EACvE,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,SAAS,YAAY;AAAA,IAAM,MAAM,KAAK,SAAS;AAAA,EACnD,MAAM,KAAK,aAAa;AAAA,EACxB,IAAI,SAAS,YAAY;AAAA,IAAM,MAAM,KAAK,SAAS;AAAA,EACnD,IAAI,SAAS,YAAY;AAAA,IAAM,MAAM,KAAK,SAAS;AAAA,EACnD,IAAI,SAAS,aAAa;AAAA,IAAM,MAAM,KAAK,UAAU;AAAA,EACrD,OAAO,EAAE,MAAM,YAAY,MAAM,KAAK,IAAI,MAAM,MAAM,QAAQ,QAAQ,CAAC,GAAG,MAAM,MAAM,GAAG,WAAW,OAAO;AAAA;AAoBtG,IAAM,0BAA2E,OAAO,OAAO;AAAA,EACpG,aAAa;AAAA,EAEb,oBAAoB;AAAA,EAKpB,eAAe;AAAA,EAEf,mBAAmB;AAAA,EAEnB,SAAS;AAAA,EAMT,cAAc;AAAA,EACd,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf,iBAAiB;AAAA,EAKjB,YAAY;AAAA,EAEZ,YAAY;AACd,CAAC;AAGM,IAAM,2BAAqF,OAAO,OAAO;AAAA,EAC9G,UAAU;AAAA,EACV,UAAU;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,QAAwD;AAAA,EAC/E,IAAI,OAAO,QAAQ,SAAS,YAAY;AAAA,IACtC,MAAM,wBAAsB;AAAA,MAC1B,SAAS,OAAO,QAAQ;AAAA,MACxB,SAAS,OAAO;AAAA,MAChB,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA;AAQK,SAAS,sBAAsB,CAAC,QAWrB;AAAA,EAChB,QAAQ,SAAS,OAAO,QAAQ,OAAO,UAAU;AAAA,EACjD,gBAAgB,EAAE,SAAS,SAAS,QAAQ,yBAAyB,CAAC;AAAA,EACtE,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,IAAI,OAAO,wBAAwB;AAAA,EAEnC,IAAI,UAAU,mBAAmB,UAAU,qBAAqB;AAAA,IAC9D,OAAO,KAAK,QAAQ,YAAY,QAAQ,WAAW,EAAE,MAAM,WAAW,EAAE,OAAO,QAAQ,MAAM,UAAU,MAAM,CAAC,EAAE,CAAC,CAAC;AAAA,EACpH;AAAA,EACA,IAAI,UAAU,qBAAqB;AAAA,IACjC,MAAM,UAAU,SAAS;AAAA,IACzB,IAAI,CAAC,OAAO,UAAU,OAAO,KAAK,UAAU,yBAAyB,YAAY,UAAU,yBAAyB,UAAU;AAAA,MAC5H,MAAM,IAAI,YAAU;AAAA,QAClB,MAAM;AAAA,QACN,SAAS,sDAAsD,yBAAyB,gBAAgB,yBAAyB,iBAAiB,OAAO,KAAK;AAAA,QAC9J,MAAM,EAAE,MAAM;AAAA,MAChB,CAAC;AAAA,IACH;AAAA,IACA,OAAO,KAAK,QAAQ,WAAW,UAAU,IAAI,OAAO,CAAC;AAAA,EACvD;AAAA,EACA,IAAI,UAAU,cAAc;AAAA,IAC1B,OAAO,KACJ,QAAQ,SAAS,UAAU,IAAI,WAAW,EAAE,OAAO,OAAO,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC,CAAC,EACrF,QAAQ,WAAW,UAAU,IAAI,OAAO,SAAS,EAAE,CAAC;AAAA,EACzD;AAAA,EACA,IAAI,UAAU,aAAa,UAAU,cAAc;AAAA,IACjD,OAAO,KACJ,QAAQ,kBAAkB,UAAU,IAAI,WAAW,EAAE,OAAO,QAAQ,MAAM,UAAU,MAAM,CAAC,CAAC,CAAC,EAC7F,QAAQ,iBAAiB,UAAU,IAAI,WAAW,EAAE,OAAO,OAAO,MAAM,SAAS,MAAM,CAAC,CAAC,CAAC;AAAA,EAC/F;AAAA,EACA,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAG7D,SAAS,UAAU,CAAC,QAA2F;AAAA,EAC7G,QAAQ,OAAO,MAAM,UAAU;AAAA,EAC/B,IAAI,UAAU,aAAa,MAAM,WAAW,GAAG;AAAA,IAC7C,MAAM,IAAI,YAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,QAAQ,qCAAqC;AAAA,MACtD,MAAM,EAAE,OAAO,UAAU,KAAK;AAAA,IAChC,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;;;ACnLT,kCAAS;;;ACAT,uCAA0B,qFAA0D;AAO7E,IAAM,aAKT,OAAO,OAAO,EAAE,YAAY,mBAAmB,aAAa,UAAU,eAAe,YAAY,aAAa,SAAS,CAAC;AAE5H,IAAM,eAAoI;AAAA,EACxI,QAAQ,EAAE,SAAS,QAAQ,QAAQ,EAAE,MAAM,QAAQ,SAAS,WAAW,kBAAkB,WAAW,MAAM,OAAO,EAAE;AAAA,EACnH,SAAS,EAAE,SAAS,WAAW,QAAQ,EAAE,SAAS,WAAW,MAAM,UAAU,EAAE;AAAA,EAC/E,KAAK,EAAE,SAAS,WAAW,QAAQ,EAAE,SAAS,WAAW,KAAK,WAAW,MAAM,WAAW,UAAU,YAAY,MAAM,WAAW,EAAE;AAAA,EACnI,QAAQ,EAAE,SAAS,UAAU,QAAQ,EAAE,QAAQ,UAAU,MAAM,SAAS,EAAE;AAAA,EAC1E,OAAO,EAAE,SAAS,oBAAoB,QAAQ,EAAE,iBAAiB,oBAAoB,QAAQ,oBAAoB,MAAM,QAAQ,QAAQ,OAAO,EAAE;AAAA,EAChJ,SAAS,EAAE,SAAS,WAAW,QAAQ,EAAE,SAAS,WAAW,SAAS,UAAU,EAAE;AAAA,EAClF,UAAU,EAAE,SAAS,eAAe,QAAQ,EAAE,aAAa,eAAe,uBAAuB,eAAe,WAAW,aAAa,0BAA0B,aAAa,MAAM,OAAO,EAAE;AAChM;AAEA,SAAS,UAAU,CAAC,QAAuC;AAAA,EACzD,IAAI,CAAC,OAAO,QAAQ,aAAa,wBAAwB;AAAA,IACvD,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,yBAAyB,CAAC;AAAA,EACjG;AAAA;AAGF,SAAS,WAAU,CAAC,QAAuD;AAAA,EACzE,IAAI,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,SAAS,MAAI,KAAK,IAAI,YAAY,EAAE,OAAO,OAAO,IAAI,EAAE,SAAS,IAAI;AAAA,IAClJ,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,qFAAqF,CAAC;AAAA,EACpJ;AAAA,EACA,OAAO,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA;AAGxD,SAAS,QAAQ,CAAC,QAAuF;AAAA,EACvG,IAAI,OAAO,WAAW,aAAa,OAAO,WAAW,YAAY,OAAO,WAAW,WAAW;AAAA,IAC5F,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,0BAA0B,MAAM,+DAA+D,CAAC;AAAA,EACvK;AAAA,EACA,OAAO,GAAG,YAAW,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,UAAU,WAAW,YAAY,CAAC,KAAK,YAAW,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,MAAM,CAAC;AAAA;AAGhK,SAAS,KAAK,CAAC,QAA6D;AAAA,EAC1E,OAAO,EAAE,MAAM,OAAO,MAAM,QAAQ,OAAO,UAAU,CAAC,GAAG,WAAW,OAAO;AAAA;AAItE,SAAS,eAAe,CAAC,QAA+D;AAAA,EAC7F,WAAW,MAAM;AAAA,EACjB,OAAO,MAAM,EAAE,MAAM,eAAe,SAAS,MAAM,8BAA8B,CAAC;AAAA;AAI7E,SAAS,cAAc,CAAC,QAA+D;AAAA,EAC5F,WAAW,MAAM;AAAA,EACjB,OAAO,MAAM,EAAE,MAAM,eAAe,SAAS,MAAM,6BAA6B,CAAC;AAAA;AAI5E,SAAS,gBAAgB,GAAG,SAAS,SAAgE;AAAA,EAC1G,WAAW,EAAE,QAAQ,CAAC;AAAA,EACtB,OAAO,MAAM,EAAE,MAAM,eAAe,SAAS,EAAE,SAAS,MAAM,CAAC,+BAA+B,CAAC;AAAA;AAI1F,SAAS,gBAAgB,GAAG,SAAS,SAAgE;AAAA,EAC1G,WAAW,EAAE,QAAQ,CAAC;AAAA,EACtB,OAAO,MAAM,EAAE,MAAM,eAAe,SAAS,EAAE,SAAS,MAAM,CAAC,gCAAgC,CAAC;AAAA;AAI3F,SAAS,mBAAmB,GAAG,SAAS,OAAO,cAIpC;AAAA,EAChB,WAAW,EAAE,QAAQ,CAAC;AAAA,EACtB,MAAM,OAAO,YAAW,EAAE,SAAS,MAAM,cAAc,WAAW,WAAW,CAAC;AAAA,EAC9E,OAAO,MAAM,EAAE,MAAM,eAAe,WAAW,SAAS,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC;AAAA;AAQ1E,SAAS,mBAAmB,CAAC,QAAyD;AAAA,EAC3F,WAAW,MAAM;AAAA,EACjB,QAAQ,UAAU;AAAA,EAClB,MAAM,UAAU,OAAO,MAAM,SAAS,YAAY,OAAO,OAAO,cAAc,MAAM,IAAI,IACpF,aAAa,MAAM,QAA4B;AAAA,EACnD,IAAI,YAAY,aAAa,CAAC,MAAM,UAAU,CAAC,MAAM,eAAe;AAAA,IAClE,IAAI,MAAM,eAAe;AAAA,MAAW,OAAO,QAAQ;AAAA,IACnD,MAAM,QAAQ,wDAAwD,KAAK,MAAM,WAAW,KAAK,CAAC;AAAA,IAClG,MAAM,OAAO,QAAQ,IAAI,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAAA,IACzD,MAAM,SAAS,SAAS,aAAa,OAAO,OAAO,QAAQ,QAAQ,IAAI,IAAI,QAAQ,OAAO,QAAQ;AAAA,IAClG,IAAI,WAAW;AAAA,MAAW,OAAO;AAAA,EACnC;AAAA,EACA,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,0BAA0B,MAAM,gDAAgD,MAAM,OAAO,CAAC;AAAA;AAGrK,SAAS,cAAc,CAAC,QAA2E;AAAA,EACjG,WAAW,MAAM;AAAA,EACjB,yBAAyB,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ,KAAK,CAAC;AAAA,EAChF,oBAAoB,EAAE,QAAQ,OAAO,OAAO,CAAC;AAAA,EAC7C,MAAM,QAAQ,OAAO,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,OAAO,KAAK;AAAA,EAC9E,IAAI,UAAU,aAAa,MAAM,QAAQ,aAAa,MAAM,QAAQ,eAAe;AAAA,IACjF,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,0DAA0D,MAAM,EAAE,OAAO,OAAO,MAAM,EAAE,CAAC;AAAA,EACvJ;AAAA,EACA,OAAO;AAAA;AASF,SAAS,kBAAkB,CAAC,QAA4F;AAAA,EAC7H,MAAM,QAAQ,eAAe,MAAM;AAAA,EACnC,OAAO,UAAU,EAAE,SAAS,OAAO,SAAS,QAAQ,OAAO,QAAQ,UAAW,OAAO,YAAY,YAAY,CAAC,IAAI,EAAE,SAAS,OAAO,QAAQ,EAAG,CAAC;AAAA;AAGlJ,SAAS,SAAS,CAAC,QAA6F;AAAA,EAC9G,QAAQ,SAAS,QAAQ,UAAU;AAAA,EACnC,MAAM,QAAQ,OAAO,YAAY,YAAY,KAAK,GAAG,YAAW,EAAE,SAAS,MAAM,OAAO,QAAQ,CAAC;AAAA,EACjG,MAAM,OAAO,MAAM;AAAA,EACnB,IAAI,SAAS;AAAA,IAAQ,OAAO;AAAA,EAC5B,IAAI,OAAO,SAAS,YAAY,WAAW,MAAM;AAAA,IAC/C,OAAO,OAAO,QAAQ,KAAK,KAAK,EAAE,IAAI,EAAE,MAAM,SAAS;AAAA,MACrD,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AAAA,MAC9D,MAAM,SAAS,YAAW,EAAE,SAAS,MAAM,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,MACvE,MAAM,eAAe,oBAAoB,EAAE,SAAS,MAAM,CAAC;AAAA,MAG3D,OAAO,IAAI,QAAQ,oCAAoC,WAAW,gBAAgB,IAAI,yBAAyB;AAAA,KAChH,EAAE,KAAK,OAAO;AAAA,EACjB;AAAA,EACA,IAAI,OAAO,SAAS,YAAY,aAAa,MAAM;AAAA,IACjD,MAAM,WAAW,MAAM,UAAU,KAAK,CAAC,UAAU,MAAM,SAAS,KAAK,OAAO;AAAA,IAC5E,MAAM,SAAS,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,SAAS,WAAW;AAAA,IAChF,MAAM,QAAQ,YAAW,EAAE,SAAS,MAAM,WAAW,YAAY,CAAC;AAAA,IAClE,MAAM,QAAQ,YAAW,EAAE,SAAS,MAAM,OAAO,WAAW,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,IACxF,MAAM,OAAO,SAAS,OAAQ,IAAI,CAAC,MAAM,UAAU;AAAA,MACjD,MAAM,aAAa,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AAAA,MACnE,MAAM,cAAc,OAAO,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,SAAS,WAAY,MAAM;AAAA,MAC5F,OAAO,IAAI,SAAS,YAAW,EAAE,SAAS,MAAM,YAAY,UAAU,YAAY,KAAK,CAAC,OAAO,SAAS,YAAW,EAAE,SAAS,MAAM,WAAW,UAAU,WAAW,KAAK,CAAC;AAAA,KAC3K,EAAE,KAAK,OAAO;AAAA,IACf,OAAO,yBAAyB,SAAS,EAAE,SAAS,OAAO,OAAO,UAAU,OAAO,KAAK,CAAC,QAAQ,eAAe;AAAA,EAClH;AAAA,EACA,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,8CAA8C,CAAC;AAAA;AAItG,SAAS,eAAe,CAAC,QAMd;AAAA,EAChB,MAAM,QAAQ,eAAe,MAAM;AAAA,EACnC,MAAM,aAAa,UAAU,EAAE,SAAS,OAAO,SAAS,QAAQ,OAAO,QAAQ,MAAM,CAAC;AAAA,EACtF,MAAM,OAAO,YAAW,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,cAAc,WAAW,WAAW,CAAC;AAAA,EACrG,MAAM,QAAQ,SAAS,EAAE,SAAS,OAAO,SAAS,OAAO,MAAM,UAAU,MAAM,MAAM,QAAQ,OAAO,aAAa,CAAC;AAAA,EAClH,OAAO,MAAM,EAAE,MAAM,iBAAiB,WAAW,gDAAgD,2BAA2B,cAAc,CAAC;AAAA;AAgBtI,SAAS,gBAAgB,CAAC,QAOf;AAAA,EAChB,WAAW,MAAM;AAAA,EACjB,MAAM,QAAQ,OAAO,SAAS,aAAa,OAAO,aAAa,QAAQ,OAAO,YAAY;AAAA,EAC1F,IAAI,qBAAqB,EAAE,SAAS,OAAO,QAAQ,CAAC,EAAE,WAAW,KAAM,OAAO,KAAK,OAAO,OAAO,EAAE,WAAW,KAAK,CAAC,SAClH,OAAO,OAAO,WAAW,YAAY,OAAO,WAAW,QAAQ,MAAM,QAAQ,OAAO,MAAM,GAAG;AAAA,IAC7F,MAAM,IAAI,gBAAgB,EAAE,QAAQ,UAAU,CAAC;AAAA,EACjD;AAAA,EACA,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,QAAkB,CAAC;AAAA,EACzB,IAAI,OAAO,SAAS;AAAA,IAAW,MAAM,KAAK,sBAAsB,UAAU,IAAI,cAAc,EAAE,MAAM,OAAO,KAAK,CAAC,CAAC,UAAU;AAAA,EAC5H,YAAY,KAAK,SAAS,OAAO,QAAQ,OAAO,OAAO,GAAG;AAAA,IACxD,IAAI,CAAC,OAAO,OAAO,OAAO,QAAQ,GAAG;AAAA,MAAG,MAAM,IAAI,gBAAgB,EAAE,QAAQ,WAAW,IAAI,CAAC;AAAA,IAC5F,MAAM,QAAQ,OAAO,OAAO;AAAA,IAC5B,IAAK,UAAU,QAAQ,CAAC,KAAK,YAAc,UAAU,SAAS,OAAO,UAAU,YAAY,MAAM,WAAW,KAAK,MAAM,SAAS,MAAI,IAAK;AAAA,MACvI,MAAM,IAAI,gBAAgB,EAAE,QAAQ,WAAW,IAAI,CAAC;AAAA,IACtD;AAAA,IACA,MAAM,KAAK,cAAc,UAAU,IAAI,GAAG,WAAW,gBAAgB,KAAK,MAAM,UAAU,IAAI,SAAS,EAAE,UAAU;AAAA,EACrH;AAAA,EACA,WAAW,OAAO,QAAQ,QAAQ,OAAO,MAAM,GAAG;AAAA,IAChD,IAAI,OAAO,QAAQ,YAAY,CAAC,OAAO,OAAO,OAAO,SAAS,GAAG;AAAA,MAAG,MAAM,IAAI,gBAAgB,EAAE,QAAQ,UAAU,CAAC;AAAA,EACrH;AAAA,EACA,IAAI,OAAO,aAAa;AAAA,IAAM,MAAM,KAAK,iDAAiD;AAAA,EAC1F,IAAI,OAAO,YAAY,MAAM;AAAA,IAC3B,MAAM,KACJ,wCAAwC,YAAW,EAAE,SAAS,OAAO,SAAS,MAAM,aAAa,CAAC,KAClG,kHAAkH,YAAW,EAAE,SAAS,OAAO,SAAS,MAAM,eAAe,CAAC,GAChL;AAAA,EACF;AAAA,EACA,OAAO,MAAM,EAAE,MAAM,UAAU,MAAM,KAAK,IAAI,KAAK,QAAQ,UAAU,OAAO,CAAC;AAAA;AAG/E,SAAS,aAAa,CAAC,QAAkC;AAAA,EACvD,IAAI,OAAO,OAAO,SAAS,YAAY,OAAO,KAAK,KAAK,EAAE,WAAW,KAAK,OAAO,KAAK,SAAS,MAAI,GAAG;AAAA,IACpG,MAAM,IAAI,YAAU,EAAE,MAAM,eAAe,SAAS,kEAAkE,CAAC;AAAA,EACzH;AAAA,EACA,OAAO,OAAO;AAAA;AAIT,SAAS,aAAa,CAAC,QAA8D;AAAA,EAC1F,WAAW,MAAM;AAAA,EACjB,MAAM,OAAO,cAAc,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,EAChD,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,OAAO,MAAM,EAAE,MAAM,6BAA6B,UAAU,IAAI,IAAI,YAAY,QAAQ,UAAU,OAAO,CAAC;AAAA;;;ADlOrG,IAAM,0BAA2C;AAGxD,IAAM,gBASF,OAAO,OAAO;AAAA,EAChB,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBV,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaf,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBf,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeR,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcV,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBP,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeV,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaZ,CAAC;AAMM,IAAM,6BACX,OAAO,OAAO,CAAC,YAAY,iBAAiB,iBAAiB,UAAU,YAAY,SAAS,YAAY,UAAU,CAAU;AAiB9H,IAAM,oBAA4B;AAAA,EAAW,2BAA2B,IACtE,CAAC,QAAQ;AAAA,EAAuC,cAAc;AAAA,aAAoB,MACpF,EAAE,KAAK;AAAA,CAAK;AAGL,IAAM,oBAaT,OAAO,OAAO;AAAA,EAChB,UAAU,cAAc;AAAA,EACxB,eAAe,cAAc;AAAA,EAC7B,eAAe,cAAc;AAAA,EAC7B,QAAQ,cAAc;AAAA,EACtB,UAAU,cAAc;AAAA,EAIxB,aAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAYb,OAAO,cAAc;AAAA,EACrB,UAAU,cAAc;AAAA,EACxB,UAAU,cAAc;AAAA,EACxB,SAAS;AAAA,EAET,gBAAgB;AAAA,EAChB,eAAe;AACjB,CAAC;AAKD,SAAS,WAAU,CAAC,QAAuC;AAAA,EACzD,IAAI,CAAC,OAAO,QAAQ,aAAa,wBAAwB;AAAA,IACvD,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,yBAAyB,CAAC;AAAA,EACjG;AAAA;AAIK,SAAS,uBAAuB,CAAC,QAItB;AAAA,EAChB,YAAW,MAAM;AAAA,EACjB,MAAM,SAAS,OAAO,UAAU,kBAAkB,CAAC,OAAO,cAAc,EAAE,IACtE,CAAC,WAAW,aAAa,WAAW,YAAY,uBAAuB;AAAA,EAC3E,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,QAAQ,IAAI;AAAA,EAClB,MAAM,OAAO,kBAAkB,OAAO,OAAO,QAAQ,YAAY,CAAC,MAAM,UAAkB;AAAA,IACxF,IAAI,cAAc,MAAM,IAAI,IAAI;AAAA,IAChC,IAAI,gBAAgB,WAAW;AAAA,MAC7B,cAAc,UAAU,IAAI,OAAO,OAAO,KAAK,IAAI,EAAE;AAAA,MACrD,MAAM,IAAI,MAAM,WAAW;AAAA,IAC7B;AAAA,IACA,OAAO;AAAA,GACR;AAAA,EACD,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAItD,SAAS,mBAAmB,CAAC,QAA0F;AAAA,EAC5H,YAAW,MAAM;AAAA,EACjB,MAAM,OAAO,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,EAC7D,MAAM,SAAS,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,WAAW,WAAW,WAAW,cAAc,UAAU,CAAC;AAAA,EAClH,MAAM,OAAO,OAAO,WAAW,WAC3B,qBAAqB,cAAc,UAAU,yBAC7C,cAAc,UAAU;AAAA,EAC5B,OAAO,EAAE,MAAM,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAIxC,SAAS,mBAAmB,CAAC,QAAqF;AAAA,EACvH,YAAW,MAAM;AAAA,EACjB,MAAM,OAAO,OAAO,UAAU,SAC1B,mHACA,OAAO,UAAU,UACf,0DACA;AAAA,EACN,OAAO,EAAE,MAAM,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;;;AElQ/C,+BAAS,sCAAoB,yCAAe;;;ACJrC,SAAS,iBAAiB,CAAC,QAAiC;AAAA,EACjE,OAAO,OAAO,IAAI,WAAW,MAAM,MAAM,EAAE,WAAW,KAAK,KAAK,EAAE,WAAW,KAAK,KAAK;AAAA;AAIlF,SAAS,eAAe,CAAC,QAAiC;AAAA,EAC/D,OAAO,IAAI,kBAAkB,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA;AAI3C,SAAS,iBAAiB,CAAC,QAAiC;AAAA,EACjE,OAAO,GAAG,kBAAkB,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA;AAI1C,SAAS,eAAe,CAAC,QAAiC;AAAA,EAC/D,OAAO,IAAI,kBAAkB,EAAE,KAAK,OAAO,IAAI,CAAC;AAAA;AAS3C,SAAS,iBAAiB,CAAC,QAAiC;AAAA,EACjE,OAAO,OAAO,IAAI,QAAQ,UAAU,CAAC,SAAS,IAAI,OAAO;AAAA;AAQpD,SAAS,kBAAkB,CAAC,QAIxB;AAAA,EACT,QAAQ,UAAU,IAAI,UAAU;AAAA,EAChC,IAAI,aAAa,QAAQ;AAAA,IACvB,MAAM,QAAQ,kBAAkB,EAAE,KAAK,MAAM,CAAC;AAAA,IAC9C,OAAO,OAAO,aAAa,IAAI,WAAW,OAAO,eAAe,GAAG,WAAW,IAAI;AAAA,EACpF;AAAA,EACA,OAAO,OAAO,aACV,gBAAgB,EAAE,KAAK,MAAM,CAAC,IAC9B,OAAO,eACL,kBAAkB,EAAE,KAAK,MAAM,CAAC,IAChC,gBAAgB,EAAE,KAAK,MAAM,CAAC;AAAA;AAiB/B,SAAS,6BAA6B,CAAC,QAIlC;AAAA,EACV,OAAO,OAAO,aAAa,YAAY,OAAO,OAAO,gBAAgB,CAAC,OAAO;AAAA;;;ACrE/E,0BAAS,yCAAe;AAexB,IAAM,iBAGF,OAAO,OAAO;AAAA,EAChB,WAAW,OAAO,OAAO;AAAA,IACvB,QAAQ;AAAA,IACR,aAAa;AAAA,IACb,OAAO;AAAA,IACP,UAAU;AAAA,EACZ,CAAC;AAAA,EACD,MAAM,OAAO,OAAO,EAAE,MAAM,IAAI,QAAQ,WAAW,YAAY,eAAe,CAAC;AACjF,CAAC;AAGM,SAAS,eAAe,CAAC,QAAmC;AAAA,EACjE,QAAQ,UAAU,SAAS,OAAO;AAAA,EAClC,OAAO,GAAG,eAAe,UAAU,YAAY,eAAe,KAAK;AAAA;AAa9D,SAAS,mBAAmB,CAAC,QAA+D;AAAA,EACjG,QAAQ,SAAS,SAAS;AAAA,EAC1B,MAAM,SAAS,QAAQ;AAAA,EACvB,IAAI,WAAW,MAAM;AAAA,IACnB,IAAI,KAAK,aAAa,YAAY,KAAK,SAAS;AAAA,MAAQ,OAAO;AAAA,IAC/D,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,KAAK,gBAAgB,EAAE,KAAK,CAAC;AAAA,MACtC,MAAM,GAAG,QAAQ;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EACA,MAAM,eAAe,OAAO,UAAU,KAAK;AAAA,EAC3C,IAAI,iBAAiB,WAAW;AAAA,IAC9B,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,OAAO,gBAAgB,EAAE,MAAM,KAAK,MAAM,MAAM,OAAO,EAAE,CAAC;AAAA,MACnE,MAAM,GAAG,QAAQ,qBAAqB,OAAO,KAAK,OAAO,SAAS,EAAE,KAAK,IAAI;AAAA,IAC/E,CAAC;AAAA,EACH;AAAA,EACA,MAAM,WAAW,OAAO,KAAK,KAAK;AAAA,EAClC,IAAI,aAAa,WAAW;AAAA,IAC1B,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,QAAQ,KAAK;AAAA,MACtB,MAAM,GAAG,QAAQ,qBAAqB,OAAO,KAAK,OAAO,IAAI,EAAE,KAAK,IAAI;AAAA,IAC1E,CAAC;AAAA,EACH;AAAA,EAGA,IAAI,KAAK,OAAO,WAAW;AAAA,IACzB,IAAI,KAAK,GAAG,WAAW;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,yCAAyC,CAAC;AAAA,IACnG,MAAM,SAAS,KAAK,GAAG,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,IAC5E,OAAO,GAAG,mBAAmB,SAAS;AAAA,EACxC;AAAA,EACA,MAAM,QAAQ,KAAK,SAAS,SAAS,OAAO,QAAQ,KAAK,YAAY;AAAA,EACrE,OAAO,SAAS,GAAG,eAAe;AAAA;AAM7B,IAAM,sBAGT,OAAO,OAAO;AAAA,EAChB,QAAQ,OAAO,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,KAAK,MAAM,MAAM,GAAG,CAAC;AAAA,EAChE,MAAM,OAAO,OAAO,EAAE,KAAK,EAAE,KAAK,KAAK,KAAK,KAAK,KAAK,EAAE,CAAC;AAC3D,CAAC;AAGD,SAAS,WAAW,CAAC,KAAuD;AAAA,EAC1E,OAAO,SAAS;AAAA;AAWX,SAAS,kBAAkB,CAAC,QAIjB;AAAA,EAChB,QAAQ,SAAS,WAAW,cAAc;AAAA,EAC1C,MAAM,YAAY,QAAQ;AAAA,EAC1B,IAAI,cAAc,MAAM;AAAA,IACtB,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,MACT,MACE,QAAQ,SAAS,UACb,oHACA,GAAG,QAAQ;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EACA,MAAM,OAAyB,UAAU;AAAA,EACzC,MAAM,MAAM,SAAS,cAAc,UAAU,YAAY,UAAU,QAAQ,UAAU;AAAA,EACrF,MAAM,MAAM,UAAU;AAAA,EACtB,MAAM,OAAO,YAAY,GAAG,IACxB,GAAG,UAAU,IAAI,IAAI,IAAI,SAAS,CAAC,IAAI,UAAU,QAAQ,WACzD,GAAG,UAAU,IAAI,OAAO,YAAY,EAAE,OAAO,IAAI,SAAS,MAAM,UAAU,CAAC,CAAC,CAAC,IAAI,UAAU,QAAQ,WACnG,GAAG,UAAU,IAAI,OAAO,YAAY,EAAE,OAAO,IAAI,UAAU,MAAM,WAAW,CAAC,CAAC,CAAC,IAAI,UAAU,QAAQ;AAAA,EAGzG,MAAM,aACJ,UAAU,SAAS,WACf,OAAO,QAAQ,WAAW,EAAE,MAAM,4BAA4B,CAAC,MAC/D;AAAA,EACN,OAAO;AAAA,IACL,MAAM,UAAU,MAAM,QAAQ;AAAA,IAC9B,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;AAQK,SAAS,mBAAmB,CAAC,QAA4H;AAAA,EAC9J,QAAQ,SAAS,MAAM,SAAS;AAAA,EAChC,MAAM,YAAY,QAAQ;AAAA,EAC1B,IAAI,cAAc;AAAA,IAAM,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,iBAAiB,CAAC;AAAA,EACxG,IAAI,SAAS,eAAe,SAAS;AAAA,IAAU,MAAM,eAAc,EAAE,SAAS,iDAAiD,CAAC;AAAA,EAChI,IAAI,KAAK,KAAK,CAAC,QAAQ,OAAO,QAAQ,YAAY,MAAM,oBAAoB,OAAO,OAAO,MAAM,oBAAoB,OAAO,GAAG,GAAG;AAAA,IAC/H,MAAM,eAAc,EAAE,SAAS,oDAAoD,CAAC;AAAA,EACtF;AAAA,EACA,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,UAAU,UAAU,IAAI,KAAK,UAAU,KAAK,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC;AAAA,EAC/E,MAAM,MAAM,SAAS,cAAc,UAAU,YAAY,UAAU,QAAQ;AAAA,EAC3E,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,eAAe,CAAC;AAAA,EACzD,MAAM,MAAM,QAAQ,WAAW,EAAE,MAAM,MAAM,CAAC;AAAA,EAC9C,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,UAAU,CAAC;AAAA,EACpD,OAAO;AAAA,IACL,MAAM,UAAU,MAAM,SAAS,MAAM,UAAU,QAAQ,0CAA0C,4CAA4C,SAAS,QAAQ,mBAAmB,SAAS;AAAA,IAC1L,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;AAIF,SAAS,WAAW,CAAC,QAAiD;AAAA,EACpE,QAAQ,OAAO,SAAS;AAAA,EACxB,IACE,CAAC,OAAO,UAAU,KAAK,KACvB,QAAQ,oBAAoB,KAAK,OACjC,QAAQ,oBAAoB,KAAK,KACjC;AAAA,IACA,MAAM,eAAc;AAAA,MAClB,SAAS,iBAAiB,sCAAsC,OAAO,KAAK;AAAA,MAC5E,MAAM,EAAE,MAAM,MAAM;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;;;ACjMT,6CAAgC,8BAAW,yCAAe;AAiB1D,IAAM,iBAAyB;AAGxB,SAAS,cAAc,CAAC,QAA2E;AAAA,EACxG,OAAO,OAAO,OAAO,UAAU,YAAY,eAAe,KAAK,OAAO,KAAK;AAAA;AAgBtE,SAAS,oBAAoB,CAAC,QAAmH;AAAA,EACtJ,QAAQ,SAAS,WAAW,eAAe;AAAA,EAC3C,IAAI,CAAC,QAAQ,aAAa,gBAAgB;AAAA,IACxC,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,IAAI,CAAC,sBAAsB,SAAS,WAAW,IAAI,GAAG;AAAA,IACpD,MAAM,eAAc,EAAE,SAAS,gCAAgC,KAAK,UAAU,WAAW,IAAI,IAAI,CAAC;AAAA,EACpG;AAAA,EACA,IAAI,CAAC,eAAe,EAAE,OAAO,WAAW,SAAS,CAAC,GAAG;AAAA,IACnD,MAAM,IAAI,YAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,aAAa,KAAK,UAAU,WAAW,QAAQ;AAAA,MACxD,MAAM,EAAE,UAAU,WAAW,SAAS;AAAA,IACxC,CAAC;AAAA,EACH;AAAA,EACA,MAAM,OAAO,QAAQ,mBAAmB,EAAE,OAAO,WAAW,KAAK,CAAC;AAAA,EAClE,MAAM,OAAO,QAAQ,mBAAmB,EAAE,OAAO,WAAW,SAAS,CAAC;AAAA,EACtE,QAAQ,WAAW;AAAA,IACjB,KAAK;AAAA,MACH,OAAO,cAAc,SAAS,cAAc;AAAA,IAC9C,KAAK;AAAA,MACH,OAAO,eAAe,SAAS,iCAAiC;AAAA,IAClE;AAAA,MACE,MAAM,eAAc,EAAE,SAAS,mCAAmC,KAAK,UAAU,WAAW,OAAO,IAAI,CAAC;AAAA;AAAA;;;AChD9G,kCAAS;AAMT,IAAM,uBAAoE,OAAO,OAAO;AAAA,EACtF,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EAEV,MAAM;AAAA,EACN,OAAO;AACT,CAAC;AAOD,IAAM,uBAAyD,OAAO,OAAO;AAAA,EAC3E,MAAM;AAAA,EACN,SAAS;AAAA,EACT,kBAAkB;AAAA,EAClB,MAAM;AAAA,EACN,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EAEP,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,MAAM;AAAA,EACN,SAAS;AAAA,EACT,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,SAAS;AAAA,EACT,SAAS;AAAA,EACT,MAAM;AAAA,EACN,WAAW;AAAA,EACX,0BAA0B;AAAA,EAC1B,aAAa;AAAA,EACb,uBAAuB;AAAA,EACvB,MAAM;AAAA,EACN,MAAM;AAAA,EACN,qBAAqB;AAAA,EACrB,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,OAAO;AACT,CAAC;AASM,SAAS,4BAA4B,CAAC,QAA4E;AAAA,EACvH,QAAQ,SAAS,WAAW;AAAA,EAC5B,IAAI,OAAO,SAAS,QAAQ;AAAA,IAC1B,IAAI,OAAO,aAAa;AAAA,MAAW,OAAO;AAAA,IAC1C,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,SAAS,KAAK,CAAC;AAAA,IAC9D,OAAO,OAAO,SAAS,cAAc,YAAY,OAAO,GAAG,QAAQ,WAAW,EAAE,MAAM,OAAO,SAAS,UAAU,CAAC,KAAK;AAAA,EACxH;AAAA,EACA,MAAM,SAAS,OAAO,eAAe,YACjC,YACA,qBAAqB,OAAO,WAAW,YAAY,EAAE,QAAQ,cAAc,EAAE,EAAE,QAAQ,QAAQ,EAAE;AAAA,EACrG,MAAM,OAAO,OAAO,eAAe,YAAY,qBAAqB,OAAO,QAAQ;AAAA,EACnF,OAAO,SAAS,OAAO,YAAY;AAAA;AAW9B,SAAS,0BAA0B,CAAC,QAAgE;AAAA,EACzG,QAAQ,SAAS,WAAW;AAAA,EAC5B,MAAM,OAAO,6BAA6B,EAAE,SAAS,OAAO,CAAC;AAAA,EAC7D,IAAI,SAAS,WAAW;AAAA,IACtB,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,iCAAiC,OAAO,OAAO,OAAO,eAAe,YAAY,KAAK,QAAQ,OAAO;AAAA,MAC9G,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;AAgBF,SAAS,uBAAuB,CAAC,QAAwD;AAAA,EAC9F,OAAO,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,cAAc,OAAO,eAAe,SAAS;AAAA;AAkB/F,SAAS,6BAA6B,CAAC,QAA4E;AAAA,EACxH,QAAQ,SAAS,WAAW;AAAA,EAC5B,IAAI,OAAO,SAAS;AAAA,IAAQ,OAAO,OAAO,YAAY,KAAK,EAAE,YAAY,MAAM,SAAS,eAAe;AAAA,EACvG,OAAO,6BAA6B,EAAE,SAAS,OAAO,CAAC;AAAA;AAUlD,SAAS,2BAA2B,CAAC,QAAgE;AAAA,EAC1G,QAAQ,SAAS,WAAW;AAAA,EAC5B,MAAM,OAAO,8BAA8B,EAAE,SAAS,OAAO,CAAC;AAAA,EAC9D,IAAI,SAAS,WAAW;AAAA,IACtB,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,2BAA2B,OAAO,OAAO,OAAO,eAAe,YAAY,KAAK,QAAQ,OAAO;AAAA,MACxG,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,OAAO;AAAA;;;AJ3GF,SAAS,eAAe,CAAC,QAAyK;AAAA,EACvM,QAAQ,SAAS,cAAc;AAAA,EAC/B,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,QAAQ,UAAU;AAAA,IAChB,KAAK,cAAc;AAAA,MAIjB,IAAI,kBAAkB,SAAS;AAAA,QAAG,OAAO,iBAAiB,EAAE,SAAS,OAAO,UAAU,MAAM,CAAC;AAAA,MAC7F,IAAI,UAAU,UAAU;AAAA,QAA4B,OAAO,uBAAuB,EAAE,SAAS,QAAQ,UAAU,OAAO,CAAC;AAAA,MACvH,IAAI,UAAU,UAAU,mBAAmB;AAAA,QACzC,OAAO,sBAAsB;AAAA,UAC3B;AAAA,UACA,OAAO,gBAAgB,EAAE,SAAS,WAAW,UAAU,UAAU,CAAC;AAAA,aAC9D,UAAU,YAAY,YAAY,CAAC,IAAI,EAAE,SAAS,UAAU,QAAQ;AAAA,QAC1E,CAAC;AAAA,MACH;AAAA,MACA,OAAO,uBAAuB,EAAE,YAAY,UAAU,CAAC;AAAA,IACzD;AAAA,IACA,KAAK;AAAA,MACH,OAAO,aAAa,EAAE,SAAS,WAAW,UAAU,CAAC;AAAA,IACvD,KAAK;AAAA,MACH,OAAO,oBAAoB,EAAE,SAAS,MAAM,UAAU,MAAM,MAAM,UAAU,KAAK,CAAC;AAAA,IACpF,KAAK;AAAA,MACH,OAAO,mBAAmB,EAAE,SAAS,WAAW,UAAU,CAAC;AAAA,IAC7D,KAAK;AAAA,MACH,OAAO,aAAa,EAAE,SAAS,WAAW,UAAU,CAAC;AAAA,IACvD,KAAK;AAAA,MACH,OAAO,aAAa,EAAE,SAAS,WAAW,UAAU,CAAC;AAAA,IACvD,KAAK;AAAA,MACH,OAAO,aAAa,EAAE,SAAS,WAAW,UAAU,CAAC;AAAA,IACvD,KAAK;AAAA,MACH,OAAO,YAAY,EAAE,SAAS,WAAW,UAAU,CAAC;AAAA,IACtD,KAAK;AAAA,MAAgB,OAAO,wBAAwB,EAAE,YAAY,UAAU,CAAC;AAAA,IAC7E,KAAK;AAAA,MAAiB,OAAO,oBAAoB,EAAE,YAAY,UAAU,CAAC;AAAA,IAC1E,KAAK;AAAA,MAAiB,OAAO,oBAAoB,EAAE,YAAY,UAAU,CAAC;AAAA,IAC1E,KAAK;AAAA,MACH,OAAO,gBAAgB,EAAE,SAAS,OAAO,UAAU,MAAM,CAAC;AAAA,IAC5D,KAAK;AAAA,MACH,OAAO,eAAe,EAAE,SAAS,OAAO,UAAU,MAAM,CAAC;AAAA,IAC3D,KAAK;AAAA,MACH,OAAO,iBAAiB,EAAE,SAAS,OAAO,UAAU,MAAM,CAAC;AAAA,IAC7D,KAAK;AAAA,MACH,OAAO,iBAAiB,EAAE,SAAS,OAAO,UAAU,MAAM,CAAC;AAAA,IAC7D,KAAK;AAAA,MACH,OAAO,oBAAoB,EAAE,SAAS,OAAO,UAAU,OAAO,YAAY,UAAU,WAAW,CAAC;AAAA,IAClG,KAAK;AAAA,MACH,OAAO,gBAAgB,EAAE,YAAY,UAAU,CAAC;AAAA,IAClD,KAAK;AAAA,MACH,OAAO,iBAAiB,EAAE,YAAY,UAAU,CAAC;AAAA,IACnD,KAAK;AAAA,MACH,OAAO,cAAc,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA;AAAA;AAM5D,SAAS,QAAQ,CAAC,SAAqB,QAAwB;AAAA,EAC7D,IAAI,OAAO,aAAa,WAAW;AAAA,IACjC,IAAI,OAAO,SAAS,SAAS,KAAK,OAAO,SAAS,KAAK,CAAC,WAAW,OAAO,aAAa,SAAS,GAAG;AAAA,MACjG,MAAM,eAAc,EAAE,SAAS,4DAA4D,CAAC;AAAA,IAC9F;AAAA,IACA,OAAO,YAAY,OAAO,SAAS,IAAI,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,EACzF;AAAA,EACA,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,EACrD,MAAM,MAAM,OAAO,UAAU,YAAY,OAAO,GAAG,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,CAAC,KAAK;AAAA,EAGjG,IAAI,OAAO,aAAa;AAAA,IAAW,OAAO,qBAAqB,EAAE,SAAS,WAAW,KAAK,YAAY,OAAO,SAAS,CAAC;AAAA,EACvH,IAAI,OAAO,aAAa;AAAA,IAAW,OAAO,eAAe,EAAE,SAAS,WAAW,KAAK,KAAK,OAAO,SAAS,CAAC;AAAA,EAC1G,IAAI,OAAO,gBAAgB;AAAA,IAAM,OAAO,QAAQ,kBAAkB,EAAE,QAAQ,IAAI,CAAC;AAAA,EAGjF,IAAI,OAAO,aAAa,MAAM;AAAA,IAC5B,IAAI,QAAQ,SAAS,UAAU;AAAA,MAC7B,MAAM,eAAc,EAAE,SAAS,gDAAgD,CAAC;AAAA,IAClF;AAAA,IACA,OAAO,QAAQ;AAAA,EACjB;AAAA,EAEA,IAAI,OAAO,cAAc,WAAW;AAAA,IAClC,IAAI,QAAQ,SAAS,YAAY;AAAA,MAC/B,MAAM,eAAc,EAAE,SAAS,gDAAgD,CAAC;AAAA,IAClF;AAAA,IACA,OAAO,GAAG,QAAQ,OAAO;AAAA,EAC3B;AAAA,EACA,OAAO;AAAA;AAkBT,SAAS,aAAa,CAAC,QAAgE;AAAA,EACrF,QAAQ,WAAW,WAAW;AAAA,EAE9B,IAAI,OAAO,aAAa;AAAA,IAAW,OAAO,KAAK,QAAQ,UAAU,OAAO,SAAS,IAAI,CAAC,WAAW,cAAc,EAAE,WAAW,QAAQ,OAAO,CAAC,CAAC,EAAE;AAAA,EAC/I,IAAI,OAAO,UAAU,aAAa,OAAO,aAAa,QAAQ,OAAO,cAAc,aAAa,OAAO,aAAa,aAAa,OAAO,aAAa;AAAA,IAAW,OAAO;AAAA,EACvK,MAAM,UAAU,UAAU,QAAQ,KAChC,CAAC,eAAe,UAAU,SAAS,UAAU,UAAU,OAAO,SAAS,UAAU,cAAc,aAAa,UAAU,UAAU,UAClI;AAAA,EACA,OAAO,UAAU,KAAK,QAAQ,OAAO,UAAU,MAAM,SAAS,UAAU,MAAM,KAAK,IAAI;AAAA;AASzF,SAAS,YAAY,CAAC,SAAqB,MAA6B;AAAA,EACtE,IAAI,KAAK,YAAY,UAAU,QAAQ,kBAAkB;AAAA,IAAI,OAAO,QAAQ;AAAA,EAC5E,IAAI,QAAQ,SAAS,YAAY;AAAA,IAC/B,MAAM,eAAc,EAAE,SAAS,qDAAqD,CAAC;AAAA,EACvF;AAAA,EACA,OAAO;AAAA;AAST,SAAS,eAAe,CAAC,SAAqB,QAAwB;AAAA,EACpE,IAAI,OAAO,cAAc,WAAW;AAAA,IAClC,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,IAErC,MAAM,QAAQ,OAAO,UAAU,OAAO,aAAa,aAAa,OAAO,aAAa,YAAY,YAAY,OAAO;AAAA,IACnH,IAAI,UAAU;AAAA,MAAW,OAAO;AAAA,IAChC,OAAO,GAAG,WAAW,QAAQ,WAAW,EAAE,MAAM,MAAM,CAAC;AAAA,EACzD;AAAA,EACA,IAAI,OAAO,cAAc,YAAY;AAAA,IACnC,MAAM,MAAM,SAAS,SAAS,MAAM;AAAA,IACpC,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,OAAO,SAAS,OAAO,KAAK,CAAC;AAAA,IACtE,OAAO,GAAG,QAAQ,mBAAmB,EAAE,YAAY,IAAI,CAAC,QAAQ;AAAA,EAClE;AAAA,EACA,MAAM,MAAM,SAAS,SAAS,MAAM;AAAA,EACpC,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,OAAO,SAAS,OAAO,KAAK,CAAC;AAAA,EACtE,IAAI,OAAO,cAAc;AAAA,IAAY,OAAO,GAAG,eAAe,EAAE,SAAS,YAAY,IAAI,CAAC,QAAQ;AAAA,EAGlG,IAAI,OAAO,cAAc,kBAAkB,QAAQ,SAAS;AAAA,IAAS,OAAO,aAAa,WAAW;AAAA,EACpG,IAAI,QAAQ,SAAS,YAAY;AAAA,IAC/B,MAAM,eAAc,EAAE,SAAS,GAAG,OAAO,oCAAoC,CAAC;AAAA,EAChF;AAAA,EACA,IAAI,OAAO,cAAc;AAAA,IAAqB,OAAO,qBAAqB,sBAAsB;AAAA,EAChG,OAAO,UAAU,qBAAqB;AAAA;AAGxC,SAAS,cAAc,CAAC,QAA6D;AAAA,EACnF,OAAO,OAAO,QAAQ,SAAS,aAAa,GAAG,OAAO,qBAClD,QAAQ,OAAO,iBAAiB,OAAO,QAAQ,SAAS,UAAU,SAAS;AAAA;AAS1E,SAAS,gBAAgB,CAAC,QAAqE;AAAA,EACpG,QAAQ,SAAS,YAAY;AAAA,EAC7B,OAAO,QAAQ,IAAI,CAAC,WAAW,gBAAgB,SAAS,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA;AAG5E,SAAS,WAAW,CAAC,SAAqB,OAAyB;AAAA,EACjE,IAAI,MAAM,cAAc;AAAA,IAAW,oBAAmB,EAAE,WAAW,MAAM,WAAW,SAAS,QAAQ,KAAK,CAAC;AAAA,EAC3G,MAAM,WAAW,QAAQ,WAAW,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,EACxD,MAAM,OAAO,MAAM,cAAc,YAAY,WAAW,GAAG,QAAQ,WAAW,EAAE,MAAM,MAAM,UAAU,CAAC,KAAK;AAAA,EAC5G,IAAI,MAAM,UAAU;AAAA,IAAW,OAAO;AAAA,EACtC,OAAO,GAAG,WAAW,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA;AAG/D,SAAS,WAAW,CAAC,OAAe,MAAoB;AAAA,EACtD,IAAI,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,GAAG;AAAA,IAC7C,MAAM,eAAc,EAAE,SAAS,GAAG,4CAA4C,QAAQ,CAAC;AAAA,EACzF;AAAA;AAGF,IAAM,kBAAmD;AAAA,EACvD,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,KAAK;AACP;AAOA,IAAM,oBAA2D;AAAA,EAC/D,WAAW;AAAA,EACX,WAAW;AAAA,EACX,UAAU;AAAA,EACV,QAAQ;AACV;AAEA,IAAM,aAA8C;AAAA,EAClD,OAAO;AAAA,EACP,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AAAA,EACL,KAAK;AACP;AAOA,SAAS,YAAY,CAAC,SAAqB,KAAa,WAAmC;AAAA,EACzF,IAAI,IAAI,WAAW;AAAA,IAAW,OAAO,wBAAwB,EAAE,SAAS,KAAK,QAAQ,IAAI,QAAQ,UAAU,CAAC;AAAA,EAC5G,IAAI,IAAI,OAAO;AAAA,IAAY,OAAO;AAAA,EAClC,MAAM,SAAS,SAAS,SAAS,IAAI,MAAM;AAAA,EAC3C,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO,UAAU,IAAI,cAAc,WAAW;AAAA,IACzE,OAAO,QAAQ,iBAAiB,EAAE,IAAI,IAAI,IAAI,QAAQ,QAAQ,IAAI,UAAU,CAAC;AAAA,EAC/E;AAAA,EACA,OAAO,GAAG,WAAW,IAAI,OAAO;AAAA;AAQlC,SAAS,uBAAuB,CAAC,QAAkG;AAAA,EACjI,QAAQ,SAAS,KAAK,QAAQ,cAAc;AAAA,EAC5C,IAAI,QAAQ,aAAa,uBAAuB,gBAAgB;AAAA,IAC9D,QAAQ,QAAQ,YAAY,UAAU;AAAA,IACtC,MAAM,YAAY,aAAa,SAAS,OAAO,SAAS;AAAA,IACxD,OAAO,GAAG,2BAA2B,WAAW,EAAE,SAAS,MAAM,QAAQ,UAAU,CAAC;AAAA,EACtF;AAAA,EACA,MAAM,OAAO,WAAW,EAAE,SAAS,MAAM,QAAQ,UAAU,CAAC;AAAA,EAC5D,IAAI,IAAI,OAAO;AAAA,IAAY,OAAO,mBAAmB;AAAA,EACrD,MAAM,SAAS,SAAS,SAAS,IAAI,MAAM;AAAA,EAC3C,KAAK,IAAI,OAAO,SAAS,IAAI,OAAO,UAAU,IAAI,cAAc,WAAW;AAAA,IACzE,OAAO,QAAQ,iBAAiB,EAAE,IAAI,IAAI,IAAI,QAAQ,QAAQ,IAAI,WAAW,KAAK,CAAC;AAAA,EACrF;AAAA,EACA,OAAO,GAAG,WAAW,IAAI,iBAAiB,aAAa;AAAA;AAIzD,IAAM,uBAAuB;AAgB7B,SAAS,cAAc,CAAC,QAAqF;AAAA,EAC3G,QAAQ,SAAS,WAAW,QAAQ;AAAA,EACpC,IAAI,IAAI,SAAS,UAAU;AAAA,IACzB,IAAI,CAAC,OAAO,cAAc,IAAI,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,sBAAsB;AAAA,MAC5F,MAAM,eAAc,EAAE,SAAS,wDAAwD,6BAA6B,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,IAC5I;AAAA,IACA,IAAI,QAAQ,SAAS;AAAA,MAAU,OAAO,UAAU,iBAAiB,IAAI;AAAA,IACrE,OAAO,GAAG,QAAQ,SAAS,UAAU,SAAS,UAAU,cAAc,IAAI;AAAA,EAC5E;AAAA,EACA,IAAI,IAAI,KAAK,WAAW,KAAK,IAAI,KAAK,KAAK,CAAC,SAAS,OAAO,SAAS,YAAY,KAAK,WAAW,KAAK,KAAK,SAAS,MAAQ,CAAC,GAAG;AAAA,IAC9H,MAAM,eAAc,EAAE,SAAS,qFAAqF,CAAC;AAAA,EACvH;AAAA,EACA,QAAQ,QAAQ;AAAA,IACd,KAAK,aAAa;AAAA,MAChB,MAAM,QAAQ,IAAI,KAAK,IAAI,CAAC,SAAS,QAAQ,mBAAmB,EAAE,OAAO,KAAK,CAAC,CAAC;AAAA,MAChF,IAAI,IAAI,YAAY;AAAA,QAAQ,OAAO,KAAK,gBAAgB,MAAM,KAAK,MAAM;AAAA,MACzE,MAAM,OAAO,MAAM,SAAS;AAAA,MAC5B,OAAO,IAAI,YAAY,MAAM,IAAI,CAAC,MAAM,UAAU,GAAG,UAAU,OAAO,UAAU,SAAS,MAAM,EAAE,KAAK,EAAE;AAAA,IAC1G;AAAA,IACA,KAAK,iBAAiB;AAAA,MACpB,MAAM,OAAO,QAAQ,mBAAmB,EAAE,OAAO,eAAe,IAAI,IAAI,EAAE,CAAC;AAAA,MAC3E,MAAM,YAAY,gBAAgB,cAAc;AAAA,MAChD,OAAO,kBAAkB,cAAc,0BAA0B,+FAA+F;AAAA,IAClK;AAAA,IACA,KAAK,gBAAgB;AAAA,MACnB,MAAM,YAAY,gBAAgB,cAAc,QAAQ,mBAAmB,EAAE,OAAO,eAAe,IAAI,IAAI,EAAE,CAAC;AAAA,MAC9G,OAAO,uBAAuB,mDAAmD;AAAA,IACnF;AAAA;AAAA;AASJ,SAAS,kBAAkB,CAAC,QAA0F;AAAA,EACpH,QAAQ,SAAS,MAAM,aAAa;AAAA,EACpC,MAAM,OAAO,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAAA,EAClD,MAAM,OAAO,QAAQ,aAAa;AAAA,EAClC,IAAI,SAAS,gBAAgB;AAAA,IAC3B,OAAO,kBAAkB,KAAK,IAAI,CAAC,QAAQ,IAAI,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI;AAAA,EACzG;AAAA,EACA,IAAI,SAAS,YAAY,cAAc,EAAE,OAAO,KAAK,QAAQ,KAAK,CAAC;AAAA,IAAG,OAAO,GAAG,KAAK,KAAK,IAAI;AAAA,EAC9F,MAAM,wBAAsB;AAAA,IAC1B,SAAS,QAAQ;AAAA,IACjB,SAAS,SAAS,WAAW,iEAAiE;AAAA,IAC9F,MAAM,SAAS,WACX,kHACA;AAAA,EACN,CAAC;AAAA;AAIH,SAAS,kBAAkB,CAAC,QAA6F;AAAA,EACvH,QAAQ,MAAM,aAAa;AAAA,EAC3B,IAAI,SAAS,KAAK,WAAW,KAAK,KAAK,WAAW,KAAK,KAAK,SAAS,IAAI;AAAA,IACvE,MAAM,eAAc,EAAE,SAAS,gEAAgE,CAAC;AAAA,EAClG;AAAA,EACA,WAAW,OAAO,SAAS,MAAM;AAAA,IAC/B,IAAI,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,cAAc,KAAK,KAAK,QAAQ,KAAK,SAAS,KAAK,MAAM,GAAG;AAAA,MAC1F,MAAM,eAAc,EAAE,SAAS,yDAAyD,CAAC;AAAA,IAC3F;AAAA,EACF;AAAA,EACA,OAAO,SAAS;AAAA;AAQX,SAAS,aAAa,CAAC,QAA0E;AAAA,EACtG,QAAQ,OAAO,SAAS;AAAA,EACxB,IAAI,KAAK,WAAW,QAAQ;AAAA,IAAG,OAAO;AAAA,EACtC,MAAM,UAAU,IAAI;AAAA,EACpB,WAAW,OAAO,MAAM;AAAA,IACtB,MAAM,SAAS,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,MAAM,UAAU,OAAO,KAAK;AAAA,IAC1D,IAAI,CAAC,OAAO,MAAM,CAAC,OAAO,aAAa,UAAU,QAAQ;AAAA,MAAG,OAAO;AAAA,IACnE,QAAQ,IAAI,IAAI,MAAM;AAAA,EACxB;AAAA,EACA,OAAO,QAAQ,SAAS,QAAQ;AAAA;AAQlC,SAAS,sBAAsB,CAAC,QAAqE;AAAA,EACnG,QAAQ,SAAS;AAAA,EACjB,MAAM,OAAO,mBAAmB,MAAM;AAAA,EACtC,MAAM,WAAW,KAAK,IAAI,CAAC,KAAK,aAAa;AAAA,IAC3C,IAAI,OAAO;AAAA,IACX,SAAS,QAAQ,EAAG,QAAQ,KAAK,QAAQ,SAAS;AAAA,MAChD,IAAI,CAAC,IAAI,SAAS,KAAK;AAAA,QAAG,QAAQ,MAAM,KAAK,SAAS,IAAI;AAAA,IAC5D;AAAA,IACA,OAAO,QAAQ,aAAa;AAAA,GAC7B;AAAA,EACD,OAAO,iBAAiB,KAAK,KAAK,IAAI,MAAM,SAAS,KAAK,GAAG;AAAA;AAG/D,SAAS,kBAAkB,CAAC,SAAqB,SAAuB;AAAA,EACtE,IAAI,QAAQ,aAAa;AAAA,IAAc;AAAA,EACvC,MAAM,wBAAsB;AAAA,IAC1B,SAAS,QAAQ;AAAA,IACjB;AAAA,IACA,MAAM;AAAA,EACR,CAAC;AAAA;AAUI,SAAS,UAAU,CAAC,QAAmF;AAAA,EAC5G,QAAQ,SAAS,MAAM,cAAc;AAAA,EAErC,QAAQ,KAAK;AAAA,IACX,KAAK,OAAO;AAAA,MACV,MAAM,KAAK,gBAAe,KAAK;AAAA,MAC/B,IAAI,OAAO,WAAW;AAAA,QACpB,MAAM,eAAc,EAAE,SAAS,gCAAgC,KAAK,MAAM,CAAC;AAAA,MAC7E;AAAA,MAEA,IAAI,cAAc,KAAK,KAAK,GAAG;AAAA,QAC7B,OAAO,GAAG,SAAS,SAAS,KAAK,MAAM,KAAK,MAAM,QAAQ,YAAY,EAAE,eAAe,KAAK,MAAM,eAAe,UAAU,CAAC;AAAA,MAC9H;AAAA,MACA,MAAM,WAAW,eAAe,EAAE,SAAS,QAAQ,KAAK,QAAQ,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,MAC9F,OAAO,GAAG,SAAS,UAAU,MAAM,SAAS;AAAA,IAC9C;AAAA,IAEA,KAAK,UAAU;AAAA,MACb,MAAM,KAAK,gBAAe,KAAK;AAAA,MAC/B,IAAI,OAAO,WAAW;AAAA,QACpB,MAAM,eAAc,EAAE,SAAS,gCAAgC,KAAK,MAAM,CAAC;AAAA,MAC7E;AAAA,MACA,OAAO,GAAG,SAAS,SAAS,KAAK,IAAI,KAAK,MAAM,SAAS,SAAS,KAAK,KAAK;AAAA,IAC9E;AAAA,IAEA,KAAK;AAAA,MACH,OAAO,GAAG,SAAS,SAAS,KAAK,MAAM,QAAQ,KAAK,WAAW,OAAO,aAAa;AAAA,IAErF,KAAK,WAAW;AAAA,MACd,IAAI,KAAK,OAAO,WAAW,GAAG;AAAA,QAE5B,OAAO,KAAK,WAAW,OAAO,UAAU;AAAA,MAC1C;AAAA,MACA,MAAM,SAAS,SAAS,SAAS,KAAK,MAAM;AAAA,MAC5C,IAAI,KAAK,cAAc,QAAQ,QAAQ,wBAAwB,cAAc;AAAA,QAC3E,MAAM,aAAa,UAAU,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC,gBAAgB,GAAG,YAAY,aAAa;AAAA,QACnG,OAAO,GAAG,KAAK,WAAW,OAAO,SAAS,MAAM,WAAW,KAAK,MAAM;AAAA,MACxE;AAAA,MACA,IAAI,QAAQ,oBAAoB,OAAO;AAAA,QACrC,MAAM,OAAO,GAAG,gBAAgB,UAAU,IAAI,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK,MAAM;AAAA,QACzG,OAAO,KAAK,WAAW,OAAO,QAAQ,UAAU;AAAA,MAClD;AAAA,MACA,MAAM,eAAe,UAAU,QAAQ,KAAK,MAAM;AAAA,MAClD,OAAO,GAAG,UAAU,KAAK,WAAW,OAAO,WAAW,SAAS,aAAa,KAAK,IAAI;AAAA,IACvF;AAAA,IAEA,KAAK,WAAW;AAAA,MACd,IAAI,KAAK,QAAQ,WAAW,GAAG;AAAA,QAC7B,MAAM,eAAc,EAAE,SAAS,oCAAoC,CAAC;AAAA,MACtE;AAAA,MACA,WAAW,OAAO,KAAK,MAAM;AAAA,QAC3B,IAAI,IAAI,WAAW,KAAK,QAAQ,QAAQ;AAAA,UACtC,MAAM,eAAc;AAAA,YAClB,SAAS,mBAAmB,IAAI,qBAAqB,KAAK,QAAQ;AAAA,UACpE,CAAC;AAAA,QACH;AAAA,MACF;AAAA,MACA,IAAI,KAAK,KAAK,WAAW,GAAG;AAAA,QAE1B,OAAO,KAAK,WAAW,OAAO,UAAU;AAAA,MAC1C;AAAA,MACA,MAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC;AAAA,MACtE,IAAI,QAAQ,oBAAoB,YAAY;AAAA,QAC1C,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,QAAQ,IAAI,UAAU,QAAQ,GAAG,EAAE,KAAK,IAAI,IAAI;AAAA,QAC9E,MAAM,OAAO,IAAI,QAAQ,KAAK,IAAI,UAAU,OAAO,KAAK,IAAI;AAAA,QAC5D,OAAO,KAAK,WAAW,OAAO,QAAQ,UAAU;AAAA,MAClD;AAAA,MAGA,MAAM,eAAe,KAAK,KAAK,IAAI,CAAC,QAAQ;AAAA,QAC1C,MAAM,QAAQ,IAAI,IAAI,CAAC,OAAO,UAAU,GAAG,QAAQ,YAAsB,UAAU,IAAI,KAAK,GAAG;AAAA,QAC/F,OAAO,MAAM,WAAW,IAAK,MAAM,KAAgB,IAAI,MAAM,KAAK,OAAO;AAAA,OAC1E;AAAA,MACD,MAAM,OAAO,aAAa,WAAW,IAAK,aAAa,KAAgB,IAAI,aAAa,KAAK,MAAM;AAAA,MACnG,OAAO,KAAK,WAAW,OAAO,OAAO,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,YAAY;AAAA,IACrF;AAAA,IAEA,KAAK;AAAA,MACH,OAAO,cAAc,EAAE,SAAS,MAAM,UAAU,CAAC;AAAA,IAEnD,KAAK,cAAc;AAAA,MAEjB,MAAM,KAAK,gBAAe,KAAK;AAAA,MAC/B,IAAI,OAAO,aAAa,KAAK,QAAQ,WAAW,KAAK,KAAK,OAAO,WAAW,KAAK,QAAQ,QAAQ;AAAA,QAC/F,MAAM,eAAc,EAAE,SAAS,+DAA+D,KAAK,QAAQ,mBAAmB,KAAK,OAAO,iBAAiB,CAAC;AAAA,MAC9J;AAAA,MACA,MAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC;AAAA,MACtE,MAAM,eAAe,KAAK,OAAO,IAAI,CAAC,UAAU,UAAU,IAAI,KAAK,CAAC;AAAA,MACpE,OAAO,IAAI,QAAQ,KAAK,IAAI,MAAM,OAAO,aAAa,KAAK,IAAI;AAAA,IACjE;AAAA,IAEA,KAAK,YAAY;AAAA,MAEf,IAAI,KAAK,QAAQ,WAAW;AAAA,QAAG,MAAM,eAAc,EAAE,SAAS,qCAAqC,CAAC;AAAA,MACpG,IAAI,QAAQ,SAAS,YAAY,KAAK,OAAO,UAAU,aAAa,KAAK,OAAO,WAAW,YAAY;AAAA,QACrG,MAAM,wBAAsB;AAAA,UAC1B,SAAS,QAAQ;AAAA,UACjB,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AAAA,MACH;AAAA,MACA,MAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC;AAAA,MACtE,IAAI,KAAK,WAAW,QAAQ,QAAQ,WAAW;AAAA,QAAG,MAAM,eAAc,EAAE,SAAS,oDAAoD,CAAC;AAAA,MACtI,MAAM,SAAS,QAAQ,WAAW,IAAK,QAAQ,KAAgB,IAAI,QAAQ,KAAK,IAAI;AAAA,MACpF,MAAM,MAAM,aAAa,EAAE,SAAS,WAAW,KAAK,QAAQ,UAAU,CAAC;AAAA,MACvE,OAAO,KAAK,WAAW,OAAO,GAAG,aAAa,IAAI,UAAU,GAAG,cAAc,IAAI;AAAA,IACnF;AAAA,IAEA,KAAK,QAAQ;AAAA,MACX,MAAM,SAAS,SAAS,SAAS,KAAK,MAAM;AAAA,MAC5C,MAAM,cAAc,UAAU,IAAI,KAAK,OAAO;AAAA,MAC9C,IAAI;AAAA,MACJ,IAAI,KAAK,gBAAgB,MAAM;AAAA,QAC7B,OACE,QAAQ,oBAAoB,UACxB,GAAG,gBAAgB,gBACnB,KAAK,gBAAgB,OAGnB,GAAG,eAAe,gBAClB,SAAS,sBAAsB;AAAA,MACzC,EAAE,KAAK;AAAA,QACL,OAAO,GAAG,eAAe;AAAA;AAAA,MAE3B,IAAI,QAAQ,qBAAqB,MAAM;AAAA,QACrC,OAAO,GAAG,OAAO,QAAQ;AAAA,MAC3B;AAAA,MACA,OAAO,KAAK,WAAW,OAAO,QAAQ,UAAU;AAAA,IAClD;AAAA,IAEA,KAAK,eAAe;AAAA,MAClB,MAAM,SAAS,SAAS,SAAS,KAAK,MAAM;AAAA,MAC5C,IAAI;AAAA,MACJ,IAAI,KAAK,OAAO,UAAU;AAAA,QAGxB,OACE,QAAQ,wBAAwB,WAC5B,GAAG,iBAAiB,UAAU,IAAI,KAAK,KAAK,iBAC5C,GAAG,YAAY,UAAU,IAAI,KAAK,KAAK;AAAA,MAC/C,EAAE,KAAK;AAAA,QACL,MAAM,UAAU,mBAAmB;AAAA,UACjC,UAAU,QAAQ;AAAA,UAClB,IAAI,KAAK;AAAA,UACT,OAAO,KAAK;AAAA,QACd,CAAC;AAAA,QACD,IAAI,QAAQ,wBAAwB,QAAQ;AAAA,UAC1C,OAAO,GAAG,eAAe,UAAU,IAAI,OAAO;AAAA,QAChD,EAAE,KAAK;AAAA,UAIL,MAAM,YAAY,8BAA8B;AAAA,YAC9C,UAAU,QAAQ;AAAA,YAClB,IAAI,KAAK;AAAA,YACT,QAAQ,KAAK,WAAW;AAAA,UAC1B,CAAC,IACG,GAAG,eAAe,UAAU,IAAI,OAAO,IAAI,QAAQ,oBAAoB,OACvE;AAAA,UACJ,MAAM,cAAc,UAAU,IAAI,OAAO;AAAA,UACzC,OACE,QAAQ,wBAAwB,WAC5B,GAAG,oBAAoB,2BACvB,GAAG,eAAe;AAAA,UACxB,IAAI,QAAQ,qBAAqB;AAAA,YAAM,OAAO,GAAG,OAAO,QAAQ;AAAA,UAChE,IAAI,cAAc;AAAA,YAAM,OAAO,IAAI,iBAAiB;AAAA;AAAA;AAAA,MAGxD,OAAO,KAAK,WAAW,OAAO,QAAQ,UAAU;AAAA,IAClD;AAAA,IAEA,KAAK;AAAA,IACL,KAAK,MAAM;AAAA,MACT,IAAI,KAAK,SAAS,WAAW,GAAG;AAAA,QAE9B,OAAO,KAAK,SAAS,QAAQ,UAAU;AAAA,MACzC;AAAA,MACA,IAAI,KAAK,SAAS,WAAW,GAAG;AAAA,QAC9B,OAAO,WAAW,EAAE,SAAS,MAAM,KAAK,SAAS,IAAK,UAAU,CAAC;AAAA,MACnE;AAAA,MACA,MAAM,SAAS,KAAK,SAAS,QAAQ,UAAU;AAAA,MAC/C,MAAM,WAAW,KAAK,SAAS,IAAI,CAAC,YAAY,WAAW,EAAE,SAAS,MAAM,SAAS,UAAU,CAAC,CAAC;AAAA,MACjG,OAAO,IAAI,SAAS,KAAK,MAAM;AAAA,IACjC;AAAA,IAEA,KAAK;AAAA,MACH,OAAO,QAAQ,WAAW,EAAE,SAAS,MAAM,KAAK,SAAS,UAAU,CAAC;AAAA,IAEtE,KAAK,UAAU;AAAA,MACb,MAAM,KAAK,gBAAe,KAAK;AAAA,MAC/B,IAAI,OAAO,WAAW;AAAA,QACpB,MAAM,eAAc,EAAE,SAAS,gCAAgC,KAAK,MAAM,CAAC;AAAA,MAC7E;AAAA,MACA,OAAO,GAAG,aAAa,SAAS,KAAK,KAAK,SAAS,KAAK,MAAM,UAAU,IAAI,KAAK,KAAK;AAAA,IACxF;AAAA,IAEA,KAAK,YAAY;AAAA,MACf,mBAAmB,SAAS,8BAAgC;AAAA,MAC5D,MAAM,WAAW,eAAe,EAAE,SAAS,QAAQ,KAAK,QAAQ,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,MAC9F,MAAM,OAAO,GAAG,SAAS,iBAAiB,SAAS;AAAA,MACnD,OAAO,KAAK,WAAW,OAAO,QAAQ,UAAU;AAAA,IAClD;AAAA,IAEA,KAAK,oBAAoB;AAAA,MACvB,mBAAmB,SAAS,mCAAqC;AAAA,MACjE,MAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK;AAAA,MACpE,MAAM,WAAW,eAAe,EAAE,SAAS,QAAQ,KAAK,QAAQ,OAAO,QAAQ,UAAU,CAAC;AAAA,MAC1F,OAAO,GAAG,SAAS,aAAa,SAAS;AAAA,IAC3C;AAAA,IAEA,KAAK,iBAAiB;AAAA,MACpB,mBAAmB,SAAS,kCAAoC;AAAA,MAChE,MAAM,SAAS,MAAM,QAAQ,KAAK,MAAM,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,KAAK;AAAA,MACpE,MAAM,WAAW,eAAe,EAAE,SAAS,QAAQ,KAAK,QAAQ,OAAO,QAAQ,UAAU,CAAC;AAAA,MAC1F,OAAO,GAAG,SAAS,aAAa,SAAS;AAAA,IAC3C;AAAA,IAEA,KAAK,gBAAgB;AAAA,MACnB,mBAAmB,SAAS,kCAAoC;AAAA,MAGhE,MAAM,SAAS,SAAS,SAAS,KAAK,MAAM;AAAA,MAC5C,OAAO,gBAAgB,iBAAiB,KAAK,QAAQ,SAAS;AAAA,IAChE;AAAA,IAEA,KAAK;AAAA,MACH,OAAO,iBAAiB,EAAE,SAAS,MAAM,UAAU,CAAC;AAAA,IAEtD,KAAK,UAAU;AAAA,MAGb,MAAM,MAAM,aAAa,EAAE,SAAS,WAAW,KAAK,QAAQ,UAAU,CAAC;AAAA,MACvE,OAAO,GAAG,KAAK,WAAW,OAAO,SAAS,aAAa,IAAI;AAAA,IAC7D;AAAA,IAEA,KAAK;AAAA,MACH,OAAO,IAAI,kBAAkB,EAAE,SAAS,UAAU,KAAK,UAAU,UAAU,CAAC;AAAA,IAE9E,KAAK;AAAA,MACH,OAAO,eAAe,EAAE,SAAS,UAAU,KAAK,UAAU,UAAU,CAAC;AAAA,IAEvE,KAAK;AAAA,MACH,OAAO,KAAK;AAAA;AAAA;AAYX,SAAS,cAAc,CAAC,QAIpB;AAAA,EACT,QAAQ,SAAS,UAAU,cAAc;AAAA,EACzC,IAAI,OAAO;AAAA,EACX,WAAW,QAAQ,SAAS,OAAO;AAAA,IACjC,IAAI,OAAO,SAAS,UAAU;AAAA,MAC5B,QAAQ;AAAA,IACV,EAAE,KAAK,IAAI,WAAW,MAAM;AAAA,MAC1B,QAAQ,UAAU,IAAI,KAAK,KAAK;AAAA,IAClC,EAAE,KAAK;AAAA,MACL,QAAQ,KAAK,MAAM,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG;AAAA;AAAA,EAE3E;AAAA,EACA,OAAO;AAAA;AAYT,SAAS,cAAc,CAAC,QAKkC;AAAA,EACxD,QAAQ,SAAS,QAAQ,OAAO,cAAc;AAAA,EAC9C,IAAI,oBAAoB,KAAK,KAAK,MAAM,YAAY,QAAQ;AAAA,IAC1D,OAAO;AAAA,MACL,QAAQ,GAAG,SAAS,SAAS,MAAM;AAAA,MACnC,SAAS,UAAU,IAAI,kBAAkB,EAAE,OAAO,MAAM,OAAO,SAAS,QAAQ,CAAC,CAAC;AAAA,IACpF;AAAA,EACF;AAAA,EACA,OAAO,EAAE,QAAQ,SAAS,SAAS,MAAM,GAAG,SAAS,UAAU,IAAI,KAAK,EAAE;AAAA;AAe5E,SAAS,aAAa,CAAC,QAAuF;AAAA,EAC5G,QAAQ,SAAS,MAAM,cAAc;AAAA,EACrC,MAAM,QAAQ,KAAK,QAAQ;AAAA,EAC3B,IAAI,UAAU;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,oCAAoC,CAAC;AAAA,EACrF,IAAI,KAAK,QAAQ,WAAW,OAAO;AAAA,IACjC,MAAM,eAAc,EAAE,SAAS,eAAe,KAAK,QAAQ,sBAAsB,gBAAgB,CAAC;AAAA,EACpG;AAAA,EACA,WAAW,OAAO,KAAK,MAAM;AAAA,IAC3B,IAAI,IAAI,WAAW;AAAA,MAAO,MAAM,eAAc,EAAE,SAAS,mBAAmB,IAAI,qBAAqB,gBAAgB,CAAC;AAAA,EACxH;AAAA,EAEA,IAAI,KAAK,KAAK,WAAW;AAAA,IAAG,OAAO;AAAA,EACnC,MAAM,UAAU,KAAK,QAAQ,IAAI,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC;AAAA,EACtE,MAAM,QAAQ,UAAU,IAAK,QAAQ,KAAgB,IAAI,QAAQ,KAAK,IAAI;AAAA,EAC1E,IAAI,QAAQ,oBAAoB,UAAU;AAAA,IAGxC,MAAM,QAAQ,KAAK,QAAQ,IAAI,CAAC,WAAW,2BAA2B,EAAE,SAAS,OAAO,CAAC,CAAC;AAAA,IAC1F,IAAI,CAAC,wBAAwB,EAAE,SAAS,KAAK,QAAQ,CAAC,GAAG;AAAA,MACvD,MAAM,SAAS,MAAM,IAAI,CAAC,MAAM,UAAU,GAAG,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,QAAQ;AAAA,MAC3G,OAAO,GAAG,kCAAkC,OAAO,KAAK,IAAI;AAAA,IAC9D;AAAA,EACF;AAAA,EACA,IAAI,QAAQ,wBAAwB,gBAAgB,KAAK,QAAQ,KAAK,CAAC,WAAW,OAAO,cAAc,IAAI,GAAG;AAAA,IAC5G,MAAM,eAAe,KAAK,KAAK,IAAI,CAAC,QAAQ;AAAA,MAC1C,MAAM,QAAQ,IAAI,IAAI,CAAC,OAAO,UAAU,GAAG,QAAQ,YAAsB,UAAU,IAAI,KAAK,GAAG;AAAA,MAC/F,OAAO,MAAM,WAAW,IAAK,MAAM,KAAgB,IAAI,MAAM,KAAK,OAAO;AAAA,KAC1E;AAAA,IACD,OAAO,aAAa,WAAW,IAAK,aAAa,KAAgB,IAAI,aAAa,KAAK,MAAM;AAAA,EAC/F;AAAA,EACA,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,QAAQ,IAAI,UAAU,QAAQ,GAAG,EAAE,KAAK,IAAI,IAAI;AAAA,EAC9E,OAAO,QAAQ,oBAAoB,WAC/B,GAAG,oBAAoB,OAAO,KAAK,IAAI,OACvC,GAAG,aAAa,OAAO,KAAK,IAAI;AAAA;AAMtC,IAAM,gBAAgB;AAEtB,IAAM,eAAe;AAErB,IAAM,gBAAgB;AAGtB,IAAM,0BAA+C,IAAI,IAAI,CAAC,QAAQ,SAAS,WAAW,SAAS,WAAW,SAAS,QAAQ,CAAC;AAOhI,SAAS,aAAa,CAAC,QAAmF;AAAA,EACxG,QAAQ,SAAS,MAAM,cAAc;AAAA,EACrC,QAAQ,WAAW;AAAA,EACnB,MAAM,QAAQ,KAAK,WAAW;AAAA,EAC9B,IAAI,UAAU,KAAK,KAAK,QAAQ,WAAW,OAAO;AAAA,IAChD,MAAM,eAAc,EAAE,SAAS,eAAe,KAAK,QAAQ,sBAAsB,oBAAoB,CAAC;AAAA,EACxG;AAAA,EACA,IAAI,KAAK,KAAK,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,iCAAiC,CAAC;AAAA,EAC7F,WAAW,OAAO,KAAK,MAAM;AAAA,IAC3B,IAAI,IAAI,WAAW;AAAA,MAAO,MAAM,eAAc,EAAE,SAAS,mBAAmB,IAAI,qBAAqB,oBAAoB,CAAC;AAAA,EAC5H;AAAA,EACA,IAAI,KAAK,SAAS,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,6CAA6C,CAAC;AAAA,EAC7G,MAAM,QAAQ,OAAO,WAAW,CAAC;AAAA,EACjC,IAAI,MAAM,WAAW,KAAK,MAAM,KAAK,CAAC,SAAS,EAAE,YAAY,KAAK,GAAG;AAAA,IACnE,MAAM,eAAc,EAAE,SAAS,wDAAwD,CAAC;AAAA,EAC1F;AAAA,EACA,IAAI,OAAO,MAAM,UAAU,aAAa,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,wBAAwB,IAAI,MAAM,CAAC,GAAG;AAAA,IAClH,MAAM,eAAc,EAAE,SAAS,iEAAiE,CAAC;AAAA,EACnG;AAAA,EACA,IAAI,QAAQ,oBAAoB,UAAU;AAAA,IACxC,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,MAAM,UAAU,CAAC,YAA4B,KAAK,QAAQ,OAAO,cAAc;AAAA,EAC/E,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,WAAW,gBAAgB,SAAS,QAAQ,MAAM,CAAC,CAAC;AAAA,EAC3F,MAAM,UAAU,CAAC,WAA+C;AAAA,IAC9D,MAAM,aAAwB,KAAK,WAAW,IAAI,CAAC,QAAQ,WAAW,EAAE,MAAM,UAAU,IAAI,MAAM,MAAM,QAAQ,OAAO,OAAO,KAAK,EAAE,EAAE;AAAA,IACvI,MAAM,WAAW,OAAO,UAAU,YAAY,aAAa,CAAC,GAAG,YAAY,OAAO,KAAK;AAAA,IACvF,OAAO,SAAS,WAAW,IAAK,SAAS,KAAiB,EAAE,MAAM,OAAO,SAAS;AAAA;AAAA,EAEpF,MAAM,UAAU,CAAC,OAAgB,UAAoC;AAAA,IACnE,MAAM;AAAA,IACN,OAAO,OAAO;AAAA,IACd,SAAS,KAAK;AAAA,OACV,OAAO,EAAE,WAAW,EAAE,aAAa,KAAK,YAAY,SAAS,OAAO,OAAO,KAAK,UAAU,EAAE,IAAI,CAAC;AAAA,IACrG;AAAA,IACA,SAAS;AAAA,OACL,OAAO,UAAU,YAAY,CAAC,IAAI,EAAE,OAAO,OAAO,MAAM;AAAA,OACxD,OAAO,WAAW,YAAY,CAAC,IAAI,EAAE,QAAQ,OAAO,OAAO;AAAA,EACjE;AAAA,EACA,MAAM,OAAO,YAAY,SAAS,KAAK,OAAO,OAAO,OAAO,cAAc,CAAC;AAAA,EAC3E,MAAM,WAAW,OAAO,MAAM,SAAS,gBAAgB,GAAG,oBAAoB;AAAA,EAC9E,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,SAAS,CAAC;AAAA,EAElD,IAAI,QAAQ,oBAAoB,WAAW;AAAA,IAEzC,IAAI,wBAAwB,EAAE,SAAS,KAAK,QAAQ,CAAC,GAAG;AAAA,MACtD,MAAM,wBAAsB;AAAA,QAC1B,SAAS,QAAQ;AAAA,QACjB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,MAAM,QAAQ,KAAK,QAAQ,IAAI,CAAC,WAAW,2BAA2B,EAAE,SAAS,OAAO,CAAC,CAAC;AAAA,IAC1F,MAAM,SAAS,MAAM,IAAI,CAAC,MAAM,UAAU,GAAG,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,QAAQ;AAAA,IAC3G,MAAM,QAAQ,KAAK,WAAW,IAAI,CAAC,GAAG,UAAU,QAAQ,WAAW,EAAE,MAAM,WAAW,QAAQ,CAAC,CAAC;AAAA,IAChG,MAAM,MAAM,aAAa,EAAE,SAAS,WAAW,QAAQ,QAAQ,CAAC,WAAW,EAAE,OAAO,UAAU,MAAM,WAAW,QAAQ,EAAE,GAAG,IAAI,GAAG,UAAU,CAAC;AAAA,IAC9I,MAAM,KAAK,KAAK,SAAS,IAAI,CAAC,WAAW,GAAG,SAAS,SAAS,QAAQ,MAAM,CAAC,OAAO,SAAS,SAAS,EAAE,OAAO,cAAc,MAAM,OAAO,KAAK,CAAC,GAAG,EAAE,KAAK,OAAO;AAAA,IACjK,MAAM,OAAO,SAAS,SAAS,EAAE,OAAO,cAAc,MAAM,KAAK,UAAU,CAAC;AAAA,IAC5E,OAAO,UAAU,CAAC,GAAG,YAAY,IAAI,EAAE,KAAK,IAAI,iBAAiB,OAAO,KAAK,IAAI,SAAS,SAAS,MAAM,KAAK,IAAI,0BAA0B,IAAI,YAAY,QAAQ,WAAW,EAAE,MAAM,aAAa,CAAC,gBAAgB,WAAW;AAAA,EAClO;AAAA,EAIA,MAAM,YAAY,KAAK,WAAW,IAAI,CAAC,WAAW,SAAS,SAAS,QAAQ,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAC/F,MAAM,YAAY,MAAM,IAAI,CAAC,SAAS,gBAAgB,EAAE,SAAS,MAAM,KAAK,MAAM,QAAQ,QAAS,KAAuB,MAAM,EAAE,GAAG,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAC5J,MAAM,OAAO,mCAAmC,sBAAsB,iBAAiB,QAAQ,WAAW,EAAE,MAAM,KAAK,UAAU,CAAC;AAAA,EAClI,MAAM,SAAS,KAAK,KAAK,IAAI,CAAC,QAAQ,IAAI,UAAU,QAAQ,GAAG,EAAE,KAAK,IAAI,IAAI;AAAA,EAE9E,MAAM,aAAa,WAAW;AAAA,IAC5B;AAAA,IACA,MAAM,EAAE,MAAM,YAAY,SAAS,KAAK,SAAS,IAAI,OAAO,GAAG,QAAQ,QAAQ,QAAQ,CAAC,WAAW,EAAE,OAAO,UAAU,MAAM,SAAS,QAAQ,IAAI,EAAE,GAAG,KAAK,EAAE;AAAA,IAC7J;AAAA,EACF,CAAC;AAAA,EACD,OAAO,UAAU,CAAC,GAAG,YAAY,IAAI,EAAE,KAAK,IAAI,kBAAkB,OAAO,KAAK,IAAI,SAAS,mBAAmB,WAAW;AAAA;AAe3H,SAAS,aAAa,CAAC,QAA+G;AAAA,EACpI,QAAQ,SAAS,WAAW,MAAM,cAAc;AAAA,EAChD,IAAI,UAAU,eAAe,aAAa,UAAU,YAAY,aAAa,UAAU,cAAc,aAAa,UAAU,MAAM,UAAU,WAAW;AAAA,IACrJ,MAAM,eAAc,EAAE,SAAS,0HAAqH,CAAC;AAAA,EACvJ;AAAA,EAEA,IAAI,UAAU,YAAY;AAAA,IAAW,MAAM,eAAc,EAAE,SAAS,2CAA2C,CAAC;AAAA,EAChH,MAAM,QAAQ,KAAK,QAAQ;AAAA,EAC3B,IAAI,UAAU,KAAK,KAAK,QAAQ,WAAW,OAAO;AAAA,IAChD,MAAM,eAAc,EAAE,SAAS,gBAAgB,KAAK,QAAQ,sBAAsB,gBAAgB,CAAC;AAAA,EACrG;AAAA,EACA,IAAI,KAAK,KAAK,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,sCAAsC,CAAC;AAAA,EAClG,WAAW,OAAO,KAAK,MAAM;AAAA,IAC3B,IAAI,IAAI,WAAW;AAAA,MAAO,MAAM,eAAc,EAAE,SAAS,oBAAoB,IAAI,qBAAqB,gBAAgB,CAAC;AAAA,EACzH;AAAA,EACA,IAAI,QAAQ,oBAAoB,YAAY,wBAAwB,EAAE,SAAS,KAAK,QAAQ,CAAC,GAAG;AAAA,IAC9F,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,QAAQ,oBAAoB,WAAW,+BAA+B;AAAA,MAC/E,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,MAAM,QAAQ,KAAK,QAAQ,IAAI,CAAC,WAAW,2BAA2B,EAAE,SAAS,OAAO,CAAC,CAAC;AAAA,EAC1F,MAAM,SAAS,MAAM,IAAI,CAAC,MAAM,UAAU,GAAG,UAAU,IAAI,KAAK,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,QAAQ;AAAA,EAC3G,MAAM,QAAQ,KAAK,QAAQ,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC;AAAA,EACrE,OAAO,UAAU,OAAO,KAAK,IAAI,SAAS,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC,MAAM,MAAM,KAAK,IAAI;AAAA;AAMlH,IAAM,uBAA4C,IAAI,IAAI,CAAC,QAAQ,SAAS,WAAW,SAAS,WAAW,OAAO,CAAC;AAOnH,SAAS,eAAe,CAAC,QAAgG;AAAA,EACvH,QAAQ,SAAS,WAAW,cAAc;AAAA,EAC1C,MAAM,WAAW,UAAU,aAAa,CAAC;AAAA,EACzC,IAAI,SAAS,SAAS;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,wCAAwC,CAAC;AAAA,EACjG,IAAI,UAAU,eAAe,aAAa,UAAU,YAAY,aAAa,UAAU,MAAM,UAAU,WAAW;AAAA,IAChH,MAAM,eAAc,EAAE,SAAS,gHAA2G,CAAC;AAAA,EAC7I;AAAA,EAEA,IAAI,UAAU,YAAY;AAAA,IAAW,MAAM,eAAc,EAAE,SAAS,+CAA+C,CAAC;AAAA,EACpH,MAAM,cAAc,CAAC,WAAoC,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,SAAS,OAAO,IAAI,EAAE,KAAK,MAAQ;AAAA,EAClI,MAAM,QAAQ,YAAY,SAAS,EAAqB;AAAA,EACxD,OAAO,SACJ,IAAI,CAAC,QAAQ,UAAU;AAAA,IACtB,IAAI,OAAO,QAAQ,WAAW,KAAK,OAAO,KAAK,MAAM,EAAE,KAAK,CAAC,WAAW,CAAC,qBAAqB,IAAI,MAAM,CAAC,GAAG;AAAA,MAC1G,MAAM,eAAc,EAAE,SAAS,8FAA8F,CAAC;AAAA,IAChI;AAAA,IACA,IAAI,YAAY,MAAM,MAAM;AAAA,MAAO,MAAM,eAAc,EAAE,SAAS,0EAA0E,CAAC;AAAA,IAC7I,MAAM,QAAQ,aAAa,EAAE,SAAS,WAAW,QAAQ,UAAU,CAAC;AAAA,IACpE,OAAO,kBAAkB,MAAM,YAAY,QAAQ,WAAW,EAAE,MAAM,WAAW,QAAQ,CAAC;AAAA,GAC3F,EACA,KAAK,aAAa;AAAA;AAKvB,SAAS,iBAAiB,CAAC,QAA0C;AAAA,EACnE,QAAQ,SAAS;AAAA,EACjB,IAAI,OAAO,KAAK,UAAU,UAAU;AAAA,IAClC,MAAM,eAAc,EAAE,SAAS,QAAQ,KAAK,8BAA8B,CAAC;AAAA,EAC7E;AAAA,EACA,IAAI,KAAK,OAAO;AAAA,IAAmB,OAAO,gBAAgB,EAAE,KAAK,KAAK,MAAM,CAAC;AAAA,EAC7E,IAAI,KAAK,OAAO;AAAA,IAAsB,OAAO,kBAAkB,EAAE,KAAK,KAAK,MAAM,CAAC;AAAA,EAClF,OAAO,gBAAgB,EAAE,KAAK,KAAK,MAAM,CAAC;AAAA;AAI5C,SAAS,cAAc,CAAC,QAKb;AAAA,EACT,QAAQ,SAAS,QAAQ,MAAM,cAAc;AAAA,EAC7C,MAAM,cAAc,UAAU,IAAI,kBAAkB,EAAE,KAAK,CAAC,CAAC;AAAA,EAC7D,IAAI;AAAA,EACJ,IAAI,KAAK,gBAAgB,MAAM;AAAA,IAC7B,OACE,QAAQ,oBAAoB,UACxB,GAAG,gBAAgB,gBACnB,SAAS,sBAAsB;AAAA,EACvC,EAAE,KAAK;AAAA,IACL,OAAO,GAAG,eAAe;AAAA;AAAA,EAE3B,IAAI,QAAQ,qBAAqB;AAAA,IAAM,OAAO,GAAG,OAAO,QAAQ;AAAA,EAChE,OAAO,KAAK,WAAW,OAAO,QAAQ,UAAU;AAAA;AAQlD,SAAS,gBAAgB,CAAC,QAAsE;AAAA,EAC9F,QAAQ,SAAS,QAAQ,WAAW;AAAA,EACpC,OAAO,aAAa,gBAAgB,SAAS,SAAS,gBAAgB,2BAA2B,SAAS,UAAU;AAAA;AAStH,SAAS,gBAAgB,CAAC,QAIf;AAAA,EACT,QAAQ,SAAS,MAAM,cAAc;AAAA,EACrC,IAAI,CAAC,QAAQ,iBAAiB,SAAS,KAAK,EAAE,GAAG;AAAA,IAC/C,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,oBAAoB,KAAK;AAAA,MAClC,MAAM,6BAA6B,QAAQ,iBAAiB,KAAK,IAAI;AAAA,IACvE,CAAC;AAAA,EACH;AAAA,EACA,MAAM,MAAM,KAAK,WAAW,OAAO,OAAO;AAAA,EAE1C,IAAI,QAAQ,iBAAiB,aAAa;AAAA,IACxC,MAAM,SAAS,SAAS,SAAS,KAAK,MAAM;AAAA,IAC5C,MAAM,YAAY,GAAG,UAAU,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC;AAAA,IAYxD,MAAM,YAAY,KAAK,YAAY,SAAS,IAAI,aAAa,sBAAsB,IAAI,aAAa;AAAA,IACpG,QAAQ,KAAK;AAAA,MACX,KAAK,UAAU;AAAA,QAKb,MAAM,SAAS,KAAK,YAAY,SAAS,gBAAgB;AAAA,QACzD,MAAM,SAAS,KAAK,KAAK,QAAQ,CAAC,SAAS,UAAU;AAAA,UACnD,IAAI,OAAO,YAAY,YAAY,CAAC,cAAc,KAAK,OAAO;AAAA,YAAG,OAAO,CAAC;AAAA,UACzE,MAAM,YAAY,UAAU,IAAI,SAAS,GAAG,aAAa,UAAU,IAAI,KAAK,KAAK,MAAM,GAAG,KAAK,EAAE,IAAI,MAAM,CAAC;AAAA,UAC5G,OAAO,CAAC,QAAQ,UAAU,uBAAuB;AAAA,SAClD;AAAA,QACD,OAAO,iBAAiB,EAAE,SAAS,IAAI,aAAa,yBAAyB,OAAO,KAAK,EAAE,KAAK,QAAQ,QAAQ,KAAK,UAAU,KAAK,CAAC;AAAA,MACvI;AAAA,MACA,KAAK;AAAA,QACH,OAAO,GAAG,aAAa,OAAO,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC,IAAI,QAAQ;AAAA,MACpF,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,oBAAoB;AAAA,QACvB,MAAM,SAAS,KAAK,YAAY,SAAS,IAAI,wBAAwB,IAAI,cAAc;AAAA,QACvF,OAAO,eAAe,EAAE,SAAS,QAAQ,MAAM,UAAU,CAAC;AAAA,MAC5D;AAAA,MACA,KAAK;AAAA,QACH,OAAO,GAAG,gBAAgB,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC,IAAI,QAAQ;AAAA,MAChF,KAAK;AAAA,QACH,OAAO,GAAG,oBAAoB,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC,IAAI,QAAQ;AAAA,MACpF,KAAK;AAAA,QACH,OAAO,GAAG,qBAAqB,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC,IAAI,QAAQ;AAAA;AAAA,EAEzF;AAAA,EAEA,IAAI,QAAQ,iBAAiB,iBAAiB;AAAA,IAC5C,MAAM,SAAS,SAAS,SAAS,KAAK,MAAM;AAAA,IAE5C,MAAM,cAAc,CAAC,MAAc,UAA2B;AAAA,MAC5D,IAAI,OAAO,UAAU;AAAA,QAAU,OAAO,GAAG;AAAA,MACzC,MAAM,MAAM,OAAO,UAAU,YAAY,OAAO,KAAK,IACjD,UAAU,OAAO,SAAS,MAAM,QAAQ,KAAK,IAAI,UACjD,OAAO,UAAU,WAAW,WAAW;AAAA,MAC3C,OAAO,GAAG,WAAW;AAAA;AAAA,IAEvB,MAAM,mBAAmB,CAAC,MAAc,UAA2B;AAAA,MACjE,MAAM,OAAO,aAAa,WAAW,UAAU,IAAI,IAAI;AAAA,MACvD,MAAM,QAAQ,YAAY,MAAM,KAAK;AAAA,MACrC,IAAI,OAAO;AAAA,MACX,IAAI,UAAU,MAAM;AAAA,QAClB,MAAM,SAAS,gBAAgB,WAAW,UAAU,IAAI,IAAI;AAAA,QAC5D,MAAM,QAAQ,OAAO,UAAU,YAAa,QAAQ,IAAI,IAAK;AAAA,QAC7D,MAAM,aAAa,OAAO,UAAU,WAChC,yBAAyB,EAAE,SAAS,MAAM,QAAQ,OAAO,UAAU,IAAI,KAAK,UAAU,KAAK,CAAC,EAAE,CAAC,IAC/F,GAAG,YAAY,UAAU,IAAI,KAAK;AAAA,QACtC,OAAO,IAAI,aAAa;AAAA,MAC1B;AAAA,MACA,OAAO,KAAK,WAAW,OAAO,QAAQ,UAAU;AAAA;AAAA,IAElD,QAAQ,KAAK;AAAA,MACX,KAAK;AAAA,QACH,OAAO,iBAAiB,EAAE,SAAS,aAAa,WAAW,UAAU,IAAI,eAAe,KAAK,IAAI,CAAC,kBAAkB,QAAQ,QAAQ,KAAK,UAAU,KAAK,CAAC;AAAA,MAC3J,KAAK;AAAA,QACH,OAAO,iBAAiB,eAAe,KAAK,IAAI,GAAG,KAAK,KAAK;AAAA,MAC/D,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK,oBAAoB;AAAA,QACvB,MAAM,SAAS,gBAAgB,WAAW,UAAU,IAAI,eAAe,KAAK,IAAI,CAAC;AAAA,QACjF,OAAO,eAAe,EAAE,SAAS,QAAQ,MAAM,UAAU,CAAC;AAAA,MAC5D;AAAA,MACA,KAAK;AAAA,MACL,KAAK,mBAAmB;AAAA,QAGtB,MAAM,OAAO,KAAK,OAAO,sBAAsB,QAAQ;AAAA,QACvD,OAAO,iBAAiB,GAAG,eAAe,KAAK,IAAI,IAAI,QAAQ,KAAK,KAAK;AAAA,MAC3E;AAAA,MACA,KAAK,kBAAkB;AAAA,QAerB,MAAM,QAAQ,aAAa,WAAW,UAAU,IAAI,eAAe,KAAK,IAAI,CAAC;AAAA,QAC7E,MAAM,WAAW,MAAM,QAAQ,KAAK,KAAK,IAAI,KAAK,QAAQ,CAAC,KAAK,KAAK;AAAA,QACrE,MAAM,QAAQ,SAAS,IAAI,CAAC,YAAY;AAAA,UACtC,IAAI,YAAY,QAAS,OAAO,YAAY,YAAY,YAAY,MAAO;AAAA,YACzE,MAAM,wBAAsB;AAAA,cAC1B,SAAS,QAAQ;AAAA,cACjB,SAAS;AAAA,cACT,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,UACA,MAAM,QAAQ,OAAO,YAAY,YAAa,UAAU,IAAI,IAAK;AAAA,UACjE,MAAM,OAAO,UAAU,IAAI,eAAe,KAAK,IAAI,CAAC;AAAA,UACpD,MAAM,OAAO,GAAG,QAAQ,WAAW,EAAE,MAAM,YAAY,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,OAAO,CAAC;AAAA,UAChG,OAAO,mCAAmC,WAAW,eAAe,YAAY,MAAM,OAAO,SAAS,QAAQ,WAAW,EAAE,MAAM,YAAY,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,QAAQ,CAAC,OAAO,UAAU,IAAI,KAAK;AAAA,SAClN;AAAA,QACD,OAAO,MAAM,WAAW,IAAI,QAAQ,IAAI,CAAC,OAAO,GAAG,KAAK,EAAE,KAAK,OAAO;AAAA,MACxE;AAAA,MACA;AAAA,QACE,MAAM,eAAc,EAAE,SAAS,YAAY,KAAK,6CAA6C,CAAC;AAAA;AAAA,EAEpG;AAAA,EAGA,MAAM,SAAS,SAAS,SAAS,KAAK,MAAM;AAAA,EAC5C,MAAM,aAAa,eAAe,KAAK,IAAI;AAAA,EAC3C,QAAQ,KAAK;AAAA,IACX,KAAK,UAAU;AAAA,MAEb,MAAM,UAAU,sBAAsB,kBAAkB,UAAU,IAAI,UAAU;AAAA,MAChF,OAAO,KAAK,UAAU,OAAO,UAAU,OAAO;AAAA,IAChD;AAAA,IACA,KAAK;AAAA,MACH,OAAO,gBAAgB,WAAW,UAAU,IAAI,UAAU,MAAM,YAAY,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,IACtH,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,oBAAoB;AAAA,MACvB,MAAM,SAAS,6BAA6B,WAAW,UAAU,IAAI,UAAU;AAAA,MAC/E,OAAO,eAAe,EAAE,SAAS,QAAQ,MAAM,UAAU,CAAC;AAAA,IAC5D;AAAA,IACA,KAAK;AAAA,MACH,OAAO,8BAA8B,WAAW,UAAU,IAAI,UAAU,YAAY,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,IAC9H,KAAK;AAAA,MACH,OAAO,gBAAgB,WAAW,UAAU,IAAI,GAAG,eAAe,MAAM,YAAY,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA,IAC9H,KAAK;AAAA,MACH,OAAO,gBAAgB,WAAW,UAAU,IAAI,GAAG,kBAAkB,MAAM,YAAY,UAAU,IAAI,KAAK,UAAU,KAAK,KAAK,CAAC;AAAA;AAAA;AAerI,SAAS,kBAAkB,CAAC,QAAiG;AAAA,EAC3H,QAAQ,SAAS,WAAW,WAAW;AAAA,EACvC,IAAI,OAAO,aAAa;AAAA,IAAW;AAAA,EACnC,MAAM,OAAO,SAAS,SAAS,MAAM;AAAA,EACrC,MAAM,YAAY,UAAU,QAAQ,KAAK,CAAC,cACxC,UAAU,aAAa,aAAa,UAAU,cAAc,aAAa,UAAU,UAAU,aAAa,SAAS,SAAS,SAAS,MAAM,IAAI;AAAA,EACjJ,OAAO,WAAW;AAAA;AAGpB,SAAS,eAAe,CAAC,QAA+G;AAAA,EACtI,QAAQ,SAAS,MAAM,WAAW,oBAAoB;AAAA,EACtD,IAAI,SAAS,MAAM;AAAA,IACjB,OAAO,GAAG,aAAa,SAAS,KAAK,KAAK,SAAS,KAAK,KAAK,cAAc,QAAQ,QAAQ;AAAA,EAC7F;AAAA,EAIA,MAAM,aAAa,YAAY,OAC3B,MAAc,qBAAqB,EAAE,SAAS,UAAU,MAAM,UAAU,CAAC,IACzE,MAAc,SAAS,SAAS,KAAK,MAAM;AAAA,EAC/C,MAAM,YAAY,KAAK,cAAc,QAAQ,QAAQ;AAAA,EACrD,IAAI,KAAK,UAAU,WAAW;AAAA,IAC5B,OAAO,GAAG,WAAW,KAAK;AAAA,EAC5B;AAAA,EACA,IAAI,QAAQ,qBAAqB,UAAU;AAAA,IACzC,OAAO,GAAG,WAAW,KAAK,mBAAmB,KAAK,UAAU,UAAU,UAAU;AAAA,EAClF;AAAA,EAOA,IAAK,KAAK,UAAU,aAAc,KAAK,cAAc,QAAQ;AAAA,IAC3D,OAAO,GAAG,WAAW,KAAK;AAAA,EAC5B;AAAA,EACA,MAAM,SAAS,oBAAoB,YAAY,WAAW,IAAI,QAAQ,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAAA,EAC1G,MAAM,YAAY,KAAK,UAAU,UAAU,GAAG,wBAAwB,GAAG;AAAA,EACzE,OAAO,GAAG,cAAc,WAAW,KAAK;AAAA;AAK1C,SAAS,gBAAgB,CAAC,QAA2D;AAAA,EACnF,QAAQ,SAAS,SAAS;AAAA,EAC1B,IAAI,KAAK,SAAS;AAAA,IAAO,OAAO;AAAA,EAChC,IAAI,KAAK,SAAS;AAAA,IAAU,MAAM,eAAc,EAAE,SAAS,sDAAsD,CAAC;AAAA,EAClH,MAAM,QAAQ,KAAK,UAAU,YAAY,KAAK,OAAO,QAAQ,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,EAC5F,OAAO,WAAW;AAAA;AAqBpB,SAAS,mBAAmB,CAAC,QAA8E;AAAA,EACzG,QAAQ,SAAS,MAAM,aAAa;AAAA,EACpC,MAAM,OAAO,cAAc,EAAE,QAAQ,CAAC;AAAA,EAGtC,MAAM,WAAW,KAAK,OAAO;AAAA,EAC7B,MAAM,aAAa,aAAa,aAAa,KAAK,UAAU,kBAAkB,KAAK,QAAQ,eACzF,SAAS,YAAY,WAAW,KAAK,SAAS,QAAQ,SAAS;AAAA,EACjE,IAAI,KAAK,OAAO,QAAQ,WAAW,KAAK,KAAK,OAAO,eAAe,cAC9D,KAAK,OAAO,YAAY,UAAU,KAAK,KAAM,aAAa,aAAa,CAAC,YAAa;AAAA,IACxF,MAAM,eAAc,EAAE,SAAS,qEAAqE,CAAC;AAAA,EACvG;AAAA,EACA,MAAM,YAAY,KAAK,OAAO,QAAQ,IAAI,CAAC,WAAW,qBAAqB,EAAE,OAAO,CAAC,CAAC;AAAA,EACtF,MAAM,SAAS,KAAK,UAAU,CAAC;AAAA,EAC/B,IAAI,OAAO,KAAK,CAAC,SAAS,CAAC,UAAU,SAAS,IAAI,CAAC,KAAK,OAAO,UAAU,UAAU,QAAQ;AAAA,IACzF,MAAM,eAAc,EAAE,SAAS,2FAA2F,CAAC;AAAA,EAC7H;AAAA,EACA,MAAM,QAAQ,CAAC,GAAG,UAAU,OAAO,CAAC,SAAS,CAAC,OAAO,SAAS,IAAI,CAAC,GAAG,GAAI,aAAa,CAAC,SAAS,KAAK,IAAI,CAAC,CAAE;AAAA,EAC7G,IAAI,IAAI,IAAI,KAAK,EAAE,SAAS,MAAM,QAAQ;AAAA,IACxC,MAAM,eAAc,EAAE,SAAS,2DAA2D,CAAC;AAAA,EAC7F;AAAA,EACA,MAAM,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,YAAY,QAAQ,WAAW,EAAE,KAAK,CAAC,GAAG;AAAA,EAChF,MAAM,SAAmB,CAAC;AAAA,EAC1B,SAAS,QAAQ,EAAG,QAAQ,OAAO,QAAQ,SAAS,eAAe,WAAW;AAAA,IAC5E,OAAO,KAAK,GAAG,KAAK,YAAY,OAAO,MAAM,OAAO,QAAQ,eAAe,SAAS,EAAE,KAAK,IAAI,IAAI;AAAA,EACrG;AAAA,EACA,IAAI,OAAO,SAAS,eAAe,WAAW;AAAA,IAC5C,MAAM,eAAc,EAAE,SAAS,kEAAkE,CAAC;AAAA,EACpG;AAAA,EACA,OAAO,OAAO,WAAW,IAAI,OAAO,KAAe,GAAG,KAAK,YAAY,OAAO,KAAK,IAAI;AAAA;AAIzF,SAAS,aAAa,CAAC,QAAyE;AAAA,EAC9F,MAAM,OAAO,OAAO,QAAQ;AAAA,EAC5B,IAAI,SAAS;AAAA,IAAM,MAAM,eAAc,EAAE,SAAS,sDAAsD,CAAC;AAAA,EACzG,OAAO;AAAA;AAGT,SAAS,iBAAiB,CAAC,QAIhB;AAAA,EACT,QAAQ,SAAS,MAAM,cAAc;AAAA,EACrC,MAAM,QAAQ,aAAa,EAAE,SAAS,WAAW,KAAK,QAAQ,UAAU,CAAC;AAAA,EACzE,IAAI,KAAK,QAAQ,SAAS;AAAA,IACxB,IAAI,KAAK,cAAc,gBAAgB,KAAK,OAAO,QAAQ,WAAW,KAClE,KAAK,OAAO,YAAY,SAAS,cAAc,KAAK,OAAO,WAAW,UAAU,KAAK,eACrF,KAAK,OAAO,YAAY,aAAa,KAAK,OAAO,WAAW,aAC5D,KAAK,OAAO,UAAU,aAAa,KAAK,OAAO,WAAW,aAAa,KAAK,OAAO,eAAe,aAClG,KAAK,OAAO,aAAa,WAAW;AAAA,MACtC,MAAM,eAAc,EAAE,SAAS,0EAA0E,CAAC;AAAA,IAC5G;AAAA,IACA,OAAO,sBAAsB,MAAM,YAAY,QAAQ,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,EACxF;AAAA,EACA,IAAI,KAAK,QAAQ,aAAa;AAAA,IAC5B,IAAI,KAAK,cAAc,gBAAgB,KAAK,OAAO,QAAQ,WAAW,KAAK,KAAK,OAAO,eAAe,cACjG,KAAK,OAAO,YAAY,UAAU,OAAO,KAC1C,KAAK,OAAO,YAAY,aAAa,KAAK,OAAO,WAAW,aAAa,KAAK,OAAO,iBAAiB,aACtG,KAAK,OAAO,UAAU,aAAa,KAAK,OAAO,WAAW,aAAa,KAAK,OAAO,eAAe,aAClG,KAAK,OAAO,aAAa,aAAa,KAAK,OAAO,YAAY,WAAW;AAAA,MAC3E,MAAM,eAAc,EAAE,SAAS,gEAAgE,CAAC;AAAA,IAClG;AAAA,IACA,OAAO,sBAAsB,MAAM,YAAY,QAAQ,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,EACxF;AAAA,EACA,MAAM,cAAc,QAAQ,WAAW,EAAE,MAAM,KAAK,YAAY,CAAC;AAAA,EACjE,MAAM,WAAW,QAAQ,WAAW,EAAE,MAAM,QAAQ,CAAC;AAAA,EACrD,MAAM,OAAO,cAAc,EAAE,QAAQ,CAAC;AAAA,EAQtC,IAAI,WAAW;AAAA,EACf,IAAI,KAAK,UAAU,iBAAiB,KAAK,QAAQ,eAAe,KAAK,OAAO,YAAY,aAAa,KAAK,OAAO,QAAQ,SAAS,GAAG;AAAA,IACnI,MAAM,YAAY,IAAI,IACpB,KAAK,OAAO,QACT,OAAO,CAAC,WAAW,OAAO,cAAc,aAAa,OAAO,aAAa,IAAI,EAC7E,IAAI,CAAC,WAAW,OAAO,IAAI,EAC3B,QAAQ,KAAK,OAAO,oBAAoB,CAAC,GAAG,IAAI,CAAC,aAAa,SAAS,KAAK,CAAC,CAClF;AAAA,IACA,MAAM,QAAQ,KAAK,OAAO;AAAA,IAC1B,MAAM,cAAc,MAAM,OACxB,CAAC,UAAyD,YAAY,KACxE;AAAA,IACA,MAAM,SAAS,CAAC,YAA4B,EAAE,OAAO,SAAS,MAAM,OAAO,SAAU,OAAO,cAAc,YAAY,CAAC,IAAI,EAAE,WAAW,OAAO,UAAU,EAAG;AAAA,IAC5J,MAAM,WAAW,CAAC,WAChB,OAAO,aAAa,YAAY,UAAU,IAAI,OAAO,IAAI,IAAI,OAAO,SAAS,MAAM,CAAC,WAAW,UAAU,IAAI,OAAO,IAAI,CAAC;AAAA,IAC3H,IAAI,YAAY,WAAW,MAAM,UAAU,YAAY,MAAM,CAAC,SAAS,SAAS,KAAK,MAAM,CAAC,GAAG;AAAA,MAC7F,MAAM,WAAW,YAAY,IAAI,CAAC,SAChC,gBAAgB;AAAA,QACd;AAAA,QACA,MAAM;AAAA,aACD;AAAA,UACH,QAAQ,KAAK,OAAO,aAAa,YAAY,OAAO,KAAK,MAAM,IAAI,KAAK,KAAK,QAAQ,UAAU,KAAK,OAAO,SAAS,IAAI,MAAM,EAAE;AAAA,QAClI;AAAA,QACA;AAAA,MACF,CAAC,CACH;AAAA,MACA,WAAW,aAAa,SAAS,KAAK,IAAI;AAAA,IAC5C;AAAA,EACF;AAAA,EACA,IAAI,KAAK,cAAc,gBAAgB,KAAK,UAAU,eAAe;AAAA,IAGnE,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,8BAA8B,MAAM,mFAAqF,CAAC;AAAA,EAC1L;AAAA,EACA,MAAM,UAAU,KAAK,cAAc,eAC/B,oBAAoB,EAAE,SAAS,MAAM,SAAS,CAAC,IAC/C,WAAW;AAAA,EACf,MAAM,aACJ,KAAK,QAAQ,cACT,YAAY,KAAK,YAAY,UAAU,cAAc,KAAK,kBAAkB,gBAC5E,GAAG,cAAc;AAAA,EACvB,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,EACrD,OAAO,6BAA6B,oBAAoB,MAAM,YAAY,gBAAgB;AAAA;AAQ5F,SAAS,mBAAmB,CAAC,QAIlB;AAAA,EACT,QAAQ,SAAS,UAAU,cAAc;AAAA,EACzC,MAAM,SAAS,SAAS;AAAA,EACxB,IAAI,OAAO,QAAQ,WAAW,KAAK,OAAO,YAAY,SAAS,eAC1D,OAAO,YAAY,UAAU,KAAK,KAAK,OAAO,cAAc,aAC7D,OAAO,YAAY,aAAa,OAAO,WAAW,aAClD,OAAO,UAAU,aAAa,OAAO,WAAW,aAChD,OAAO,eAAe,aAAa,OAAO,aAAa,aAAa,OAAO,YAAY,aACvF,OAAO,oBAAoB,aAAa,OAAO,qBAAqB,WAAW;AAAA,IACjF,MAAM,eAAc,EAAE,SAAS,gDAAgD,CAAC;AAAA,EAClF;AAAA,EACA,MAAM,QAAQ,aAAa,EAAE,SAAS,WAAW,QAAQ,UAAU,CAAC;AAAA,EACpE,OAAO,IAAI,MAAM,YAAY,QAAQ,WAAW,EAAE,MAAM,SAAS,MAAM,CAAC;AAAA;AAI1E,SAAS,oBAAoB,CAAC,QAInB;AAAA,EACT,QAAQ,SAAS,UAAU,cAAc;AAAA,EACzC,MAAM,QAAQ,IAAI,aAAa,EAAE,SAAS,WAAW,SAAS,QAAQ,UAAU,CAAC,EAAE;AAAA,EACnF,OAAO,SAAS,aAAa,IAAI,YAAY,cAAc;AAAA;AAK7D,SAAS,cAAc,CAAC,QAasC;AAAA,EAC5D,QAAQ,SAAS,cAAc;AAAA,EAC/B,IAAI,cAAc,aAAa,UAAU,WAAW,GAAG;AAAA,IACrD,OAAO,EAAE,QAAQ,IAAI,QAAQ,OAAO;AAAA,EACtC;AAAA,EACA,IAAI,CAAC,QAAQ,aAAa,WAAW;AAAA,IAEnC,MAAM,UAAU,UAAU,KAAK,wBAAwB;AAAA,IACvD,IAAI,YAAY;AAAA,MAAW,uBAAuB,EAAE,SAAS,QAAQ,SAAS,WAAW,OAAO,WAAW,MAAM,gBAAgB,CAAC;AAAA,IAClI,MAAM,QAAQ,UAAU,KAAK,yBAAyB;AAAA,IACtD,IAAI,UAAU;AAAA,MAAW,wBAAwB,EAAE,SAAS,QAAQ,OAAO,MAAM,gBAAgB,CAAC;AAAA,IAClG,MAAM,UAAU,UAAU,KAAK,CAAC,WAAW,OAAO,WAAW,aAAY,mBAAmB,OAAM;AAAA,IAClG,IAAI,YAAY;AAAA,MAAW,6BAA6B,EAAE,SAAS,OAAO,oBAAoB,OAAO,EAAE,CAAC;AAAA,IACxG,OAAO,EAAE,QAAQ,IAAI,QAAQ,UAAU;AAAA,EACzC;AAAA,EAGA,MAAM,UAAU,OAAO,OAAO,SAAS,SAAS,OAAO,OAAO,SAAS,UACrE,UAAU,KAAK,CAAC,WAAW,yBAAyB,MAAM,KAAM,0BAA0B,MAAM,KAAK,OAAO,SAAS,KAAM;AAAA,EAC7H,MAAM,OAAO,SAAS,EAAE,KAAK,QAAQ,WAAW,EAAE,MAAM,aAAa,CAAC,GAAG,KAAK,QAAQ,WAAW,EAAE,MAAM,aAAa,CAAC,EAAE,IAAI;AAAA,EAC7H,MAAM,OAAO,CAAC,SAA0B,OAAO,YAAY,YAAY,OAAO,GAAG,OAAO,WAAW;AAAA,EACnG,MAAM,UAAU,UACb,IAAI,CAAC,WAAW;AAAA,IACf,IAAI,OAAO,WAAW;AAAA,MAAU,OAAO,KAAK,QAAQ,WAAW,EAAE,MAAM,OAAO,CAAC,CAAC;AAAA,IAChF,IAAI,aAAa;AAAA,MAAQ,OAAO,uBAAuB,EAAE,SAAS,QAAQ,WAAW,OAAO,WAAW,KAAK,CAAC;AAAA,IAC7G,IAAI,UAAU;AAAA,MAAQ,OAAO,wBAAwB,EAAE,SAAS,QAAQ,KAAK,CAAC;AAAA,IAC9E,IAAI,mBAAmB;AAAA,MAAQ,OAAO,6BAA6B,EAAE,SAAS,OAAO,OAAO,MAAM,CAAC;AAAA,IACnG,IAAI,eAAe,QAAQ;AAAA,MACzB,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,MACrD,OAAO,GAAG,QAAQ,mBAAmB,EAAE,YAAY,KAAK,IAAI,EAAE,CAAC,QAAQ;AAAA,IACzE;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,IACrD,OAAO,GAAG,eAAe,EAAE,SAAS,YAAY,KAAK,IAAI,EAAE,CAAC,QAAQ;AAAA,GACrE,EACA,KAAK,IAAI;AAAA,EACZ,MAAM,UAAU,SAAS,gBAAgB,KAAK,eAAe,KAAK,UAAU;AAAA,EAC5E,OAAO,EAAE,QAAQ,cAAc,UAAU,WAAW,QAAQ,SAAS;AAAA;AAMvE,IAAM,kBAA4B,OAAO,OAAO,EAAE,KAAK,OAAO,KAAK,MAAM,CAAC;AAG1E,SAAS,4BAA4B,CAAC,QAAwD;AAAA,EAC5F,QAAQ,YAAY;AAAA,EACpB,IAAI,CAAC,QAAQ,aAAa,YAAY;AAAA,IACpC,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,gCAAgC,MAAM,+FAA+F,CAAC;AAAA,EACtM;AAAA,EACA,OAAO,uDAAuD,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA;AASzG,SAAS,sBAAsB,CAAC,QAAiI;AAAA,EAC/J,QAAQ,SAAS,QAAQ,SAAS;AAAA,EAClC,IAAI,CAAC,QAAQ,aAAa,YAAY;AAAA,IACpC,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,qCAAqC,MAAM,0GAA0G,CAAC;AAAA,EACtN;AAAA,EACA,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,EACvD,IAAI,OAAO,YAAY,WAAW;AAAA,IAChC,IAAI,OAAO,cAAc;AAAA,MAAW,MAAM,eAAc,EAAE,SAAS,2BAA2B,OAAO,gDAAgD,CAAC;AAAA,IACtJ,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAAA,IAC9D,MAAM,QAAQ,OAAO,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,SAAS,QAAQ,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,OAAO,KAAK,OAAO,QAAQ,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,KAAK,OAAO;AAAA,IAC7K,OAAO,GAAG,oBAAoB,EAAE,SAAS,SAAS,OAAO,SAAS,OAAO,WAAW,OAAO,UAAU,CAAC,QAAQ;AAAA,EAChH;AAAA,EACA,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,EACrD,IAAI,OAAO,YAAY;AAAA,IAAY,OAAO,IAAI,KAAK,OAAO,oBAAoB;AAAA,EAC9E,IAAI,OAAO,YAAY;AAAA,IAAO,OAAO,GAAG,KAAK,OAAO,WAAW;AAAA,EAC/D,OAAO,GAAG,kBAAkB,EAAE,SAAS,KAAK,KAAK,OAAO,UAAU,MAAM,OAAO,CAAC,QAAQ;AAAA;AAG1F,IAAM,sBAAsB;AAC5B,IAAM,oBAAoB;AAQ1B,SAAS,iBAAiB,CAAC,QAAyE;AAAA,EAClG,QAAQ,SAAS,KAAK,SAAS;AAAA,EAC/B,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,EACnD,IAAI,KAAK,QAAQ;AAAA,IAAW,OAAO,eAAe,EAAE,SAAS,YAAY,GAAG,OAAO,OAAO,CAAC;AAAA,EAC3F,IAAI,KAAK,IAAI,GAAG,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,mBAAmB,KAAK,IAAI,MAAM,sCAAsC,CAAC;AAAA,EACtI,MAAM,UAAU,QAAQ,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAAA,EAC9D,MAAM,QAAQ,KAAK,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,WAAW,QAAQ,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,OAAO,QAAQ,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,EAAE,KAAK,OAAO;AAAA,EACrK,OAAO,WAAW,eAAe,EAAE,SAAS,YAAY,GAAG,WAAW,OAAO,CAAC,UAAU,YAAY,SAAS,KAAK,IAAI,KAAK,QAAQ,iBAAiB;AAAA;AAItJ,SAAS,mBAAmB,CAAC,QAA4G;AAAA,EACvI,QAAQ,SAAS,SAAS,OAAO,cAAc;AAAA,EAC/C,IAAI,QAAQ,MAAM,WAAW,KAAK,QAAQ,GAAG,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,yBAAyB,QAAQ,MAAM,mDAAmD,CAAC;AAAA,EACrL,IAAI,CAAC,OAAO,cAAc,QAAQ,KAAK,KAAK,QAAQ,QAAQ;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,yBAAyB,QAAQ,MAAM,uCAAuC,CAAC;AAAA,EAC7K,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAAA,EAC9D,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,WAAW,CAAC;AAAA,EACpD,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC,SAAS,kBAAkB,EAAE,SAAS,KAAK,OAAO,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EACrG,OAAO,qBAAqB,2CAA2C,aAAa,aAAa,YAAY,SAAS,QAAQ,KAAK,QAAQ,eAAe,eAAe,UAAU,IAAI,QAAQ,KAAK,SAAS,QAAQ,WAAW,EAAE,MAAM,WAAW,CAAC;AAAA;AAStP,SAAS,uBAAuB,CAAC,QAA0F;AAAA,EACzH,QAAQ,SAAS,WAAW;AAAA,EAC5B,MAAM,UAAU,OAAO,SAAS;AAAA,EAChC,IAAI,UAAU,CAAC,QAAQ,aAAa,aAAa,CAAC,QAAQ,aAAa,4BAA4B;AAAA,IACjG,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS,UAAU,oDAA+C;AAAA,MAClE,MAAM,UAAU,iCAAiC;AAAA,IACnD,CAAC;AAAA,EACH;AAAA,EACA,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,CAAC;AAAA,EACrD,MAAM,aAAa,OAAO,SAAS,QAAQ,GAAG,OAAO,KAAK,OAAO,SAAS,GAAG,QAAQ,WAAW,EAAE,MAAM,OAAO,KAAK,OAAO,CAAC,KAAK;AAAA,EACjI,MAAM,YAAY,OAAO,eAAe,aAAa,eAAe,EAAE,SAAS,WAAW,CAAC,IACvF,OAAO,eAAe,aAAa,QAAQ,mBAAmB,EAAE,WAAW,CAAC,IAC5E;AAAA,EACJ,OAAO,GAAG,gBAAgB,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA;AA2BrE,SAAS,kBAAkB,CAAC,QAAwF;AAAA,EAClH,QAAQ,SAAS,MAAM,cAAc;AAAA,EAIrC,MAAM,iBAAiB,CAAC,WAAoC,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU,OAAO,SAAS;AAAA,EAClI,MAAM,WAAW,QAAQ,SAAS,UAC9B,KAAK,QAAQ,MAAM,CAAC,WAAW,OAAO,SAAS,YAAY,OAAO,SAAS,MAAM,IACjF,QAAQ,SAAS,cAAc,KAAK,QAAQ,MAAM,cAAc;AAAA,EACpE,IAAI,CAAC,UAAU;AAAA,IACb,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,IAAI,KAAK,QAAQ,WAAW,KAAK,KAAK,QAAQ,WAAW,KAAK,QAAQ,QAAQ;AAAA,IAC5E,MAAM,eAAc,EAAE,SAAS,8CAA8C,KAAK,QAAQ,cAAc,KAAK,QAAQ,SAAS,CAAC;AAAA,EACjI;AAAA,EACA,IAAI,KAAK,KAAK,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,uCAAuC,CAAC;AAAA,EACnG,WAAW,UAAU,KAAK,SAAS;AAAA,IACjC,IAAI,OAAO,SAAS,aAAa,EAAE,OAAO,UAAU,OAAO,KAAK,KAAK,OAAO,SAAS,KAAK,OAAO,SAAS,KAAK;AAAA,MAC7G,MAAM,eAAc,EAAE,SAAS,wDAAwD,OAAO,OAAO,KAAK,IAAI,CAAC;AAAA,IACjH;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,EACrD,MAAM,cAAc,KAAK,QAAQ,IAAI,CAAC,GAAG,UAAU,QAAQ,WAAW,EAAE,MAAM,WAAW,QAAQ,CAAC,CAAC;AAAA,EACnG,MAAM,OAAO,KAAK,KAAK,IAAI,CAAC,KAAK,YAAY;AAAA,IAC3C,IAAI,IAAI,WAAW,KAAK,QAAQ,QAAQ;AAAA,MACtC,MAAM,eAAc,EAAE,SAAS,qBAAqB,IAAI,qBAAqB,KAAK,QAAQ,iBAAiB,CAAC;AAAA,IAC9G;AAAA,IACA,MAAM,QAAQ,IAAI,IAAI,CAAC,OAAO,UAAU;AAAA,MACtC,MAAM,cAAc,UAAU,IAAI,KAAK;AAAA,MACvC,MAAM,SAAS,KAAK,QAAQ;AAAA,MAC5B,QAAQ,OAAO;AAAA,QACb,KAAK;AAAA,UACH,OAAO,QAAQ,SAAS,UAAU,QAAQ,2BAA2B,QAAQ;AAAA,QAC/E,KAAK;AAAA,UACH,OAAO,QAAQ;AAAA,QACjB,KAAK;AAAA,UACH,OAAO,QAAQ;AAAA,QACjB,KAAK;AAAA,UACH,OAAO,QAAQ,6BAA6B,OAAO;AAAA,QACrD,KAAK;AAAA,UACH,OAAO,QAAQ;AAAA,QACjB,KAAK;AAAA,UACH,OAAO,QAAQ;AAAA,QACjB;AAAA,UACE,OAAO;AAAA;AAAA,KAEZ;AAAA,IACD,OAAO,QAAQ,SAAS,UAAU,OAAO,MAAM,KAAK,IAAI,MAAM,aAAa,IAAI,MAAM,KAAK,IAAI,MAAM;AAAA,GACrG;AAAA,EACD,MAAM,KAAK,KAAK,QAAQ,IAAI,CAAC,QAAQ,UAAU,GAAG,SAAS,SAAS,MAAM,OAAO,SAAS,YAAY,QAAkB,EAAE,KAAK,OAAO;AAAA,EACtI,OAAO,sBAAsB,KAAK,KAAK,IAAI,SAAS,UAAU,CAAC,GAAG,aAAa,QAAQ,WAAW,EAAE,MAAM,KAAK,aAAa,CAAC,CAAC,EAAE,KAAK,IAAI,SAAS;AAAA;AAapJ,SAAS,cAAc,CAAC,QAAoF;AAAA,EAC1G,QAAQ,SAAS,MAAM,cAAc;AAAA,EACrC,IAAI,KAAK,GAAG,WAAW,GAAG;AAAA,IACxB,MAAM,eAAc,EAAE,SAAS,uCAAuC,CAAC;AAAA,EACzE;AAAA,EACA,IAAI,KAAK,OAAO,QAAQ,WAAW,KAAK,KAAK,OAAO,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,SAAS,GAAG;AAAA,IACxG,MAAM,eAAc,EAAE,SAAS,iEAAiE,CAAC;AAAA,EACnG;AAAA,EACA,MAAM,QAAQ,aAAa,EAAE,SAAS,WAAW,KAAK,QAAQ,UAAU,CAAC;AAAA,EACzE,MAAM,KAAK,KAAK,GACb,IAAI,CAAC,SAAS,GAAG,SAAS,SAAS,KAAK,IAAI,OAAO,SAAS,SAAS,KAAK,KAAK,GAAG,EAClF,KAAK,OAAO;AAAA,EACf,OAAO,cAAc,MAAM,YAAY,QAAQ,WAAW,EAAE,MAAM,KAAK,MAAM,CAAC,QAAQ;AAAA;AAQxF,SAAS,kBAAkB,CAAC,QAAsH;AAAA,EAChJ,QAAQ,SAAS,WAAW,OAAO,cAAc;AAAA,EACjD,MAAM,QACJ,UAAU,QAAQ,SAAS,MAAM,UAAU,YAAY,UAAU,KAAK,KAAK,UAAU,oBAAoB,aACzG,UAAU,qBAAqB,aAAa,UAAU,cAAc,aAAa,UAAU,YAAY,aACvG,UAAU,iBAAiB,aAAa,UAAU,WAAW,aAAa,UAAU,YAAY,aAChG,UAAU,UAAU,aAAa,UAAU,WAAW,aAAa,UAAU,YAAY,aACzF,UAAU,aAAa,aAAa,UAAU,eAAe,aAAa,UAAU,iBAAiB,aACrG,UAAU,eAAe,aAAa,UAAU,cAAc,aAAa,UAAU,aAAa;AAAA,EACpG,IAAI;AAAA,IAAO,MAAM,eAAc,EAAE,SAAS,iDAAiD,CAAC;AAAA,EAC5F,MAAM,QAAQ,aAAa,EAAE,SAAS,WAAW,KAAK,WAAW,YAAY,EAAE,MAAM,MAAM,EAAE,GAAG,UAAU,CAAC;AAAA,EAC3G,OAAO,KAAK,OAAO,MAAM,kBAAkB,MAAM,YAAY,QAAQ,WAAW,EAAE,MAAM,MAAM,CAAC,IAAI;AAAA;AAGrG,SAAS,YAAY,CAAC,QAIJ;AAAA,EAChB,QAAQ,SAAS,WAAW,cAAc;AAAA,EAE1C,IAAI,UAAU,YAAY,SAAS;AAAA,IAAU,OAAO,mBAAmB,EAAE,SAAS,WAAW,OAAO,UAAU,WAAW,OAAO,UAAU,CAAC;AAAA,EAC3I,IAAI,UAAU,eAAe,aAAa,UAAU,QAAQ,SAAS,KAAK,UAAU,WAAW,SAAS,YAAY;AAAA,IAClH,MAAM,eAAc,EAAE,SAAS,+CAA+C,CAAC;AAAA,EACjF;AAAA,EACA,IACE,UAAU,eAAe,aACzB,UAAU,eAAe,aACzB,UAAU,WAAW,SAAS,GAC9B;AAAA,IACA,MAAM,eAAc,EAAE,SAAS,2CAA2C,CAAC;AAAA,EAC7E;AAAA,EACA,MAAM,aAAa,UAAU,QAAQ,IAAI,CAAC,WAAW,gBAAgB,SAAS,MAAM,CAAC;AAAA,EACrF,IAAI,UAAU,eAAe,WAAW;AAAA,IACtC,WAAW,KAAK,iBAAiB,EAAE,SAAS,MAAM,UAAU,WAAW,CAAC,CAAC;AAAA,EAC3E;AAAA,EACA,IAAI,UAAU,eAAe,WAAW;AAAA,IACtC,WAAW,aAAa,UAAU,YAAY;AAAA,MAC5C,MAAM,aAAa,aAAa,SAAS,UAAU,KAAK,SAAS;AAAA,MACjE,MAAM,YAAY,UAAU,aAAa,OAAO,eAAe,EAAE,SAAS,WAAW,CAAC,IAAI;AAAA,MAC1F,WAAW,KAAK,GAAG,gBAAgB,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG;AAAA,IACpF;AAAA,EACF;AAAA,EACA,MAAM,YAAY,UAAU,SAAS,IAAI,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC,KAAK,CAAC;AAAA,EACpF,IAAI,UAAU,iBAAiB,WAAW;AAAA,IACxC,WAAW,KAAK,GAAG,uBAAuB,EAAE,MAAM,WAAW,UAAU,UAAU,aAAa,CAAC,QAAQ,QAAQ,WAAW,EAAE,MAAM,UAAU,aAAa,WAAW,CAAC,GAAG;AAAA,EAC1K;AAAA,EACA,IAAI,UAAU,oBAAoB,WAAW;AAAA,IAC3C,WAAW,YAAY,UAAU,iBAAiB;AAAA,MAChD,WAAW,KAAK,oBAAoB,EAAE,SAAS,UAAU,UAAU,CAAC,CAAC;AAAA,IACvE;AAAA,EACF;AAAA,EACA,IAAI,UAAU,qBAAqB,WAAW;AAAA,IAC5C,WAAW,YAAY,UAAU,kBAAkB;AAAA,MACjD,WAAW,KAAK,GAAG,qBAAqB,EAAE,SAAS,UAAU,UAAU,CAAC,QAAQ,QAAQ,WAAW,EAAE,MAAM,SAAS,MAAM,CAAC,GAAG;AAAA,IAChI;AAAA,EACF;AAAA,EACA,IAAI,UAAU,cAAc,WAAW;AAAA,IACrC,MAAM,YAAY,UAAU;AAAA,IAI5B,IAAI,UAAU,YAAY,WAAW,KAAK,UAAU,QAAQ,WAAW,GAAG;AAAA,MACxE,MAAM,eAAc,EAAE,SAAS,iDAAiD,CAAC;AAAA,IACnF;AAAA,IACA,MAAM,YAAY,UAAU,YAAY,WAAW,IAAI,KAAK,gBAAgB,UAAU,YAAY,IAAI,CAAC,WAAW,SAAS,SAAS,MAAM,CAAC,EAAE,KAAK,IAAI;AAAA,IACtJ,MAAM,QACJ,UAAU,QAAQ,WAAW,IACzB,KACA,GAAG,cAAc,KAAK,KAAK,eAAe,UAAU,QAAQ,IAAI,CAAC,SAAS,gBAAgB,EAAE,SAAS,MAAM,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,IACxI,WAAW,KACT,sBAAsB,YAAY,aAAa,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC,GAC7F;AAAA,EACF;AAAA,EACA,IAAI,iBAAiB,UAAU,aAAa,OAAO,cAAc;AAAA,EACjE,IAAI,UAAU,aAAa,QAAQ,UAAU,eAAe,WAAW;AAAA,IACrE,MAAM,eAAc,EAAE,SAAS,yCAAyC,CAAC;AAAA,EAC3E;AAAA,EACA,IAAI,UAAU,eAAe,aAAa,UAAU,WAAW,SAAS,GAAG;AAAA,IACzE,IAAI,CAAC,QAAQ,aAAa,YAAY;AAAA,MACpC,MAAM,wBAAsB;AAAA,QAC1B,SAAS,QAAQ;AAAA,QACjB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,iBAAiB,gBAAgB,UAAU,WAAW,IAAI,CAAC,WAAW,SAAS,SAAS,cAAc,EAAE,WAAW,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAC1I;AAAA,EACA,MAAM,UAAU,WAAW,WAAW,IAAI,MAAM,WAAW,KAAK,IAAI;AAAA,EAEpE,IAAI;AAAA,EAEJ,IAAI,UAAU,aAAa,WAAW;AAAA,IACpC,OAAO,cAAc,EAAE,SAAS,WAAW,MAAM,UAAU,UAAU,UAAU,CAAC;AAAA,EAClF,EAAE,KAAK,IAAI,UAAU,cAAc,WAAW;AAAA,IAE5C,OAAO,IAAI,gBAAgB,EAAE,SAAS,WAAW,UAAU,CAAC,SAAS,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,EACxH,EAAE,KAAK,IAAI,UAAU,YAAY,WAAW;AAAA,IAE1C,IAAI,UAAU,eAAe,aAAa,UAAU,MAAM,UAAU,WAAW;AAAA,MAC7E,MAAM,eAAc,EAAE,SAAS,qGAAgG,CAAC;AAAA,IAClI;AAAA,IACA,OAAO,IAAI,cAAc,EAAE,SAAS,MAAM,UAAU,SAAS,UAAU,CAAC,SAAS,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,EACpI,EAAE,KAAK,IAAI,UAAU,eAAe,WAAW;AAAA,IAC7C,IAAI,UAAU,MAAM,UAAU,WAAW;AAAA,MACvC,MAAM,eAAc,EAAE,SAAS,oFAA+E,CAAC;AAAA,IACjH;AAAA,IAGA,MAAM,QAAQ,aAAa,EAAE,SAAS,WAAW,UAAU,YAAY,UAAU,CAAC;AAAA,IAClF,OAAO,IAAI,MAAM,YAAY,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,EAChF,EAAE,KAAK;AAAA,IACL,OAAO,YAAY,SAAS,UAAU,KAAK;AAAA;AAAA,EAE7C,IAAI,OAAO,UAAU,iBAAiB,gBAAgB;AAAA,EAEtD,IAAI,UAAU,eAAe,aAAa,UAAU,WAAW,SAAS,GAAG;AAAA,IACzE,WAAW,QAAQ,UAAU,YAAY;AAAA,MACvC,IAAI,KAAK,GAAG,WAAW,GAAG;AAAA,QACxB,MAAM,eAAc,EAAE,SAAS,wCAAwC,CAAC;AAAA,MAC1E;AAAA,MACA,MAAM,KAAK,KAAK,GACb,IAAI,CAAC,SAAS,GAAG,SAAS,SAAS,KAAK,IAAI,OAAO,SAAS,SAAS,KAAK,KAAK,GAAG,EAClF,KAAK,OAAO;AAAA,MACf,QAAQ,eAAe,YAAY,SAAS,KAAK,KAAK,QAAQ;AAAA,IAChE;AAAA,EACF;AAAA,EACA,IAAI,UAAU,aAAa,WAAW;AAAA,IACpC,QAAQ,IAAI,mBAAmB,EAAE,SAAS,MAAM,UAAU,UAAU,UAAU,CAAC;AAAA,EACjF;AAAA,EAEA,IAAI,UAAU,cAAc,aAAa,UAAU,UAAU,SAAS,GAAG;AAAA,IACvE,IAAI,UAAU,YAAY,WAAW;AAAA,MACnC,MAAM,eAAc,EAAE,SAAS,mHAA8G,CAAC;AAAA,IAChJ;AAAA,IACA,WAAW,QAAQ,UAAU,WAAW;AAAA,MACtC,QAAQ,IAAI,eAAe,EAAE,SAAS,MAAM,UAAU,CAAC;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,IAAI,UAAU,iBAAiB,aAAa,UAAU,aAAa,SAAS,GAAG;AAAA,IAC7E,IAAI,CAAC,QAAQ,aAAa,eAAe,QAAQ,gBAAgB,MAAM;AAAA,MACrE,MAAM,wBAAsB;AAAA,QAC1B,SAAS,QAAQ;AAAA,QACjB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,WAAW,QAAQ,UAAU,cAAc;AAAA,MACzC,QAAQ,IAAI,kBAAkB,EAAE,SAAS,MAAM,UAAU,CAAC;AAAA,IAC5D;AAAA,EACF;AAAA,EAEA,IAAI,UAAU,UAAU,WAAW;AAAA,IACjC,QAAQ,UAAU,WAAW,EAAE,SAAS,MAAM,UAAU,OAAO,UAAU,CAAC;AAAA,EAC5E;AAAA,EACA,IAAI,UAAU,YAAY,aAAa,UAAU,QAAQ,SAAS,GAAG;AAAA,IACnE,QAAQ,aAAa,UAAU,iBAAiB,YAAY,UAAU,KAAK,IAAI,IAAI,mBAAmB,EAAE,SAAS,MAAM,WAAW,UAAU,UAAU,aAAa,CAAC;AAAA,EACtK,EAAE,KAAK,IAAI,UAAU,iBAAiB,WAAW;AAAA,IAC/C,MAAM,eAAc,EAAE,SAAS,qCAAqC,CAAC;AAAA,EACvE;AAAA,EACA,IAAI,UAAU,WAAW,WAAW;AAAA,IAClC,QAAQ,WAAW,WAAW,EAAE,SAAS,MAAM,UAAU,QAAQ,UAAU,CAAC;AAAA,EAC9E;AAAA,EACA,IAAI,UAAU,YAAY,aAAa,UAAU,QAAQ,SAAS,GAAG;AAAA,IACnE,MAAM,QAAQ,UAAU,QAAQ,IAAI,CAAC,SAAS;AAAA,MAC5C,IAAI,EAAE,YAAY;AAAA,QAAO,OAAO,gBAAgB,EAAE,SAAS,MAAM,UAAU,CAAC;AAAA,MAC5E,MAAM,kBAAkB,KAAK,UAAU,aAAa,QAAQ,qBAAqB,WAAW,YAAY,mBAAmB,EAAE,SAAS,WAAW,QAAQ,KAAK,OAAO,CAAC;AAAA,MACtK,OAAO,gBAAgB;AAAA,QACrB;AAAA,QACA,MAAM,KAAK,MAAM,QAAQ,cAAc,EAAE,WAAW,QAAQ,KAAK,OAAO,CAAC,EAAE;AAAA,QAC3E;AAAA,WACI,oBAAoB,YAAY,CAAC,IAAI,EAAE,gBAAgB;AAAA,MAC7D,CAAC;AAAA,KACF;AAAA,IACD,QAAQ,aAAa,MAAM,KAAK,IAAI;AAAA,EACtC;AAAA,EAEA,IAAI,UAAU,UAAU,WAAW;AAAA,IACjC,YAAY,UAAU,OAAO,OAAO;AAAA,IACpC,QAAQ,UAAU,UAAU;AAAA,EAC9B;AAAA,EACA,IAAI,UAAU,WAAW,WAAW;AAAA,IAClC,YAAY,UAAU,QAAQ,QAAQ;AAAA,IACtC,IAAI,UAAU,UAAU,aAAa,QAAQ,wBAAwB,MAAM;AAAA,MACzE,QAAQ,UAAU,QAAQ,oBAAoB;AAAA,IAChD;AAAA,IACA,QAAQ,WAAW,UAAU;AAAA,EAC/B;AAAA,EACA,IAAI,UAAU,YAAY,WAAW;AAAA,IACnC,MAAM,SAAS,UAAU,MAAM,SAAS,UAAU,MAAM;AAAA,IACxD,IAAI,UAAU,QAAQ,OAAO,aAAa,UAAU,QAAQ,GAAG,KAAK,CAAC,SAAS,SAAS,MAAM,GAAG;AAAA,MAC9F,MAAM,eAAc,EAAE,SAAS,qEAAqE,UAAU,CAAC;AAAA,IACjH;AAAA,IACA,IAAI,UAAU,QAAQ,OAAO,cAAc,UAAU,eAAe,aAAa,UAAU,YAAY,YAAY;AAAA,MACjH,MAAM,eAAc,EAAE,SAAS,qDAAqD,CAAC;AAAA,IACvF;AAAA,IACA,MAAM,SAAS,oBAAoB,EAAE,SAAS,MAAM,UAAU,QAAQ,CAAC;AAAA,IACvE,IAAI,WAAW;AAAA,MAAM,QAAQ,IAAI;AAAA,EACnC;AAAA,EAEA,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAM7D,IAAM,oBAAoB;AAC1B,IAAM,oBAAoB;AAQ1B,SAAS,aAAa,CAAC,QAAgG;AAAA,EACrH,QAAQ,OAAO,QAAQ,gBAAgB;AAAA,EACvC,IAAI,UAAU,QAAQ,UAAU;AAAA,IAAW,OAAO;AAAA,EAClD,IAAI,gBAAgB,KAAK,GAAG;AAAA,IAC1B,IAAI,gBAAgB,cAAc,MAAM,WAAW,aAAa,aAAa;AAAA,MAC3E,MAAM,eAAc,EAAE,SAAS,yBAAyB,0DAA0D,CAAC;AAAA,IACrH;AAAA,IACA,OAAO,MAAM;AAAA,EACf;AAAA,EACA,IAAI,gBAAgB,WAAW;AAAA,IAC7B,QAAQ,OAAO;AAAA,MACb,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AAAA,QACH,OAAO;AAAA,MACT,KAAK;AAAA,QACH,IAAI,iBAAiB,QAAQ,iBAAiB;AAAA,UAAY,OAAO;AAAA;AAAA,EAEvE;AAAA,EACA,MAAM,eAAc,EAAE,SAAS,yBAAyB,sHAAiH,CAAC;AAAA;AAY5K,SAAS,gBAAgB,CAAC,QAKf;AAAA,EACT,QAAQ,SAAS,WAAW,SAAS,cAAc;AAAA,EACnD,IAAI,QAAQ,mBAAmB,UAAU;AAAA,IACvC,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,IAAI,UAAU,QAAQ,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,6CAA6C,CAAC;AAAA,EACjH,IAAI,QAAQ,WAAW,UAAU,QAAQ,QAAQ;AAAA,IAC/C,MAAM,eAAc,EAAE,SAAS,qBAAqB,QAAQ,2BAA2B,UAAU,QAAQ,iBAAiB,CAAC;AAAA,EAC7H;AAAA,EACA,IAAI,UAAU,eAAe,aAAa,EAAE,eAAe,UAAU,aAAa;AAAA,IAChF,MAAM,eAAc,EAAE,SAAS,qEAAgE,CAAC;AAAA,EAClG;AAAA,EACA,MAAM,UAAU,UAAU,QAAQ,IAAI,CAAC,SAAS,UAAU,QAAQ,WAAW,EAAE,MAAM,IAAI,QAAQ,IAAI,CAAC,CAAC;AAAA,EACvG,MAAM,SAAS,QAAQ,IAAI,CAAC,QAAQ,UAAU;AAAA,IAC5C,MAAM,OAAO,4BAA4B,EAAE,SAAS,OAAO,CAAC;AAAA,IAC5D,MAAM,cAAc,OAAO,SAAS,SAAS,YAAY,SAAS,eAAe,SAAS;AAAA,IAC1F,MAAM,SAAS,UAAU,QAAQ;AAAA,IACjC,MAAM,SAAS,UAAU,KAAK,IAAI,CAAC,QAAQ,cAAc,EAAE,OAAO,IAAI,QAAQ,QAAQ,YAAY,CAAC,CAAC;AAAA,IACpG,OAAO,GAAG,UAAU,IAAI,MAAM,MAAM;AAAA,GACrC;AAAA,EACD,MAAM,MAAM,QAAQ,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAAA,EAC1D,OAAO,UAAU,QAAQ,KAAK,IAAI,iBAAiB,OAAO,KAAK,IAAI,yBAAyB,QAAQ,WAAW,EAAE,MAAM,kBAAkB,CAAC,MAAM,QAAQ,KAAK,IAAI,MAAM,iBAAiB;AAAA;AAG1L,SAAS,YAAY,CAAC,QAIJ;AAAA,EAChB,QAAQ,SAAS,WAAW,cAAc;AAAA,EAE1C,IAAI,UAAU,KAAK,WAAW,GAAG;AAAA,IAC/B,MAAM,eAAc,EAAE,SAAS,mCAAmC,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,gBAAgB,UAAU,QAAQ,WAAW,KAAK,QAAQ,YAAY,SAAS;AAAA,EACrF,IAAI,iBAAiB,UAAU,KAAK,WAAW,GAAG;AAAA,IAChD,MAAM,eAAc,EAAE,SAAS,GAAG,QAAQ,2EAA2E,CAAC;AAAA,EACxH;AAAA,EACA,IAAI,iBAAiB,UAAU,eAAe,aAAa,EAAE,QAAQ,YAAY,SAAS,mBAAmB,QAAQ,YAAY,iBAAiB;AAAA,IAChJ,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,WAAW,OAAO,UAAU,MAAM;AAAA,IAChC,IAAI,IAAI,WAAW,UAAU,QAAQ,QAAQ;AAAA,MAC3C,MAAM,eAAc;AAAA,QAClB,SAAS,kBAAkB,IAAI,qBAAqB,UAAU,QAAQ;AAAA,MACxE,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,UAAU;AAAA,EAC7B,MAAM,gBAAgB;AAAA,EAEtB,MAAM,aAAa,UAAU,QAAQ,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAE1F,MAAM,eAAe,UAAU,WAAW,YAAY,YAAY,iBAAiB,EAAE,SAAS,WAAW,SAAS,UAAU,QAAQ,UAAU,CAAC;AAAA,EAC/I,MAAM,UAAU,iBAAiB,YAAY,KAAK,UAAU,KACzD,IACC,CAAC,QACC,IAAI,IACD,IAAI,CAAC,UAAU;AAAA,IAGd,IAAI,gBAAgB,KAAK;AAAA,MAAG,OAAO,GAAG,UAAU,IAAI,MAAM,IAAI,IAAI,aAAa,SAAS,KAAK;AAAA,IAE7F,IAAI,cAAc,KAAK,GAAG;AAAA,MACxB,OAAO,QAAQ,YAAY,EAAE,eAAe,MAAM,eAAe,UAAU,CAAC;AAAA,IAC9E;AAAA,IACA,IAAI,CAAC,iBAAiB,KAAK;AAAA,MAAG,OAAO,UAAU,IAAI,KAAK;AAAA,IAExD,IAAI,CAAC,QAAQ,mBAAmB;AAAA,MAC9B,MAAM,eAAc;AAAA,QAClB,SAAS,GAAG,QAAQ;AAAA,MACtB,CAAC;AAAA,IACH;AAAA,IACA,OAAO;AAAA,GACR,EACA,KAAK,IAAI,IAChB,EACC,KAAK,IAAI;AAAA,EACZ,IAAI,OAAO,gBACP,GAAG,iBAAiB,YAAY,SAAS,UAAU,KAAK,qBACxD,GAAG,iBAAiB,YAAY,SAAS,UAAU,KAAK,MAAM,eAAe,gBAAgB,UAAU;AAAA,EAM3G,IACE,eAAe,aACf,EAAE,eAAe,eACjB,QAAQ,eAAe,SAAS,cAChC,OAAO,OAAO,WAAW,MAAM,EAAE,KAAK,CAAC,UAAU,cAAc,KAAK,KAAM,cAAc,KAAK,KAAK,gBAAgB,EAAE,UAAU,MAAM,CAAC,CAAE,GACvI;AAAA,IACA,QAAQ,OAAO,QAAQ,WAAW,EAAE,MAAM,QAAQ,eAAe,MAAM,CAAC;AAAA,EAC1E;AAAA,EAEA,IAAI,eAAe,WAAW;AAAA,IAC5B,IAAI,eAAe,YAAY;AAAA,MAC7B,IAAI,QAAQ,kBAAkB,uBAAuB;AAAA,QACnD,IAAI,SAAS;AAAA,QACb,IAAI,WAAW,eAAe,WAAW;AAAA,UACvC,IAAI,QAAQ,SAAS,YAAY;AAAA,YAC/B,MAAM,wBAAsB;AAAA,cAC1B,SAAS,QAAQ;AAAA,cACjB,SAAS;AAAA,cACT,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,UACA,SAAS,kBAAkB,QAAQ,WAAW,EAAE,MAAM,WAAW,WAAW,CAAC;AAAA,QAC/E,EAAE,KAAK,IAAI,WAAW,YAAY,aAAa,WAAW,QAAQ,SAAS,GAAG;AAAA,UAC5E,SAAS,KAAK,WAAW,QAAQ,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,UACtF,IAAI,WAAW,kBAAkB,WAAW;AAAA,YAG1C,UAAU,UAAU,WAAW;AAAA,UACjC;AAAA,QACF;AAAA,QACA,QAAQ,eAAe;AAAA,MACzB,EAAE,KAAK;AAAA,QAKL,IAAI,WAAW,eAAe,aAAa,WAAW,kBAAkB,WAAW;AAAA,UACjF,MAAM,wBAAsB;AAAA,YAC1B,SAAS,QAAQ;AAAA,YACjB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QAGA,MAAM,WAAW,WAAW,cAAc,UAAU,QAAQ;AAAA,QAC5D,IAAI,aAAa,WAAW;AAAA,UAC1B,MAAM,eAAc,EAAE,SAAS,0EAA0E,CAAC;AAAA,QAC5G;AAAA,QACA,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,SAAS,CAAC;AAAA,QAClD,MAAM,UAAU,GAAG,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC,KAAK;AAAA,QACzE,MAAM,OAAO,WAAW;AAAA,QACxB,IAAI,SAAS,aAAa,CAAC,aAAa,KAAK,IAAI,GAAG;AAAA,UAClD,MAAM,eAAc,EAAE,SAAS,gDAAgD,KAAK,UAAU,IAAI,IAAI,CAAC;AAAA,QACzG;AAAA,QAGA,QAAQ,SAAS,YACb,4BAA4B,UAAU,YACtC,4BAA4B,4BAA4B,UAAU,YAAY;AAAA;AAAA,IAEtF,EAAE,KAAK;AAAA,MACL,MAAM,UAAU,OAAO,QAAQ,WAAW,MAAM;AAAA,MAChD,IAAI,QAAQ,WAAW,GAAG;AAAA,QACxB,MAAM,eAAc,EAAE,SAAS,6CAA6C,CAAC;AAAA,MAC/E;AAAA,MAOA,MAAM,UAAU,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,MACjE,IAAI,WAAW,kBAAkB,aAAa,CAAC,QAAQ,aAAa,qBAAqB;AAAA,QACvF,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,2CAA2C,MAAM,qCAAqC,CAAC;AAAA,MACvJ;AAAA,MACA,IAAI,WAAW,cAAc,aAAa,CAAC,QAAQ,aAAa,wBAAwB;AAAA,QACtF,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,0BAA0B,MAAM,iEAAiE,CAAC;AAAA,MAClK;AAAA,MACA,MAAM,cAAc,QAAQ,eAAe,gBAAgB,WAAW,kBAAkB,YACpF,4BAA4B,EAAE,SAAS,SAAS,WAAW,eAAe,QAAQ,WAAW,QAAQ,WAAW,SAAS,WAAW,UAAU,MAAM,KAAK,CAAC,IAC1J,kBAAkB,EAAE,SAAS,SAAS,SAAS,WAAW,SAAS,eAAe,MAAM,WAAW,UAAU,MAAM,KAAK,CAAC;AAAA,MAC7H,IAAI,QAAQ,eAAe,cAAc;AAAA,QACvC,IAAI,WAAW,uBAAuB,WAAW;AAAA,UAC/C,MAAM,eAAc,EAAE,SAAS,2DAA2D,CAAC;AAAA,QAC7F;AAAA,QACA,IAAI,WAAW,eAAe,aAAa,QAAQ,SAAS,YAAY;AAAA,UACtE,MAAM,wBAAsB;AAAA,YAC1B,SAAS,QAAQ;AAAA,YACjB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,IAAI,WAAW,eAAe,aAAa,WAAW,kBAAkB,WAAW;AAAA,UACjF,MAAM,eAAc;AAAA,YAClB,SAAS;AAAA,UACX,CAAC;AAAA,QACH;AAAA,QAGA,MAAM,UAAU,WAAW,kBAAkB,YAAY,KAAK,UAAU,WAAW;AAAA,QACnF,MAAM,SACJ,WAAW,eAAe,YACtB,kBAAkB,QAAQ,WAAW,EAAE,MAAM,WAAW,WAAW,CAAC,MACpE,KAAK,WAAW,QAAQ,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK;AAAA,QACxF,QAAQ,eAAe,wBAAwB;AAAA,QAC/C,MAAM,YAAY,WAAW,kBAAkB,YAC3C,YACA,qBAAqB,EAAE,SAAS,SAAS,WAAW,eAAe,QAAQ,WAAW,QAAQ,WAAW,SAAS,WAAW,UAAU,MAAM,KAAK,CAAC;AAAA,QACvJ,IAAI,cAAc,aAAa,WAAW,gBAAgB,WAAW;AAAA,UACnE,IAAI,CAAC,QAAQ,aAAa,qBAAqB;AAAA,YAC7C,MAAM,wBAAsB;AAAA,cAC1B,SAAS,QAAQ;AAAA,cACjB,SAAS;AAAA,cACT,MAAM;AAAA,YACR,CAAC;AAAA,UACH;AAAA,UACA,MAAM,YAAY,WAAW,gBAAgB,YAAY,YAAY,WAAW,EAAE,SAAS,MAAM,WAAW,aAAa,UAAU,CAAC;AAAA,UACpI,MAAM,QAAQ,cAAc,YAAY,YAAY,cAAc,YAAY,YAAY,GAAG,kBAAkB;AAAA,UAE/G,QAAQ,WAAW,cAAc,YAAY,UAAU,UAAU,WAAW,WAAW,8BAA8B;AAAA,QACvH;AAAA,MACF,EAAE,KAAK;AAAA,QACL,IAAI,WAAW,gBAAgB,WAAW;AAAA,UACxC,MAAM,wBAAsB;AAAA,YAC1B,SAAS,QAAQ;AAAA,YACjB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,IAAI,WAAW,eAAe,WAAW;AAAA,UACvC,MAAM,wBAAsB;AAAA,YAC1B,SAAS,QAAQ;AAAA,YACjB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QACA,IAAI,WAAW,kBAAkB,WAAW;AAAA,UAC1C,MAAM,wBAAsB;AAAA,YAC1B,SAAS,QAAQ;AAAA,YACjB,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,QACH;AAAA,QAIA,MAAM,QACJ,WAAW,uBAAuB,YAC9B,KACA,KAAK,QAAQ,WAAW,EAAE,MAAM,WAAW,mBAAmB,CAAC,sBAAsB,QAAQ,WAAW,EAAE,MAAM,WAAW,mBAAmB,CAAC;AAAA,QACrJ,MAAM,UAAU,WAAW;AAAA,QAC3B,IAAI,YAAY,cAAc,WAAW,uBAAuB,aAAa,CAAC,aAAa,KAAK,QAAQ,IAAI,IAAI;AAAA,UAC9G,MAAM,eAAc,EAAE,SAAS,oHAAoH,CAAC;AAAA,QACtJ;AAAA,QACA,MAAM,OAAO,YAAY,YACrB,KACA,KAAK,QAAQ,WAAW,EAAE,MAAM,QAAQ,OAAO,CAAC,yBAAyB,QAAQ,UAAU,WAAW,QAAQ,WAAW,EAAE,MAAM,QAAQ,OAAO,CAAC,MAAM,WAAW,QAAQ,WAAW,EAAE,MAAM,QAAQ,OAAO,CAAC;AAAA,QACjN,QAAQ,4BAA4B,cAAc,QAAQ;AAAA;AAAA;AAAA,EAGhE;AAAA,EAEA,MAAM,YAAY,eAAe,EAAE,SAAS,WAAW,UAAU,WAAW,WAAW,OAAO,UAAU,MAAM,CAAC;AAAA,EAC/G,OAAO,EAAE,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,QAAQ,WAAW,UAAU,OAAO;AAAA;AAKhG,SAAS,YAAY,CAAC,QAMJ;AAAA,EAChB,QAAQ,SAAS,WAAW,cAAc;AAAA,EAE1C,MAAM,cAAc,OAAO,QAAQ,UAAU,GAAG;AAAA,EAChD,IAAI,YAAY,WAAW,GAAG;AAAA,IAC5B,MAAM,eAAc,EAAE,SAAS,sCAAsC,CAAC;AAAA,EACxE;AAAA,EACA,MAAM,SAAS,UAAU;AAAA,EACzB,IAAI,WAAW,WAAW;AAAA,IACxB,IAAI,UAAU,UAAU,aAAa,UAAU,UAAU,OAAO;AAAA,MAAO,MAAM,eAAc,EAAE,SAAS,8DAAyD,CAAC;AAAA,IAChK,MAAM,SAAS,QAAQ,WAAW,EAAE,MAAM,UAAU,MAAM,CAAC;AAAA,IAC3D,MAAM,SAAS,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,IACxD,MAAM,SAAS,MAAc,kBAAkB,EAAE,SAAS,SAAS,aAAa,WAAW,SAAS,QAAQ,QAAQ,WAAY,QAAQ,SAAS,UAAU,EAAE,cAAc,OAAO,IAAI,CAAC,MAAQ,OAAO,YAAY,YAAY,CAAC,IAAI,EAAE,OAAO,OAAO,QAAQ,EAAG,CAAC;AAAA,IAC/P,MAAM,QAAQ,MAAc,UAAU,UAAU,YAAY,KAAK,QAAQ,WAAW,EAAE,SAAS,MAAM,UAAU,OAAO,UAAU,CAAC;AAAA,IACjI,IAAI,YAAY,QAAQ;AAAA,MAGtB,IAAI,CAAC,QAAQ,aAAa,4BAA4B;AAAA,QACpD,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,0EAAgE,MAAM,mEAAmE,CAAC;AAAA,MAC1M;AAAA,MAEA,MAAM,MAAM,OAAO;AAAA,MACnB,MAAM,eAAe,aAAa,EAAE,SAAS,WAAW,OAAO,QAAQ,UAAU,CAAC,EAAE;AAAA,MACpF,MAAM,OAAO,UAAU,YAAY,SAAS,UAAU,KAAK,QAAQ,cAAc,aAAa,oBAAoB,gBAAgB,WAAW,EAAE,SAAS,MAAM,OAAO,IAAI,UAAU,CAAC,IAAI,MAAM;AAAA,MAC9L,MAAM,YAAY,eAAe,EAAE,SAAS,WAAW,UAAU,WAAW,SAAS,OAAO,CAAC;AAAA,MAC7F,OAAO,EAAE,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,QAAQ,WAAW,UAAU,OAAO;AAAA,IAChG;AAAA,IAEA,MAAM,OAAO,QAAQ,SAAS,UAC1B,UAAU,YAAY,SAAS,UAAU,KAAK,QAAQ,eAAe,YAAY,SAAS,OAAO,KAAK,QAAQ,aAAa,WAAW,EAAE,SAAS,MAAM,OAAO,IAAI,UAAU,CAAC,SAAS,OAAO,IAAI,UAAU,UAAU,YAAY,KAAK,UAAU,WAAW,EAAE,SAAS,MAAM,UAAU,OAAO,UAAU,CAAC,QACxS,UAAU,YAAY,SAAS,UAAU,KAAK,QAAQ,cAAc,OAAO,UAAU,YAAY,SAAS,OAAO,KAAK,QAAQ,gBAAgB,WAAW,EAAE,SAAS,MAAM,OAAO,IAAI,UAAU,CAAC,IAAI,MAAM;AAAA,IAC9M,MAAM,YAAY,eAAe,EAAE,SAAS,WAAW,UAAU,WAAW,cAAe,QAAQ,SAAS,aAAa,EAAE,SAAS,OAAO,IAAI,CAAC,EAAG,CAAC;AAAA,IACpJ,OAAO,EAAE,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,QAAQ,WAAW,UAAU,OAAO;AAAA,EAChG;AAAA,EACA,MAAM,SAAS,kBAAkB,EAAE,SAAS,SAAS,aAAa,cAAe,OAAO,YAAY,YAAY,CAAC,IAAI,EAAE,OAAO,OAAO,QAAQ,EAAG,CAAC;AAAA,EACjJ,IAAI,OAAO,UAAU,YAAY,SAAS,UAAU,KAAK,SAAS;AAAA,EAElE,IAAI,UAAU,UAAU,WAAW;AAAA,IACjC,QAAQ,UAAU,WAAW,EAAE,SAAS,MAAM,UAAU,OAAO,UAAU,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAM,YAAY,eAAe,EAAE,SAAS,WAAW,UAAU,WAAW,WAAW,OAAO,UAAU,MAAM,CAAC;AAAA,EAC/G,OAAO,EAAE,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,QAAQ,WAAW,UAAU,OAAO;AAAA;AAmBhG,SAAS,uBAAuB,CAAC,QAAyD;AAAA,EACxF,QAAQ,SAAS,WAAW;AAAA,EAC5B,MAAM,MAAM,QAAQ;AAAA,EACpB,MAAM,YAAY,IAAI,SAAS,YAAY,IAAI,OAAO,QAAQ,WAAW,EAAE,MAAM,IAAI,MAAM,CAAC;AAAA,EAC5F,OAAO,GAAG,aAAa,QAAQ,WAAW,EAAE,MAAM,OAAO,CAAC;AAAA;AAkB5D,SAAS,iBAAiB,CAAC,QAA0F;AAAA,EACnH,QAAQ,SAAS,YAAY;AAAA,EAC7B,OAAO,QACJ,IAAI,EAAE,MAAM,WAAW,GAAG,QAAQ,WAAW,EAAE,KAAK,CAAC,OAAO,sBAAsB,KAAK,QAAQ,MAAM,MAAM,CAAC,GAAG,EAC/G,IAAI,CAAC,eAAgB,OAAO,iBAAiB,YAAY,aAAa,GAAG,OAAO,gBAAgB,YAAa,EAC7G,KAAK,IAAI;AAAA;AAed,SAAS,oBAAoB,CAAC,QAOnB;AAAA,EACT,QAAQ,SAAS,SAAS,QAAQ,WAAW,SAAS,cAAc;AAAA,EACpE,IAAI,QAAQ,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,4DAA4D,CAAC;AAAA,EACtH,MAAM,OAAiB,CAAC;AAAA,EACxB,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,SAAS,SAAS;AAAA,IAC3B,IAAI,CAAC,OAAO,OAAO,QAAQ,MAAM,MAAM,GAAG;AAAA,MACxC,MAAM,eAAc,EAAE,SAAS,6BAA6B,MAAM,6CAA6C,CAAC;AAAA,IAClH;AAAA,IACA,MAAM,WAAW,OAAO,MAAM;AAAA,IAC9B,MAAM,QAAQ,sBAAsB,EAAE,SAAS,WAAW,SAAS,eAAe,MAAM,WAAW,MAAM,MAAM,QAAQ,OAAO,SAAS,CAAC;AAAA,IACxI,MAAM,SAAS,GAAG,WAAW,QAAQ,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC;AAAA,IACtE,IAAI,QAAQ,SAAS,WAAW,MAAM,UAAU,aAAa,MAAM,UAAU,WAAW;AAAA,MACtF,KAAK,KAAK,QAAQ,mBAAmB;AAAA,MAErC,MAAM,KAAK,MAAM,SAAS,aAAa,CAAC,cAAc,QAAQ,IAAI,aAAa,8BAA8B,QAAQ,kBAAkB;AAAA,MACvI;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,SAAS,cAAc,MAAM,UAAU,MAAM;AAAA,MACvD,MAAM,OAAO,MAAM,SAAS,OAAO,WAAW;AAAA,MAC9C,KAAK,KAAK,GAAG,WAAW,kBAAkB;AAAA,MAC1C,MAAM,KAAK,IAAI,WAAW,kBAAkB;AAAA,MAC5C;AAAA,IACF;AAAA,IACA,IAAI,QAAQ,SAAS,cAAc,MAAM,UAAU,WAAW;AAAA,MAC5D,KAAK,KAAK,GAAG,cAAc;AAAA,MAC3B,MAAM,KAAK,KAAK,kBAAkB,MAAM,SAAS,OAAO,OAAO,WAAW;AAAA,MAC1E;AAAA,IACF;AAAA,IACA,MAAM,OAAO,QAAQ,SAAS,cAAc,MAAM,SAAS,YAAY,UAAU,MAAM,SAAS,SAAS,OAAO,OAAO;AAAA,IACvH,KAAK,KAAK,GAAG,SAAS,MAAM;AAAA,IAC5B,MAAM,KAAK,SAAS,KAAK,QAAQ,IAAI,SAAS,MAAM;AAAA,EACtD;AAAA,EACA,OAAO,QAAQ,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAAA;AAajD,SAAS,2BAA2B,CAAC,QAO1B;AAAA,EACT,QAAQ,SAAS,SAAS,QAAQ,WAAW,SAAS,cAAc;AAAA,EACpE,MAAM,WAAW,IAAI,IAAI,QAAQ,IAAI,CAAC,UAAU,MAAM,MAAM,CAAC;AAAA,EAC7D,MAAM,UAAU,EAAE,SAAS,WAAW,SAAS,eAAe,MAAM,UAAU;AAAA,EAC9E,MAAM,SAAS,OAAO,QAAQ,MAAM,EAAE,OAAO,EAAE,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC;AAAA,EAC5E,MAAM,OAAO,OAAO,QAAQ,MAAM,EAAE,OAAO,EAAE,UAAU,SAAS,IAAI,IAAI,CAAC;AAAA,EACzE,MAAM,QAAQ,OAAO,IAAI,EAAE,MAAM,WAAW;AAAA,IAC1C,MAAM,UAAU,qBAAqB,KAAK,OAAO,CAAC;AAAA,IAClD,MAAM,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,IAC1C,OAAO,GAAG,eAAe,YAAY,sBAAsB,KAAK,SAAS,MAAM,MAAM,CAAC,MAAM,WAAW;AAAA,GACxG;AAAA,EACD,OAAO,CAAC,GAAG,OAAO,GAAI,KAAK,WAAW,IAAI,CAAC,IAAI,CAAC,kBAAkB,KAAK,SAAS,SAAS,KAAK,CAAC,CAAC,CAAE,EAAE,KAAK,IAAI;AAAA;AAI/G,SAAS,qBAAqB,CAAC,QAAsE;AAAA,EACnG,QAAQ,SAAS,WAAW,SAAS,MAAM,UAAU;AAAA,EACrD,MAAM,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EAC1C,MAAM,OAAO,YAAY,YAAY,SAAS,GAAG,WAAW;AAAA,EAC5D,IAAI,kBAAkB,KAAK,GAAG;AAAA,IAC5B,IAAI,OAAO,WAAW;AAAA,MAAW,MAAM,eAAc,EAAE,SAAS,wDAAwD,MAAM,4CAA4C,CAAC;AAAA,IAC3K,OAAO,GAAG,OAAO,UAAU,QAAQ,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC;AAAA,EACtE;AAAA,EAGA,IAAI,gBAAgB,KAAK,GAAG;AAAA,IAC1B,IAAI,OAAO,UAAU,aAAa,CAAC,OAAO,MAAM,IAAI,MAAM,IAAI,GAAG;AAAA,MAC/D,MAAM,eAAc,EAAE,SAAS,mCAAmC,MAAM,4CAA4C,CAAC;AAAA,IACvH;AAAA,IACA,OAAO,WAAW,QAAQ,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC,UAAU,QAAQ,WAAW,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,EAC9G;AAAA,EAIA,IAAI,cAAc,KAAK,GAAG;AAAA,IACxB,IAAI,OAAO,kBAAkB,QAAQ,YAAY;AAAA,MAAW,MAAM,eAAc,EAAE,SAAS,qDAAqD,CAAC;AAAA,IACjJ,OAAO,kBAAkB,EAAE,SAAS,UAAU,OAAO,WAAW,UAAU,EAAE,OAAO,OAAO,UAAW,EAAE,CAAC;AAAA,EAC1G;AAAA,EACA,IAAI,cAAc,KAAK,GAAG;AAAA,IACxB,IAAI,OAAO,kBAAkB,MAAM;AAAA,MACjC,MAAM,eAAc;AAAA,QAClB,SAAS,8BAA8B,MAAM;AAAA,MAC/C,CAAC;AAAA,IACH;AAAA,IACA,OAAO,wBAAwB,EAAE,SAAS,QAAQ,MAAM,OAAO,CAAC;AAAA,EAClE;AAAA,EAEA,IAAI,cAAc,KAAK,GAAG;AAAA,IACxB,IAAI,OAAO,kBAAkB,QAAQ,YAAY;AAAA,MAAW,MAAM,eAAc,EAAE,SAAS,sEAAsE,CAAC;AAAA,IAClK,OAAO;AAAA,EACT;AAAA,EACA,IAAI,qBAAqB,KAAK,GAAG;AAAA,IAC/B,OAAO,gBAAgB,EAAE,SAAS,OAAO,OAAO,MAAM,UAAU,CAAC;AAAA,EACnE;AAAA,EAEA,IAAI,gBAAgB,KAAK,GAAG;AAAA,IAC1B,OAAO,GAAG,UAAU,IAAI,MAAM,IAAI,IAAI,aAAa,SAAS,KAAK;AAAA,EACnE;AAAA,EACA,IAAI,eAAe,KAAK,GAAG;AAAA,IACzB,MAAM,UAAU,UAAU,IAAI,MAAM,KAAK;AAAA,IACzC,MAAM,UAAU,QAAQ,SAAS,YAAY,MAAM,gBAAgB,YAAY,QAAQ,qBAAqB;AAAA,IAC5G,OAAO,GAAG,QAAQ,kBAAkB,MAAM,SAAS;AAAA,EACrD;AAAA,EACA,IAAI,cAAc,KAAK,GAAG;AAAA,IACxB,OAAO,QAAQ,YAAY,EAAE,eAAe,MAAM,eAAe,UAAU,CAAC;AAAA,EAC9E;AAAA,EACA,IAAI,mBAAmB,KAAK,GAAG;AAAA,IAC7B,mBAAmB,SAAS,yCAAyC;AAAA,IACrE,IAAI,MAAM,aAAa,UAAU;AAAA,MAC/B,OAAO,gBAAgB,SAAS,UAAU,IAAI,MAAM,KAAK;AAAA,IAC3D;AAAA,IACA,OAAO,GAAG,WAAW,UAAU,IAAI,MAAM,KAAK;AAAA,EAChD;AAAA,EACA,OAAO,UAAU,IAAI,KAAK;AAAA;AAK5B,SAAS,YAAY,CAAC,QAIJ;AAAA,EAChB,QAAQ,SAAS,WAAW,cAAc;AAAA,EAE1C,IAAI,OAAO,eAAe,YAAY,SAAS,UAAU,KAAK;AAAA,EAC9D,IAAI,UAAU,UAAU,WAAW;AAAA,IACjC,QAAQ,UAAU,WAAW,EAAE,SAAS,MAAM,UAAU,OAAO,UAAU,CAAC;AAAA,EAC5E;AAAA,EAEA,MAAM,YAAY,eAAe,EAAE,SAAS,WAAW,UAAU,WAAW,WAAW,OAAO,UAAU,MAAM,CAAC;AAAA,EAC/G,OAAO,EAAE,MAAM,OAAO,UAAU,QAAQ,QAAQ,UAAU,QAAQ,WAAW,UAAU,OAAO;AAAA;AAMhG,IAAM,mBAAmB;AACzB,IAAM,kBAAkB;AAcxB,SAAS,WAAW,CAAC,QAIH;AAAA,EAChB,QAAQ,SAAS,WAAW,cAAc;AAAA,EAC1C,IAAI,QAAQ,mBAAmB,MAAM;AAAA,IACnC,MAAM,wBAAsB;AAAA,MAC1B,SAAS,QAAQ;AAAA,MACjB,SAAS;AAAA,MACT,MAAM;AAAA,IACR,CAAC;AAAA,EACH;AAAA,EACA,IAAI,UAAU,MAAM,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,4CAA4C,CAAC;AAAA,EAC9G,MAAM,UAAU,IAAI;AAAA,EACpB,MAAM,QAAkB,CAAC;AAAA,EACzB,WAAW,QAAQ,UAAU,OAAO;AAAA,IAClC,IAAI,KAAK,SAAS,oBAAoB,KAAK,SAAS,mBAAmB,QAAQ,IAAI,KAAK,IAAI,GAAG;AAAA,MAC7F,MAAM,eAAc,EAAE,SAAS,oBAAoB,KAAK,gCAAgC,CAAC;AAAA,IAC3F;AAAA,IACA,MAAM,OAAO,gBAAgB,EAAE,SAAS,WAAW,KAAK,WAAW,WAAW,SAAS,QAAQ,CAAC;AAAA,IAChG,MAAM,KAAK,GAAG,QAAQ,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,OAAO;AAAA,IACpE,QAAQ,IAAI,KAAK,IAAI;AAAA,EACvB;AAAA,EAEA,MAAM,SAAS,UAAU;AAAA,EACzB,MAAM,WAAW,OAAO,WAAW,CAAC;AAAA,EACpC,IAAI,SAAS,SAAS,KAAK,CAAC,QAAQ,aAAa,YAAY;AAAA,IAC3D,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,qCAAqC,MAAM,0GAA0G,CAAC;AAAA,EACtN;AAAA,EACA,WAAW,SAAS,eAAe,EAAE,SAAS,CAAC,GAAG;AAAA,IAChD,IAAI,OAAO,QAAQ,SAAS,KAAK,KAAK,UAAU,OAAO,SAAS,SAAS,UAAU,OAAO,OAAO,OAAO;AAAA,MACtG,MAAM,eAAc,EAAE,SAAS,wBAAwB,uCAAuC,CAAC;AAAA,IACjG;AAAA,EACF;AAAA,EACA,IAAI,OAAO,SAAS,WAAW,KAAK,OAAO,QAAQ,WAAW,KAAK,OAAO,UAAU,aAAa,OAAO,YAAY,WAAW;AAAA,IAC7H,MAAM,QAAQ,kBAAkB,EAAE,SAAS,QAAQ,SAAS,UAAU,CAAC;AAAA,IACvE,OAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,IAAI,YAAY,CAAC,OAAO,GAAG,oBAAoB,EAAE,SAAS,UAAU,SAAS,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,KAAK,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EACzL;AAAA,EACA,IAAI,OAAO,SAAS,WAAW,KAAK,OAAO,QAAQ,WAAW,GAAG;AAAA,IAC/D,MAAM,eAAc,EAAE,SAAS,+DAA+D,CAAC;AAAA,EACjG;AAAA,EACA,WAAW,QAAQ,OAAO,UAAU;AAAA,IAClC,IAAI,CAAC,QAAQ,IAAI,IAAI;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,sCAAsC,QAAQ,CAAC;AAAA,EACxG;AAAA,EACA,MAAM,aAAa,OAAO,QAAQ,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EACvF,MAAM,UAAU,OAAO,YAAY,aAAa,OAAO,UAAU,aAAc,OAAO,SAAS,aAAa,OAAO,KAAK,SAAS;AAAA,EAGjI,MAAM,aAAa,WAAW,SAAS,WAAW,IAAI,KAAK,KAAK,oBAAoB,EAAE,SAAS,UAAU,SAAS,UAAU,CAAC,EAAE,KAAK,IAAI;AAAA,EACxI,MAAM,QAAQ,OAAO,SAClB,IAAI,CAAC,SAAS,UAAU,aAAa,mBAAmB,QAAQ,WAAW,EAAE,KAAK,CAAC,GAAG,EACtF,KAAK,aAAa;AAAA,EACrB,IAAI,SAAS;AAAA,EACb,IAAI,SAAS;AAAA,IACX,MAAM,QAAkB,CAAC;AAAA,IACzB,WAAW,SAAS,CAAC,OAAO,SAAS,OAAO,OAAO,OAAO,KAAK,GAAG;AAAA,MAChE,IAAI,UAAU,aAAa,OAAO,QAAQ,SAAS,KAAK,GAAG;AAAA,QACzD,MAAM,eAAc,EAAE,SAAS,uBAAuB,uCAAuC,CAAC;AAAA,MAChG;AAAA,IACF;AAAA,IACA,MAAM,OAAO,QAAQ,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAAA,IAC1D,MAAM,YAAY,OAAO,QAAQ,IAAI,CAAC,SAAS,GAAG,QAAQ,QAAQ,WAAW,EAAE,KAAK,CAAC,GAAG;AAAA,IACxF,IAAI,OAAO,YAAY,WAAW;AAAA,MAChC,MAAM,KAAK,GAAG,WAAW,EAAE,SAAS,MAAM,OAAO,QAAQ,MAAM,UAAU,CAAC,QAAQ,QAAQ,WAAW,EAAE,MAAM,OAAO,QAAQ,MAAM,CAAC,GAAG;AAAA,IACxI;AAAA,IACA,IAAI,OAAO,UAAU,aAAc,OAAO,SAAS,aAAa,OAAO,KAAK,SAAS,GAAI;AAAA,MACvF,MAAM,KAAK,kBAAkB,EAAE,SAAS,QAAQ,SAAS,UAAU,CAAC,CAAC;AAAA,IACvE;AAAA,IACA,MAAM,KAAK,GAAG,oBAAoB,EAAE,SAAS,UAAU,SAAS,UAAU,CAAC,CAAC;AAAA,IAC5E,SACE,UAAU,CAAC,GAAG,WAAW,GAAG,KAAK,EAAE,KAAK,IAAI,wBAAwB,QAAQ,WAAW,EAAE,MAAM,gBAAgB,CAAC,MAChH,eAAe,aAAa;AAAA,EAChC;AAAA,EACA,OAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,IAAI,KAAK,UAAU,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAGnG,SAAS,eAAe,CAAC,QAKd;AAAA,EACT,QAAQ,SAAS,WAAW,cAAc;AAAA,EAC1C,QAAQ,UAAU;AAAA,IAChB,KAAK;AAAA,MACH,OAAO,aAAa,EAAE,SAAS,WAAW,UAAU,CAAC,EAAE;AAAA,IACzD,KAAK;AAAA,MACH,OAAO,aAAa,EAAE,SAAS,WAAW,UAAU,CAAC,EAAE;AAAA,IACzD,KAAK;AAAA,MACH,OAAO,mBAAmB,EAAE,SAAS,WAAW,WAAW,SAAS,OAAO,QAAQ,CAAC;AAAA,IACtF,KAAK;AAAA,MACH,OAAO,aAAa,EAAE,SAAS,WAAW,WAAW,SAAS,OAAO,QAAQ,CAAC,EAAE;AAAA,IAClF,KAAK;AAAA,MACH,OAAO,aAAa,EAAE,SAAS,WAAW,UAAU,CAAC,EAAE;AAAA;AAAA;AAK7D,SAAS,cAAc,CAAC,QAAyD;AAAA,EAC/E,MAAM,MAAgB,CAAC;AAAA,EACvB,WAAW,SAAS,OAAO,UAAU;AAAA,IACnC,IAAI,KAAK,GAAG,MAAM,SAAS;AAAA,IAC3B,IAAI,MAAM,aAAa;AAAA,MAAW,IAAI,KAAK,GAAG,MAAM,SAAS;AAAA,IAC7D,IAAI,MAAM,WAAW,aAAa,MAAM,OAAO,SAAS;AAAA,MAAG,IAAI,KAAK,GAAG,MAAM,SAAS;AAAA,IACtF,IAAI,MAAM,UAAU,aAAa,MAAM,MAAM,SAAS,GAAG;AAAA,MACvD,IAAI,MAAM,aAAa,aAAa,MAAM,iBAAiB;AAAA,QAAM,IAAI,KAAK,GAAG,MAAM,SAAS;AAAA,MAC5F,IAAI,MAAM,aAAa;AAAA,QAAW,IAAI,KAAK,GAAG,MAAM,UAAU;AAAA,IAChE;AAAA,IACA,WAAW,UAAU,MAAM,YAAY,CAAC,GAAG,KAAK;AAAA,MAAG,IAAI,KAAK,GAAG,MAAM,UAAU,OAAO;AAAA,EACxF;AAAA,EACA,OAAO;AAAA;AAUT,SAAS,mBAAmB,CAAC,QAAuI;AAAA,EAClK,QAAQ,SAAS,UAAU,SAAS,cAAc;AAAA,EAClD,MAAM,QAAQ,CAAC,SAAyB,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACnE,MAAM,MAAgB,CAAC;AAAA,EACvB,WAAW,SAAS,UAAU;AAAA,IAC5B,IAAI,CAAC,QAAQ,IAAI,MAAM,IAAI;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,uCAAuC,MAAM,QAAQ,CAAC;AAAA,IACnH,MAAM,OAAO,MAAM,MAAM,IAAI;AAAA,IAC7B,MAAM,SAAS,MAAM,aAAa,YAAY,YAAY,MAAM,MAAM,QAAQ;AAAA,IAC9E,IAAI,KAAK,yBAAyB,YAAY,MAAM,GAAG,MAAM,SAAS,GAAG;AAAA,IACzE,IAAI,WAAW;AAAA,MAAW,IAAI,KAAK,yBAAyB,cAAc,cAAc,MAAM,GAAG,MAAM,SAAS,GAAG;AAAA,IACnH,MAAM,SAAS,MAAM,UAAU,CAAC;AAAA,IAChC,MAAM,QAAQ,MAAM,SAAS,CAAC;AAAA,IAC9B,IAAI,KAAK,GAAG,sBAAsB,EAAE,SAAS,OAAO,MAAM,QAAQ,QAAQ,OAAO,UAAU,CAAC,CAAC;AAAA,IAC7F,YAAY,OAAO,aAAa,MAAM,YAAY,CAAC,GAAG,QAAQ,GAAG;AAAA,MAC/D,MAAM,OAAO,MAAM,UAAU;AAAA,MAC7B,MAAM,QAAQ,MAAM,mBAAmB;AAAA,MACvC,MAAM,QAAQ,yBAAyB,WAAW,cAAc,QAAQ,GAAG,IAAI,CAAC,SAAS,GAAG,QAAQ,MAAM,KAAK,MAAM,OAAO,SAAS,MAAM,KAAK,KAAK,GAAG,EAAE,KAAK,OAAO;AAAA,MACtK,IAAI,KAAK,GAAG,oBAAoB,EAAE,SAAS,SAAS,OAAO,UAAU,CAAC,QAAQ,MAAM,GAAG,MAAM,UAAU,OAAO,GAAG;AAAA,IACnH;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAIT,SAAS,qBAAqB,CAAC,QAA0L;AAAA,EACvN,QAAQ,SAAS,OAAO,MAAM,QAAQ,QAAQ,OAAO,cAAc;AAAA,EACnE,MAAM,QAAQ,CAAC,SAAyB,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACnE,MAAM,MAAgB,CAAC;AAAA,EACvB,IAAI,OAAO,WAAW,KAAK,MAAM,WAAW;AAAA,IAAG,OAAO;AAAA,EACtD,IAAI,CAAC,OAAO,cAAc,MAAM,KAAK,KAAK,MAAM,QAAQ;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,kBAAkB,MAAM,wCAAwC,CAAC;AAAA,EAC3J,MAAM,QAAQ,UAAU,IAAI,MAAM,KAAK;AAAA,EACvC,MAAM,OAAO,MAAM,UAAU;AAAA,EAC7B,MAAM,QAAQ,CAAC,SAA4B,WACzC,qBAAqB,2CAA2C,QAAQ,IAAI,KAAK,EAAE,KAAK,IAAI,SAAS,aAAa,OAAO,gBAAgB,aAAa,MAAM,UAAU;AAAA,EACxK,MAAM,cAAc,WAAW,YAAY,KAAK,cAAc;AAAA,EAC9D,IAAI,OAAO,SAAS;AAAA,IAAG,IAAI,KAAK,GAAG,MAAM,QAAQ,WAAW,QAAQ,MAAM,GAAG,MAAM,SAAS,GAAG;AAAA,EAC/F,IAAI,MAAM,SAAS,MAAM,WAAW,aAAa,MAAM,iBAAiB;AAAA,IAAO,IAAI,KAAK,GAAG,MAAM,OAAO,WAAW,QAAQ,MAAM,GAAG,MAAM,SAAS,GAAG;AAAA,EACtJ,IAAI,MAAM,SAAS,KAAK,WAAW;AAAA,IAAW,IAAI,KAAK,GAAG,MAAM,OAAO,UAAU,QAAQ,QAAQ,MAAM,GAAG,MAAM,UAAU,GAAG;AAAA,EAC7H,OAAO;AAAA;AAIT,SAAS,gBAAgB,CAAC,QAAoF;AAAA,EAC5G,QAAQ,SAAS,OAAO,cAAc;AAAA,EACtC,IAAI,gBAAgB,KAAK;AAAA,IAAG,OAAO,GAAG,UAAU,IAAI,MAAM,IAAI,IAAI,aAAa,SAAS,KAAK;AAAA,EAC7F,IAAI,cAAc,KAAK;AAAA,IAAG,OAAO,QAAQ,YAAY,EAAE,eAAe,MAAM,eAAe,UAAU,CAAC;AAAA,EACtG,IAAI,iBAAiB,KAAK,GAAG;AAAA,IAC3B,MAAM,eAAc,EAAE,SAAS,wFAA8E,CAAC;AAAA,EAChH;AAAA,EACA,OAAO,UAAU,IAAI,KAAK;AAAA;AAU5B,SAAS,eAAe,CAAC,QAA4F;AAAA,EACnH,QAAQ,SAAS,QAAQ,cAAc;AAAA,EACvC,IAAI,OAAO,QAAQ,WAAW,KAAK,OAAO,KAAK,WAAW,GAAG;AAAA,IAC3D,MAAM,eAAc,EAAE,SAAS,qDAAqD,CAAC;AAAA,EACvF;AAAA,EACA,MAAM,UAAU,YAAY,SAAS,OAAO,OAAO;AAAA,EACnD,MAAM,UAAU,OAAO,QAAQ,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC;AAAA,EACzE,MAAM,OAAO,CAAC,IAAI,QAAQ,IAAI,CAAC,WAAW,WAAW,eAAe,sBAAsB,EAAE,KAAK,IAAI,IAAI;AAAA,EACzG,WAAW,OAAO,OAAO,MAAM;AAAA,IAC7B,IAAI,IAAI,WAAW,OAAO,QAAQ,QAAQ;AAAA,MACxC,MAAM,eAAc,EAAE,SAAS,sBAAsB,IAAI,qBAAqB,OAAO,QAAQ,iBAAiB,CAAC;AAAA,IACjH;AAAA,IACA,KAAK,KAAK,IAAI,IAAI,IAAI,CAAC,UAAU,iBAAiB,EAAE,SAAS,OAAO,UAAU,CAAC,CAAC,EAAE,KAAK,IAAI,IAAI;AAAA,EACjG;AAAA,EACA,MAAM,QAAQ,QAAQ,WAAW,EAAE,MAAM,OAAO,MAAM,CAAC;AAAA,EACvD,MAAM,aAAa,QAAQ,KAAK,IAAI;AAAA,EACpC,OAAO,WAAW,2BAA2B,KAAK,KAAK,IAAI,SAAS,UAAU,4BAA4B;AAAA;AAgB5G,SAAS,iBAAiB,CAAC,QAAuH;AAAA,EAChJ,QAAQ,SAAS,QAAQ,SAAS,cAAc;AAAA,EAChD,MAAM,QAAQ,OAAO;AAAA,EACrB,IAAI,UAAU;AAAA,IAAW,MAAM,eAAc,EAAE,SAAS,6CAA6C,CAAC;AAAA,EACtG,IAAI,MAAM,MAAM,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,wCAAwC,CAAC;AAAA,EACtG,MAAM,OAAO,CAAC,SAAyB;AAAA,IACrC,IAAI,CAAC,QAAQ,IAAI,IAAI;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,6CAA6C,QAAQ,CAAC;AAAA,IAC7G,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA;AAAA,EAEpC,MAAM,QAAQ,CAAC,SAAyB,yBAAyB,KAAK,IAAI;AAAA,EAC1E,MAAM,MAAM,MAAM,MAAM,IAAI,KAAK,EAAE,KAAK,KAAK;AAAA,EAC7C,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,EAC/B,IAAI,OAAO,WAAW,GAAG;AAAA,IACvB,IAAI,OAAO,aAAa;AAAA,MAAW,MAAM,eAAc,EAAE,SAAS,yCAAyC,CAAC;AAAA,IAC5G,OAAO,GAAG,UAAU,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA,EAC9D;AAAA,EACA,MAAM,OAAO,OAAO,aAAa,YAAY,CAAC,IAAI,CAAC,kCAAkC,KAAK,OAAO,QAAQ,WAAW,KAAK;AAAA,EACzH,MAAM,OAAO,OAAO,IAAI,CAAC,SAAS;AAAA,IAChC,IAAI,CAAC,yBAAyB,KAAK,KAAK,KAAK;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,qBAAqB,KAAK,kCAAkC,CAAC;AAAA,IAC5I,IAAI,OAAO,KAAK,UAAU,YAAY,KAAK,UAAU;AAAA,MAAI,MAAM,eAAc,EAAE,SAAS,eAAe,KAAK,iCAAiC,CAAC;AAAA,IAC9I,MAAM,UAAU,KAAK,WAAW;AAAA,IAChC,IAAI,CAAC,OAAO,cAAc,OAAO,KAAK,UAAU;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,eAAe,KAAK,0CAA0C,CAAC;AAAA,IACjJ,IAAI,KAAK,cAAc,cAAc,CAAC,OAAO,cAAc,KAAK,SAAS,KAAK,KAAK,YAAY,KAAK,KAAK,YAAY,YAAY;AAAA,MAC/H,MAAM,eAAc,EAAE,SAAS,eAAe,KAAK,oEAAoE,CAAC;AAAA,IAC1H;AAAA,IACA,MAAM,OAAO,KAAK,cAAc,YAC5B,QAAQ,MAAM,KAAK,IAAI,QAAQ,KAAK,cACpC,YAAY,IAAI,kCAAkC,KAAK,KAAK,IAAI,OAAO,QAAQ,MAAM,KAAK,IAAI,OAAO;AAAA,IACzG,OAAO,GAAG,mBAAmB,oBAAoB,KAAK,cAAc,UAAU,IAAI,KAAK,KAAK,eAAe,MAAM,KAAK,IAAI;AAAA,GAC3H;AAAA,EACD,OAAO,QAAQ,CAAC,GAAG,MAAM,GAAG,IAAI,EAAE,KAAK,GAAG,UAAU,cAAc,QAAQ,WAAW,EAAE,MAAM,MAAM,MAAM,CAAC;AAAA;AAI5G,SAAS,kBAAkB,CAAC,QAKjB;AAAA,EACT,QAAQ,SAAS,WAAW,cAAc;AAAA,EAC1C,IAAI,UAAU,QAAQ,WAAW;AAAA,IAAG,MAAM,eAAc,EAAE,SAAS,sCAAsC,CAAC;AAAA,EAC1G,IAAI,UAAU,MAAM,WAAW,UAAU,QAAQ,QAAQ;AAAA,IACvD,MAAM,eAAc;AAAA,MAClB,SAAS,kBAAkB,UAAU,MAAM,qBAAqB,UAAU,QAAQ;AAAA,IACpF,CAAC;AAAA,EACH;AAAA,EACA,MAAM,OAAO,UAAU,QAAQ,CAAC;AAAA,EAChC,WAAW,QAAQ,MAAM;AAAA,IACvB,IAAI,CAAC,OAAO,QAAQ,IAAI,IAAI;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,oCAA+B,6BAA6B,CAAC;AAAA,EAC7H;AAAA,EACA,MAAM,SAAS,UAAU;AAAA,EACzB,IAAI,WAAW,cAAc,OAAO,QAAQ,IAAI,OAAO,KAAK,KAAK,KAAK,SAAS,OAAO,KAAK,IAAI;AAAA,IAC7F,MAAM,eAAc,EAAE,SAAS,qBAAqB,OAAO,oCAAoC,CAAC;AAAA,EAClG;AAAA,EACA,MAAM,QAAQ,UAAU,MAAM,IAAI,CAAC,UAAU;AAAA,IAC3C,IAAI,gBAAgB,KAAK,GAAG;AAAA,MAC1B,IAAI,CAAC,KAAK,SAAS,MAAM,IAAI,KAAK,MAAM,SAAS,QAAQ,OAAO;AAAA,QAC9D,MAAM,eAAc,EAAE,SAAS,oBAAoB,MAAM,8DAAyD,CAAC;AAAA,MACrH;AAAA,MACA,OAAO,GAAG,QAAQ,WAAW,EAAE,MAAM,MAAM,KAAK,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,MAAM,OAAO,CAAC;AAAA,IACjG;AAAA,IACA,OAAO,iBAAiB,EAAE,SAAS,OAAO,UAAU,CAAC;AAAA,GACtD;AAAA,EACD,MAAM,aAAa,UAAU,QAAQ,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EAC1F,IAAI,OAAO,eAAe,YAAY,SAAS,UAAU,KAAK,MAAM,sBAAsB,MAAM,KAAK,IAAI;AAAA,EACzG,MAAM,YAAY,KAAK,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC;AAAA,EACjE,IAAI,WAAW;AAAA,IAAW,UAAU,KAAK,gBAAgB,EAAE,SAAS,QAAQ,UAAU,CAAC,CAAC;AAAA,EACxF,IAAI,UAAU,SAAS;AAAA,IAAG,QAAQ,SAAS,UAAU,KAAK,cAAc;AAAA,EACxE,IAAI,UAAU,UAAU,WAAW;AAAA,IACjC,QAAQ,UAAU,WAAW,EAAE,SAAS,MAAM,UAAU,OAAO,UAAU,CAAC;AAAA,EAC5E;AAAA,EACA,MAAM,WAAW,UAAU;AAAA,EAC3B,IAAI,aAAa,WAAW;AAAA,IAC1B,IAAI,SAAS,QAAQ,WAAW;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,oEAA+D,CAAC;AAAA,IAClI,IAAI,QAAQ,kBAAkB,uBAAuB;AAAA,MACnD,MAAM,wBAAsB;AAAA,QAC1B,SAAS,QAAQ;AAAA,QACjB,SAAS;AAAA,QACT,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,IACA,QAAQ,iBAAiB,SAAS,QAAQ,IAAI,CAAC,SAAS,QAAQ,WAAW,EAAE,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,EACjG;AAAA,EACA,OAAO,OAAO,eAAe,EAAE,SAAS,WAAW,UAAU,WAAW,WAAW,OAAO,UAAU,MAAM,CAAC,EAAE;AAAA;;;APvtF/G,IAAM,OAAe;AAAA;AAMrB,MAAM,sBAAsB,eAAe;AAAA,EACxB;AAAA,EACR,QAAmB,CAAC;AAAA,EAE7B,WAAW,CAAC,SAAqB;AAAA,IAC/B,MAAM,OAAO;AAAA,IACb,KAAK,SAAS;AAAA;AAAA,EAGP,GAAG,CAAC,OAAwB;AAAA,IACnC,MAAM,YAAY,sBAAsB,EAAE,MAAM,CAAC;AAAA,IACjD,IAAI,UAAU,SAAS,WAAW,CAAC,KAAK,OAAO,aAAa;AAAA,MAAc,MAAM,wBAAsB,EAAE,SAAS,KAAK,OAAO,MAAM,SAAS,eAAe,CAAC;AAAA,IAC5J,MAAM,OAAO,sBAAsB,EAAE,MAAM,CAAC;AAAA,IAC5C,KAAK,MAAM,KAAK,MAAM,QAAQ,IAAI,KAAK,KAAK,OAAO,aAAa,eAAe,aAAa,EAAE,QAAQ,KAAK,CAAC,IAAI,IAAI;AAAA,IACpH,OAAO,4BAA4B,EAAE,SAAS,KAAK,QAAQ,aAAa,OAAK,KAAK,MAAM,SAAS,SAAO,UAAU,CAAC;AAAA;AAEvH;AAEA,SAAS,YAAY,CAAC,MAAsB;AAAA,EAC1C,OAAO,IAAI,KAAK,QAAQ,UAAU,CAAC,SAAS,KAAK,MAAM;AAAA;AAQzD,SAAS,YAAY,CAAC,QAAgD;AAAA,EACpE,MAAM,WAAW,OAAO,OAAO,IAAI,CAAC,UAAU;AAAA,IAC5C,IAAI,UAAU,QAAQ,UAAU;AAAA,MAAW,OAAO;AAAA,IAClD,IAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU;AAAA,MAAW,OAAO,OAAO,KAAK;AAAA,IAC7G,IAAI,iBAAiB;AAAA,MAAM,OAAO,aAAa,MAAM,YAAY,CAAC;AAAA,IAClE,IAAI,iBAAiB;AAAA,MAAY,OAAO,aAAa,MAAM,MAAM,KAAK,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE,GAAG;AAAA,IACrI,IAAI,OAAO,UAAU;AAAA,MAAU,OAAO,aAAa,KAAK;AAAA,IACxD,OAAO,aAAa,KAAK,UAAU,KAAK,CAAC;AAAA,GAC1C;AAAA,EACD,OAAO,IAAI,SAAS,KAAK,GAAG;AAAA;AAQvB,SAAS,cAAc,CAAC,QAA6D;AAAA,EAC1F,MAAM,YAAY,IAAI,cAAc,OAAO,OAAO;AAAA,EAClD,MAAM,OAAO,WAAW,EAAE,SAAS,OAAO,SAAS,MAAM,OAAO,MAAM,UAAU,CAAC;AAAA,EACjF,MAAM,SAAS,KAAK,MAAM,IAAI;AAAA,EAC9B,MAAM,UAAoB,CAAC;AAAA,EAC3B,MAAM,SAAoB,CAAC;AAAA,EAC3B,SAAS,QAAQ,EAAG,QAAQ,OAAO,QAAQ,SAAS;AAAA,IAClD,MAAM,QAAQ,OAAO;AAAA,IACrB,IAAI,QAAQ,MAAM;AAAA,MAAG,QAAQ,KAAK,KAAK;AAAA,IACvC;AAAA,MAAK,OAAO,KAAK,UAAU,MAAM,OAAO,KAAK,EAAE;AAAA,EACjD;AAAA,EACA,MAAM,WAAW,OAAO,OAAO,CAAC,GAAG,OAAO,GAAG,EAAE,KAAK,CAAC,GAAG,OAAO,EAAE,CAAC;AAAA,EAClE,OAAO,IAAI,UAAU,GAAG,MAAM;AAAA;;AYzEhC,sBAAS;AAuBT,IAAM,UAAU,IAAI;AACpB,IAAM,WAAW,IAAI;AAYrB,IAAM,kBAAkB,IAAI;AAC5B,IAAM,mBAAmB,IAAI;AAC7B,uBAAuB,EAAE,OAAO,CAAC,UAAU,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,iBAAiB,IAAI,KAAK,EAAE,CAAC;AAEnJ,SAAS,QAAO,CAAC,SAAwB;AAAA,EACvC,MAAM,IAAI,YAAU,EAAE,MAAM,mBAAmB,QAAQ,CAAC;AAAA;AAInD,SAAS,cAAmB,CAAC,QAAmF;AAAA,EACrH,IAAI,OAAO,OAAO,WAAW,cAAc,OAAO,OAAO,SAAS,WAAW;AAAA,IAAY,SAAQ,mDAAmD;AAAA,EACpJ,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,EAC/C,QAAQ,IAAI,OAAO,OAAO,OAAO,EAAE,QAAQ,OAAO,QAAQ,SAAS,OAAO,QAAQ,CAAC,CAAC;AAAA,EACpF,OAAO;AAAA;AAIF,SAAS,gBAAgB,CAAC,QAA+C;AAAA,EAC9E,IAAI,OAAO,OAAO,WAAW;AAAA,IAAY,SAAQ,iCAAiC;AAAA,EAClF,MAAM,UAAU,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,EACjD,SAAS,IAAI,SAAS,OAAO,MAAM;AAAA,EACnC,OAAO;AAAA;AAIF,SAAS,UAAU,CAAC,OAA4C;AAAA,EACrE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,QAAQ,IAAI,KAAK;AAAA;AAIlE,SAAS,YAAY,CAAC,OAAqC;AAAA,EAChE,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,SAAS,IAAI,KAAK;AAAA;AAInE,SAAS,kBAAkB,CAAC,OAA4D;AAAA,EAC7F,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,gBAAgB,IAAI,KAAK;AAAA;AAI1E,SAAS,oBAAoB,CAAC,OAAqD;AAAA,EACxF,OAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,iBAAiB,IAAI,KAAK;AAAA;AAI3E,SAAS,sBAA6C,CAAC,QAAkF;AAAA,EAC9I,MAAM,QAAQ,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAQ,qCAAqC;AAAA,EACxF,kBAAkB,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,EACzC,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,EAC/C,gBAAgB,IAAI,OAAO,KAAK,OAAO,OAAO,OAAO,OAAO,OAAO,IAAI,QAAU,CAAC;AAAA,EAClF,OAAO;AAAA;AAIF,SAAS,wBAA0C,CAAC,QAA4E;AAAA,EACrI,MAAM,SAAS,SAAS,IAAI,OAAO,KAAK,KAAK,SAAQ,mCAAmC;AAAA,EACxF,kBAAkB,EAAE,OAAO,OAAO,MAAM,CAAC;AAAA,EACzC,MAAM,QAAQ,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC;AAAA,EAC/C,iBAAiB,IAAI,OAAO,EAAE,QAAQ,OAAO,OAAO,OAAO,OAAO,IAAI,QAAU,CAAC;AAAA,EACjF,OAAO;AAAA;AAGT,SAAS,gBAAgB,CAAC,QAAyE;AAAA,EACjG,MAAM,SAAS,OAAO,MAAM,MAAM,IAAI,OAAO,OAAO;AAAA,EACpD,IAAI,WAAW;AAAA,IAAW,OAAO;AAAA,EACjC,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,0BAA0B,EAAE,WAAW,SAAS,OAAO,SAAS,OAAO,OAAO,MAAM,MAAM,CAAC;AAAA,EAC3F,MAAM,OAAO,OAAO,MAAM,OAAO,EAAE,SAAS,OAAO,SAAS,UAAU,CAAC;AAAA,EACvE,IAAI,UAAU,MAAM,IAAI,OAAO,QAAQ;AAAA,IAAa,SAAQ,0FAA0F;AAAA,EACtJ,MAAM,UAAU,2BAA2B,EAAE,UAAU,CAAC;AAAA,EACxD,MAAM,WAAW,OAAO,OAAO,EAAE,MAAM,QAAQ,CAAC;AAAA,EAChD,OAAO,MAAM,MAAM,IAAI,OAAO,SAAS,QAAQ;AAAA,EAC/C,OAAO;AAAA;AAIT,SAAS,eAAe,CAAC,QAA0D;AAAA,EACjF,QAAQ,UAAU;AAAA,EAClB,OAAO,QAAQ,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,gBAAgB,IAAI,KAAK,KAAK,iBAAiB,IAAI,KAAK,KACvG,cAAc,KAAK,KAAK,WAAW,KAAK,KAAK,oBAAoB,MAAM;AAAA;AAG9E,SAAS,YAAY,CAAC,QAA0F;AAAA,EAC9G,QAAQ,UAAU,OAAO;AAAA,EACzB,OAAO,sBAAsB,EAAE,SAAS,OAAO,SAAS,SAAS,QAAQ,OAAO,QAAQ,UAAU,CAAC,UAAU,gBAAgB,EAAE,OAAO,MAAM,CAAC,EAAE,CAAC;AAAA;AAI3I,SAAS,uBAA8C,CAAC,QAAsI;AAAA,EACnM,MAAM,QAAQ,gBAAgB,IAAI,OAAO,KAAK,KAAK,SAAQ,8CAA8C;AAAA,EACzG,MAAM,WAAW,iBAAiB,EAAE,SAAS,OAAO,SAAS,MAAM,CAAC;AAAA,EACpE,OAAO,EAAE,MAAM,SAAS,MAAM,QAAQ,aAAa,EAAE,UAAU,OAAO,QAAQ,OAAO,OAAO,CAAC,GAAG,SAAS,MAAM,QAAkC;AAAA;AAI5I,SAAS,yBAA2C,CAAC,QAAgI;AAAA,EAC1L,MAAM,QAAQ,iBAAiB,IAAI,OAAO,KAAK,KAAK,SAAQ,4CAA4C;AAAA,EACxG,MAAM,WAAW,iBAAiB,EAAE,SAAS,OAAO,SAAS,MAAM,CAAC;AAAA,EACpE,OAAO,EAAE,MAAM,SAAS,MAAM,QAAQ,aAAa,EAAE,UAAU,OAAO,QAAQ,OAAO,OAAO,CAAC,EAAE;AAAA;AAI1F,SAAS,eAAoB,CAAC,QAA8E;AAAA,EACjH,MAAM,QAAQ,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAQ,qCAAqC;AAAA,EACxF,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,OAAO,MAAM,OAAO,EAAE,SAAS,OAAO,SAAS,UAAU,CAAC;AAAA,EAChE,IAAI,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,IAAa,SAAQ,0FAA0F;AAAA,EAC5J,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,SAAS,MAAM,QAAkC;AAAA;AAIrF,SAAS,iBAAiB,CAAC,QAAyF;AAAA,EACzH,MAAM,SAAS,SAAS,IAAI,OAAO,KAAK,KAAK,SAAQ,mCAAmC;AAAA,EACxF,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,OAAO,OAAO,EAAE,SAAS,OAAO,SAAS,UAAU,CAAC;AAAA,EAC1D,IAAI,UAAU,OAAO,SAAS,OAAO,QAAQ;AAAA,IAAa,SAAQ,4FAA4F;AAAA,EAC9J,OAAO,EAAE,MAAM,QAAQ,UAAU,OAAO;AAAA;;ACxJ1C,sBAAS,kCAAW,kCAAmB,sCAAY;AAKnD,SAAS,QAAO,CAAC,MAAqB;AAAA,EACpC,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,iCAAiC,QAAQ,MAAM,EAAE,MAAM,aAAa,OAAO,EAAE,CAAC;AAAA;AAIrI,SAAS,gBAAgB,CAAC,QAAiH;AAAA,EAChJ,QAAQ,WAAW,MAAM,OAAO,YAAY;AAAA,EAC5C,IAAI,CAAC,QAAQ,aAAa;AAAA,IAAsB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACtI,IAAI,CAAC,KAAK,QAAQ,KAAK,KAAK,SAAS,MAAI;AAAA,IAAG,SAAQ,MAAM;AAAA,EAC1D,IAAI,CAAC,CAAC,aAAa,WAAW,WAAW,EAAE,SAAS,KAAK,MAAM,IAAI;AAAA,IAAG,SAAQ,YAAY;AAAA,EAC1F,IAAI,CAAC,CAAC,MAAM,MAAM,MAAM,IAAI,EAAE,SAAS,KAAK,MAAM,MAAM;AAAA,IAAG,SAAQ,QAAQ;AAAA,EAC3E,MAAM,QAAQ,CAAC,SAA0B;AAAA,IACvC,MAAM,QAAQ,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AAAA,IAC9D,IAAI,UAAU,aAAa,MAAM,UAAU,MAAM;AAAA,MAAe,SAAQ,OAAO;AAAA,IAC/E,OAAO;AAAA;AAAA,EAET,MAAM,WAAW,CAAC,UAAqC;AAAA,IACrD,IAAI,eAAe;AAAA,MAAO,OAAO;AAAA,IACjC,MAAM,WAAW,cAAc,QAAQ,MAAM,WAAW,MAAM;AAAA,IAC9D,IAAI,aAAa,cAAc,KAAK,MAAM,SAAS,eAAe,CAAC,CAAC,YAAY,WAAW,EAAE,SAAS,QAAQ;AAAA,MAAI,SAAQ,UAAU;AAAA,IACpI,MAAM,UAAU,aAAa,YAAY,YAAY,GAAG,QAAQ,mBAAmB,EAAE,OAAO,SAAS,CAAC,MAAM,KAAK,MAAM,SAAS,YAAY,cAAc;AAAA,IAC1J,IAAI,cAAc;AAAA,MAAO,OAAO;AAAA,IAChC,MAAM,SAAS,MAAM,MAAM,KAAK;AAAA,IAChC,IAAI,mBAAkB,EAAE,MAAM,OAAO,KAAK,CAAC,OAAO,KAAK,MAAM,SAAS,cAAc,WAAW;AAAA,MAAa,SAAQ,kBAAkB;AAAA,IACtI,IAAI,OAAO,SAAS,YAAY;AAAA,MAC9B,MAAM,WAAW,yCAAyC,KAAK,OAAO,cAAc,aAAa;AAAA,MACjG,IAAI,cAAc,KAAK,MAAM,SAAS;AAAA,QAAc,SAAQ,gBAAgB;AAAA,IAC9E;AAAA,IACA,MAAM,MAAM,QAAQ,WAAW,EAAE,MAAM,OAAO,UAAU,OAAO,KAAK,CAAC;AAAA,IACrE,OAAO,YAAY,YAAY,MAAM,YAAY,QAAQ;AAAA;AAAA,EAE3D,MAAM,OAAO,KAAK,KAAK,IAAI,CAAC,QAAQ;AAAA,IAClC,IAAI,gBAAgB,KAAK;AAAA,MACvB,IAAI,CAAC,IAAI,WAAW,KAAK,KAAK,IAAI,WAAW,SAAS,MAAI,KAAK,IAAI,OAAO,WAAW;AAAA,QAAG,SAAQ,YAAY;AAAA,MAC5G,IAAI,OAAO,QAAQ,KAAK;AAAA,MACxB,OAAO,IAAI,IAAI;AAAA,IACjB;AAAA,IACA,MAAM,SAAS,MAAM,IAAI,KAAK;AAAA,IAC9B,IAAI,OAAO;AAAA,MAAY,SAAQ,kCAAkC;AAAA,IACjE,IAAI,CAAC,YAAW,OAAO,IAAI,KAAK,CAAC,CAAC,UAAU,OAAO,UAAU,SAAS,WAAW,WAAW,UAAU,EAAE,SAAS,mBAAkB,EAAE,MAAM,OAAO,KAAK,CAAC,CAAC;AAAA,MAAG,SAAQ,UAAU;AAAA,IAC9K,OAAO,GAAG,QAAQ,WAAW,EAAE,MAAM,OAAO,UAAU,OAAO,KAAK,CAAC;AAAA,GACpE;AAAA,EACD,KAAK,KAAK,GAAG,KAAK,MAAM,QAAQ,SAAS,KAAK,MAAM,KAAK,MAAM,SAAS,KAAK,MAAM,KAAK,MAAM,QAAQ,mBAAmB,EAAE,OAAO,KAAK,MAAM,OAAO,CAAC,YAAY;AAAA,EACjK,MAAM,QAAQ,KAAK,UAAU,YAAY,KAAK,WAAW,gBAAgB,EAAE,WAAW,KAAK,OAAO,OAAO,SAAS,OAAO,sBAAsB,MAAM,KAAK,KAAK,CAAC;AAAA,EAChK,OAAO,EAAE,MAAM,KAAK,MAAM,YAAY,uBAAuB,KAAK,KAAK,IAAI,KAAK,SAAS,QAAQ,MAAM,oBAAoB,KAAK,KAAK,WAAW,IAAI,CAAC,IAAI,QAAQ,aAAa,oBAAoB;AAAA;AAI7L,SAAS,oBAAoB,CAAC,QAAmE;AAAA,EACtG,IAAI,CAAC,OAAO,QAAQ,aAAa;AAAA,IAAsB,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACpJ,OAAO,OAAO,UAAU,mBAAmB,IAAI,CAAC,SAAS,kCAAkC,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC,IAAI;AAAA;AAG5H,SAAS,kBAAkB,CAAC,QAA6G;AAAA,EAC9I,QAAQ,SAAS,OAAO,WAAW,cAAc;AAAA,EACjD,IAAI,CAAC,QAAQ,aAAa;AAAA,IAAsB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACtI,MAAM,SAAS,eAAe,QAAQ,WAAW,EAAE,MAAM,MAAM,CAAC;AAAA,EAChE,IAAI,cAAc;AAAA,IAAQ,OAAO,CAAC,GAAG,0BAA0B,QAAQ,WAAW,EAAE,MAAM,UAAU,KAAK,CAAC,IAAI;AAAA,EAC9G,OAAO,CAAC,GAAG,qBAAqB,EAAE,SAAS,UAAU,CAAC,GAAG,GAAG,yBAAyB,QAAQ,WAAW,EAAE,MAAM,UAAU,KAAK,CAAC,KAAK,UAAU,aAAa;AAAA;AAIvJ,SAAS,sBAAsB,CAAC,QAA6E;AAAA,EAClH,QAAQ,SAAS,UAAU;AAAA,EAC3B,IAAI,CAAC,QAAQ,aAAa;AAAA,IAAsB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACtI,MAAM,QAAQ,UAAU,YAAY,eAAe,QAAQ,mBAAmB,EAAE,OAAO,OAAO,aAAa,SAAS,CAAC,MAAM,WAAW,QAAQ,mBAAmB,EAAE,OAAO,MAAM,CAAC;AAAA,EACjL,OAAO,maAAma;AAAA;AAIra,SAAS,oBAAoB,CAAC,QAAiH;AAAA,EACpJ,QAAQ,SAAS,OAAO,OAAO,eAAe;AAAA,EAC9C,IAAI,CAAC,QAAQ,aAAa;AAAA,IAAsB,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACtI,OAAO,CAAC,qBAAqB,QAAQ,WAAW,EAAE,MAAM,MAAM,CAAC,WAAW,QAAQ,WAAW,EAAE,MAAM,OAAO,aAAa,SAAS,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,MAAM,CAAC,MAAM,eAAe,QAAQ,WAAW,EAAE,MAAM,MAAM,CAAC,oBAAoB,QAAQ,WAAW,EAAE,MAAM,GAAG,UAAU,CAAC,KAAK,YAAY;AAAA;;ACrE1S,IAAM,kBAA8B;AAAA,EACzC,MAAM;AAAA,EACN,cAAc;AAAA,EAEd,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,oBAAoB;AAAA,EACpB,iBAAiB;AAAA,EACjB,aAAa,EAAE,UAAU,oBAAoB,UAAU,YAAY,YAAY,cAAc,OAAO,eAAe,iBAAiB,OAAO,yBAAyB,MAAM;AAAA,EAC1K,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EAGxB,kBAAkB,EAAE,SAAS,MAAM,uBAAuB,KAAK;AAAA,EAC/D,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,YAAY;AAAA,EAWZ,qBAAqB;AAAA,IACnB,gBAAgB,CAAC,SAAS;AAAA,IAC1B,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,EAC5B;AAAA,EACA,gBAAgB,EAAE,MAAM,WAAW,MAAM,WAAW;AAAA,EACpD,eAAe;AAAA,EACf,iBAAiB;AAAA,EAEjB,qBAAqB;AAAA,EACrB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAIA,eAAe;AAAA,EACf,gBAAgB,OAAO,OAAO,EAAE,QAAQ,QAAQ,SAAS,WAAW,KAAK,WAAW,QAAQ,UAAU,OAAO,oBAAoB,SAAS,WAAW,UAAU,eAAe,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,EAC7M,iBAAiB;AAAA,EAGjB,eAAe;AAAA,IACb,WAAW,OAAO,OAAO;AAAA,MACvB,QAAQ;AAAA,MACR,aAAa;AAAA,MACb,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC;AAAA,IACD,MAAM,OAAO,OAAO,EAAE,MAAM,IAAI,QAAQ,WAAW,YAAY,eAAe,CAAC;AAAA,EACjF;AAAA,EAGA,uBAAuB;AAAA,IACrB,WAAW,OAAO,OAAO;AAAA,MACvB,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,IACD,QAAQ,OAAO,OAAO;AAAA,MACpB,MAAM;AAAA,MACN,QAAQ;AAAA,IACV,CAAC;AAAA,IACD,SAAS,OAAO,OAAO,EAAE,QAAQ,YAAY,MAAM,SAAS,CAAC;AAAA,EAC/D;AAAA,EACA,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,aAAa,EAAE,MAAM,iBAAiB,gBAAgB,KAAK;AAAA,EAG3D,gBAAgB;AAAA,EAChB,aAAa;AAAA,EAGb,gBAAgB,EAAE,MAAM,QAAQ,OAAO,QAAQ;AAAA,EAE/C,UAAU,GAAG,QAAQ;AAAA,IACnB,OAAO,IAAI,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,IAAI;AAAA;AAAA,EAIvD,kBAAkB,GAAG,SAAS;AAAA,IAC5B,OAAO,IAAI,MAAM,WAAW,KAAK,IAAI;AAAA;AAAA,EAEvC,iBAAiB,GAAG,UAAU;AAAA,IAC5B,OAAO;AAAA;AAAA,EAET,gBAAgB,GAAG,IAAI,UAAU;AAAA,IAC/B,OAAO,GAAG,OAAO,QAAQ,QAAQ,SAAS;AAAA;AAAA,EAE5C,WAAW,GAAG,SAAS;AAAA,IACrB,OAAO,IAAI;AAAA;AAAA,EAEb,kBAAkB,GAAG,cAAsB;AAAA,IACzC,OAAO,GAAG;AAAA;AAAA,EAEZ,WAAW,GAAG,eAAe,aAAa;AAAA,IACxC,IAAI,kBAAkB;AAAA,MAAG,OAAO;AAAA,IAChC,OAAO,kCAAkC,UAAU,IAAI,aAAa;AAAA;AAAA,EAEtE,gBAAgB,GAAG,MAAM,SAAS;AAAA,IAChC,MAAM,MAAM,CAAC,UAAsC,MAAM,WAAW,IAAK,MAAM,KAAgB,IAAI,MAAM,KAAK,IAAI;AAAA,IAClH,OAAO,GAAG,IAAI,IAAI,sBAAsB,IAAI,KAAK;AAAA;AAErD;;AClHO,IAAM,eAA2B;AAAA,EACtC,MAAM;AAAA,EACN,cAAc;AAAA,EAEd,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EAEjB,oBAAoB;AAAA,EAEpB,iBAAiB;AAAA,EAGjB,aAAa,EAAE,UAAU,cAAc,UAAU,iBAAiB,YAAY,gBAAgB,OAAO,gBAAgB,iBAAiB,MAAM,yBAAyB,KAAK;AAAA,EAC1K,yBAAyB;AAAA,EACzB,wBAAwB;AAAA,EAGxB,kBAAkB,EAAE,SAAS,MAAM,uBAAuB,MAAM;AAAA,EAChE,kBAAkB;AAAA,EAClB,gBAAgB;AAAA,EAEhB,qBAAqB;AAAA,EACrB,YAAY;AAAA,EAOZ,qBAAqB;AAAA,IACnB,gBAAgB,CAAC,SAAS;AAAA,IAC1B,wBAAwB;AAAA,IACxB,uBAAuB;AAAA,IAQvB,0BAA0B;AAAA,EAC5B;AAAA,EAGA,gBAAgB,EAAE,MAAM,YAAY,OAAO,MAAM;AAAA,EACjD,eAAe;AAAA,EACf,iBAAiB;AAAA,EAKjB,qBAAqB;AAAA,EAGrB,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,qBAAqB,EAAE,WAAW,uBAAuB;AAAA,EACzD,kBAAkB;AAAA,EAGlB,cAAc;AAAA,EACd,kBAAkB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EAEA,eAAe;AAAA,EACf,gBAAgB,OAAO,OAAO,EAAE,QAAQ,QAAQ,SAAS,YAAY,KAAK,UAAU,QAAQ,UAAU,OAAO,UAAU,SAAS,mBAAmB,UAAU,eAAe,MAAM,QAAQ,OAAO,SAAS,CAAC;AAAA,EAC3M,iBAAiB;AAAA,EAQjB,eAAe;AAAA,IACb,WAAW,OAAO,OAAO,EAAE,QAAQ,cAAc,OAAO,YAAY,CAAC;AAAA,IACrE,MAAM,OAAO,OAAO,EAAE,MAAM,IAAI,QAAQ,WAAW,YAAY,eAAe,CAAC;AAAA,IAC/E,OAAO,OAAO,OAAO,EAAE,OAAO,qBAAqB,CAAC;AAAA,EACtD;AAAA,EAIA,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,gBAAgB;AAAA,EAChB,aAAa,EAAE,MAAM,WAAW;AAAA,EAEhC,gBAAgB;AAAA,EAChB,aAAa;AAAA,EAIb,gBAAgB,EAAE,MAAM,KAAK,OAAO,IAAI;AAAA,EAExC,UAAU,GAAG,QAAQ;AAAA,IACnB,OAAO,KAAK,YAAY,EAAE,KAAK,CAAC,EAAE,WAAW,KAAK,IAAI;AAAA;AAAA,EAMxD,kBAAkB,GAAG,SAAS;AAAA,IAC5B,OAAO,IAAI,MAAM,WAAW,MAAM,MAAM,EAAE,WAAW,KAAK,IAAI;AAAA;AAAA,EAEhE,iBAAiB,GAAG,UAAU;AAAA,IAC5B,OAAO,GAAG;AAAA;AAAA,EAEZ,gBAAgB,GAAG,IAAI,QAAQ,QAAQ,QAAQ;AAAA,IAC7C,MAAM,YAAY,OAAO,QAAQ,QAAQ;AAAA,IACzC,MAAM,OAAO,CAAC,UAA0B,SAAS,YAAY,QAAQ,aAAa,aAAa;AAAA,IAC/F,IAAI,WAAW;AAAA,MAAW,OAAO,GAAG,aAAa,KAAK,GAAG,YAAY;AAAA,IAGrE,OAAO,aAAa,aAAa,KAAK,eAAe,wBAAwB,SAAS;AAAA;AAAA,EAExF,WAAW,GAAG;AAAA,IACZ,OAAO;AAAA;AAAA,EAET,kBAAkB,GAAG,cAAsB;AAAA,IACzC,OAAO,QAAQ;AAAA;AAAA,EAEjB,WAAW,GAAG,eAAe,aAAa;AAAA,IAGxC,IAAI,kBAAkB;AAAA,MAAG,OAAO;AAAA,IAChC,OAAO,6BAA6B,UAAU,IAAI,aAAa;AAAA;AAAA,EAEjE,gBAAgB,GAAG,MAAM,SAAS;AAAA,IAChC,MAAM,MAAM,CAAC,UAAsC,MAAM,WAAW,IAAK,MAAM,KAAgB,IAAI,MAAM,KAAK,IAAI;AAAA,IAClH,OAAO,QAAQ,IAAI,IAAI,SAAS,IAAI,KAAK;AAAA;AAE7C;;ACjJO,IAAM,eAAsD;AAAA,EACjE,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AACT;AAGO,SAAS,aAAa,CAAC,QAA0C;AAAA,EACtE,OAAO,aAAa,OAAO;AAAA;;ACrB7B;AAKO,SAAS,oBAAoB,GAAG,SAAS,OAAO,UAI/B;AAAA,EACtB,IAAI,QAAQ,SAAS;AAAA,IAAU;AAAA,EAC/B,MAAM,SAAS,QAAQ,WAAW,EAAE,MAAM,OAAO,CAAC;AAAA,EAElD,OAAO;AAAA,IACL,MAAM,mBAAmB,EAAE,OAAO,OAAO,CAAC;AAAA,IAC1C,YAAY,GAAG,kBAAkB,gBAAgB,qBAAqB,aAAa,QAAQ,mBAAmB,EAAE,OAAO,aAAa,CAAC;AAAA,EACvI;AAAA;;ACEK,IAAM,+BAAqE,OAAO,OAAO;AAAA,EAC9F,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT,CAAC;AAGM,IAAM,4BAAkE,OAAO,OAAO;AAAA,EAC3F,QAAQ,WAAW,aAAa,oBAAoB;AAAA,EACpD,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT,CAAC;AAGM,IAAM,gCAAsE,OAAO,OAAO;AAAA,EAC/F,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,MAAM;AAAA,EACN,OAAO;AACT,CAAC;AASM,IAAM,0BAA4D,OAAO,OAAO;AAAA,EACrF,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,MAAM;AAAA,EACN,MAAM;AAAA,EACN,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,iBAAiB;AAAA,EACjB,SAAS;AAAA,EACT,uBAAuB;AAAA,EACvB,0BAA0B;AAAA,EAC1B,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,YAAY;AACd,CAAC;AAGD,IAAM,8BAAgE,OAAO,OAAO;AAAA,EAClF,KAAK;AACP,CAAC;AAQD,IAAM,iCAAsD,IAAI,IAAI,CAAC,aAAa,QAAQ,QAAQ,CAAC;AAO5F,SAAS,2BAA2B,CAAC,QAA0C;AAAA,EACpF,MAAM,UAAU,OAAO,IAAI,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAAA,EAC3D,MAAM,QAAQ,QAAQ,MAAM,gCAAgC;AAAA,EAC5D,IAAI,UAAU;AAAA,IAAM,OAAO;AAAA,EAC3B,MAAM,OAAO,wBAAwB,MAAM,OAAkB,MAAM;AAAA,EACnE,MAAM,WAAW,+BAA+B,IAAI,IAAI,KAAK,MAAM,OAAO,QAAQ,KAAK,MAAM,MAAM,4BAA4B,SAAS;AAAA,EACxI,OAAO,GAAG,OAAO,WAAW,MAAM,MAAM;AAAA;AAQnC,IAAM,6BAAuF,OAAO,OAAO;AAAA,EAChH,UAAU,OAAO,OAAO,CAAC,gBAAgB,CAAC;AAC5C,CAAC;AAID,IAAM,uBAAyD,OAAO,OAAO;AAAA,EAC3E,SAAS;AAAA,EACT,KAAK;AAAA,EACL,SAAS;AAAA,EACT,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AACb,CAAC;AAUM,SAAS,wBAAwB,CAAC,QAA0C;AAAA,EACjF,MAAM,UAAU,OAAO,IAAI,YAAY,EAAE,QAAQ,QAAQ,EAAE;AAAA,EAC3D,IAAI,YAAY,gBAAgB,YAAY,UAAU,YAAY;AAAA,IAAW,OAAO;AAAA,EACpF,MAAM,QAAQ,QAAQ,MAAM,6BAA6B;AAAA,EACzD,IAAI,UAAU;AAAA,IAAM,OAAO;AAAA,EAC3B,MAAM,OAAO,qBAAqB,MAAM,OAAkB,MAAM;AAAA,EAChE,IAAI,WAAW,MAAM,MAAM;AAAA,EAC3B,IAAI,4CAA4C,KAAK,IAAI;AAAA,IAAG,WAAW;AAAA,EACvE,IAAI,aAAa,SAAS,8BAA8B,KAAK,IAAI;AAAA,IAAG,WAAW;AAAA,EAC/E,OAAO,GAAG,OAAO,WAAW,MAAM,MAAM;AAAA;AAsBnC,SAAS,mBAAmB,CAAC,QAAsH;AAAA,EACxJ,QAAQ,SAAS,QAAQ,eAAe;AAAA,EACxC,QAAQ;AAAA,IACN,KAAK,YAAY;AAAA,MACf,MAAM,YAAY,4BAA4B,EAAE,KAAK,6BAA6B,QAAQ,CAAC;AAAA,MAC3F,IAAI,eAAe;AAAA,QAAW,OAAO;AAAA,MACrC,MAAM,WAAW,4BAA4B,EAAE,KAAK,WAAW,CAAC;AAAA,MAChE,OAAO,aAAa,aAAa,2BAA2B,SAAS,SAAS,QAAQ,MAAM,OAAO,YAAY;AAAA,IACjH;AAAA,IACA,KAAK;AAAA,MACH,OAAO,yBAAyB,EAAE,KAAK,cAAc,0BAA0B,QAAQ,CAAC;AAAA,IAC1F,KAAK;AAAA,MACH,OAAO,8BAA8B;AAAA;AAAA;;ACxL3C,sBAAS,sCAAW;;;ACApB,kCAAS;AAUF,SAAS,mCAAmC,GAAG,aAE3C;AAAA,EACT,OAAO,wBAAwB,UAAU;AAAA;AASpC,SAAS,kCAAkC,GAAG,SAAS,SAG5C;AAAA,EAChB,IAAI,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,+BAA+B,CAAC;AAAA,EAC/H,MAAM,IAAI,GAAG,WAA8C,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACtF,IAAI;AAAA,EACJ,QAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,MAAa,OAAO,aAAa,EAAE,EAAE,MAAM,MAAM,UAAU,CAAC;AAAA,MAAK;AAAA,IACtE,KAAK;AAAA,MAAY,OAAO,yBAAyB,EAAE,EAAE,MAAM,MAAM,UAAU,CAAC;AAAA,MAAK;AAAA,IACjF,KAAK;AAAA,MAAW,OAAO,qBAAqB,EAAE,EAAE,MAAM,MAAM,UAAU,CAAC;AAAA,MAAK;AAAA,IAC5E,KAAK;AAAA,MAAO,OAAO,eAAe,EAAE,EAAE,MAAM,MAAM,MAAM,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,MAAM,MAAM,KAAK,CAAC,gBAAgB,EAAE,EAAE,MAAM,MAAM,OAAO,CAAC,KAAK,MAAM;AAAA,MAAc;AAAA;AAAA,EAEvK,OAAO,EAAE,MAAM,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAIxC,SAAS,qCAAqC,GAAG,SAAS,OAAO,UAItD;AAAA,EAChB,IAAI,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,0BAA0B,CAAC;AAAA,EAC1H,OAAO,EAAE,MAAM,eAAe,QAAQ,WAAW,EAAE,MAAM,MAAM,UAAU,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,MAAM,KAAK,CAAC,kBAAkB,QAAQ,WAAW,EAAE,MAAM,OAAO,CAAC,qBAAqB,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;;;ADzBzN,SAAS,2BAA2B,GAAG,SAAS,aAG5C;AAAA,EACT,IAAI,EAAE,sBAAsB,QAAQ,iBAAiB,QAAQ,aAAa,qBAAqB,MAAM;AAAA,IACnG,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,mBAAmB,CAAC;AAAA,EACpF;AAAA,EACA,IAAI,UAAU,YAAY,UAAU;AAAA,IAClC,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,0BAA0B,CAAC;AAAA,EAC3F;AAAA,EACA,IAAI,OAAO,UAAU,eAAe,YAAY,UAAU,WAAW,KAAK,EAAE,WAAW,KAAK,UAAU,WAAW,SAAS,MAAI,GAAG;AAAA,IAC/H,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,uDAAuD,MAAM,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AAAA,EACvK;AAAA,EACA,QAAQ,QAAQ;AAAA,IACd,KAAK;AAAA,MAAY,OAAO,oCAAoC,EAAE,UAAU,CAAC;AAAA,IACzE,KAAK;AAAA,MAAS,OAAO,iCAAiC,EAAE,UAAU,CAAC;AAAA,IACnE,KAAK;AAAA,MAAU,OAAO,kCAAkC,EAAE,UAAU,CAAC;AAAA;AAAA;;AEpCzE,sBAAS,8BAAW,gKAAsI;;;ACA1J,sBAAS,sCAAW;AAOpB,SAAS,UAAU,GAAG,SAAS,SAA4E;AAAA,EACzG,MAAM,SAAS,QAAQ,WAAW,EAAE,MAAM,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,EACtE,MAAM,OAAO,MAAM,SAAS,SAAS,qBAAqB,MAAM,SAAS,OAAO,OAAO;AAAA,EACvF,OAAO,OAAO,SAAS,6BAA6B,SAAS;AAAA;AAuBxD,SAAS,qBAAqB,GAAG,SAAS,WAG7B;AAAA,EAClB,IAAI,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,mBAAmB,CAAC;AAAA,EACnH,QAAQ,MAAM,OAAO,kBAAkB,iBAAiB,iBAAiB,cAAc;AAAA,EACvF,MAAM,UAAU,GAAG,WAAwD,GAAG,QAAQ,WAAW,EAAE,MAAM,KAAK,UAAU,CAAC,KAAK,QAAQ,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC;AAAA,EACpK,MAAM,eAAe,QAAQ,EAAE,MAAM,iBAAiB,KAAK,CAAC;AAAA,EAC5D,MAAM,YAAY,QAAQ,EAAE,MAAM,MAAM,CAAC;AAAA,EACzC,MAAM,cAAc,QAAQ,WAAW,EAAE,MAAM,gBAAgB,KAAK,CAAC;AAAA,EACrE,MAAM,aAAa,QAAQ,mBAAmB,EAAE,OAAO,gBAAgB,KAAK,CAAC;AAAA,EAC7E,MAAM,QAAQ;AAAA,EAAwD,KAAK,SAAS,eAAe,SAAS,2DAA2D;AAAA,EACvK,IAAI;AAAA,EACJ,IAAI,KAAK,SAAS,cAAc;AAAA,IAC9B,OAAO;AAAA,IAAY;AAAA;AAAA,EACrB,EAAE,KAAK;AAAA,IACL,MAAM,QAAQ,gBAAgB,IAAI,CAAC,UAAU,WAAW,EAAE,SAAS,MAAM,CAAC,CAAC;AAAA,IAC3E,IAAI,MAAM,WAAW,GAAG;AAAA,MACtB,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,YAAY,KAAK,gCAAgC,MAAM,EAAE,OAAO,QAAQ,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC;AAAA,IAChK;AAAA,IACA,MAAM,YAAY,cAAc,YAC5B,MAAM,KAAK;AAAA,QAAW,IACtB,OAAO,QAAQ,WAAW,EAAE,MAAM,UAAU,UAAU,UAAU,KAAK,CAAC;AAAA,MAA4B,MAAM,KAAK;AAAA,QAAW;AAAA;AAAA,IAC5H,OAAO;AAAA,OAAe;AAAA,MAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,EAE/C,IAAI,SAAS;AAAA,EACb,SAAS,SAAS,EAAG,KAAK,SAAS,MAAM,GAAG,UAAU;AAAA,IAAG,SAAS,kBAAkB;AAAA,EACpF,MAAM,iBAAiB,mBAAmB;AAAA;AAAA;AAAA,KAAgJ;AAAA,EAAW;AAAA,EAAS;AAAA,EAC9M,MAAM,gBAAgB,kBAAkB,4BAA4B,KAAK,SAAS,eAAe,eAAe,SAAS;AAAA,gCAA4C;AAAA,EACrK,OAAO;AAAA,IACL,YAAY,CAAC,kBAAkB,eAAe;AAAA,IAC9C,QAAQ,CAAC,EAAE,MAAM,gBAAgB,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,eAAe,QAAQ,CAAC,EAAE,CAAC;AAAA,IAClF,MAAM,CAAC,EAAE,MAAM,gBAAgB,kBAAkB,cAAc,QAAQ,CAAC,EAAE,GAAG,EAAE,MAAM,iBAAiB,mBAAmB,QAAQ,CAAC,EAAE,CAAC;AAAA,IACrI,iBAAiB,gBAAgB,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,OACtD,cAAc,YAAY,CAAC,IAAI,EAAE,WAAW,UAAU,KAAK;AAAA,EACjE;AAAA;;;ACpEF,oDAAuC,sCAAW;AAQ3C,SAAS,mBAAmB,GAAG,SAAS,WAG3B;AAAA,EAClB,IAAI,QAAQ,SAAS;AAAA,IAAU,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,iBAAiB,CAAC;AAAA,EAC/G,QAAQ,MAAM,OAAO,UAAU,iBAAiB,cAAc;AAAA,EAC9D,IAAI,MAAM,cAAc;AAAA,IAAQ,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,kBAAkB,CAAC;AAAA,EACjH,MAAM,QAAQ,gBAAgB,IAAI,CAAC,UAAU;AAAA,IAC3C,MAAM,SAAS,QAAQ,WAAW,EAAE,MAAM,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,IACtE,OAAO,OAAO,qBAAqB;AAAA,GACpC;AAAA,EACD,IAAI,KAAK,SAAS,gBAAgB,MAAM,WAAW;AAAA,IAAG,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,YAAY,KAAK,gCAAgC,MAAM,EAAE,OAAO,QAAQ,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC;AAAA,EACpN,MAAM,YAAY,KAAK,SAAS,eAAe,KAAK,cAAc,YAC9D,QAAQ,MAAM,KAAK;AAAA,MAAS;AAAA,IAC5B,YAAY,QAAQ,WAAW,EAAE,MAAM,UAAU,UAAU,UAAU,KAAK,CAAC;AAAA,IAA0B,MAAM,KAAK;AAAA,MAAS;AAAA;AAAA;AAAA,EAC7H,OAAO;AAAA,IACL,YAAY,SAAS,IAAI,GAAG,eAAe,QAAQ;AAAA,IACnD,QAAQ,SAAS,IAAI,GAAG,OAAO,gBAAgB;AAAA,MAC7C,MAAM,kBAAkB,QAAQ,WAAW,EAAE,MAAM,SAAS,KAAK,CAAC,YAAY,MAAM,YAAY,QAAQ,QAAQ,WAAW,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA;AAAA,EAAoB;AAAA,wBAAyC,QAAQ,mBAAmB,EAAE,OAAO,GAAG,+BAA+B,SAAS,OAAO,CAAC;AAAA;AAAA,MACnS,QAAQ,CAAC;AAAA,IACX,EAAE;AAAA,IACF,MAAM,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,IAAI,GAAG,gBAAgB,EAAE,MAAM,gBAAgB,QAAQ,WAAW,EAAE,MAAM,SAAS,KAAK,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE;AAAA,IAC1I,iBAAiB,gBAAgB,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,OACtD,cAAc,YAAY,CAAC,IAAI,EAAE,WAAW,UAAU,KAAK;AAAA,EACjE;AAAA;;;AChCF,wDAA2C,qEAA0C;AAIrF,SAAS,iBAAiB,GAAG,MAAM,SAAS,WAIjC;AAAA,EACT,MAAM,UAAU,qBAAqB;AAAA,EAErC,IAAI,8BAA8B,EAAE,aAAa,KAAK,CAAC,IAAI;AAAA,IAAkC,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,YAAY,QAAQ,KAAK,wBAAwB,sFAAsF,MAAM,EAAE,OAAO,QAAQ,OAAO,MAAM,QAAQ,KAAK,KAAK,EAAE,CAAC;AAAA,EAEzV,IAAI,QAAQ,SAAS,IAAI,GAAG;AAAA,IAC1B,MAAM,MAAM,MAAM,KAAK,IAAI,YAAY,EAAE,OAAO,OAAO,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA,IAC/G,OAAO,cAAc;AAAA,EACvB;AAAA,EACA,OAAO,QAAQ,mBAAmB,EAAE,OAAO,QAAQ,CAAC;AAAA;AAO/C,SAAS,kBAAkB,GAAG,SAAS,WAG1B;AAAA,EAClB,IAAI,QAAQ,SAAS;AAAA,IAAS,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,gBAAgB,CAAC;AAAA,EAC7G,QAAQ,MAAM,OAAO,UAAU,iBAAiB,WAAW,cAAc;AAAA,EACzE,WAAW,QAAQ,OAAO,KAAK,aAAa,CAAC,CAAC;AAAA,IAAG,IAAI,CAAC,SAAS,KAAK,GAAG,eAAe,SAAS,SAAS,IAAI;AAAA,MAAG,MAAM,IAAI,YAAU,EAAE,MAAM,iBAAiB,SAAS,oEAAoE,MAAM,EAAE,OAAO,QAAQ,OAAO,MAAM,KAAK,MAAM,SAAS,KAAK,EAAE,CAAC;AAAA,EACzS,MAAM,WAAW,GAAG,WAA8C;AAAA,IAChE,MAAM,QAAQ,YAAY;AAAA,IAC1B,IAAI,UAAU;AAAA,MAAW,OAAO;AAAA,IAChC,OAAO,aAAa,QAAQ,YAAY,QAAQ,WAAW,EAAE,MAAM,MAAM,QAAQ,CAAC,MAAM,aAAa,QAAQ,WAAW,EAAE,MAAM,MAAM,SAAS,CAAC;AAAA;AAAA,EAElJ,MAAM,UAAU,GAAG,WAA8C,MAAM,cAAc,WACjF,QAAQ,WAAW,EAAE,KAAK,CAAC,IAC3B,GAAG,QAAQ,WAAW,EAAE,MAAM,MAAM,UAAU,CAAC,KAAK,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACnF,MAAM,QAAQ,gBAAgB,IAAI,CAAC,UAAU;AAAA,IAC3C,MAAM,SAAS,QAAQ,WAAW,EAAE,MAAM,MAAM,UAAU,MAAM,KAAK,CAAC;AAAA,IACtE,OAAO,YAAY,kBAAkB;AAAA,GACtC;AAAA,EACD,IAAI,KAAK,SAAS,gBAAgB,MAAM,WAAW;AAAA,IAAG,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,YAAY,KAAK,gCAAgC,MAAM,EAAE,OAAO,QAAQ,OAAO,MAAM,KAAK,KAAK,EAAE,CAAC;AAAA,EACpN,MAAM,YAAY,cAAc,YAAY,MAAM,KAAK;AAAA,QAAW,IAC9D,OAAO,QAAQ,WAAW,EAAE,MAAM,UAAU,UAAU,UAAU,KAAK,CAAC;AAAA,MAA4B,MAAM,KAAK;AAAA,QAAW;AAAA;AAAA,EAC5H,OAAO;AAAA,IACL,YAAY,SAAS,IAAI,GAAG,eAAe,QAAQ;AAAA,IACnD,QAAQ,SAAS,IAAI,GAAG,OAAO,eAAe;AAAA,MAC5C,MAAM,SAAS,kEAAkE,kBAAkB,EAAE,MAAM,SAAS,MAAM,SAAS,QAAQ,CAAC;AAAA,MAC5I,MAAM,OAAO,KAAK,SAAS,eAAe,KAAK,WAAW,QAAQ;AAAA,MAAuB;AAAA;AAAA,MACzF,OAAO,EAAE,MAAM,kBAAkB,QAAQ,EAAE,MAAM,SAAS,KAAK,CAAC,YAAY,MAAM,YAAY,QAAQ,QAAQ,EAAE,MAAM,MAAM,KAAK,CAAC;AAAA,cAAkB,SAAS,EAAE,MAAM,SAAS,KAAK,CAAC;AAAA;AAAA,EAAa;AAAA,OAAc,QAAQ,CAAC,EAAE;AAAA,KAC3N;AAAA,IACD,MAAM,CAAC,GAAG,QAAQ,EAAE,QAAQ,EAAE,IAAI,GAAG,gBAAgB,EAAE,MAAM,gBAAgB,QAAQ,EAAE,MAAM,SAAS,KAAK,CAAC,MAAM,QAAQ,CAAC,EAAE,EAAE;AAAA,IAC/H,iBAAiB,gBAAgB,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,OACtD,cAAc,YAAY,CAAC,IAAI,EAAE,WAAW,UAAU,KAAK;AAAA,EACjE;AAAA;;;AHJK,SAAS,aAAa,GAAG,QAAQ,OAAO,MAAM,SAAS,aAO1C;AAAA,EAClB,MAAM,QAAQ,kBAAkB,EAAE,OAAO,KAAK,CAAC;AAAA,EAC/C,IAAI,UAAU,WAAW;AAAA,IACvB,MAAM,IAAI,YAAU,EAAE,MAAM,uBAAuB,SAAS,OAAO,MAAM,EAAE,OAAO,MAAM,KAAK,EAAE,CAAC;AAAA,EAClG;AAAA,EACA,IAAI,cAAc,aAAa,OAAO,KAAK,SAAS,EAAE,SAAS,KAAK,QAAQ,SAAS;AAAA,IAAS,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,0BAA0B,CAAC;AAAA,EACvL,MAAM,aAAa,kBAAkB,EAAE,QAAQ,OAAO,OAAO,CAAC,IAAI,GAAG,SAAS,QAAQ,KAAK,CAAC,EAAE;AAAA,EAC9F,QAAQ,QAAQ;AAAA,IACd,KAAK,YAAY;AAAA,MACf,MAAM,UAAU,kBAAkB,EAAE,QAAQ,OAAO,MAAM,YAAY,SAAS,QAAQ,KAAK,CAAC;AAAA,MAC5F,MAAM,mBAAmB,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,UAAU,GAAG;AAAA,MAC/E,MAAM,kBAAkB,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,SAAS,GAAG;AAAA,MAC7E,IAAI,kBAAkB,SAAS,cAAc,iBAAiB,SAAS;AAAA,QAAW,MAAM,eAAc,EAAE,SAAS,yDAAyD,MAAM,EAAE,OAAO,MAAM,MAAM,MAAM,WAAW,KAAK,EAAE,CAAC;AAAA,MAC9N,MAAM,OAAO,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAAA,MAClD,MAAM,YAAY,SAAS,YAAY,YAAY,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AAAA,MACnG,OAAO,sBAAsB;AAAA,QAC3B;AAAA,QACA,SAAS;AAAA,UACP,OAAO,MAAM;AAAA,UAAM,OAAO,gBAAgB;AAAA,UAAO,MAAM;AAAA,UACvD;AAAA,UAAkB,iBAAiB,EAAE,MAAM,WAAW,OAAO,gBAAgB,OAAO,MAAM,gBAAgB,KAAK;AAAA,UAC/G,iBAAiB,uBAAuB,EAAE,QAAQ,OAAO,MAAM,WAAW,CAAC;AAAA,aACvE,cAAc,YAAY,CAAC,IAAI,EAAE,UAAU;AAAA,QACjD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AAAA,IACL,KAAK,SAAS;AAAA,MACZ,MAAM,UAAU,kBAAkB,EAAE,QAAQ,OAAO,MAAM,YAAY,SAAS,QAAQ,KAAK,CAAC;AAAA,MAC5F,MAAM,WAAW,QAAQ,IAAI,GAAG,MAAM,eAAwD;AAAA,QAC5F,IAAI,SAAS,aAAa,SAAS,SAAS;AAAA,UAAW,MAAM,eAAc,EAAE,SAAS,qCAAqC,MAAM,EAAE,OAAO,MAAM,MAAM,MAAM,WAAW,KAAK,EAAE,CAAC;AAAA,QAC/K,MAAM,QAAS,CAAC,UAAU,QAAQ,EAAY,KAAK,CAAC,UAAU,SAAS,SAAS,mBAAmB,EAAE,MAAM,YAAY,MAAM,CAAC,CAAC;AAAA,QAC/H,IAAI,UAAU;AAAA,UAAW,MAAM,eAAc,EAAE,SAAS,2CAA2C,MAAM,EAAE,OAAO,MAAM,MAAM,MAAM,WAAW,MAAM,SAAS,SAAS,KAAK,EAAE,CAAC;AAAA,QAC/K,OAAO,EAAE,OAAO,UAAU,EAAE,MAAM,WAAW,OAAO,SAAS,OAAO,MAAM,SAAS,KAAK,EAAE;AAAA,OAC3F;AAAA,MACD,MAAM,QAAQ,SAAS,IAAI,SAAS;AAAA,MACpC,IAAI,UAAU;AAAA,QAAW,MAAM,eAAc,EAAE,SAAS,gDAAgD,MAAM,EAAE,OAAO,MAAM,MAAM,MAAM,WAAW,KAAK,EAAE,CAAC;AAAA,MAC5J,MAAM,OAAO,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAAA,MAClD,MAAM,YAAY,SAAS,YAAY,YAAY,MAAM,OAAO,KAAK,CAAC,UAAU,MAAM,SAAS,IAAI;AAAA,MACnG,MAAM,UAA+B;AAAA,QACnC,OAAO,MAAM;AAAA,QAAM;AAAA,QAAO,MAAM;AAAA,QAAY;AAAA,QAC5C,iBAAiB,uBAAuB,EAAE,QAAQ,OAAO,MAAM,WAAW,CAAC;AAAA,WACvE,cAAc,YAAY,CAAC,IAAI,EAAE,UAAU;AAAA,WAC3C,cAAc,YAAY,CAAC,IAAI,EAAE,UAAU;AAAA,MACjD;AAAA,MACA,OAAO,QAAQ,SAAS,WAAW,oBAAoB,EAAE,SAAS,QAAQ,CAAC,IAAI,mBAAmB,EAAE,SAAS,QAAQ,CAAC;AAAA,IACxH;AAAA;AAAA;;AIxGJ,kCAAS;AAcT,IAAM,aAAa;AACnB,IAAM,iBAAiB,gBAAgB;AACvC,IAAM,YAAoB,IAAI,OAAO,SAAS,6BAA6B,4BAA4B,6BAA6B,qDAAqD;AACzL,IAAM,iBAAyB,IAAI,OAAO,gBAAgB,GAAG;AAC7D,SAAS,QAAQ,CAAC,QAAkC;AAAA,EAClD,IAAI,OAAO,QAAQ;AAAA,IAAW,OAAO;AAAA,EACrC,MAAM,SAAS,OAAO,IAAI,MAAM,GAAG,EAAE,EAAE,MAAM,cAAc,KAAK,CAAC;AAAA,EACjE,OAAO,IAAI,OAAO,IAAI,CAAC,UAAU,aAAa,KAAK,KAAK,IAAI,OAAO,KAAK,EAAE,SAAS,IAAI,MAAM,WAAW,GAAG,KAAK,MAAM,WAAW,GAAG,IAAI,QAAQ,MAAM,YAAY,CAAC,EAAE,KAAK,GAAG;AAAA;AAE/K,SAAS,WAAU,CAAC,QAAmC;AAAA,EACrD,OAAO,OAAO,MAAM,WAAW,GAAG,IAAI,OAAO,MAAM,MAAM,GAAG,EAAE,EAAE,WAAW,MAAM,GAAG,IAAI,OAAO,MAAM,YAAY;AAAA;AAI5G,SAAS,qBAAqB,CAAC,QAAuD;AAAA,EAC3F,MAAM,QAAQ,UAAU,KAAK,OAAO,GAAG;AAAA,EACvC,IAAI,UAAU;AAAA,IAAM;AAAA,EACpB,OAAO;AAAA,OACD,MAAM,OAAO,YAAY,CAAC,IAAI,EAAE,WAAW,YAAW,EAAE,OAAO,MAAM,GAAI,CAAC,EAAE;AAAA,IAChF,MAAM,YAAW,EAAE,OAAO,MAAM,MAAM,MAAM,GAAI,CAAC;AAAA,IACjD,UAAU,SAAS,KAAM,MAAM,OAAO,YAAY,CAAC,IAAI,EAAE,KAAK,MAAM,GAAG,EAAG,CAAC;AAAA,IAC3E,QAAQ,MAAM,IAAI,UAAU,KAAK;AAAA,EACnC;AAAA;AAIK,SAAS,sBAAsB,CAAC,QAAiE;AAAA,EACtG,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACrI,QAAQ,SAAS,SAAS;AAAA,EAC1B,OAAO,GAAG,KAAK,cAAc,YAAY,KAAK,GAAG,QAAQ,WAAW,EAAE,MAAM,KAAK,UAAU,CAAC,OAAO,QAAQ,WAAW,EAAE,MAAM,KAAK,KAAK,CAAC,IAAI,KAAK,WAAW,KAAK,QAAQ,OAAO;AAAA;AAI5K,SAAS,0BAA0B,CAAC,QAGzB;AAAA,EAChB,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACrI,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,QAAQ,WAAW;AAAA,EACnB,IAAI;AAAA,EACJ,IAAI,WAAW,QAAQ;AAAA,IACrB,OAAO,qcAAqc,UAAU,IAAI,OAAO,MAAM,SAAS,qBAAqB,UAAU,IAAI,OAAO,MAAM,IAAI,qBAAqB,UAAU,IAAI,OAAO,MAAM;AAAA,EACtlB,EAAE,KAAK;AAAA,IACL,MAAM,OAAO,uBAAuB,EAAE,SAAS,OAAO,SAAS,MAAM,KAAK,OAAO,MAAM,UAAU,IAAI,OAAO,MAAM,EAAE,CAAC;AAAA,IACrH,OAAO,2LAA2L,UAAU,IAAI,IAAI;AAAA;AAAA,EAEtN,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;;AC7D7D,kCAAS;AAOF,SAAS,qCAAqC,CAAC,QAIpC;AAAA,EAChB,QAAQ,SAAS,OAAO,WAAW;AAAA,EACnC,IAAI,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,0BAA0B,CAAC;AAAA,EAC1H,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,EAC5C,MAAM,YAAY,UAAU,IAAI,MAAM,SAAS;AAAA,EAC/C,MAAM,OAAO,UAAU,IAAI,MAAM,IAAI;AAAA,EACrC,MAAM,QAAQ,UAAU,IAAI,MAAM;AAAA,EAClC,OAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAWU,6BAA6B,wBAAwB;AAAA;AAAA,IAErE,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;;AClCF,kCAAS;AAKF,SAAS,8BAA8B,CAAC,QAAmF;AAAA,EAChI,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,2BAA2B,CAAC;AAAA,EACzI,MAAM,QAAQ,CAAC,SAAyB,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EAC1E,OAAO,EAAE,MAAM,eAAe,MAAM,OAAO,KAAK,qBAAqB,MAAM,OAAO,UAAU,MAAM,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;;ACRlI,kCAAS;AAMF,SAAS,qBAAqB,CAAC,QASpB;AAAA,EAChB,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAS,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,sBAAsB,CAAC;AAAA,EACjI,MAAM,IAAI,CAAC,SAAyB,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACtE,MAAM,QAAQ,EAAE,OAAO,KAAK;AAAA,EAC5B,QAAQ,OAAO;AAAA,IACb,KAAK;AAAA,MACH,IAAI,OAAO,UAAU;AAAA,QAAW,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,uBAAuB,MAAM,6BAA6B,CAAC;AAAA,MACpJ,OAAO,EAAE,MAAM,0BAA0B,cAAc,EAAE,OAAO,MAAM,SAAS,KAAK,EAAE,OAAO,MAAM,IAAI,KAAK,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA,IAC5I,KAAK,OAAO;AAAA,MACV,IAAI,OAAO,eAAe,aAAa,OAAO,eAAe;AAAA,QAAW,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,uBAAuB,MAAM,qEAAqE,CAAC;AAAA,MACpO,MAAM,QAAQ,qBAAqB,EAAE,KAAK,OAAO,YAAY,kBAAkB,KAAK,CAAC;AAAA,MACrF,OAAO,EAAE,MAAM,0BAA0B;AAAA,EAAY,CAAC,GAAG,MAAM,SAAS,cAAc,gBAAgB,OAAO,aAAa,EAAE,KAAK;AAAA,CAAK;AAAA,GAAO,MAAM,UAAU,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA,IAC7L;AAAA,IACA,KAAK;AAAA,MAAQ,OAAO,EAAE,MAAM,qBAAqB,OAAO,UAAU,YAAY,QAAQ,GAAG,EAAE,OAAO,MAAM,SAAS,KAAK,EAAE,OAAO,MAAM,IAAI,OAAO,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA,IAC9K,KAAK;AAAA,MAAQ,OAAO,EAAE,MAAM,wBAAwB,SAAS,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAAA;;ACzBxF,SAAS,2BAA2B,CAAC,QAAmE;AAAA,EAC7G,MAAM,IAAI,CAAC,SAAyB,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACtE,OAAO,EAAE,MAAM,UAAU,EAAE,MAAM,MAAM,EAAE,UAAU,MAAM,EAAE,iBAAiB,MAAM,EAAE,OAAO,UAAU,EAAE,OAAO,SAAS,KAAK,EAAE,kBAAkB,cAAc,EAAE,IAAI,KAAK,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;;ACKzM,IAAM,cAAqB;AAC3B,SAAS,WAAU,CAAC,OAAuB;AAAA,EACzC,MAAM,OAAO,MAAM,KAAK;AAAA,EACxB,IAAI,KAAK,WAAW,GAAG;AAAA,IAAG,OAAO,KAAK,MAAM,GAAG,EAAE,EAAE,WAAW,MAAM,GAAG;AAAA,EACvE,IAAI,KAAK,WAAW,GAAG;AAAA,IAAG,OAAO,KAAK,MAAM,GAAG,EAAE,EAAE,WAAW,MAAM,GAAG;AAAA,EACvE,IAAI,KAAK,WAAW,GAAG;AAAA,IAAG,OAAO,KAAK,MAAM,GAAG,EAAE;AAAA,EACjD,OAAO;AAAA;AAIF,SAAS,sBAAsB,CAAC,QAA4D;AAAA,EACjG,MAAM,SAAmC,CAAC;AAAA,EAC1C,WAAW,UAAU,qBAAqB,MAAM,EAAE,SAAS;AAAA,IACzD,MAAM,QAAQ,IAAI,OAAO,mBAAmB,oBAAmB,GAAG,EAAE,KAAK,MAAM;AAAA,IAC/E,MAAM,OAAO,UAAU,OAAO,SAAS,OAAO,MAAM,MAAM,GAAG,MAAM;AAAA,IACnE,MAAM,OAAO,oDAAoD,KAAK,IAAI;AAAA,IAC1E,IAAI,SAAS;AAAA,MAAM;AAAA,IACnB,MAAM,OAAO,WAAW,KAAK,KAAK,EAAG,IAAI,UAAU,YAAY,KAAK,KAAK,EAAG,IAAI,eAAe,YAAY,KAAK,KAAK,EAAG,IAAI,eAAe;AAAA,IAC3I,MAAM,QAAQ,qBAAqB,EAAE,KAAK,kBAAkB,KAAK,MAAM,KAAK,GAAG,QAAQ,GAAG,CAAC,IAAI,CAAC;AAAA,IAChG,MAAM,UAAU,SAAS,UAAU,CAAC,IAAI,MAAM,QAAQ,IAAI,WAAU;AAAA,IACpE,OAAO,KAAK,EAAE,MAAM,UAAU,OAAO,WAAW,QAAQ,OAAO,WAAW,YAAW,MAAM,EAAG,GAAG,OAAO,UAAU,MAAM,MAAM,KAAK,MAAM,QAAQ,CAAC;AAAA,EACpJ;AAAA,EACA,OAAO;AAAA;;ACjCT,kCAAS;;;ACAT,kCAAS;AAgBF,IAAM,qBAA6B;AAGnC,SAAS,2BAA2B,CAAC,QAAkF;AAAA,EAC5H,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAU,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,wBAAwB,CAAC;AAAA,EACpI,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,OAAO,EAAE,MAAM,6EAA6E,UAAU,IAAI,OAAO,KAAK,MAAM,UAAU,IAAI,OAAO,SAAS,mBAAmB,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAIpN,SAAS,+BAA+B,CAAC,QAAkF;AAAA,EAChI,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAU,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,4BAA4B,CAAC;AAAA,EACxI,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,OAAO,EAAE,MAAM,mGAAmG,UAAU,IAAI,OAAO,KAAK,MAAM,UAAU,IAAI,OAAO,SAAS,uBAAuB,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAW9O,SAAS,gCAAgC,CAAC,QAA8F;AAAA,EAC7I,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAU,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,wBAAwB,CAAC;AAAA,EACpI,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,UAAU,OAAO,QAAQ,WAAW,EAAE,MAAM,eAAe,CAAC;AAAA,EAClE,OAAO,EAAE,MAAM,mBAAmB,sGAAsG,UAAU,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,8CAA8C,UAAU,IAAI,OAAO,SAAS,8BAA8B,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAIpU,SAAS,oCAAoC,CAAC,QAA8F;AAAA,EACjJ,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAU,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,4BAA4B,CAAC;AAAA,EACxI,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,UAAU,OAAO,QAAQ,WAAW,EAAE,MAAM,eAAe,CAAC;AAAA,EAClE,OAAO,EAAE,MAAM,mBAAmB,oLAAoL,UAAU,IAAI,KAAK,UAAU,OAAO,MAAM,CAAC,mDAAmD,UAAU,IAAI,OAAO,SAAS,oCAAoC,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAIpa,IAAM,oCAAyF,OAAO,OAAO;AAAA,EAC3G,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,kBAAkB;AACpB,CAAC;AAqBM,SAAS,oCAAoC,CAAC,QAA6G;AAAA,EAChK,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAU,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,iCAAiC,CAAC;AAAA,EAC7I,MAAM,QAAQ,kCAAkC,OAAO;AAAA,EACvD,IAAI,UAAU;AAAA,IAAW,MAAM,wBAAsB,EAAE,SAAS,UAAU,SAAS,uBAAuB,OAAO,OAAO,MAAM,IAAI,CAAC;AAAA,EACnI,OAAO,EAAE,MAAM,mBAAmB,OAAO,QAAQ,WAAW,EAAE,MAAM,eAAe,CAAC,yBAAyB,OAAO,QAAQ,mBAAmB,EAAE,OAAO,KAAK,UAAU,OAAO,KAAK,EAAE,CAAC,yBAAyB,OAAO,qCAAqC,SAAS,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAI7R,SAAS,0BAA0B,CAAC,QAAgD;AAAA,EACzF,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAU,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,uBAAuB,CAAC;AAAA,EACnI,OAAO,EAAE,MAAM,uIAAuI,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAQ/K,SAAS,wBAAwB,CAAC,QAAmE;AAAA,EAC1G,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,YAAY,UAAU,IAAI,OAAO,SAAS;AAAA,EAChD,IAAI,OAAO,QAAQ,SAAS,YAAY;AAAA,IACtC,OAAO,EAAE,MAAM;AAAA;AAAA,sBAEG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,0bAUoa;AAAA,wKAClR;AAAA,EACtK,OAAO,cAAc,WAAW,KAAK,0HAA0H;AAAA,8BACnI,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EACxE;AAAA,EACA,IAAI,OAAO,QAAQ,SAAS,SAAS;AAAA,IAEnC,MAAM,IAAI,MAAc,UAAU,IAAI,OAAO,SAAS;AAAA,IACtD,OAAO,EAAE,MAAM,0NAA0N;AAAA,yJACpF,EAAE;AAAA,oWACyM,EAAE;AAAA,yIAC7N,EAAE;AAAA,4HACf,EAAE;AAAA,yMAC2E,EAAE;AAAA,4HAC/E,EAAE;AAAA,6BACjG,sBAAsB,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EAC7F;AAAA,EACA,MAAM,SAAS,OAAO,QAAQ,WAAW,EAAE,MAAM,OAAO,UAAU,CAAC;AAAA,EACnE,OAAO,EAAE,MAAM,yEAAyE,kIAAkI,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;;;AD1HnP,SAAS,yBAAyB,CAAC,QAAmE;AAAA,EAC3G,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAS,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,yBAAyB,CAAC;AAAA,EACpI,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,UAAU;AAAA,EAChB,OAAO,EAAE,MAAM,8FAA8F,8GAA8G,eAAe,UAAU,IAAI,OAAO,SAAS,sBAAsB,sBAAsB,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;;AEhBlW,0BAAS,yCAAe;AAOjB,SAAS,0BAA0B,CAAC,QAA6E;AAAA,EACtH,OAAO,YAAY,KAAK,QAAQ,WAAW,IAAI,eAAe,OAAO,OAAO,EAAE,CAAC;AAAA;AAKjF,SAAS,WAAW,CAAC,QAA6G;AAAA,EAChI,QAAQ,SAAS,UAAU,QAAQ,cAAc;AAAA,EACjD,IAAI,OAAO,SAAS,aAAa;AAAA,IAC/B,IAAI,QAAQ,SAAS;AAAA,MAAY,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,kBAAkB,CAAC;AAAA,IAClH,OAAO,EAAE,MAAM,qFAAqF,UAAU,IAAI,OAAO,IAAI,KAAK,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EAChL;AAAA,EACA,MAAM,WAAW,WAAW,SAAS,OAAO,QAAQ,OAAO;AAAA,EAC3D,MAAM,YAAY,UAAU,IAAI,SAAS,SAAS;AAAA,EAClD,MAAM,OAAO,UAAU,IAAI,SAAS,IAAI;AAAA,EACxC,IAAI;AAAA,EACJ,IAAI,QAAQ,SAAS,YAAY;AAAA,IAC/B,MAAM,WAAW;AAAA,IACjB,MAAM,QAAQ,eAAe,6BAA6B;AAAA,IAC1D,QAAQ,OAAO;AAAA,MACb,KAAK,cAAc;AAAA,QACjB,MAAM,cAAc,OAAO,mBAAmB,eAAe,oIAAoI;AAAA,QACjM,OAAO,yMAAyM,eAAe,4EAA4E,2BAA2B,UAAU,IAAI,OAAO,IAAI;AAAA,QAC/V;AAAA,MACF;AAAA,MACA,KAAK;AAAA,QACH,OAAO,8PAA8P,6KAA6K,wBAAwB,UAAU,IAAI,OAAO,IAAI;AAAA,QACne;AAAA,MACF,KAAK;AAAA,QACH,OAAO,ocAAoc,6BAA6B,2PAA2P,UAAU,IAAI,OAAO,cAAc,IAAI,CAAC,SAAS,GAAG,KAAK,aAAa,KAAK,MAAM,CAAC;AAAA,QACrzB;AAAA,MACF,KAAK;AAAA,QACH,OAAO,8HAA8H,kBAAkB;AAAA,QACvJ;AAAA,MACF,KAAK;AAAA,QACH,OAAO,qOAAqO,sEAAsE;AAAA,QAClT;AAAA,MACF,KAAK;AAAA,MAAU,KAAK;AAAA,MAAiB,KAAK;AAAA,QACxC,OAAO,4TAA4T,6RAA6R,yBAAyB,UAAU,IAAI,OAAO,MAAM;AAAA,QACppB;AAAA,MACF,KAAK;AAAA,QACH,OAAO,oOAAoO,iOAAiO,0BAA0B,UAAU,IAAI,OAAO,IAAI;AAAA,QAC/f;AAAA,MACF,KAAK;AAAA,QACH,OAAO,gPAAgP,kBAAkB;AAAA,QACzQ;AAAA,MACF,KAAK;AAAA,QACH,OAAO,wOAAwO,6BAA6B;AAAA,QAC5Q;AAAA,MACF,KAAK;AAAA,QACH,OAAO,uLAAuL,6BAA6B;AAAA,QAC3N;AAAA;AAAA,EAEN,EAAE,KAAK,IAAI,QAAQ,SAAS,SAAS;AAAA,IACnC,IAAI,OAAO,SAAS,gBAAgB,OAAO,mBAAmB;AAAA,MAAa,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,uBAAuB,CAAC;AAAA,IAC5J,MAAM,QAAQ,eAAe,EAAE,SAAS,UAAU,QAAQ,WAAW,MAAM,UAAU,CAAC;AAAA,IACtF,IAAI,UAAU;AAAA,MAAW,MAAM,wBAAsB,EAAE,SAAS,SAAS,SAAS,WAAW,OAAO,OAAO,CAAC;AAAA,IAC5G,OAAO;AAAA,EACT,EAAE,KAAK;AAAA,IACL,IAAI,SAAS,cAAc,UAAU,SAAS,cAAc;AAAA,MAAQ,MAAM,wBAAsB,EAAE,SAAS,UAAU,SAAS,2BAA2B,CAAC;AAAA,IAE1J,MAAM,UAAU,GAAG,QAAQ,WAAW,EAAE,MAAM,SAAS,UAAU,CAAC;AAAA,IAClE,MAAM,OAAO,OAAO,SAAS,WAAW,OAAO,SAAS,SAAS,OAAO,OAAO,OAAO,SAAS,YAAY,YAAY,OAAO,SAAS,UAAU,UAAU;AAAA,IAC3J,IAAI,CAAC,YAAY,YAAY,qBAAqB,MAAM,EAAE,SAAS,OAAO,IAAI,KAAM,OAAO,SAAS,gBAAgB,OAAO,mBAAmB;AAAA,MAAc,MAAM,wBAAsB,EAAE,SAAS,UAAU,SAAS,WAAW,OAAO,OAAO,CAAC;AAAA,IAEhP,MAAM,eAAe,IAAI,eAAe,OAAO;AAAA,IAC/C,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,mBAAmB,OAAO,SAAS,mBAAmB;AAAA,MACpG,OAAO,oJAAoJ,wBAAwB,aAAa,IAAI,SAAS,IAAI,oEAAoE,aAAa,IAAI,SAAS,IAAI,MAAM,aAAa,IAAI,SAAS,SAAS,uBAAuB,aAAa,IAAI,OAAO,MAAM;AAAA,MACjZ,OAAO,EAAE,MAAM,QAAQ,aAAa,QAAQ,WAAW,OAAO;AAAA,IAChE;AAAA,IACA,MAAM,aAAa,OAAO,SAAS,aAAa,OAAO,SAAS,UAAU,OAAO,OAAO,SAAS;AAAA,IACjG,OAAO,+CAA+C,wBAAwB,aAAa,IAAI,UAAU,gBAAgB,aAAa,IAAI,IAAI,IAAI,OAAO,SAAS,YAAY,mBAAmB,aAAa,IAAI,SAAS,IAAI,MAAM;AAAA,IACrO,OAAO,EAAE,MAAM,QAAQ,aAAa,QAAQ,WAAW,OAAO;AAAA;AAAA,EAEhE,OAAO,EAAE,MAAM,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAQ7D,SAAS,cAAc,CAAC,QAAmL;AAAA,EACzM,QAAQ,SAAS,UAAU,QAAQ,WAAW,MAAM,cAAc;AAAA,EAClE,QAAQ,OAAO;AAAA,IACb,KAAK;AAAA,MAAQ,OAAO,2KAA2K,8BAA8B;AAAA,IAC7N,KAAK;AAAA,MAAW,OAAO,6NAA6N,sCAAsC,2BAA2B,UAAU,IAAI,OAAO,IAAI;AAAA,IAC9U,KAAK;AAAA,MAAY,OAAO,uQAAuQ,gCAAgC;AAAA,IAC/T,KAAK;AAAA,IAAU,KAAK;AAAA,IAAiB,KAAK;AAAA,MAAmB,OAAO,+GAA+G,QAAQ,WAAW,EAAE,MAAM,YAAY,CAAC,uGAAuG,8BAA8B,0BAA0B,UAAU,IAAI,OAAO,MAAM;AAAA,IACrZ,KAAK;AAAA,MACH,IAAI,OAAO,mBAAmB;AAAA,QAAa;AAAA,MAC3C,OAAO,4jBAA4jB,iCAAiC,iCAAiC,UAAU,IAAI,OAAO,IAAI;AAAA,IAChqB,KAAK;AAAA,MAAS,OAAO,2JAA2J,8BAA8B,yBAAyB,UAAU,IAAI,OAAO,IAAI;AAAA,IAChQ,KAAK;AAAA,MAAS,OAAO,iIAAiI,8BAA8B;AAAA,IACpL;AAAA,MAAS;AAAA;AAAA;AAOb,SAAS,gBAAgB,CAAC,QAAuG;AAAA,EAC/H,QAAQ,UAAU,QAAQ,cAAc;AAAA,EACxC,IAAI,OAAO,SAAS,cAAc,OAAO,SAAS,WAAW,OAAO,SAAS;AAAA,IAAc;AAAA,EAC3F,MAAM,WAAW,WAAW,SAAS,OAAO,QAAQ,OAAO;AAAA,EAC3D,MAAM,YAAY,UAAU,IAAI,SAAS,SAAS;AAAA,EAClD,MAAM,OAAO,UAAU,IAAI,SAAS,IAAI;AAAA,EACxC,OAAO,OAAO,SAAS,aACnB,EAAE,SAAS,2IAA2I,QAAQ,yDAAyD,iCAAiC,QAAQ,SAAS,mBAAmB,IAC5R,OAAO,SAAS,UACd,EAAE,SAAS,mGAAmG,QAAQ,sDAAsD,8BAA8B,yBAAyB,UAAU,IAAI,OAAO,IAAI,KAAK,SAAS,eAAe,IACzR,EAAE,SAAS,0JAA0J,QAAQ,iEAAiE,8BAA8B,8BAA8B,UAAU,IAAI,OAAO,IAAI,KAAK,SAAS,mBAAmB;AAAA;AAIrW,SAAS,wBAAwB,CAAC,QAAyF;AAAA,EAChI,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAS;AAAA,EACrC,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,QAAQ,iBAAiB,EAAE,UAAU,OAAO,UAAU,UAAU,CAAC;AAAA,EACvE,IAAI,UAAU;AAAA,IAAW;AAAA,EACzB,OAAO,EAAE,MAAM,UAAU,MAAM,gBAAgB,MAAM,mBAAmB,MAAM,WAAW,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAgBvI,IAAM,0BAA0B;AAUhC,IAAM,2BAA2B;AAGjC,SAAS,YAAY,CAAC,QAAwM;AAAA,EAC5N,MAAM,UAA8B,CAAC;AAAA,EACrC,WAAW,SAAS,OAAO,OAAO,OAAO,GAAG;AAAA,IAC1C,SAAS,SAAS,EAAG,SAAS,MAAM,QAAQ,UAAU,yBAAyB;AAAA,MAC7E,MAAM,QAAQ,MAAM,MAAM,QAAQ,SAAS,uBAAuB;AAAA,MAClE,QAAQ,KAAK;AAAA,QACX,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,UAAU,MAAM,OAAO,KAAK,CAAC,EAAE,KAAK,aAAa,IAAI,OAAO,SAAS;AAAA,QAChG,QAAQ,MAAM,QAAQ,CAAC,UAAU,MAAM,MAAM;AAAA,QAC7C,WAAW;AAAA,QACX,WAAW,MAAM,IAAI,CAAC,UAAU,MAAM,QAAQ;AAAA,MAChD,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAaF,SAAS,sBAAsB,CAAC,QAAwG;AAAA,EAC7I,QAAQ,YAAY;AAAA,EACpB,IAAI,QAAQ,SAAS;AAAA,IAAS,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,6BAA6B,CAAC;AAAA,EAC1H,MAAM,WAAW,QAAQ,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAAA,EAC7D,MAAM,SAAS,IAAI;AAAA,EACnB,YAAY,OAAO,aAAa,OAAO,WAAW,QAAQ,GAAG;AAAA,IAC3D,IAAI,SAAS,SAAS;AAAA,MAAa;AAAA,IACnC,MAAM,WAAW,WAAW,WAAW,SAAS,QAAQ,SAAS;AAAA,IACjE,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,IAC5C,MAAM,OAAO,eAAe,EAAE,SAAS,UAAU,WAAW,UAAU,IAAI,SAAS,SAAS,GAAG,MAAM,UAAU,IAAI,SAAS,IAAI,GAAG,UAAU,CAAC;AAAA,IAC9I,IAAI,SAAS;AAAA,MAAW;AAAA,IACxB,MAAM,QAAQ,OAAO,IAAI,IAAI,KAAK,CAAC;AAAA,IACnC,MAAM,KAAK,EAAE,UAAU,OAAO,QAAQ,CAAC,WAAW,UAAU,aAAa,uBAAuB,WAAW,QAAQ,UAAU,OAAO,CAAC;AAAA,IACrI,OAAO,IAAI,MAAM,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,aAAa,EAAE,QAAQ,QAAQ,GAAG,CAAC;AAAA;AAarC,SAAS,6BAA6B,CAAC,QAAwG;AAAA,EACpJ,QAAQ,YAAY;AAAA,EACpB,IAAI,QAAQ,SAAS;AAAA,IAAS,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,6BAA6B,CAAC;AAAA,EAC1H,MAAM,WAAW,QAAQ,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAAA,EAC7D,MAAM,UAAU,QAAQ,WAAW,EAAE,MAAM,eAAe,CAAC;AAAA,EAC3D,MAAM,SAAS,IAAI;AAAA,EACnB,YAAY,OAAO,aAAa,OAAO,WAAW,QAAQ,GAAG;AAAA,IAC3D,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,IAC5C,MAAM,QAAQ,iBAAiB,EAAE,UAAU,UAAU,CAAC;AAAA,IACtD,IAAI,UAAU;AAAA,MAAW;AAAA,IACzB,MAAM,QAAQ,OAAO,IAAI,SAAS,IAAI,KAAK,CAAC;AAAA,IAC5C,MAAM,KAAK,EAAE,UAAU,OAAO,QAAQ,CAAC,WAAW,UAAU,aAAa,aAAa,MAAM,cAAc,YAAY,MAAM,gBAAgB,MAAM,UAAU,QAAQ,UAAU,OAAO,CAAC;AAAA,IACtL,OAAO,IAAI,SAAS,MAAM,KAAK;AAAA,EACjC;AAAA,EACA,OAAO,aAAa,EAAE,QAAQ,QAAQ,aAAa,aAAa,UAAU,CAAC;AAAA;AAItE,SAAS,2BAA2B,CAAC,QAA6E;AAAA,EACvH,OAAO,gBAAgB,KAAK,QAAQ,WAAW,IAAI,eAAe,OAAO,OAAO,EAAE,CAAC;AAAA;AAGrF,SAAS,eAAe,CAAC,QAA6G;AAAA,EACpI,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,sBAAsB,CAAC;AAAA,EACpI,MAAM,SAAS,OAAO;AAAA,EACtB,MAAM,YAAY,OAAO;AAAA,EACzB,IAAI,OAAO,SAAS,aAAa;AAAA,IAC/B,MAAM,YAAY,UAAU,IAAI,OAAO,IAAI;AAAA,IAC3C,OAAO,EAAE,MAAM,0WAA0W,8BAA8B,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA,EACrc;AAAA,EACA,MAAM,WAAW,WAAW,SAAS,OAAO,QAAQ,OAAO;AAAA,EAC3D,MAAM,YAAY,UAAU,IAAI,SAAS,SAAS;AAAA,EAClD,MAAM,OAAO,UAAU,IAAI,SAAS,IAAI;AAAA,EACxC,MAAM,WAAW,sHAAsH,6BAA6B;AAAA,EACpK,IAAI;AAAA,EACJ,QAAQ,OAAO;AAAA,IACb,KAAK;AAAA,MAAc,SAAS,wIAAwI,+BAA+B,UAAU,IAAI,OAAO,IAAI;AAAA,MAAK;AAAA,IACjO,KAAK;AAAA,MAAW,SAAS,2HAA2H,4BAA4B,UAAU,IAAI,OAAO,IAAI;AAAA,MAAK;AAAA,IAC9M,KAAK;AAAA,IAAiB,KAAK;AAAA,MAAmB,SAAS,4MAA4M,6BAA6B,UAAU,IAAI,OAAO,MAAM;AAAA,MAAK;AAAA,IAChU,KAAK;AAAA,MAAU,SAAS,wIAAwI,6BAA6B,UAAU,IAAI,OAAO,MAAM;AAAA,MAAK;AAAA,IAC7N,KAAK;AAAA,MAAQ,SAAS,4HAA4H;AAAA,MAAa;AAAA,IAC/J,KAAK;AAAA,MAAS,SAAS,kLAAkL,6BAA6B,UAAU,IAAI,OAAO,IAAI;AAAA,MAAK;AAAA,IACpQ,KAAK;AAAA,MAAY,SAAS,6KAA6K,6BAA6B,uOAAuO,UAAU,IAAI,OAAO,cAAc,IAAI,CAAC,SAAS,GAAG,KAAK,aAAa,KAAK,MAAM,CAAC;AAAA,MAAa;AAAA,IAC1iB,KAAK;AAAA,MAAQ,SAAS,6KAA6K,6BAA6B;AAAA,MAA4B;AAAA,IAC5P,KAAK;AAAA,MAAqB,SAAS,uLAAuL,6BAA6B;AAAA,MAAQ;AAAA,IAC/P;AAAA,MAAS,SAAS,mHAAmH;AAAA,MAAa;AAAA;AAAA,EAEpJ,OAAO,EAAE,MAAM,6GAA6G,4OAA4O,QAAQ,UAAU,QAAQ,WAAW,OAAO;AAAA;AAGtZ,SAAS,oBAAoB,CAAC,QAAsD;AAAA,EAClF,MAAM,SAAoB,CAAC;AAAA,EAC3B,OAAO,EAAE,QAAQ,GAAG,CAAC,OAAO;AAAA,IAC1B,OAAO,KAAK,KAAK;AAAA,IACjB,OAAO,WAAW,OAAO,QAAQ,WAAW,EAAE,MAAM,IAAI,OAAO,SAAS,CAAC;AAAA,IACzE;AAAA;AAOG,SAAS,0BAA0B,CAAC,QAA4G;AAAA,EACrJ,QAAQ,YAAY;AAAA,EACpB,IAAI,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,QAAQ,MAAM,SAAS,6BAA6B,CAAC;AAAA,EAC7H,MAAM,SAAS,IAAI;AAAA,EACnB,YAAY,UAAU,aAAa,OAAO,WAAW,QAAQ,GAAG;AAAA,IAE9D,MAAM,OAAO,SAAS,SAAS,eAAe,GAAG,SAAS,QAAQ,SAAS,mBAAmB,SAAS,SAAS,oBAAoB,kBAAkB,SAAS;AAAA,IAC/J,MAAM,QAAQ,OAAO,IAAI,IAAI,KAAK,CAAC;AAAA,IACnC,MAAM,KAAK,EAAE,UAAU,SAAS,CAAC;AAAA,IACjC,OAAO,IAAI,MAAM,KAAK;AAAA,EACxB;AAAA,EACA,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC,EAAE,IAAI,CAAC,UAAgC;AAAA,IAC/D,MAAM,WAAW,MAAM,GAAI;AAAA,IAC3B,MAAM,QAAQ,YAAY,EAAE,SAAS,UAAU,WAAW,qBAAqB,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,IAC7F,MAAM,eAAe,gBAAgB,EAAE,SAAS,UAAU,WAAW,qBAAqB,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,IAExG,IAAI,KAAK,UAAU,aAAa,MAAM,MAAM,KAAK,UAAU,MAAM,MAAM;AAAA,MAAG,MAAM,eAAc,EAAE,SAAS,mEAAmE,MAAM,EAAE,MAAM,SAAS,KAAK,EAAE,CAAC;AAAA,IAC3M,MAAM,UAAU,MAAM,OAAO,IAAI,CAAC,OAAO,UAAU,GAAG,QAAQ,WAAW,EAAE,MAAM,IAAI,QAAQ,IAAI,CAAC,KAAK,MAAM,QAAQ,KAAK,IAAI,WAAW,QAAQ;AAAA,IACjJ,MAAM,WAAW,MAAM,IAAI,GAAG,UAAU,gBAAgB,EAAE,aAAa,OAAO,YAAY,2BAA2B,EAAE,SAAS,SAAS,CAAC,EAAE,OAAO,IAAI,CAAC,OAAO,UAAU,CAAC,IAAI,QAAQ,KAAK,KAAK,CAAC,CAAC,EAAE,EAAE;AAAA,IAEtM,MAAM,YAAY,IAAI,eAAe,OAAO;AAAA,IAC5C,OAAO;AAAA,MACL,MAAM,iFAAiF,aAAa,uFAAuF,UAAU,IAAI,KAAK,UAAU,QAAQ,CAAC,gDAAgD,QAAQ,KAAK,IAAI,0BAA0B,MAAM;AAAA,MAClU,QAAQ,UAAU;AAAA,MAClB,WAAW;AAAA,MACX,WAAW,MAAM,IAAI,GAAG,eAAe,QAAQ;AAAA,IACjD;AAAA,GACD;AAAA;AAII,SAAS,4BAA4B,CAAC,QAAgD;AAAA,EAC3F,OAAO,EAAE,MAAM,OAAO,QAAQ,SAAS,WAAW,uCAAuC,+BAA+B,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAIjJ,SAAS,wBAAwB,CAAC,QAAgD;AAAA,EACvF,OAAO,EAAE,MAAM,OAAO,QAAQ,SAAS,UAAU,mCAAmC,OAAO,QAAQ,SAAS,WAAW,+BAA+B,gCAAgC,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAI/M,SAAS,gBAAgB,CAAC,QAA8H;AAAA,EAC7J,IAAI,OAAO,QAAQ,SAAS;AAAA,IAAY,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,qBAAqB,CAAC;AAAA,EACnI,MAAM,IAAI,CAAC,SAAyB,OAAO,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACtE,OAAO,EAAE,MAAM,eAAe,EAAE,OAAO,MAAM,SAAS,KAAK,EAAE,OAAO,MAAM,IAAI,oBAAoB,EAAE,OAAO,IAAI,YAAY,OAAO,yBAAyB,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;;ACvS3L,sBAAS,sCAAW;AAgBpB,IAAM,gBAAgB;AAEtB,SAAS,gBAAe,CAAC,QAAwD;AAAA,EAC/E,IAAI,OAAO,QAAQ,SAAS,YAAY;AAAA,IACtC,MAAM,wBAAsB,EAAE,SAAS,OAAO,QAAQ,MAAM,SAAS,OAAO,QAAQ,CAAC;AAAA,EACvF;AAAA;AAIK,SAAS,0BAA0B,CAAC,QAAgD;AAAA,EACzF,iBAAgB,EAAE,SAAS,OAAO,SAAS,SAAS,2BAA2B,CAAC;AAAA,EAChF,OAAO;AAAA,IACL,MAAM;AAAA,IACN,QAAQ,CAAC;AAAA,IACT,WAAW;AAAA,EACb;AAAA;AAQK,SAAS,yBAAyB,CAAC,QAMxB;AAAA,EAChB,iBAAgB,EAAE,SAAS,OAAO,SAAS,SAAS,2BAA2B,CAAC;AAAA,EAChF,QAAQ,cAAc,YAAY;AAAA,EAClC,IAAI,CAAC,OAAO,cAAc,YAAY,KAAK,eAAe,GAAG;AAAA,IAC3D,MAAM,IAAI,YAAU;AAAA,MAClB,MAAM;AAAA,MACN,SAAS,GAAG,sEAAsE,OAAO,YAAY;AAAA,MACrG,MAAM,EAAE,QAAQ,8BAA8B,SAAS,OAAO,aAAa;AAAA,IAC7E,CAAC;AAAA,EACH;AAAA,EACA,OAAO,EAAE,MAAM,OAAO,OAAO,UAAU,OAAO,WAAW,KAAK,cAAc,mBAAmB,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAQxH,SAAS,6BAA6B,CAAC,QAI5B;AAAA,EAChB,iBAAgB,EAAE,SAAS,OAAO,SAAS,SAAS,2BAA2B,CAAC;AAAA,EAChF,MAAM,UAAU,OAAO,MAAM,KAAK;AAAA,EAClC,MAAM,OAAO,cAAc,KAAK,OAAO,IACnC,OAAO,OAAO,cAAc,aAC5B,SAAS,OAAO;AAAA,EACpB,OAAO,EAAE,MAAM,QAAQ,CAAC,GAAG,WAAW,OAAO;AAAA;AAkBxC,SAAS,qBAAqB,CAAC,QAA+D;AAAA,EACnG,iBAAgB,EAAE,SAAS,OAAO,SAAS,SAAS,0BAA0B,CAAC;AAAA,EAC/E,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,OAAO,UAAU,IAAI,OAAO,KAAK;AAAA,EACvC,OAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gEAoBsD;AAAA,IAC5D,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;AAIK,SAAS,0BAA0B,CAAC,QAIzB;AAAA,EAChB,iBAAgB,EAAE,SAAS,OAAO,SAAS,SAAS,oBAAoB,CAAC;AAAA,EACzE,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,QAAQ,UAAU,IAAI,OAAO,KAAK;AAAA,EACxC,MAAM,aAAa,UAAU,IAAI,OAAO,UAAU;AAAA,EAClD,OAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kEAQwD,2BAA2B;AAAA,IACzF,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;AAIK,SAAS,wBAAwB,CAAC,QAA+D;AAAA,EACtG,iBAAgB,EAAE,SAAS,OAAO,SAAS,SAAS,iBAAiB,CAAC;AAAA,EACtE,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,QAAQ,UAAU,IAAI,OAAO,KAAK;AAAA,EACxC,OAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA,gEAGsD;AAAA,IAC5D,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;AAIK,SAAS,sBAAsB,CAAC,QAIrB;AAAA,EAChB,iBAAgB,EAAE,SAAS,OAAO,SAAS,SAAS,iBAAiB,CAAC;AAAA,EACtE,MAAM,YAAY,IAAI,eAAe,OAAO,OAAO;AAAA,EACnD,MAAM,QAAQ,UAAU,IAAI,OAAO,KAAK;AAAA,EACxC,MAAM,SAAS,UAAU,IAAI,OAAO,MAAM;AAAA,EAC1C,OAAO;AAAA,IACL,MAAM;AAAA;AAAA;AAAA;AAAA,gEAIsD,yBAAyB;AAAA;AAAA,IAErF,QAAQ,UAAU;AAAA,IAClB,WAAW;AAAA,EACb;AAAA;",
82
+ "debugId": "43389FE0EFAEA89964756E2164756E21",
80
83
  "names": []
81
84
  }