@zenstackhq/runtime 3.0.0-alpha.11 → 3.0.0-alpha.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{contract-BQGRBbOU.d.cts → contract-CBOBlAuw.d.cts} +82 -51
- package/dist/{contract-BQGRBbOU.d.ts → contract-CBOBlAuw.d.ts} +82 -51
- package/dist/index.cjs +664 -243
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +664 -243
- package/dist/index.js.map +1 -1
- package/dist/plugins/{policy.cjs → policy/index.cjs} +225 -125
- package/dist/plugins/policy/index.cjs.map +1 -0
- package/dist/plugins/{policy.d.ts → policy/index.d.cts} +1 -1
- package/dist/plugins/{policy.d.cts → policy/index.d.ts} +1 -1
- package/dist/plugins/{policy.js → policy/index.js} +225 -125
- package/dist/plugins/policy/index.js.map +1 -0
- package/dist/plugins/policy/plugin.zmodel +33 -0
- package/package.json +12 -12
- package/dist/plugins/policy.cjs.map +0 -1
- package/dist/plugins/policy.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/plugins/policy/errors.ts","../../src/plugins/policy/policy-handler.ts","../../src/client/crud/dialects/index.ts","../../src/client/crud/dialects/postgresql.ts","../../src/client/errors.ts","../../src/client/query-utils.ts","../../src/client/crud/dialects/base.ts","../../src/utils/enumerate.ts","../../src/client/crud/dialects/sqlite.ts","../../src/schema/expression.ts","../../src/utils/default-operation-node-visitor.ts","../../src/plugins/policy/column-collector.ts","../../src/plugins/policy/expression-transformer.ts","../../src/plugins/policy/expression-evaluator.ts","../../src/plugins/policy/utils.ts","../../src/plugins/policy/plugin.ts"],"sourcesContent":["/**\n * Error thrown when an operation is rejected by access policy.\n */\nexport class RejectedByPolicyError extends Error {\n constructor(\n public readonly model: string | undefined,\n public readonly reason?: string,\n ) {\n super(reason ?? `Operation rejected by policy${model ? ': ' + model : ''}`);\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n DeleteQueryNode,\n FromNode,\n IdentifierNode,\n InsertQueryNode,\n OperationNodeTransformer,\n OperatorNode,\n PrimitiveValueListNode,\n RawNode,\n ReturningNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n UpdateQueryNode,\n ValueNode,\n ValuesNode,\n WhereNode,\n type OperationNode,\n type QueryResult,\n type RootOperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { ClientContract } from '../../client';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport { InternalError } from '../../client/errors';\nimport type { ProceedKyselyQueryFunction } from '../../client/plugin';\nimport { getIdFields, requireField, requireModel } from '../../client/query-utils';\nimport { ExpressionUtils, type BuiltinType, type Expression, type GetModels, type SchemaDef } from '../../schema';\nimport { ColumnCollector } from './column-collector';\nimport { RejectedByPolicyError } from './errors';\nimport { ExpressionTransformer } from './expression-transformer';\nimport type { Policy, PolicyOperation } from './types';\nimport { buildIsFalse, conjunction, disjunction, falseNode, getTableName } from './utils';\n\nexport type CrudQueryNode = SelectQueryNode | InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport type MutationQueryNode = InsertQueryNode | UpdateQueryNode | DeleteQueryNode;\n\nexport class PolicyHandler<Schema extends SchemaDef> extends OperationNodeTransformer {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(private readonly client: ClientContract<Schema>) {\n super();\n this.dialect = getCrudDialect(this.client.$schema, this.client.$options);\n }\n\n get kysely() {\n return this.client.$qb;\n }\n\n async handle(\n node: RootOperationNode,\n proceed: ProceedKyselyQueryFunction /*, transaction: OnKyselyQueryTransaction*/,\n ) {\n if (!this.isCrudQueryNode(node)) {\n // non-CRUD queries are not allowed\n throw new RejectedByPolicyError(undefined, 'non-CRUD queries are not allowed');\n }\n\n if (!this.isMutationQueryNode(node)) {\n // transform and proceed read without transaction\n return proceed(this.transformNode(node));\n }\n\n let mutationRequiresTransaction = false;\n const mutationModel = this.getMutationModel(node);\n\n if (InsertQueryNode.is(node)) {\n // reject create if unconditional deny\n const constCondition = this.tryGetConstantPolicy(mutationModel, 'create');\n if (constCondition === false) {\n throw new RejectedByPolicyError(mutationModel);\n } else if (constCondition === undefined) {\n mutationRequiresTransaction = true;\n }\n }\n\n if (!mutationRequiresTransaction && !node.returning) {\n // transform and proceed mutation without transaction\n return proceed(this.transformNode(node));\n }\n\n if (InsertQueryNode.is(node)) {\n await this.enforcePreCreatePolicy(node, proceed);\n }\n const transformedNode = this.transformNode(node);\n const result = await proceed(transformedNode);\n\n if (!this.onlyReturningId(node)) {\n const readBackResult = await this.processReadBack(node, result, proceed);\n if (readBackResult.rows.length !== result.rows.length) {\n throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n }\n return readBackResult;\n } else {\n return result;\n }\n\n // TODO: run in transaction\n //let readBackError = false;\n\n // transform and post-process in a transaction\n // const result = await transaction(async (txProceed) => {\n // if (InsertQueryNode.is(node)) {\n // await this.enforcePreCreatePolicy(node, txProceed);\n // }\n // const transformedNode = this.transformNode(node);\n // const result = await txProceed(transformedNode);\n\n // if (!this.onlyReturningId(node)) {\n // const readBackResult = await this.processReadBack(node, result, txProceed);\n // if (readBackResult.rows.length !== result.rows.length) {\n // readBackError = true;\n // }\n // return readBackResult;\n // } else {\n // return result;\n // }\n // });\n\n // if (readBackError) {\n // throw new RejectedByPolicyError(mutationModel, 'result is not allowed to be read back');\n // }\n\n // return result;\n }\n\n private onlyReturningId(node: MutationQueryNode) {\n if (!node.returning) {\n return true;\n }\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n const collector = new ColumnCollector();\n const selectedColumns = collector.collect(node.returning);\n return selectedColumns.every((c) => idFields.includes(c));\n }\n\n private async enforcePreCreatePolicy(node: InsertQueryNode, proceed: ProceedKyselyQueryFunction) {\n if (!node.columns || !node.values) {\n return;\n }\n\n const model = this.getMutationModel(node);\n const fields = node.columns.map((c) => c.column.name);\n const valueRows = this.unwrapCreateValueRows(node.values, model, fields);\n for (const values of valueRows) {\n await this.enforcePreCreatePolicyForOne(\n model,\n fields,\n values.map((v) => v.node),\n values.map((v) => v.raw),\n proceed,\n );\n }\n }\n\n private async enforcePreCreatePolicyForOne(\n model: GetModels<Schema>,\n fields: string[],\n values: OperationNode[],\n valuesRaw: unknown[],\n proceed: ProceedKyselyQueryFunction,\n ) {\n const thisEntity: Record<string, OperationNode> = {};\n const thisEntityRaw: Record<string, unknown> = {};\n for (let i = 0; i < fields.length; i++) {\n thisEntity[fields[i]!] = values[i]!;\n thisEntityRaw[fields[i]!] = valuesRaw[i]!;\n }\n\n const filter = this.buildPolicyFilter(model, undefined, 'create', thisEntity, thisEntityRaw);\n const preCreateCheck: SelectQueryNode = {\n kind: 'SelectQueryNode',\n selections: [SelectionNode.create(AliasNode.create(filter, IdentifierNode.create('$condition')))],\n };\n const result = await proceed(preCreateCheck);\n if (!(result.rows[0] as any)?.$condition) {\n throw new RejectedByPolicyError(model);\n }\n }\n\n private unwrapCreateValueRows(node: OperationNode, model: GetModels<Schema>, fields: string[]) {\n if (ValuesNode.is(node)) {\n return node.values.map((v) => this.unwrapCreateValueRow(v.values, model, fields));\n } else if (PrimitiveValueListNode.is(node)) {\n return [this.unwrapCreateValueRow(node.values, model, fields)];\n } else {\n throw new InternalError(`Unexpected node kind: ${node.kind} for unwrapping create values`);\n }\n }\n\n private unwrapCreateValueRow(data: readonly unknown[], model: GetModels<Schema>, fields: string[]) {\n invariant(data.length === fields.length, 'data length must match fields length');\n const result: { node: OperationNode; raw: unknown }[] = [];\n for (let i = 0; i < data.length; i++) {\n const item = data[i]!;\n const fieldDef = requireField(this.client.$schema, model, fields[i]!);\n if (typeof item === 'object' && item && 'kind' in item) {\n invariant(item.kind === 'ValueNode', 'expecting a ValueNode');\n result.push({\n node: ValueNode.create(\n this.dialect.transformPrimitive(\n (item as ValueNode).value,\n fieldDef.type as BuiltinType,\n !!fieldDef.array,\n ),\n ),\n raw: (item as ValueNode).value,\n });\n } else {\n const value = this.dialect.transformPrimitive(item, fieldDef.type as BuiltinType, !!fieldDef.array);\n if (Array.isArray(value)) {\n result.push({\n node: RawNode.createWithSql(this.dialect.buildArrayLiteralSQL(value)),\n raw: value,\n });\n } else {\n result.push({ node: ValueNode.create(value), raw: value });\n }\n }\n }\n return result;\n }\n\n private tryGetConstantPolicy(model: GetModels<Schema>, operation: PolicyOperation) {\n const policies = this.getModelPolicies(model, operation);\n if (!policies.some((p) => p.kind === 'allow')) {\n // no allow -> unconditional deny\n return false;\n } else if (\n // unconditional deny\n policies.some((p) => p.kind === 'deny' && this.isTrueExpr(p.condition))\n ) {\n return false;\n } else if (\n // unconditional allow\n !policies.some((p) => p.kind === 'deny') &&\n policies.some((p) => p.kind === 'allow' && this.isTrueExpr(p.condition))\n ) {\n return true;\n } else {\n return undefined;\n }\n }\n\n private isTrueExpr(expr: Expression) {\n return ExpressionUtils.isLiteral(expr) && expr.value === true;\n }\n\n private async processReadBack(node: CrudQueryNode, result: QueryResult<any>, proceed: ProceedKyselyQueryFunction) {\n if (result.rows.length === 0) {\n return result;\n }\n\n if (!this.isMutationQueryNode(node) || !node.returning) {\n return result;\n }\n\n // do a select (with policy) in place of returning\n const table = this.getMutationModel(node);\n if (!table) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n\n const idConditions = this.buildIdConditions(table, result.rows);\n const policyFilter = this.buildPolicyFilter(table, undefined, 'read');\n\n const select: SelectQueryNode = {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(table)]),\n where: WhereNode.create(conjunction(this.dialect, [idConditions, policyFilter])),\n selections: node.returning.selections,\n };\n const selectResult = await proceed(select);\n return selectResult;\n }\n\n private buildIdConditions(table: string, rows: any[]): OperationNode {\n const idFields = getIdFields(this.client.$schema, table);\n return disjunction(\n this.dialect,\n rows.map((row) =>\n conjunction(\n this.dialect,\n idFields.map((field) =>\n BinaryOperationNode.create(\n ColumnNode.create(field),\n OperatorNode.create('='),\n ValueNode.create(row[field]),\n ),\n ),\n ),\n ),\n );\n }\n\n private getMutationModel(node: InsertQueryNode | UpdateQueryNode | DeleteQueryNode) {\n const r = match(node)\n .when(InsertQueryNode.is, (node) => getTableName(node.into) as GetModels<Schema>)\n .when(UpdateQueryNode.is, (node) => getTableName(node.table) as GetModels<Schema>)\n .when(DeleteQueryNode.is, (node) => {\n if (node.from.froms.length !== 1) {\n throw new InternalError('Only one from table is supported for delete');\n }\n return getTableName(node.from.froms[0]) as GetModels<Schema>;\n })\n .exhaustive();\n if (!r) {\n throw new InternalError(`Unable to get table name for query node: ${node}`);\n }\n return r;\n }\n\n private isCrudQueryNode(node: RootOperationNode): node is CrudQueryNode {\n return (\n SelectQueryNode.is(node) || InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node)\n );\n }\n\n private isMutationQueryNode(node: RootOperationNode): node is MutationQueryNode {\n return InsertQueryNode.is(node) || UpdateQueryNode.is(node) || DeleteQueryNode.is(node);\n }\n\n private buildPolicyFilter(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n thisEntity?: Record<string, OperationNode>,\n thisEntityRaw?: Record<string, unknown>,\n ) {\n const policies = this.getModelPolicies(model, operation);\n if (policies.length === 0) {\n return falseNode(this.dialect);\n }\n\n const allows = policies\n .filter((policy) => policy.kind === 'allow')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy, thisEntity, thisEntityRaw));\n\n const denies = policies\n .filter((policy) => policy.kind === 'deny')\n .map((policy) => this.transformPolicyCondition(model, alias, operation, policy, thisEntity, thisEntityRaw));\n\n let combinedPolicy: OperationNode;\n\n if (allows.length === 0) {\n // constant false\n combinedPolicy = falseNode(this.dialect);\n } else {\n // or(...allows)\n combinedPolicy = disjunction(this.dialect, allows);\n\n // and(...!denies)\n if (denies.length !== 0) {\n const combinedDenies = conjunction(\n this.dialect,\n denies.map((d) => buildIsFalse(d, this.dialect)),\n );\n // or(...allows) && and(...!denies)\n combinedPolicy = conjunction(this.dialect, [combinedPolicy, combinedDenies]);\n }\n }\n return combinedPolicy;\n }\n\n protected override transformSelectQuery(node: SelectQueryNode) {\n let whereNode = node.where;\n\n node.from?.froms.forEach((from) => {\n const extractResult = this.extractTableName(from);\n if (extractResult) {\n const { model, alias } = extractResult;\n const filter = this.buildPolicyFilter(model, alias, 'read');\n whereNode = WhereNode.create(\n whereNode?.where ? conjunction(this.dialect, [whereNode.where, filter]) : filter,\n );\n }\n });\n\n const baseResult = super.transformSelectQuery({\n ...node,\n where: undefined,\n });\n\n return {\n ...baseResult,\n where: whereNode,\n };\n }\n\n protected override transformInsertQuery(node: InsertQueryNode) {\n const result = super.transformInsertQuery(node);\n if (!node.returning) {\n return result;\n }\n if (this.onlyReturningId(node)) {\n return result;\n } else {\n // only return ID fields, that's enough for reading back the inserted row\n const idFields = getIdFields(this.client.$schema, this.getMutationModel(node));\n return {\n ...result,\n returning: ReturningNode.create(\n idFields.map((field) => SelectionNode.create(ColumnNode.create(field))),\n ),\n };\n }\n }\n\n protected override transformUpdateQuery(node: UpdateQueryNode) {\n const result = super.transformUpdateQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'update');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n protected override transformDeleteQuery(node: DeleteQueryNode) {\n const result = super.transformDeleteQuery(node);\n const mutationModel = this.getMutationModel(node);\n const filter = this.buildPolicyFilter(mutationModel, undefined, 'delete');\n return {\n ...result,\n where: WhereNode.create(result.where ? conjunction(this.dialect, [result.where.where, filter]) : filter),\n };\n }\n\n private extractTableName(from: OperationNode): { model: GetModels<Schema>; alias?: string } | undefined {\n if (TableNode.is(from)) {\n return { model: from.table.identifier.name as GetModels<Schema> };\n }\n if (AliasNode.is(from)) {\n const inner = this.extractTableName(from.node);\n if (!inner) {\n return undefined;\n }\n return {\n model: inner.model,\n alias: IdentifierNode.is(from.alias) ? from.alias.name : undefined,\n };\n } else {\n // this can happen for subqueries, which will be handled when nested\n // transformation happens\n return undefined;\n }\n }\n\n private transformPolicyCondition(\n model: GetModels<Schema>,\n alias: string | undefined,\n operation: CRUD,\n policy: Policy,\n thisEntity?: Record<string, OperationNode>,\n thisEntityRaw?: Record<string, unknown>,\n ) {\n return new ExpressionTransformer(this.client.$schema, this.client.$options, this.client.$auth).transform(\n policy.condition,\n {\n model,\n alias,\n operation,\n thisEntity,\n thisEntityRaw,\n auth: this.client.$auth,\n },\n );\n }\n\n private getModelPolicies(modelName: string, operation: PolicyOperation) {\n const modelDef = requireModel(this.client.$schema, modelName);\n const result: Policy[] = [];\n\n const extractOperations = (expr: Expression) => {\n invariant(ExpressionUtils.isLiteral(expr), 'expecting a literal');\n invariant(typeof expr.value === 'string', 'expecting a string literal');\n return expr.value\n .split(',')\n .filter((v) => !!v)\n .map((v) => v.trim()) as PolicyOperation[];\n };\n\n if (modelDef.attributes) {\n result.push(\n ...modelDef.attributes\n .filter((attr) => attr.name === '@@allow' || attr.name === '@@deny')\n .map(\n (attr) =>\n ({\n kind: attr.name === '@@allow' ? 'allow' : 'deny',\n operations: extractOperations(attr.args![0]!.value),\n condition: attr.args![1]!.value,\n }) as const,\n )\n .filter((policy) => policy.operations.includes('all') || policy.operations.includes(operation)),\n );\n }\n return result;\n }\n}\n","import { match } from 'ts-pattern';\nimport type { SchemaDef } from '../../../schema';\nimport type { ClientOptions } from '../../options';\nimport type { BaseCrudDialect } from './base';\nimport { PostgresCrudDialect } from './postgresql';\nimport { SqliteCrudDialect } from './sqlite';\n\nexport function getCrudDialect<Schema extends SchemaDef>(\n schema: Schema,\n options: ClientOptions<Schema>,\n): BaseCrudDialect<Schema> {\n return match(schema.provider.type)\n .with('sqlite', () => new SqliteCrudDialect(schema, options))\n .with('postgresql', () => new PostgresCrudDialect(schema, options))\n .exhaustive();\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n sql,\n type Expression,\n type ExpressionBuilder,\n type ExpressionWrapper,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport type { FindArgs } from '../../crud-types';\nimport {\n buildFieldRef,\n buildJoinPairs,\n getIdFields,\n getManyToManyRelation,\n isRelationField,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base';\n\nexport class PostgresCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n override get provider() {\n return 'postgresql' as const;\n }\n\n override transformPrimitive(value: unknown, type: BuiltinType, forArrayField: boolean): unknown {\n if (value === undefined) {\n return value;\n }\n\n if (Array.isArray(value)) {\n if (type === 'Json' && !forArrayField) {\n // node-pg incorrectly handles array values passed to non-array JSON fields,\n // the workaround is to JSON stringify the value\n // https://github.com/brianc/node-postgres/issues/374\n return JSON.stringify(value);\n } else {\n return value.map((v) => this.transformPrimitive(v, type, false));\n }\n } else {\n return match(type)\n .with('DateTime', () =>\n value instanceof Date ? value : typeof value === 'string' ? new Date(value) : value,\n )\n .with('Decimal', () => (value !== null ? value.toString() : value))\n .otherwise(() => value);\n }\n }\n\n override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n const joinedQuery = this.buildRelationJSON(model, query, relationField, parentAlias, payload);\n\n return joinedQuery.select(`${parentAlias}$${relationField}.$j as ${relationField}`);\n }\n\n private buildRelationJSON(\n model: string,\n qb: SelectQueryBuilder<any, any, any>,\n relationField: string,\n parentName: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ) {\n const relationFieldDef = requireField(this.schema, model, relationField);\n const relationModel = relationFieldDef.type as GetModels<Schema>;\n\n return qb.leftJoinLateral(\n (eb) => {\n const joinTableName = `${parentName}$${relationField}`;\n\n // simple select by default\n let result = eb.selectFrom(`${relationModel} as ${joinTableName}`);\n\n // however if there're filter/orderBy/take/skip,\n // we need to build a subquery to handle them before aggregation\n result = eb.selectFrom(() => {\n let subQuery = eb.selectFrom(`${relationModel}`).selectAll();\n\n if (payload && typeof payload === 'object') {\n if (payload.where) {\n subQuery = subQuery.where((eb) =>\n this.buildFilter(eb, relationModel, relationModel, payload.where),\n );\n }\n\n // skip & take\n const skip = payload.skip;\n let take = payload.take;\n let negateOrderBy = false;\n if (take !== undefined && take < 0) {\n negateOrderBy = true;\n take = -take;\n }\n subQuery = this.buildSkipTake(subQuery, skip, take);\n\n // orderBy\n subQuery = this.buildOrderBy(\n subQuery,\n relationModel,\n relationModel,\n payload.orderBy,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\n }\n\n // add join conditions\n\n const m2m = getManyToManyRelation(this.schema, model, relationField);\n\n if (m2m) {\n // many-to-many relation\n const parentIds = getIdFields(this.schema, model);\n const relationIds = getIdFields(this.schema, relationModel);\n invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n subQuery = subQuery.where(\n eb(\n eb.ref(`${relationModel}.${relationIds[0]}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(\n `${parentName}.${parentIds[0]}`,\n '=',\n `${m2m.joinTable}.${m2m.parentFkName}`,\n ),\n ),\n );\n } else {\n const joinPairs = buildJoinPairs(this.schema, model, parentName, relationField, relationModel);\n subQuery = subQuery.where((eb) =>\n this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))),\n );\n }\n\n return subQuery.as(joinTableName);\n });\n\n result = this.buildRelationObjectSelect(\n relationModel,\n relationField,\n relationFieldDef,\n result,\n payload,\n parentName,\n );\n\n // add nested joins for each relation\n result = this.buildRelationJoins(relationModel, relationField, result, payload, parentName);\n\n // alias the join table\n return result.as(joinTableName);\n },\n (join) => join.onTrue(),\n );\n }\n\n private buildRelationObjectSelect(\n relationModel: string,\n relationField: string,\n relationFieldDef: FieldDef,\n qb: SelectQueryBuilder<any, any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentName: string,\n ) {\n qb = qb.select((eb) => {\n const objArgs = this.buildRelationObjectArgs(relationModel, relationField, eb, payload, parentName);\n\n if (relationFieldDef.array) {\n return eb.fn\n .coalesce(sql`jsonb_agg(jsonb_build_object(${sql.join(objArgs)}))`, sql`'[]'::jsonb`)\n .as('$j');\n } else {\n return sql`jsonb_build_object(${sql.join(objArgs)})`.as('$j');\n }\n });\n\n return qb;\n }\n\n private buildRelationObjectArgs(\n relationModel: string,\n relationField: string,\n eb: ExpressionBuilder<any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentName: string,\n ) {\n const relationModelDef = requireModel(this.schema, relationModel);\n const objArgs: Array<\n string | ExpressionWrapper<any, any, any> | SelectQueryBuilder<any, any, any> | RawBuilder<any>\n > = [];\n\n if (payload === true || !payload.select) {\n // select all scalar fields\n objArgs.push(\n ...Object.entries(relationModelDef.fields)\n .filter(([, value]) => !value.relation)\n .filter(([name]) => !(typeof payload === 'object' && (payload.omit as any)?.[name] === true))\n .map(([field]) => [\n sql.lit(field),\n buildFieldRef(this.schema, relationModel, field, this.options, eb),\n ])\n .flatMap((v) => v),\n );\n } else if (payload.select) {\n // select specific fields\n objArgs.push(\n ...Object.entries(payload.select)\n .filter(([, value]) => value)\n .map(([field]) => {\n const fieldDef = requireField(this.schema, relationModel, field);\n const fieldValue = fieldDef.relation\n ? // reference the synthesized JSON field\n eb.ref(`${parentName}$${relationField}$${field}.$j`)\n : // reference a plain field\n buildFieldRef(this.schema, relationModel, field, this.options, eb);\n return [sql.lit(field), fieldValue];\n })\n .flatMap((v) => v),\n );\n }\n\n if (typeof payload === 'object' && payload.include && typeof payload.include === 'object') {\n // include relation fields\n objArgs.push(\n ...Object.entries<any>(payload.include)\n .filter(([, value]) => value)\n .map(([field]) => [\n sql.lit(field),\n // reference the synthesized JSON field\n eb.ref(`${parentName}$${relationField}$${field}.$j`),\n ])\n .flatMap((v) => v),\n );\n }\n return objArgs;\n }\n\n private buildRelationJoins(\n relationModel: string,\n relationField: string,\n qb: SelectQueryBuilder<any, any, any>,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n parentName: string,\n ) {\n let result = qb;\n if (typeof payload === 'object') {\n const selectInclude = payload.include ?? payload.select;\n if (selectInclude && typeof selectInclude === 'object') {\n Object.entries<any>(selectInclude)\n .filter(([, value]) => value)\n .filter(([field]) => isRelationField(this.schema, relationModel, field))\n .forEach(([field, value]) => {\n result = this.buildRelationJSON(\n relationModel,\n result,\n field,\n `${parentName}$${relationField}`,\n value,\n );\n });\n }\n }\n return result;\n }\n\n override buildSkipTake(\n query: SelectQueryBuilder<any, any, any>,\n skip: number | undefined,\n take: number | undefined,\n ) {\n if (take !== undefined) {\n query = query.limit(take);\n }\n if (skip !== undefined) {\n query = query.offset(skip);\n }\n return query;\n }\n\n override buildJsonObject(eb: ExpressionBuilder<any, any>, value: Record<string, Expression<unknown>>) {\n return eb.fn(\n 'jsonb_build_object',\n Object.entries(value).flatMap(([key, value]) => [sql.lit(key), value]),\n );\n }\n\n override get supportsUpdateWithLimit(): boolean {\n return false;\n }\n\n override get supportsDeleteWithLimit(): boolean {\n return false;\n }\n\n override get supportsDistinctOn(): boolean {\n return true;\n }\n\n override buildArrayLength(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): ExpressionWrapper<any, any, number> {\n return eb.fn('array_length', [array]);\n }\n\n override buildArrayLiteralSQL(values: unknown[]): string {\n if (values.length === 0) {\n return '{}';\n } else {\n return `ARRAY[${values.map((v) => (typeof v === 'string' ? `'${v}'` : v))}]`;\n }\n }\n}\n","/**\n * Error thrown when input validation fails.\n */\nexport class InputValidationError extends Error {\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n\n/**\n * Error thrown when a query fails.\n */\nexport class QueryError extends Error {\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n\n/**\n * Error thrown when an internal error occurs.\n */\nexport class InternalError extends Error {}\n\n/**\n * Error thrown when an entity is not found.\n */\nexport class NotFoundError extends Error {\n constructor(model: string) {\n super(`Entity not found for model \"${model}\"`);\n }\n}\n","import type { ExpressionBuilder, ExpressionWrapper } from 'kysely';\nimport type { FieldDef, GetModels, SchemaDef } from '../schema';\nimport type { OrderBy } from './crud-types';\nimport { InternalError, QueryError } from './errors';\nimport type { ClientOptions } from './options';\n\nexport function hasModel(schema: SchemaDef, model: string) {\n return Object.keys(schema.models)\n .map((k) => k.toLowerCase())\n .includes(model.toLowerCase());\n}\n\nexport function getModel(schema: SchemaDef, model: string) {\n return schema.models[model];\n}\n\nexport function requireModel(schema: SchemaDef, model: string) {\n const matchedName = Object.keys(schema.models).find((k) => k.toLowerCase() === model.toLowerCase());\n if (!matchedName) {\n throw new QueryError(`Model \"${model}\" not found in schema`);\n }\n return schema.models[matchedName]!;\n}\n\nexport function getField(schema: SchemaDef, model: string, field: string) {\n const modelDef = getModel(schema, model);\n return modelDef?.fields[field];\n}\n\nexport function requireField(schema: SchemaDef, model: string, field: string) {\n const modelDef = requireModel(schema, model);\n if (!modelDef.fields[field]) {\n throw new QueryError(`Field \"${field}\" not found in model \"${model}\"`);\n }\n return modelDef.fields[field];\n}\n\nexport function getIdFields<Schema extends SchemaDef>(schema: SchemaDef, model: GetModels<Schema>) {\n const modelDef = requireModel(schema, model);\n return modelDef?.idFields as GetModels<Schema>[];\n}\n\nexport function requireIdFields(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const result = modelDef?.idFields;\n if (!result) {\n throw new InternalError(`Model \"${model}\" does not have ID field(s)`);\n }\n return result;\n}\n\nexport function getRelationForeignKeyFieldPairs(schema: SchemaDef, model: string, relationField: string) {\n const fieldDef = requireField(schema, model, relationField);\n\n if (!fieldDef?.relation) {\n throw new InternalError(`Field \"${relationField}\" is not a relation`);\n }\n\n if (fieldDef.relation.fields) {\n if (!fieldDef.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\n }\n // this model owns the fk\n return {\n keyPairs: fieldDef.relation.fields.map((f, i) => ({\n fk: f,\n pk: fieldDef.relation!.references![i]!,\n })),\n ownedByModel: true,\n };\n } else {\n if (!fieldDef.relation.opposite) {\n throw new InternalError(`Opposite relation not defined for field \"${relationField}\"`);\n }\n\n const oppositeField = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n\n if (!oppositeField.relation) {\n throw new InternalError(`Field \"${fieldDef.relation.opposite}\" is not a relation`);\n }\n if (!oppositeField.relation.fields) {\n throw new InternalError(`Relation fields not defined for field \"${relationField}\"`);\n }\n if (!oppositeField.relation.references) {\n throw new InternalError(`Relation references not defined for field \"${relationField}\"`);\n }\n\n // the opposite model owns the fk\n return {\n keyPairs: oppositeField.relation.fields.map((f, i) => ({\n fk: f,\n pk: oppositeField.relation!.references![i]!,\n })),\n ownedByModel: false,\n };\n }\n}\n\nexport function isScalarField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = requireField(schema, model, field);\n return !fieldDef.relation && !fieldDef.foreignKeyFor;\n}\n\nexport function isForeignKeyField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = requireField(schema, model, field);\n return !!fieldDef.foreignKeyFor;\n}\n\nexport function isRelationField(schema: SchemaDef, model: string, field: string): boolean {\n const fieldDef = requireField(schema, model, field);\n return !!fieldDef.relation;\n}\n\nexport function getUniqueFields(schema: SchemaDef, model: string) {\n const modelDef = requireModel(schema, model);\n const result: Array<\n // single field unique\n | { name: string; def: FieldDef }\n // multi-field unique\n | { name: string; defs: Record<string, FieldDef> }\n > = [];\n for (const [key, value] of Object.entries(modelDef.uniqueFields)) {\n if (typeof value !== 'object') {\n throw new InternalError(`Invalid unique field definition for \"${key}\"`);\n }\n\n if (typeof value.type === 'string') {\n // singular unique field\n result.push({ name: key, def: requireField(schema, model, key) });\n } else {\n // compound unique field\n result.push({\n name: key,\n defs: Object.fromEntries(Object.keys(value).map((k) => [k, requireField(schema, model, k)])),\n });\n }\n }\n return result;\n}\n\nexport function getIdValues(schema: SchemaDef, model: string, data: any): Record<string, any> {\n const idFields = getIdFields(schema, model);\n if (!idFields) {\n throw new InternalError(`ID fields not defined for model \"${model}\"`);\n }\n return idFields.reduce((acc, field) => ({ ...acc, [field]: data[field] }), {});\n}\n\nexport function buildFieldRef<Schema extends SchemaDef>(\n schema: Schema,\n model: string,\n field: string,\n options: ClientOptions<Schema>,\n eb: ExpressionBuilder<any, any>,\n modelAlias?: string,\n): ExpressionWrapper<any, any, unknown> {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.computed) {\n return eb.ref(modelAlias ? `${modelAlias}.${field}` : field);\n } else {\n let computer: Function | undefined;\n if ('computedFields' in options) {\n const computedFields = options.computedFields as Record<string, any>;\n computer = computedFields?.[model]?.[field];\n }\n if (!computer) {\n throw new QueryError(`Computed field \"${field}\" implementation not provided for model \"${model}\"`);\n }\n return computer(eb);\n }\n}\n\nexport function fieldHasDefaultValue(fieldDef: FieldDef) {\n return fieldDef.default !== undefined || fieldDef.updatedAt;\n}\n\nexport function isEnum(schema: SchemaDef, type: string) {\n return !!schema.enums?.[type];\n}\n\nexport function getEnum(schema: SchemaDef, type: string) {\n return schema.enums?.[type];\n}\n\nexport function buildJoinPairs(\n schema: SchemaDef,\n model: string,\n modelAlias: string,\n relationField: string,\n relationModelAlias: string,\n): [string, string][] {\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(schema, model, relationField);\n\n return keyPairs.map(({ fk, pk }) => {\n if (ownedByModel) {\n // the parent model owns the fk\n return [`${relationModelAlias}.${pk}`, `${modelAlias}.${fk}`];\n } else {\n // the relation side owns the fk\n return [`${relationModelAlias}.${fk}`, `${modelAlias}.${pk}`];\n }\n });\n}\n\nexport function makeDefaultOrderBy<Schema extends SchemaDef>(schema: SchemaDef, model: string) {\n const idFields = getIdFields(schema, model);\n return idFields.map((f) => ({ [f]: 'asc' }) as OrderBy<Schema, GetModels<Schema>, true, false>);\n}\n\nexport function getManyToManyRelation(schema: SchemaDef, model: string, field: string) {\n const fieldDef = requireField(schema, model, field);\n if (!fieldDef.array || !fieldDef.relation?.opposite) {\n return undefined;\n }\n const oppositeFieldDef = requireField(schema, fieldDef.type, fieldDef.relation.opposite);\n if (oppositeFieldDef.array) {\n // Prisma's convention for many-to-many relation:\n // - model are sorted alphabetically by name\n // - join table is named _<model1>To<model2>, unless an explicit name is provided by `@relation`\n // - foreign keys are named A and B (based on the order of the model)\n const sortedModelNames = [model, fieldDef.type].sort();\n return {\n parentFkName: sortedModelNames[0] === model ? 'A' : 'B',\n otherModel: fieldDef.type,\n otherField: fieldDef.relation.opposite,\n otherFkName: sortedModelNames[0] === fieldDef.type ? 'A' : 'B',\n joinTable: fieldDef.relation.name\n ? `_${fieldDef.relation.name}`\n : `_${sortedModelNames[0]}To${sortedModelNames[1]}`,\n };\n } else {\n return undefined;\n }\n}\n\n/**\n * Convert filter like `{ id1_id2: { id1: 1, id2: 1 } }` to `{ id1: 1, id2: 1 }`\n */\nexport function flattenCompoundUniqueFilters(schema: SchemaDef, model: string, filter: unknown) {\n if (typeof filter !== 'object' || !filter) {\n return filter;\n }\n\n const uniqueFields = getUniqueFields(schema, model);\n const compoundUniques = uniqueFields.filter((u) => 'defs' in u);\n if (compoundUniques.length === 0) {\n return filter;\n }\n\n const result: any = {};\n for (const [key, value] of Object.entries(filter)) {\n if (compoundUniques.some(({ name }) => name === key)) {\n // flatten the compound field\n Object.assign(result, value);\n } else {\n result[key] = value;\n }\n }\n return result;\n}\n\nexport function ensureArray<T>(value: T | T[]): T[] {\n if (Array.isArray(value)) {\n return value;\n } else {\n return [value];\n }\n}\n\nexport function safeJSONStringify(value: unknown) {\n return JSON.stringify(value, (_, v) => {\n if (typeof v === 'bigint') {\n return v.toString();\n } else {\n return v;\n }\n });\n}\n","import { invariant, isPlainObject } from '@zenstackhq/common-helpers';\nimport type { Expression, ExpressionBuilder, ExpressionWrapper, SqlBool, ValueNode } from 'kysely';\nimport { sql, type SelectQueryBuilder } from 'kysely';\nimport { match, P } from 'ts-pattern';\nimport type { BuiltinType, DataSourceProviderType, FieldDef, GetModels, SchemaDef } from '../../../schema';\nimport { enumerate } from '../../../utils/enumerate';\nimport type { OrArray } from '../../../utils/type-utils';\nimport type {\n BooleanFilter,\n BytesFilter,\n DateTimeFilter,\n FindArgs,\n OrderBy,\n SortOrder,\n StringFilter,\n} from '../../crud-types';\nimport { InternalError, QueryError } from '../../errors';\nimport type { ClientOptions } from '../../options';\nimport {\n buildFieldRef,\n buildJoinPairs,\n flattenCompoundUniqueFilters,\n getField,\n getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n isEnum,\n makeDefaultOrderBy,\n requireField,\n} from '../../query-utils';\n\nexport abstract class BaseCrudDialect<Schema extends SchemaDef> {\n constructor(\n protected readonly schema: Schema,\n protected readonly options: ClientOptions<Schema>,\n ) {}\n\n abstract get provider(): DataSourceProviderType;\n\n transformPrimitive(value: unknown, _type: BuiltinType, _forArrayField: boolean) {\n return value;\n }\n\n abstract buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any>;\n\n abstract buildSkipTake(\n query: SelectQueryBuilder<any, any, any>,\n skip: number | undefined,\n take: number | undefined,\n ): SelectQueryBuilder<any, any, any>;\n\n buildFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n where: boolean | object | undefined,\n ) {\n if (where === true || where === undefined) {\n return this.true(eb);\n }\n\n if (where === false) {\n return this.false(eb);\n }\n\n let result = this.true(eb);\n const _where = flattenCompoundUniqueFilters(this.schema, model, where);\n\n for (const [key, payload] of Object.entries(_where)) {\n if (payload === undefined) {\n continue;\n }\n\n if (key.startsWith('$')) {\n continue;\n }\n\n if (key === 'AND' || key === 'OR' || key === 'NOT') {\n result = this.and(eb, result, this.buildCompositeFilter(eb, model, modelAlias, key, payload));\n continue;\n }\n\n const fieldDef = requireField(this.schema, model, key);\n if (fieldDef.relation) {\n result = this.and(eb, result, this.buildRelationFilter(eb, model, modelAlias, key, fieldDef, payload));\n } else if (fieldDef.array) {\n result = this.and(eb, result, this.buildArrayFilter(eb, model, modelAlias, key, fieldDef, payload));\n } else {\n result = this.and(eb, result, this.buildPrimitiveFilter(eb, model, modelAlias, key, fieldDef, payload));\n }\n }\n\n // call expression builder and combine the results\n if ('$expr' in _where && typeof _where['$expr'] === 'function') {\n result = this.and(eb, result, _where['$expr'](eb));\n }\n\n return result;\n }\n\n protected buildCompositeFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n key: 'AND' | 'OR' | 'NOT',\n payload: any,\n ): Expression<SqlBool> {\n return match(key)\n .with('AND', () =>\n this.and(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('OR', () =>\n this.or(\n eb,\n ...enumerate(payload).map((subPayload) => this.buildFilter(eb, model, modelAlias, subPayload)),\n ),\n )\n .with('NOT', () => eb.not(this.buildCompositeFilter(eb, model, modelAlias, 'AND', payload)))\n .exhaustive();\n }\n\n private buildRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n if (!fieldDef.array) {\n return this.buildToOneRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n } else {\n return this.buildToManyRelationFilter(eb, model, modelAlias, field, fieldDef, payload);\n }\n }\n\n private buildToOneRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n table: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ): Expression<SqlBool> {\n if (payload === null) {\n const { ownedByModel, keyPairs } = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n if (ownedByModel) {\n // can be short-circuited to FK null check\n return this.and(eb, ...keyPairs.map(({ fk }) => eb(sql.ref(`${table}.${fk}`), 'is', null)));\n } else {\n // translate it to `{ is: null }` filter\n return this.buildToOneRelationFilter(eb, model, table, field, fieldDef, { is: null });\n }\n }\n\n const joinAlias = `${table}$${field}`;\n const joinPairs = buildJoinPairs(this.schema, model, table, field, joinAlias);\n const filterResultField = `${field}$filter`;\n\n const joinSelect = eb\n .selectFrom(`${fieldDef.type} as ${joinAlias}`)\n .where(() => this.and(eb, ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right)))))\n .select(() => eb.fn.count(eb.lit(1)).as(filterResultField));\n\n const conditions: Expression<SqlBool>[] = [];\n\n if ('is' in payload || 'isNot' in payload) {\n if ('is' in payload) {\n if (payload.is === null) {\n // check if not found\n conditions.push(eb(joinSelect, '=', 0));\n } else {\n // check if found\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload.is)),\n '>',\n 0,\n ),\n );\n }\n }\n\n if ('isNot' in payload) {\n if (payload.isNot === null) {\n // check if found\n conditions.push(eb(joinSelect, '>', 0));\n } else {\n conditions.push(\n this.or(\n eb,\n // is null\n eb(joinSelect, '=', 0),\n // found one that matches the filter\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload.isNot)),\n '=',\n 0,\n ),\n ),\n );\n }\n }\n } else {\n conditions.push(\n eb(\n joinSelect.where(() => this.buildFilter(eb, fieldDef.type, joinAlias, payload)),\n '>',\n 0,\n ),\n );\n }\n\n return this.and(eb, ...conditions);\n }\n\n private buildToManyRelationFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n table: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n // null check needs to be converted to fk \"is null\" checks\n if (payload === null) {\n return eb(sql.ref(`${table}.${field}`), 'is', null);\n }\n\n const relationModel = fieldDef.type;\n\n const buildPkFkWhereRefs = (eb: ExpressionBuilder<any, any>) => {\n const m2m = getManyToManyRelation(this.schema, model, field);\n if (m2m) {\n // many-to-many relation\n const modelIdField = getIdFields(this.schema, model)[0]!;\n const relationIdField = getIdFields(this.schema, relationModel)[0]!;\n return eb(\n sql.ref(`${relationModel}.${relationIdField}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(\n sql.ref(`${m2m.joinTable}.${m2m.parentFkName}`),\n '=',\n sql.ref(`${table}.${modelIdField}`),\n ),\n );\n } else {\n const relationKeyPairs = getRelationForeignKeyFieldPairs(this.schema, model, field);\n\n let result = this.true(eb);\n for (const { fk, pk } of relationKeyPairs.keyPairs) {\n if (relationKeyPairs.ownedByModel) {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${table}.${fk}`), '=', sql.ref(`${relationModel}.${pk}`)),\n );\n } else {\n result = this.and(\n eb,\n result,\n eb(sql.ref(`${table}.${pk}`), '=', sql.ref(`${relationModel}.${fk}`)),\n );\n }\n }\n return result;\n }\n };\n\n let result = this.true(eb);\n\n for (const [key, subPayload] of Object.entries(payload)) {\n if (!subPayload) {\n continue;\n }\n\n switch (key) {\n case 'some': {\n result = this.and(\n eb,\n result,\n eb(\n eb\n .selectFrom(relationModel)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) => this.buildFilter(eb1, relationModel, relationModel, subPayload)),\n '>',\n 0,\n ),\n );\n break;\n }\n\n case 'every': {\n result = this.and(\n eb,\n result,\n eb(\n eb\n .selectFrom(relationModel)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) =>\n eb1.not(this.buildFilter(eb1, relationModel, relationModel, subPayload)),\n ),\n '=',\n 0,\n ),\n );\n break;\n }\n\n case 'none': {\n result = this.and(\n eb,\n result,\n eb(\n eb\n .selectFrom(relationModel)\n .select((eb1) => eb1.fn.count(eb1.lit(1)).as('count'))\n .where(buildPkFkWhereRefs(eb))\n .where((eb1) => this.buildFilter(eb1, relationModel, relationModel, subPayload)),\n '=',\n 0,\n ),\n );\n break;\n }\n }\n }\n\n return result;\n }\n\n private buildArrayFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n const clauses: Expression<SqlBool>[] = [];\n const fieldType = fieldDef.type as BuiltinType;\n const fieldRef = buildFieldRef(this.schema, model, field, this.options, eb, modelAlias);\n\n for (const [key, _value] of Object.entries(payload)) {\n if (_value === undefined) {\n continue;\n }\n\n const value = this.transformPrimitive(_value, fieldType, !!fieldDef.array);\n\n switch (key) {\n case 'equals': {\n clauses.push(this.buildLiteralFilter(eb, fieldRef, fieldType, eb.val(value)));\n break;\n }\n\n case 'has': {\n clauses.push(eb(fieldRef, '@>', eb.val([value])));\n break;\n }\n\n case 'hasEvery': {\n clauses.push(eb(fieldRef, '@>', eb.val(value)));\n break;\n }\n\n case 'hasSome': {\n clauses.push(eb(fieldRef, '&&', eb.val(value)));\n break;\n }\n\n case 'isEmpty': {\n clauses.push(eb(fieldRef, value === true ? '=' : '!=', eb.val([])));\n break;\n }\n\n default: {\n throw new InternalError(`Invalid array filter key: ${key}`);\n }\n }\n }\n\n return this.and(eb, ...clauses);\n }\n\n buildPrimitiveFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n modelAlias: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n if (payload === null) {\n return eb(sql.ref(`${modelAlias}.${field}`), 'is', null);\n }\n\n if (isEnum(this.schema, fieldDef.type)) {\n return this.buildEnumFilter(eb, modelAlias, field, fieldDef, payload);\n }\n\n return (\n match(fieldDef.type as BuiltinType)\n .with('String', () => this.buildStringFilter(eb, modelAlias, field, payload))\n .with(P.union('Int', 'Float', 'Decimal', 'BigInt'), (type) =>\n this.buildNumberFilter(eb, model, modelAlias, field, type, payload),\n )\n .with('Boolean', () => this.buildBooleanFilter(eb, modelAlias, field, payload))\n .with('DateTime', () => this.buildDateTimeFilter(eb, modelAlias, field, payload))\n .with('Bytes', () => this.buildBytesFilter(eb, modelAlias, field, payload))\n // TODO: JSON filters\n .with('Json', () => {\n throw new InternalError('JSON filters are not supported yet');\n })\n .with('Unsupported', () => {\n throw new QueryError(`Unsupported field cannot be used in filters`);\n })\n .exhaustive()\n );\n }\n\n private buildLiteralFilter(eb: ExpressionBuilder<any, any>, lhs: Expression<any>, type: BuiltinType, rhs: unknown) {\n return eb(lhs, '=', rhs !== null && rhs !== undefined ? this.transformPrimitive(rhs, type, false) : rhs);\n }\n\n private buildStandardFilter(\n eb: ExpressionBuilder<any, any>,\n type: BuiltinType,\n payload: any,\n lhs: Expression<any>,\n getRhs: (value: unknown) => any,\n recurse: (value: unknown) => Expression<SqlBool>,\n throwIfInvalid = false,\n onlyForKeys: string[] | undefined = undefined,\n ) {\n if (payload === null || !isPlainObject(payload)) {\n return {\n conditions: [this.buildLiteralFilter(eb, lhs, type, payload)],\n consumedKeys: [],\n };\n }\n\n const conditions: Expression<SqlBool>[] = [];\n const consumedKeys: string[] = [];\n\n for (const [op, value] of Object.entries(payload)) {\n if (onlyForKeys && !onlyForKeys.includes(op)) {\n continue;\n }\n const rhs = Array.isArray(value) ? value.map(getRhs) : getRhs(value);\n const condition = match(op)\n .with('equals', () => (rhs === null ? eb(lhs, 'is', null) : eb(lhs, '=', rhs)))\n .with('in', () => {\n invariant(Array.isArray(rhs), 'right hand side must be an array');\n if (rhs.length === 0) {\n return this.false(eb);\n } else {\n return eb(lhs, 'in', rhs);\n }\n })\n .with('notIn', () => {\n invariant(Array.isArray(rhs), 'right hand side must be an array');\n if (rhs.length === 0) {\n return this.true(eb);\n } else {\n return eb.not(eb(lhs, 'in', rhs));\n }\n })\n .with('lt', () => eb(lhs, '<', rhs))\n .with('lte', () => eb(lhs, '<=', rhs))\n .with('gt', () => eb(lhs, '>', rhs))\n .with('gte', () => eb(lhs, '>=', rhs))\n .with('not', () => eb.not(recurse(value)))\n .otherwise(() => {\n if (throwIfInvalid) {\n throw new QueryError(`Invalid filter key: ${op}`);\n } else {\n return undefined;\n }\n });\n\n if (condition) {\n conditions.push(condition);\n consumedKeys.push(op);\n }\n }\n\n return { conditions, consumedKeys };\n }\n\n private buildStringFilter(\n eb: ExpressionBuilder<any, any>,\n table: string,\n field: string,\n payload: StringFilter<true>,\n ) {\n const fieldDef = getField(this.schema, table, field);\n let fieldRef: Expression<any> = fieldDef?.computed ? sql.ref(field) : sql.ref(`${table}.${field}`);\n\n let insensitive = false;\n if (payload && typeof payload === 'object' && 'mode' in payload && payload.mode === 'insensitive') {\n insensitive = true;\n fieldRef = eb.fn('lower', [fieldRef]);\n }\n\n const { conditions, consumedKeys } = this.buildStandardFilter(\n eb,\n 'String',\n payload,\n fieldRef,\n (value) => this.prepStringCasing(eb, value, insensitive),\n (value) => this.buildStringFilter(eb, table, field, value as StringFilter<true>),\n );\n\n if (payload && typeof payload === 'object') {\n for (const [key, value] of Object.entries(payload)) {\n if (key === 'mode' || consumedKeys.includes(key)) {\n // already consumed\n continue;\n }\n\n const condition = match(key)\n .with('contains', () =>\n insensitive\n ? eb(fieldRef, 'ilike', sql.lit(`%${value}%`))\n : eb(fieldRef, 'like', sql.lit(`%${value}%`)),\n )\n .with('startsWith', () =>\n insensitive\n ? eb(fieldRef, 'ilike', sql.lit(`${value}%`))\n : eb(fieldRef, 'like', sql.lit(`${value}%`)),\n )\n .with('endsWith', () =>\n insensitive\n ? eb(fieldRef, 'ilike', sql.lit(`%${value}`))\n : eb(fieldRef, 'like', sql.lit(`%${value}`)),\n )\n .otherwise(() => {\n throw new Error(`Invalid string filter key: ${key}`);\n });\n\n if (condition) {\n conditions.push(condition);\n }\n }\n }\n\n return this.and(eb, ...conditions);\n }\n\n private prepStringCasing(eb: ExpressionBuilder<any, any>, value: unknown, toLower: boolean = true): any {\n if (typeof value === 'string') {\n return toLower ? eb.fn('lower', [sql.lit(value)]) : sql.lit(value);\n } else if (Array.isArray(value)) {\n return value.map((v) => this.prepStringCasing(eb, v, toLower));\n } else {\n return value === null ? null : sql.lit(value);\n }\n }\n\n private buildNumberFilter(\n eb: ExpressionBuilder<any, any>,\n model: string,\n table: string,\n field: string,\n type: BuiltinType,\n payload: any,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n type,\n payload,\n buildFieldRef(this.schema, model, field, this.options, eb),\n (value) => this.transformPrimitive(value, type, false),\n (value) => this.buildNumberFilter(eb, model, table, field, type, value),\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBooleanFilter(\n eb: ExpressionBuilder<any, any>,\n table: string,\n field: string,\n payload: BooleanFilter<true>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'Boolean',\n payload,\n sql.ref(`${table}.${field}`),\n (value) => this.transformPrimitive(value, 'Boolean', false),\n (value) => this.buildBooleanFilter(eb, table, field, value as BooleanFilter<true>),\n true,\n ['equals', 'not'],\n );\n return this.and(eb, ...conditions);\n }\n\n private buildDateTimeFilter(\n eb: ExpressionBuilder<any, any>,\n table: string,\n field: string,\n payload: DateTimeFilter<true>,\n ) {\n const { conditions } = this.buildStandardFilter(\n eb,\n 'DateTime',\n payload,\n sql.ref(`${table}.${field}`),\n (value) => this.transformPrimitive(value, 'DateTime', false),\n (value) => this.buildDateTimeFilter(eb, table, field, value as DateTimeFilter<true>),\n true,\n );\n return this.and(eb, ...conditions);\n }\n\n private buildBytesFilter(\n eb: ExpressionBuilder<any, any>,\n table: string,\n field: string,\n payload: BytesFilter<true>,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'Bytes',\n payload,\n sql.ref(`${table}.${field}`),\n (value) => this.transformPrimitive(value, 'Bytes', false),\n (value) => this.buildBytesFilter(eb, table, field, value as BytesFilter<true>),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...conditions.conditions);\n }\n\n private buildEnumFilter(\n eb: ExpressionBuilder<any, any>,\n table: string,\n field: string,\n fieldDef: FieldDef,\n payload: any,\n ) {\n const conditions = this.buildStandardFilter(\n eb,\n 'String',\n payload,\n sql.ref(`${table}.${field}`),\n (value) => value,\n (value) => this.buildEnumFilter(eb, table, field, fieldDef, value),\n true,\n ['equals', 'in', 'notIn', 'not'],\n );\n return this.and(eb, ...conditions.conditions);\n }\n\n buildOrderBy(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n modelAlias: string,\n orderBy: OrArray<OrderBy<Schema, GetModels<Schema>, boolean, boolean>> | undefined,\n useDefaultIfEmpty: boolean,\n negated: boolean,\n ) {\n if (!orderBy) {\n if (useDefaultIfEmpty) {\n orderBy = makeDefaultOrderBy(this.schema, model);\n } else {\n return query;\n }\n }\n\n let result = query;\n enumerate(orderBy).forEach((orderBy) => {\n for (const [field, value] of Object.entries<any>(orderBy)) {\n if (!value) {\n continue;\n }\n\n // aggregations\n if (['_count', '_avg', '_sum', '_min', '_max'].includes(field)) {\n invariant(value && typeof value === 'object', `invalid orderBy value for field \"${field}\"`);\n for (const [k, v] of Object.entries<string>(value)) {\n invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n result = result.orderBy(\n (eb) => eb.fn(field.slice(1), [sql.ref(k)]),\n sql.raw(this.negateSort(v, negated)),\n );\n }\n continue;\n }\n\n switch (field) {\n case '_count': {\n invariant(value && typeof value === 'object', 'invalid orderBy value for field \"_count\"');\n for (const [k, v] of Object.entries<string>(value)) {\n invariant(v === 'asc' || v === 'desc', `invalid orderBy value for field \"${field}\"`);\n result = result.orderBy(\n (eb) => eb.fn.count(sql.ref(k)),\n sql.raw(this.negateSort(v, negated)),\n );\n }\n continue;\n }\n default:\n break;\n }\n\n const fieldDef = requireField(this.schema, model, field);\n\n if (!fieldDef.relation) {\n if (value === 'asc' || value === 'desc') {\n result = result.orderBy(sql.ref(`${modelAlias}.${field}`), this.negateSort(value, negated));\n } else if (\n value &&\n typeof value === 'object' &&\n 'nulls' in value &&\n 'sort' in value &&\n (value.sort === 'asc' || value.sort === 'desc') &&\n (value.nulls === 'first' || value.nulls === 'last')\n ) {\n result = result.orderBy(\n sql.ref(`${modelAlias}.${field}`),\n sql.raw(`${this.negateSort(value.sort, negated)} nulls ${value.nulls}`),\n );\n }\n } else {\n // order by relation\n const relationModel = fieldDef.type;\n\n if (fieldDef.array) {\n // order by to-many relation\n if (typeof value !== 'object') {\n throw new QueryError(`invalid orderBy value for field \"${field}\"`);\n }\n if ('_count' in value) {\n invariant(\n value._count === 'asc' || value._count === 'desc',\n 'invalid orderBy value for field \"_count\"',\n );\n const sort = this.negateSort(value._count, negated);\n result = result.orderBy((eb) => {\n let subQuery = eb.selectFrom(relationModel);\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, relationModel);\n subQuery = subQuery.where(() =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\n ),\n );\n subQuery = subQuery.select(() => eb.fn.count(eb.lit(1)).as('_count'));\n return subQuery;\n }, sort);\n }\n } else {\n // order by to-one relation\n result = result.leftJoin(relationModel, (join) => {\n const joinPairs = buildJoinPairs(this.schema, model, modelAlias, field, relationModel);\n return join.on((eb) =>\n this.and(\n eb,\n ...joinPairs.map(([left, right]) => eb(sql.ref(left), '=', sql.ref(right))),\n ),\n );\n });\n result = this.buildOrderBy(result, fieldDef.type, relationModel, value, false, negated);\n }\n }\n }\n });\n\n return result;\n }\n\n private negateSort(sort: SortOrder, negated: boolean) {\n return negated ? (sort === 'asc' ? 'desc' : 'asc') : sort;\n }\n\n public true(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return eb.lit<SqlBool>(this.transformPrimitive(true, 'Boolean', false) as boolean);\n }\n\n public false(eb: ExpressionBuilder<any, any>): Expression<SqlBool> {\n return eb.lit<SqlBool>(this.transformPrimitive(false, 'Boolean', false) as boolean);\n }\n\n public isTrue(expression: Expression<SqlBool>) {\n const node = expression.toOperationNode();\n if (node.kind !== 'ValueNode') {\n return false;\n }\n return (node as ValueNode).value === true || (node as ValueNode).value === 1;\n }\n\n public isFalse(expression: Expression<SqlBool>) {\n const node = expression.toOperationNode();\n if (node.kind !== 'ValueNode') {\n return false;\n }\n return (node as ValueNode).value === false || (node as ValueNode).value === 0;\n }\n\n protected and(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n const nonTrueArgs = args.filter((arg) => !this.isTrue(arg));\n if (nonTrueArgs.length === 0) {\n return this.true(eb);\n } else if (nonTrueArgs.length === 1) {\n return nonTrueArgs[0]!;\n } else {\n return eb.and(nonTrueArgs);\n }\n }\n\n protected or(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n const nonFalseArgs = args.filter((arg) => !this.isFalse(arg));\n if (nonFalseArgs.length === 0) {\n return this.false(eb);\n } else if (nonFalseArgs.length === 1) {\n return nonFalseArgs[0]!;\n } else {\n return eb.or(nonFalseArgs);\n }\n }\n\n protected not(eb: ExpressionBuilder<any, any>, ...args: Expression<SqlBool>[]) {\n return eb.not(this.and(eb, ...args));\n }\n\n /**\n * Builds an Kysely expression that returns a JSON object for the given key-value pairs.\n */\n abstract buildJsonObject(\n eb: ExpressionBuilder<any, any>,\n value: Record<string, Expression<unknown>>,\n ): ExpressionWrapper<any, any, unknown>;\n\n /**\n * Builds an Kysely expression that returns the length of an array.\n */\n abstract buildArrayLength(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): ExpressionWrapper<any, any, number>;\n\n /**\n * Builds an array literal SQL string for the given values.\n */\n abstract buildArrayLiteralSQL(values: unknown[]): string;\n\n /**\n * Whether the dialect supports updating with a limit on the number of updated rows.\n */\n abstract get supportsUpdateWithLimit(): boolean;\n\n /**\n * Whether the dialect supports deleting with a limit on the number of deleted rows.\n */\n abstract get supportsDeleteWithLimit(): boolean;\n\n /**\n * Whether the dialect supports DISTINCT ON.\n */\n abstract get supportsDistinctOn(): boolean;\n}\n","/**\n * Array or scalar\n */\nexport type Enumerable<T> = T | Array<T>;\n\n/**\n * Uniformly enumerates an array or scalar.\n */\nexport function enumerate<T>(x: Enumerable<T>) {\n if (x === null || x === undefined) {\n return [];\n } else if (Array.isArray(x)) {\n return x;\n } else {\n return [x];\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport type Decimal from 'decimal.js';\nimport {\n ExpressionWrapper,\n sql,\n type Expression,\n type ExpressionBuilder,\n type RawBuilder,\n type SelectQueryBuilder,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { BuiltinType, GetModels, SchemaDef } from '../../../schema';\nimport type { FindArgs } from '../../crud-types';\nimport {\n buildFieldRef,\n getIdFields,\n getManyToManyRelation,\n getRelationForeignKeyFieldPairs,\n requireField,\n requireModel,\n} from '../../query-utils';\nimport { BaseCrudDialect } from './base';\n\nexport class SqliteCrudDialect<Schema extends SchemaDef> extends BaseCrudDialect<Schema> {\n override get provider() {\n return 'sqlite' as const;\n }\n\n override transformPrimitive(value: unknown, type: BuiltinType, _forArrayField: boolean): unknown {\n if (value === undefined) {\n return value;\n }\n\n if (Array.isArray(value)) {\n return value.map((v) => this.transformPrimitive(v, type, false));\n } else {\n return match(type)\n .with('Boolean', () => (value ? 1 : 0))\n .with('DateTime', () => (value instanceof Date ? value.toISOString() : value))\n .with('Decimal', () => (value as Decimal).toString())\n .with('Bytes', () => Buffer.from(value as Uint8Array))\n .with('Json', () => JSON.stringify(value))\n .otherwise(() => value);\n }\n }\n\n override buildRelationSelection(\n query: SelectQueryBuilder<any, any, any>,\n model: string,\n relationField: string,\n parentAlias: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ): SelectQueryBuilder<any, any, any> {\n return query.select((eb) =>\n this.buildRelationJSON(model, eb, relationField, parentAlias, payload).as(relationField),\n );\n }\n\n private buildRelationJSON(\n model: string,\n eb: ExpressionBuilder<any, any>,\n relationField: string,\n parentName: string,\n payload: true | FindArgs<Schema, GetModels<Schema>, true>,\n ) {\n const relationFieldDef = requireField(this.schema, model, relationField);\n const relationModel = relationFieldDef.type as GetModels<Schema>;\n const relationModelDef = requireModel(this.schema, relationModel);\n\n const subQueryName = `${parentName}$${relationField}`;\n\n let tbl = eb.selectFrom(() => {\n let subQuery = eb.selectFrom(relationModel).selectAll();\n\n if (payload && typeof payload === 'object') {\n if (payload.where) {\n subQuery = subQuery.where((eb) =>\n this.buildFilter(eb, relationModel, relationModel, payload.where),\n );\n }\n\n // skip & take\n const skip = payload.skip;\n let take = payload.take;\n let negateOrderBy = false;\n if (take !== undefined && take < 0) {\n negateOrderBy = true;\n take = -take;\n }\n subQuery = this.buildSkipTake(subQuery, skip, take);\n\n // orderBy\n subQuery = this.buildOrderBy(\n subQuery,\n relationModel,\n relationModel,\n payload.orderBy,\n skip !== undefined || take !== undefined,\n negateOrderBy,\n );\n }\n\n // join conditions\n\n const m2m = getManyToManyRelation(this.schema, model, relationField);\n if (m2m) {\n // many-to-many relation\n const parentIds = getIdFields(this.schema, model);\n const relationIds = getIdFields(this.schema, relationModel);\n invariant(parentIds.length === 1, 'many-to-many relation must have exactly one id field');\n invariant(relationIds.length === 1, 'many-to-many relation must have exactly one id field');\n subQuery = subQuery.where(\n eb(\n eb.ref(`${relationModel}.${relationIds[0]}`),\n 'in',\n eb\n .selectFrom(m2m.joinTable)\n .select(`${m2m.joinTable}.${m2m.otherFkName}`)\n .whereRef(`${parentName}.${parentIds[0]}`, '=', `${m2m.joinTable}.${m2m.parentFkName}`),\n ),\n );\n } else {\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, model, relationField);\n keyPairs.forEach(({ fk, pk }) => {\n if (ownedByModel) {\n // the parent model owns the fk\n subQuery = subQuery.whereRef(`${relationModel}.${pk}`, '=', `${parentName}.${fk}`);\n } else {\n // the relation side owns the fk\n subQuery = subQuery.whereRef(`${relationModel}.${fk}`, '=', `${parentName}.${pk}`);\n }\n });\n }\n return subQuery.as(subQueryName);\n });\n\n tbl = tbl.select(() => {\n type ArgsType = Expression<any> | RawBuilder<any> | SelectQueryBuilder<any, any, any>;\n const objArgs: ArgsType[] = [];\n\n if (payload === true || !payload.select) {\n // select all scalar fields\n objArgs.push(\n ...Object.entries(relationModelDef.fields)\n .filter(([, value]) => !value.relation)\n .filter(([name]) => !(typeof payload === 'object' && (payload.omit as any)?.[name] === true))\n .map(([field]) => [\n sql.lit(field),\n buildFieldRef(this.schema, relationModel, field, this.options, eb),\n ])\n .flatMap((v) => v),\n );\n } else if (payload.select) {\n // select specific fields\n objArgs.push(\n ...Object.entries<any>(payload.select)\n .filter(([, value]) => value)\n .map(([field, value]) => {\n const fieldDef = requireField(this.schema, relationModel, field);\n if (fieldDef.relation) {\n const subJson = this.buildRelationJSON(\n relationModel as GetModels<Schema>,\n eb,\n field,\n `${parentName}$${relationField}`,\n value,\n );\n return [sql.lit(field), subJson as ArgsType];\n } else {\n return [\n sql.lit(field),\n buildFieldRef(this.schema, relationModel, field, this.options, eb) as ArgsType,\n ];\n }\n })\n .flatMap((v) => v),\n );\n }\n\n if (typeof payload === 'object' && payload.include && typeof payload.include === 'object') {\n // include relation fields\n objArgs.push(\n ...Object.entries<any>(payload.include)\n .filter(([, value]) => value)\n .map(([field, value]) => {\n const subJson = this.buildRelationJSON(\n relationModel as GetModels<Schema>,\n eb,\n field,\n `${parentName}$${relationField}`,\n value,\n );\n return [sql.lit(field), subJson];\n })\n .flatMap((v) => v),\n );\n }\n\n if (relationFieldDef.array) {\n return eb.fn\n .coalesce(sql`json_group_array(json_object(${sql.join(objArgs)}))`, sql`json_array()`)\n .as('$j');\n } else {\n return sql`json_object(${sql.join(objArgs)})`.as('data');\n }\n });\n\n return tbl;\n }\n\n override buildSkipTake(\n query: SelectQueryBuilder<any, any, any>,\n skip: number | undefined,\n take: number | undefined,\n ) {\n if (take !== undefined) {\n query = query.limit(take);\n }\n if (skip !== undefined) {\n query = query.offset(skip);\n if (take === undefined) {\n // SQLite requires offset to be used with limit\n query = query.limit(-1);\n }\n }\n return query;\n }\n\n override buildJsonObject(eb: ExpressionBuilder<any, any>, value: Record<string, Expression<unknown>>) {\n return eb.fn(\n 'json_object',\n Object.entries(value).flatMap(([key, value]) => [sql.lit(key), value]),\n );\n }\n\n override get supportsUpdateWithLimit() {\n return false;\n }\n\n override get supportsDeleteWithLimit() {\n return false;\n }\n\n override get supportsDistinctOn() {\n return false;\n }\n\n override buildArrayLength(\n eb: ExpressionBuilder<any, any>,\n array: Expression<unknown>,\n ): ExpressionWrapper<any, any, number> {\n return eb.fn('json_array_length', [array]);\n }\n\n override buildArrayLiteralSQL(_values: unknown[]): string {\n throw new Error('SQLite does not support array literals');\n }\n}\n","import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from '.';\n\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return {\n kind: 'literal',\n value,\n };\n },\n\n array: (items: Expression[]): ArrayExpression => {\n return {\n kind: 'array',\n items,\n };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return {\n kind: 'call',\n function: functionName,\n args,\n };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression): BinaryExpression => {\n return {\n kind: 'binary',\n op,\n left,\n right,\n };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return {\n kind: 'unary',\n op,\n operand,\n };\n },\n\n field: (field: string): FieldExpression => {\n return {\n kind: 'field',\n field,\n };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return {\n kind: 'member',\n receiver: receiver,\n members,\n };\n },\n\n _this: (): ThisExpression => {\n return {\n kind: 'this',\n };\n },\n\n _null: (): NullExpression => {\n return {\n kind: 'null',\n };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n is: (value: unknown, kind: Expression['kind']): value is Expression => {\n return !!value && typeof value === 'object' && 'kind' in value && value.kind === kind;\n },\n\n isLiteral: (value: unknown): value is LiteralExpression => ExpressionUtils.is(value, 'literal'),\n\n isArray: (value: unknown): value is ArrayExpression => ExpressionUtils.is(value, 'array'),\n\n isCall: (value: unknown): value is CallExpression => ExpressionUtils.is(value, 'call'),\n\n isNull: (value: unknown): value is NullExpression => ExpressionUtils.is(value, 'null'),\n\n isThis: (value: unknown): value is ThisExpression => ExpressionUtils.is(value, 'this'),\n\n isUnary: (value: unknown): value is UnaryExpression => ExpressionUtils.is(value, 'unary'),\n\n isBinary: (value: unknown): value is BinaryExpression => ExpressionUtils.is(value, 'binary'),\n\n isField: (value: unknown): value is FieldExpression => ExpressionUtils.is(value, 'field'),\n\n isMember: (value: unknown): value is MemberExpression => ExpressionUtils.is(value, 'member'),\n};\n","import {\n AddColumnNode,\n AddConstraintNode,\n AddIndexNode,\n AggregateFunctionNode,\n AliasNode,\n AlterColumnNode,\n AlterTableNode,\n AndNode,\n BinaryOperationNode,\n CaseNode,\n CastNode,\n CheckConstraintNode,\n ColumnDefinitionNode,\n ColumnNode,\n ColumnUpdateNode,\n CommonTableExpressionNameNode,\n CommonTableExpressionNode,\n CreateIndexNode,\n CreateSchemaNode,\n CreateTableNode,\n CreateTypeNode,\n CreateViewNode,\n DataTypeNode,\n DefaultInsertValueNode,\n DefaultValueNode,\n DeleteQueryNode,\n DropColumnNode,\n DropConstraintNode,\n DropIndexNode,\n DropSchemaNode,\n DropTableNode,\n DropTypeNode,\n DropViewNode,\n ExplainNode,\n FetchNode,\n ForeignKeyConstraintNode,\n FromNode,\n FunctionNode,\n GeneratedNode,\n GroupByItemNode,\n GroupByNode,\n HavingNode,\n IdentifierNode,\n InsertQueryNode,\n JoinNode,\n JSONOperatorChainNode,\n JSONPathLegNode,\n JSONPathNode,\n JSONReferenceNode,\n LimitNode,\n ListNode,\n MatchedNode,\n MergeQueryNode,\n ModifyColumnNode,\n OffsetNode,\n OnConflictNode,\n OnDuplicateKeyNode,\n OnNode,\n OperationNodeVisitor,\n OperatorNode,\n OrderByItemNode,\n OrderByNode,\n OrNode,\n OutputNode,\n OverNode,\n ParensNode,\n PartitionByItemNode,\n PartitionByNode,\n PrimitiveValueListNode,\n RawNode,\n ReferenceNode,\n ReferencesNode,\n RenameColumnNode,\n ReturningNode,\n SchemableIdentifierNode,\n SelectAllNode,\n SelectionNode,\n SelectModifierNode,\n SelectQueryNode,\n SetOperationNode,\n TableNode,\n TopNode,\n TupleNode,\n UnaryOperationNode,\n UniqueConstraintNode,\n UpdateQueryNode,\n UsingNode,\n ValueListNode,\n ValueNode,\n ValuesNode,\n WhenNode,\n WhereNode,\n WithNode,\n type OperationNode,\n type PrimaryKeyConstraintNode,\n} from 'kysely';\n\nexport class DefaultOperationNodeVisitor extends OperationNodeVisitor {\n protected defaultVisit(node: OperationNode) {\n Object.values(node).forEach((value) => {\n if (!value) {\n return;\n }\n if (Array.isArray(value)) {\n value.forEach((el) => this.defaultVisit(el));\n }\n if (typeof value === 'object' && 'kind' in value && typeof value.kind === 'string') {\n this.visitNode(value);\n }\n });\n }\n\n protected override visitSelectQuery(node: SelectQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelection(node: SelectionNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumn(node: ColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlias(node: AliasNode): void {\n this.defaultVisit(node);\n }\n protected override visitTable(node: TableNode): void {\n this.defaultVisit(node);\n }\n protected override visitFrom(node: FromNode): void {\n this.defaultVisit(node);\n }\n protected override visitReference(node: ReferenceNode): void {\n this.defaultVisit(node);\n }\n protected override visitAnd(node: AndNode): void {\n this.defaultVisit(node);\n }\n protected override visitOr(node: OrNode): void {\n this.defaultVisit(node);\n }\n protected override visitValueList(node: ValueListNode): void {\n this.defaultVisit(node);\n }\n protected override visitParens(node: ParensNode): void {\n this.defaultVisit(node);\n }\n protected override visitJoin(node: JoinNode): void {\n this.defaultVisit(node);\n }\n protected override visitRaw(node: RawNode): void {\n this.defaultVisit(node);\n }\n protected override visitWhere(node: WhereNode): void {\n this.defaultVisit(node);\n }\n protected override visitInsertQuery(node: InsertQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitDeleteQuery(node: DeleteQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitReturning(node: ReturningNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateTable(node: CreateTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddColumn(node: AddColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumnDefinition(node: ColumnDefinitionNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropTable(node: DropTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitOrderBy(node: OrderByNode): void {\n this.defaultVisit(node);\n }\n protected override visitOrderByItem(node: OrderByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitGroupBy(node: GroupByNode): void {\n this.defaultVisit(node);\n }\n protected override visitGroupByItem(node: GroupByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitUpdateQuery(node: UpdateQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitColumnUpdate(node: ColumnUpdateNode): void {\n this.defaultVisit(node);\n }\n protected override visitLimit(node: LimitNode): void {\n this.defaultVisit(node);\n }\n protected override visitOffset(node: OffsetNode): void {\n this.defaultVisit(node);\n }\n protected override visitOnConflict(node: OnConflictNode): void {\n this.defaultVisit(node);\n }\n protected override visitOnDuplicateKey(node: OnDuplicateKeyNode): void {\n this.defaultVisit(node);\n }\n protected override visitCheckConstraint(node: CheckConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitDataType(node: DataTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelectAll(node: SelectAllNode): void {\n this.defaultVisit(node);\n }\n protected override visitIdentifier(node: IdentifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitSchemableIdentifier(node: SchemableIdentifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitValue(node: ValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitPrimitiveValueList(node: PrimitiveValueListNode): void {\n this.defaultVisit(node);\n }\n protected override visitOperator(node: OperatorNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateIndex(node: CreateIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropIndex(node: DropIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitList(node: ListNode): void {\n this.defaultVisit(node);\n }\n protected override visitPrimaryKeyConstraint(node: PrimaryKeyConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitUniqueConstraint(node: UniqueConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitReferences(node: ReferencesNode): void {\n this.defaultVisit(node);\n }\n protected override visitWith(node: WithNode): void {\n this.defaultVisit(node);\n }\n protected override visitCommonTableExpression(node: CommonTableExpressionNode): void {\n this.defaultVisit(node);\n }\n protected override visitCommonTableExpressionName(node: CommonTableExpressionNameNode): void {\n this.defaultVisit(node);\n }\n protected override visitHaving(node: HavingNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateSchema(node: CreateSchemaNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropSchema(node: DropSchemaNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlterTable(node: AlterTableNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropColumn(node: DropColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitRenameColumn(node: RenameColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAlterColumn(node: AlterColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitModifyColumn(node: ModifyColumnNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddConstraint(node: AddConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropConstraint(node: DropConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitForeignKeyConstraint(node: ForeignKeyConstraintNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateView(node: CreateViewNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropView(node: DropViewNode): void {\n this.defaultVisit(node);\n }\n protected override visitGenerated(node: GeneratedNode): void {\n this.defaultVisit(node);\n }\n protected override visitDefaultValue(node: DefaultValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitOn(node: OnNode): void {\n this.defaultVisit(node);\n }\n protected override visitValues(node: ValuesNode): void {\n this.defaultVisit(node);\n }\n protected override visitSelectModifier(node: SelectModifierNode): void {\n this.defaultVisit(node);\n }\n protected override visitCreateType(node: CreateTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitDropType(node: DropTypeNode): void {\n this.defaultVisit(node);\n }\n protected override visitExplain(node: ExplainNode): void {\n this.defaultVisit(node);\n }\n protected override visitDefaultInsertValue(node: DefaultInsertValueNode): void {\n this.defaultVisit(node);\n }\n protected override visitAggregateFunction(node: AggregateFunctionNode): void {\n this.defaultVisit(node);\n }\n protected override visitOver(node: OverNode): void {\n this.defaultVisit(node);\n }\n protected override visitPartitionBy(node: PartitionByNode): void {\n this.defaultVisit(node);\n }\n protected override visitPartitionByItem(node: PartitionByItemNode): void {\n this.defaultVisit(node);\n }\n protected override visitSetOperation(node: SetOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitBinaryOperation(node: BinaryOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitUnaryOperation(node: UnaryOperationNode): void {\n this.defaultVisit(node);\n }\n protected override visitUsing(node: UsingNode): void {\n this.defaultVisit(node);\n }\n protected override visitFunction(node: FunctionNode): void {\n this.defaultVisit(node);\n }\n protected override visitCase(node: CaseNode): void {\n this.defaultVisit(node);\n }\n protected override visitWhen(node: WhenNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONReference(node: JSONReferenceNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONPath(node: JSONPathNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONPathLeg(node: JSONPathLegNode): void {\n this.defaultVisit(node);\n }\n protected override visitJSONOperatorChain(node: JSONOperatorChainNode): void {\n this.defaultVisit(node);\n }\n protected override visitTuple(node: TupleNode): void {\n this.defaultVisit(node);\n }\n protected override visitMergeQuery(node: MergeQueryNode): void {\n this.defaultVisit(node);\n }\n protected override visitMatched(node: MatchedNode): void {\n this.defaultVisit(node);\n }\n protected override visitAddIndex(node: AddIndexNode): void {\n this.defaultVisit(node);\n }\n protected override visitCast(node: CastNode): void {\n this.defaultVisit(node);\n }\n protected override visitFetch(node: FetchNode): void {\n this.defaultVisit(node);\n }\n protected override visitTop(node: TopNode): void {\n this.defaultVisit(node);\n }\n protected override visitOutput(node: OutputNode): void {\n this.defaultVisit(node);\n }\n}\n","import type { ColumnNode, OperationNode } from 'kysely';\nimport { DefaultOperationNodeVisitor } from '../../utils/default-operation-node-visitor';\n\n/**\n * Collects all column names from a query.\n */\nexport class ColumnCollector extends DefaultOperationNodeVisitor {\n private columns: string[] = [];\n\n collect(node: OperationNode) {\n this.columns = [];\n this.visitNode(node);\n return this.columns;\n }\n\n protected override visitColumn(node: ColumnNode): void {\n if (!this.columns.includes(node.column.name)) {\n this.columns.push(node.column.name);\n }\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport {\n AliasNode,\n BinaryOperationNode,\n ColumnNode,\n expressionBuilder,\n FromNode,\n FunctionNode,\n IdentifierNode,\n OperatorNode,\n ReferenceNode,\n SelectionNode,\n SelectQueryNode,\n TableNode,\n ValueListNode,\n ValueNode,\n WhereNode,\n type ExpressionBuilder,\n type OperandExpression,\n type OperationNode,\n} from 'kysely';\nimport { match } from 'ts-pattern';\nimport type { CRUD } from '../../client/contract';\nimport { getCrudDialect } from '../../client/crud/dialects';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport { InternalError, QueryError } from '../../client/errors';\nimport type { ClientOptions } from '../../client/options';\nimport { getRelationForeignKeyFieldPairs, requireField } from '../../client/query-utils';\nimport type {\n BinaryExpression,\n BinaryOperator,\n BuiltinType,\n FieldDef,\n GetModels,\n LiteralExpression,\n MemberExpression,\n UnaryExpression,\n} from '../../schema';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type SchemaDef,\n} from '../../schema';\nimport { ExpressionEvaluator } from './expression-evaluator';\nimport { conjunction, disjunction, logicalNot, trueNode } from './utils';\n\nexport type ExpressionTransformerContext<Schema extends SchemaDef> = {\n model: GetModels<Schema>;\n alias?: string;\n operation: CRUD;\n thisEntity?: Record<string, OperationNode>;\n thisEntityRaw?: Record<string, unknown>;\n auth?: any;\n memberFilter?: OperationNode;\n memberSelect?: SelectionNode;\n};\n\n// a registry of expression handlers marked with @expr\nconst expressionHandlers = new Map<string, PropertyDescriptor>();\n\n// expression handler decorator\nfunction expr(kind: Expression['kind']) {\n return function (_target: unknown, _propertyKey: string, descriptor: PropertyDescriptor) {\n if (!expressionHandlers.get(kind)) {\n expressionHandlers.set(kind, descriptor);\n }\n return descriptor;\n };\n}\n\nexport class ExpressionTransformer<Schema extends SchemaDef> {\n private readonly dialect: BaseCrudDialect<Schema>;\n\n constructor(\n private readonly schema: Schema,\n private readonly clientOptions: ClientOptions<Schema>,\n private readonly auth: unknown | undefined,\n ) {\n this.dialect = getCrudDialect(this.schema, this.clientOptions);\n }\n\n get authType() {\n if (!this.schema.authType) {\n throw new InternalError('Schema does not have an \"authType\" specified');\n }\n return this.schema.authType;\n }\n\n transform(expression: Expression, context: ExpressionTransformerContext<Schema>): OperationNode {\n const handler = expressionHandlers.get(expression.kind);\n if (!handler) {\n throw new Error(`Unsupported expression kind: ${expression.kind}`);\n }\n return handler.value.call(this, expression, context);\n }\n\n @expr('literal')\n // @ts-expect-error\n private _literal(expr: LiteralExpression) {\n return this.transformValue(\n expr.value,\n typeof expr.value === 'string' ? 'String' : typeof expr.value === 'boolean' ? 'Boolean' : 'Int',\n );\n }\n\n @expr('array')\n // @ts-expect-error\n private _array(expr: ArrayExpression, context: ExpressionTransformerContext<Schema>) {\n return ValueListNode.create(expr.items.map((item) => this.transform(item, context)));\n }\n\n @expr('field')\n // @ts-expect-error\n private _field(expr: FieldExpression, context: ExpressionTransformerContext<Schema>) {\n const fieldDef = requireField(this.schema, context.model, expr.field);\n if (!fieldDef.relation) {\n if (context.thisEntity) {\n return context.thisEntity[expr.field];\n } else {\n return this.createColumnRef(expr.field, context);\n }\n } else {\n const { memberFilter, memberSelect, ...restContext } = context;\n const relation = this.transformRelationAccess(expr.field, fieldDef.type, restContext);\n return {\n ...relation,\n where: this.mergeWhere(relation.where, memberFilter),\n selections: memberSelect ? [memberSelect] : relation.selections,\n };\n }\n }\n\n private mergeWhere(where: WhereNode | undefined, memberFilter: OperationNode | undefined) {\n if (!where) {\n return WhereNode.create(memberFilter ?? trueNode(this.dialect));\n }\n if (!memberFilter) {\n return where;\n }\n return WhereNode.create(conjunction(this.dialect, [where.where, memberFilter]));\n }\n\n @expr('null')\n // @ts-ignore\n private _null() {\n return ValueNode.createImmediate(null);\n }\n\n @expr('binary')\n // @ts-ignore\n private _binary(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n if (expr.op === '&&') {\n return conjunction(this.dialect, [this.transform(expr.left, context), this.transform(expr.right, context)]);\n } else if (expr.op === '||') {\n return disjunction(this.dialect, [this.transform(expr.left, context), this.transform(expr.right, context)]);\n }\n\n if (this.isAuthCall(expr.left) || this.isAuthCall(expr.right)) {\n return this.transformAuthBinary(expr);\n }\n\n const op = expr.op;\n\n if (op === '?' || op === '!' || op === '^') {\n return this.transformCollectionPredicate(expr, context);\n }\n\n const left = this.transform(expr.left, context);\n const right = this.transform(expr.right, context);\n\n if (op === 'in') {\n if (this.isNullNode(left)) {\n return this.transformValue(false, 'Boolean');\n } else {\n if (ValueListNode.is(right)) {\n return BinaryOperationNode.create(left, OperatorNode.create('in'), right);\n } else {\n // array contains\n return BinaryOperationNode.create(\n left,\n OperatorNode.create('='),\n FunctionNode.create('any', [right]),\n );\n }\n }\n }\n\n if (this.isNullNode(right)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(left, OperatorNode.create('is'), right)\n : BinaryOperationNode.create(left, OperatorNode.create('is not'), right);\n } else if (this.isNullNode(left)) {\n return expr.op === '=='\n ? BinaryOperationNode.create(right, OperatorNode.create('is'), ValueNode.createImmediate(null))\n : BinaryOperationNode.create(right, OperatorNode.create('is not'), ValueNode.createImmediate(null));\n }\n\n return BinaryOperationNode.create(left, this.transformOperator(op), right);\n }\n\n private transformCollectionPredicate(expr: BinaryExpression, context: ExpressionTransformerContext<Schema>) {\n invariant(expr.op === '?' || expr.op === '!' || expr.op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n if (this.isAuthCall(expr.left) || this.isAuthMember(expr.left)) {\n const value = new ExpressionEvaluator().evaluate(expr, {\n auth: this.auth,\n });\n return this.transformValue(value, 'Boolean');\n }\n\n invariant(\n ExpressionUtils.isField(expr.left) || ExpressionUtils.isMember(expr.left),\n 'left operand must be field or member access',\n );\n\n let newContextModel: string;\n if (ExpressionUtils.isField(expr.left)) {\n const fieldDef = requireField(this.schema, context.model, expr.left.field);\n newContextModel = fieldDef.type;\n } else {\n invariant(ExpressionUtils.isField(expr.left.receiver));\n const fieldDef = requireField(this.schema, context.model, expr.left.receiver.field);\n newContextModel = fieldDef.type;\n for (const member of expr.left.members) {\n const memberDef = requireField(this.schema, newContextModel, member);\n newContextModel = memberDef.type;\n }\n }\n\n let predicateFilter = this.transform(expr.right, {\n ...context,\n model: newContextModel as GetModels<Schema>,\n alias: undefined,\n thisEntity: undefined,\n });\n\n if (expr.op === '!') {\n predicateFilter = logicalNot(predicateFilter);\n }\n\n const count = FunctionNode.create('count', [ValueNode.createImmediate(1)]);\n\n const predicateResult = match(expr.op)\n .with('?', () => BinaryOperationNode.create(count, OperatorNode.create('>'), ValueNode.createImmediate(0)))\n .with('!', () => BinaryOperationNode.create(count, OperatorNode.create('='), ValueNode.createImmediate(0)))\n .with('^', () => BinaryOperationNode.create(count, OperatorNode.create('='), ValueNode.createImmediate(0)))\n .exhaustive();\n\n return this.transform(expr.left, {\n ...context,\n memberSelect: SelectionNode.create(AliasNode.create(predicateResult, IdentifierNode.create('$t'))),\n memberFilter: predicateFilter,\n });\n }\n\n private transformAuthBinary(expr: BinaryExpression) {\n if (expr.op !== '==' && expr.op !== '!=') {\n throw new Error(`Unsupported operator for auth call: ${expr.op}`);\n }\n let other: Expression;\n if (this.isAuthCall(expr.left)) {\n other = expr.right;\n } else {\n other = expr.left;\n }\n\n if (ExpressionUtils.isNull(other)) {\n return this.transformValue(expr.op === '==' ? !this.auth : !!this.auth, 'Boolean');\n } else {\n throw new Error('Unsupported binary expression with `auth()`');\n }\n }\n\n private transformValue(value: unknown, type: BuiltinType) {\n return ValueNode.create(this.dialect.transformPrimitive(value, type, false) ?? null);\n }\n\n @expr('unary')\n // @ts-ignore\n private _unary(expr: UnaryExpression, context: ExpressionTransformerContext<Schema>) {\n // only '!' operator for now\n invariant(expr.op === '!', 'only \"!\" operator is supported');\n return BinaryOperationNode.create(\n this.transform(expr.operand, context),\n this.transformOperator('!='),\n trueNode(this.dialect),\n );\n }\n\n private transformOperator(op: Exclude<BinaryOperator, '?' | '!' | '^'>) {\n const mappedOp = match(op)\n .with('==', () => '=' as const)\n .otherwise(() => op);\n return OperatorNode.create(mappedOp);\n }\n\n @expr('call')\n // @ts-ignore\n private _call(expr: CallExpression, context: ExpressionTransformerContext<Schema>) {\n const result = this.transformCall(expr, context);\n return result.toOperationNode();\n }\n\n private transformCall(expr: CallExpression, context: ExpressionTransformerContext<Schema>) {\n const func = this.clientOptions.functions?.[expr.function];\n if (!func) {\n throw new QueryError(`Function not implemented: ${expr.function}`);\n }\n const eb = expressionBuilder<any, any>();\n return func(\n eb,\n (expr.args ?? []).map((arg) => this.transformCallArg(eb, arg, context)),\n {\n dialect: this.dialect,\n model: context.model,\n operation: context.operation,\n },\n );\n }\n\n private transformCallArg(\n eb: ExpressionBuilder<any, any>,\n arg: Expression,\n context: ExpressionTransformerContext<Schema>,\n ): OperandExpression<any> {\n if (ExpressionUtils.isLiteral(arg)) {\n return eb.val(arg.value);\n }\n\n if (ExpressionUtils.isField(arg)) {\n return context.thisEntityRaw ? eb.val(context.thisEntityRaw[arg.field]) : eb.ref(arg.field);\n }\n\n if (ExpressionUtils.isCall(arg)) {\n return this.transformCall(arg, context);\n }\n\n if (this.isAuthMember(arg)) {\n const valNode = this.valueMemberAccess(context.auth, arg as MemberExpression, this.authType);\n return valNode ? eb.val(valNode.value) : eb.val(null);\n }\n\n // TODO\n // if (Expression.isMember(arg)) {\n // }\n\n throw new InternalError(`Unsupported argument expression: ${arg.kind}`);\n }\n\n @expr('member')\n // @ts-ignore\n private _member(expr: MemberExpression, context: ExpressionTransformerContext<Schema>) {\n // auth() member access\n if (this.isAuthCall(expr.receiver)) {\n return this.valueMemberAccess(this.auth, expr, this.authType);\n }\n\n invariant(ExpressionUtils.isField(expr.receiver), 'expect receiver to be field expression');\n\n const { memberFilter, memberSelect, ...restContext } = context;\n\n const receiver = this.transform(expr.receiver, restContext);\n invariant(SelectQueryNode.is(receiver), 'expected receiver to be select query');\n\n // relation member access\n const receiverField = requireField(this.schema, context.model, expr.receiver.field);\n\n // traverse forward to collect member types\n const memberFields: { fromModel: string; fieldDef: FieldDef }[] = [];\n let currType = receiverField.type;\n for (const member of expr.members) {\n const fieldDef = requireField(this.schema, currType, member);\n memberFields.push({ fieldDef, fromModel: currType });\n currType = fieldDef.type;\n }\n\n let currNode: SelectQueryNode | ColumnNode | ReferenceNode | undefined = undefined;\n\n for (let i = expr.members.length - 1; i >= 0; i--) {\n const member = expr.members[i]!;\n const { fieldDef, fromModel } = memberFields[i]!;\n\n if (fieldDef.relation) {\n const relation = this.transformRelationAccess(member, fieldDef.type, {\n ...restContext,\n model: fromModel as GetModels<Schema>,\n alias: undefined,\n thisEntity: undefined,\n });\n\n if (currNode) {\n invariant(SelectQueryNode.is(currNode), 'expected select query node');\n currNode = {\n ...relation,\n selections: [\n SelectionNode.create(\n AliasNode.create(currNode, IdentifierNode.create(expr.members[i + 1]!)),\n ),\n ],\n };\n } else {\n // inner most member, merge with member filter from the context\n currNode = {\n ...relation,\n where: this.mergeWhere(relation.where, memberFilter),\n selections: memberSelect ? [memberSelect] : relation.selections,\n };\n }\n } else {\n invariant(i === expr.members.length - 1, 'plain field access must be the last segment');\n invariant(!currNode, 'plain field access must be the last segment');\n\n currNode = ColumnNode.create(member);\n }\n }\n\n return {\n ...receiver,\n selections: [SelectionNode.create(AliasNode.create(currNode!, IdentifierNode.create('$t')))],\n };\n }\n\n private valueMemberAccess(receiver: any, expr: MemberExpression, receiverType: string) {\n if (!receiver) {\n return ValueNode.createImmediate(null);\n }\n\n if (expr.members.length !== 1) {\n throw new Error(`Only single member access is supported`);\n }\n\n const field = expr.members[0]!;\n const fieldDef = requireField(this.schema, receiverType, field);\n const fieldValue = receiver[field] ?? null;\n return this.transformValue(fieldValue, fieldDef.type as BuiltinType);\n }\n\n private transformRelationAccess(\n field: string,\n relationModel: string,\n context: ExpressionTransformerContext<Schema>,\n ): SelectQueryNode {\n const fromModel = context.model;\n const { keyPairs, ownedByModel } = getRelationForeignKeyFieldPairs(this.schema, fromModel, field);\n\n if (context.thisEntity) {\n let condition: OperationNode;\n if (ownedByModel) {\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(relationModel)),\n OperatorNode.create('='),\n context.thisEntity![fk]!,\n ),\n ),\n );\n } else {\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(relationModel)),\n OperatorNode.create('='),\n context.thisEntity![pk]!,\n ),\n ),\n );\n }\n\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(relationModel)]),\n where: WhereNode.create(condition),\n };\n } else {\n let condition: OperationNode;\n if (ownedByModel) {\n // `fromModel` owns the fk\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(context.alias ?? fromModel)),\n OperatorNode.create('='),\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(relationModel)),\n ),\n ),\n );\n } else {\n // `relationModel` owns the fk\n condition = conjunction(\n this.dialect,\n keyPairs.map(({ fk, pk }) =>\n BinaryOperationNode.create(\n ReferenceNode.create(ColumnNode.create(pk), TableNode.create(context.alias ?? fromModel)),\n OperatorNode.create('='),\n ReferenceNode.create(ColumnNode.create(fk), TableNode.create(relationModel)),\n ),\n ),\n );\n }\n\n return {\n kind: 'SelectQueryNode',\n from: FromNode.create([TableNode.create(relationModel)]),\n where: WhereNode.create(condition),\n };\n }\n }\n\n private createColumnRef(column: string, context: ExpressionTransformerContext<Schema>): ReferenceNode {\n return ReferenceNode.create(ColumnNode.create(column), TableNode.create(context.alias ?? context.model));\n }\n\n private isAuthCall(value: unknown): value is CallExpression {\n return ExpressionUtils.isCall(value) && value.function === 'auth';\n }\n\n private isAuthMember(expr: Expression) {\n return ExpressionUtils.isMember(expr) && this.isAuthCall(expr.receiver);\n }\n\n private isNullNode(node: OperationNode) {\n return ValueNode.is(node) && node.value === null;\n }\n}\n","import { invariant } from '@zenstackhq/common-helpers';\nimport { match } from 'ts-pattern';\nimport {\n ExpressionUtils,\n type ArrayExpression,\n type BinaryExpression,\n type CallExpression,\n type Expression,\n type FieldExpression,\n type LiteralExpression,\n type MemberExpression,\n type UnaryExpression,\n} from '../../schema';\n\ntype ExpressionEvaluatorContext = {\n auth?: any;\n thisValue?: any;\n};\n\n/**\n * Evaluate a schema expression into a JavaScript value.\n */\nexport class ExpressionEvaluator {\n evaluate(expression: Expression, context: ExpressionEvaluatorContext): any {\n const result = match(expression)\n .when(ExpressionUtils.isArray, (expr) => this.evaluateArray(expr, context))\n .when(ExpressionUtils.isBinary, (expr) => this.evaluateBinary(expr, context))\n .when(ExpressionUtils.isField, (expr) => this.evaluateField(expr, context))\n .when(ExpressionUtils.isLiteral, (expr) => this.evaluateLiteral(expr))\n .when(ExpressionUtils.isMember, (expr) => this.evaluateMember(expr, context))\n .when(ExpressionUtils.isUnary, (expr) => this.evaluateUnary(expr, context))\n .when(ExpressionUtils.isCall, (expr) => this.evaluateCall(expr, context))\n .when(ExpressionUtils.isThis, () => context.thisValue)\n .when(ExpressionUtils.isNull, () => null)\n .exhaustive();\n\n return result ?? null;\n }\n\n private evaluateCall(expr: CallExpression, context: ExpressionEvaluatorContext): any {\n if (expr.function === 'auth') {\n return context.auth;\n } else {\n throw new Error(`Unsupported call expression function: ${expr.function}`);\n }\n }\n\n private evaluateUnary(expr: UnaryExpression, context: ExpressionEvaluatorContext) {\n return match(expr.op)\n .with('!', () => !this.evaluate(expr.operand, context))\n .exhaustive();\n }\n\n private evaluateMember(expr: MemberExpression, context: ExpressionEvaluatorContext) {\n let val = this.evaluate(expr.receiver, context);\n for (const member of expr.members) {\n val = val?.[member];\n }\n return val;\n }\n\n private evaluateLiteral(expr: LiteralExpression): any {\n return expr.value;\n }\n\n private evaluateField(expr: FieldExpression, context: ExpressionEvaluatorContext): any {\n return context.thisValue?.[expr.field];\n }\n\n private evaluateArray(expr: ArrayExpression, context: ExpressionEvaluatorContext) {\n return expr.items.map((item) => this.evaluate(item, context));\n }\n\n private evaluateBinary(expr: BinaryExpression, context: ExpressionEvaluatorContext) {\n if (expr.op === '?' || expr.op === '!' || expr.op === '^') {\n return this.evaluateCollectionPredicate(expr, context);\n }\n\n const left = this.evaluate(expr.left, context);\n const right = this.evaluate(expr.right, context);\n\n return match(expr.op)\n .with('==', () => left === right)\n .with('!=', () => left !== right)\n .with('>', () => left > right)\n .with('>=', () => left >= right)\n .with('<', () => left < right)\n .with('<=', () => left <= right)\n .with('&&', () => left && right)\n .with('||', () => left || right)\n .with('in', () => {\n const _right = right ?? [];\n invariant(Array.isArray(_right), 'expected array for \"in\" operator');\n return _right.includes(left);\n })\n .exhaustive();\n }\n\n private evaluateCollectionPredicate(expr: BinaryExpression, context: ExpressionEvaluatorContext) {\n const op = expr.op;\n invariant(op === '?' || op === '!' || op === '^', 'expected \"?\" or \"!\" or \"^\" operator');\n\n const left = this.evaluate(expr.left, context);\n if (!left) {\n return false;\n }\n\n invariant(Array.isArray(left), 'expected array');\n\n return match(op)\n .with('?', () => left.some((item: any) => this.evaluate(expr.right, { ...context, thisValue: item })))\n .with('!', () => left.every((item: any) => this.evaluate(expr.right, { ...context, thisValue: item })))\n .with(\n '^',\n () =>\n !left.some((item: any) =>\n this.evaluate(expr.right, {\n ...context,\n thisValue: item,\n }),\n ),\n )\n .exhaustive();\n }\n}\n","import type { OperationNode } from 'kysely';\nimport {\n AliasNode,\n AndNode,\n BinaryOperationNode,\n FunctionNode,\n OperatorNode,\n OrNode,\n ParensNode,\n ReferenceNode,\n TableNode,\n UnaryOperationNode,\n ValueNode,\n} from 'kysely';\nimport type { BaseCrudDialect } from '../../client/crud/dialects/base';\nimport type { SchemaDef } from '../../schema';\n\n/**\n * Creates a `true` value node.\n */\nexport function trueNode<Schema extends SchemaDef>(dialect: BaseCrudDialect<Schema>) {\n return ValueNode.createImmediate(dialect.transformPrimitive(true, 'Boolean', false));\n}\n\n/**\n * Creates a `false` value node.\n */\nexport function falseNode<Schema extends SchemaDef>(dialect: BaseCrudDialect<Schema>) {\n return ValueNode.createImmediate(dialect.transformPrimitive(false, 'Boolean', false));\n}\n\n/**\n * Checks if a node is a truthy value node.\n */\nexport function isTrueNode(node: OperationNode): boolean {\n return ValueNode.is(node) && (node.value === true || node.value === 1);\n}\n\n/**\n * Checks if a node is a falsy value node.\n */\nexport function isFalseNode(node: OperationNode): boolean {\n return ValueNode.is(node) && (node.value === false || node.value === 0);\n}\n\n/**\n * Builds a logical conjunction of a list of nodes.\n */\nexport function conjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.some(isFalseNode)) {\n return falseNode(dialect);\n }\n const items = nodes.filter((n) => !isTrueNode(n));\n if (items.length === 0) {\n return trueNode(dialect);\n }\n return items.reduce((acc, node) =>\n OrNode.is(node)\n ? AndNode.create(acc, ParensNode.create(node)) // wraps parentheses\n : AndNode.create(acc, node),\n );\n}\n\nexport function disjunction<Schema extends SchemaDef>(\n dialect: BaseCrudDialect<Schema>,\n nodes: OperationNode[],\n): OperationNode {\n if (nodes.some(isTrueNode)) {\n return trueNode(dialect);\n }\n const items = nodes.filter((n) => !isFalseNode(n));\n if (items.length === 0) {\n return falseNode(dialect);\n }\n return items.reduce((acc, node) =>\n AndNode.is(node)\n ? OrNode.create(acc, ParensNode.create(node)) // wraps parentheses\n : OrNode.create(acc, node),\n );\n}\n\n/**\n * Negates a logical expression.\n */\nexport function logicalNot(node: OperationNode): OperationNode {\n return UnaryOperationNode.create(\n OperatorNode.create('not'),\n AndNode.is(node) || OrNode.is(node)\n ? ParensNode.create(node) // wraps parentheses\n : node,\n );\n}\n\n/**\n * Builds an expression node that checks if a node is true.\n */\nexport function buildIsTrue<Schema extends SchemaDef>(node: OperationNode, dialect: BaseCrudDialect<Schema>) {\n if (isTrueNode(node)) {\n return trueNode(dialect);\n } else if (isFalseNode(node)) {\n return falseNode(dialect);\n }\n return BinaryOperationNode.create(node, OperatorNode.create('='), trueNode(dialect));\n}\n\n/**\n * Builds an expression node that checks if a node is false.\n */\nexport function buildIsFalse<Schema extends SchemaDef>(node: OperationNode, dialect: BaseCrudDialect<Schema>) {\n if (isFalseNode(node)) {\n return trueNode(dialect);\n } else if (isTrueNode(node)) {\n return falseNode(dialect);\n }\n return BinaryOperationNode.create(\n // coalesce so null is treated as false\n FunctionNode.create('coalesce', [node, falseNode(dialect)]),\n OperatorNode.create('='),\n falseNode(dialect),\n );\n}\n\n/**\n * Gets the table name from a node.\n */\nexport function getTableName(node: OperationNode | undefined) {\n if (!node) {\n return node;\n }\n if (TableNode.is(node)) {\n return node.table.identifier.name;\n } else if (AliasNode.is(node)) {\n return getTableName(node.node);\n } else if (ReferenceNode.is(node) && node.table) {\n return getTableName(node.table);\n }\n return undefined;\n}\n","import { type OnKyselyQueryArgs, type RuntimePlugin } from '../../client/plugin';\nimport type { SchemaDef } from '../../schema';\nimport { PolicyHandler } from './policy-handler';\n\nexport class PolicyPlugin<Schema extends SchemaDef> implements RuntimePlugin<Schema> {\n get id() {\n return 'policy';\n }\n\n get name() {\n return 'Access Policy';\n }\n\n get description() {\n return 'Enforces access policies defined in the schema.';\n }\n\n onKyselyQuery({ query, client, proceed /*, transaction*/ }: OnKyselyQueryArgs<Schema>) {\n const handler = new PolicyHandler<Schema>(client);\n return handler.handle(query, proceed /*, transaction*/);\n }\n}\n"],"mappings":";;;;AAGO,IAAMA,wBAAN,cAAoCC,MAAAA;EAH3C,OAG2CA;;;;;EACvC,YACoBC,OACAC,QAClB;AACE,UAAMA,UAAU,+BAA+BD,QAAQ,OAAOA,QAAQ,EAAA,EAAI,GAAA,KAH1DA,QAAAA,OAAAA,KACAC,SAAAA;EAGpB;AACJ;;;ACVA,SAASC,aAAAA,kBAAiB;AAC1B,SACIC,aAAAA,YACAC,uBAAAA,sBACAC,cAAAA,aACAC,iBACAC,YAAAA,WACAC,kBAAAA,iBACAC,iBACAC,0BACAC,gBAAAA,eACAC,wBACAC,SACAC,eACAC,iBAAAA,gBACAC,mBAAAA,kBACAC,aAAAA,YACAC,iBACAC,aAAAA,YACAC,YACAC,aAAAA,kBAIG;AACP,SAASC,SAAAA,cAAa;;;ACzBtB,SAASC,SAAAA,cAAa;;;ACAtB,SAASC,aAAAA,kBAAiB;AAC1B,SACIC,OAAAA,YAMG;AACP,SAASC,SAAAA,cAAa;;;ACGf,IAAMC,aAAN,cAAyBC,MAAAA;EAZhC,OAYgCA;;;EAC5B,YAAYC,SAAiBC,OAAiB;AAC1C,UAAMD,SAAS;MAAEC;IAAM,CAAA;EAC3B;AACJ;AAKO,IAAMC,gBAAN,cAA4BH,MAAAA;EArBnC,OAqBmCA;;;AAAO;;;ACTnC,SAASI,SAASC,QAAmBC,OAAa;AACrD,SAAOD,OAAOE,OAAOD,KAAAA;AACzB;AAFgBF;AAIT,SAASI,aAAaH,QAAmBC,OAAa;AACzD,QAAMG,cAAcC,OAAOC,KAAKN,OAAOE,MAAM,EAAEK,KAAK,CAACC,MAAMA,EAAEC,YAAW,MAAOR,MAAMQ,YAAW,CAAA;AAChG,MAAI,CAACL,aAAa;AACd,UAAM,IAAIM,WAAW,UAAUT,KAAAA,uBAA4B;EAC/D;AACA,SAAOD,OAAOE,OAAOE,WAAAA;AACzB;AANgBD;AAQT,SAASQ,SAASX,QAAmBC,OAAeW,OAAa;AACpE,QAAMC,WAAWd,SAASC,QAAQC,KAAAA;AAClC,SAAOY,UAAUC,OAAOF,KAAAA;AAC5B;AAHgBD;AAKT,SAASI,aAAaf,QAAmBC,OAAeW,OAAa;AACxE,QAAMC,WAAWV,aAAaH,QAAQC,KAAAA;AACtC,MAAI,CAACY,SAASC,OAAOF,KAAAA,GAAQ;AACzB,UAAM,IAAIF,WAAW,UAAUE,KAAAA,yBAA8BX,KAAAA,GAAQ;EACzE;AACA,SAAOY,SAASC,OAAOF,KAAAA;AAC3B;AANgBG;AAQT,SAASC,YAAsChB,QAAmBC,OAAwB;AAC7F,QAAMY,WAAWV,aAAaH,QAAQC,KAAAA;AACtC,SAAOY,UAAUI;AACrB;AAHgBD;AAcT,SAASE,gCAAgCC,QAAmBC,OAAeC,eAAqB;AACnG,QAAMC,WAAWC,aAAaJ,QAAQC,OAAOC,aAAAA;AAE7C,MAAI,CAACC,UAAUE,UAAU;AACrB,UAAM,IAAIC,cAAc,UAAUJ,aAAAA,qBAAkC;EACxE;AAEA,MAAIC,SAASE,SAASE,QAAQ;AAC1B,QAAI,CAACJ,SAASE,SAASG,YAAY;AAC/B,YAAM,IAAIF,cAAc,8CAA8CJ,aAAAA,GAAgB;IAC1F;AAEA,WAAO;MACHO,UAAUN,SAASE,SAASE,OAAOG,IAAI,CAACC,GAAGC,OAAO;QAC9CC,IAAIF;QACJG,IAAIX,SAASE,SAAUG,WAAYI,CAAAA;MACvC,EAAA;MACAG,cAAc;IAClB;EACJ,OAAO;AACH,QAAI,CAACZ,SAASE,SAASW,UAAU;AAC7B,YAAM,IAAIV,cAAc,4CAA4CJ,aAAAA,GAAgB;IACxF;AAEA,UAAMe,gBAAgBb,aAAaJ,QAAQG,SAASe,MAAMf,SAASE,SAASW,QAAQ;AAEpF,QAAI,CAACC,cAAcZ,UAAU;AACzB,YAAM,IAAIC,cAAc,UAAUH,SAASE,SAASW,QAAQ,qBAAqB;IACrF;AACA,QAAI,CAACC,cAAcZ,SAASE,QAAQ;AAChC,YAAM,IAAID,cAAc,0CAA0CJ,aAAAA,GAAgB;IACtF;AACA,QAAI,CAACe,cAAcZ,SAASG,YAAY;AACpC,YAAM,IAAIF,cAAc,8CAA8CJ,aAAAA,GAAgB;IAC1F;AAGA,WAAO;MACHO,UAAUQ,cAAcZ,SAASE,OAAOG,IAAI,CAACC,GAAGC,OAAO;QACnDC,IAAIF;QACJG,IAAIG,cAAcZ,SAAUG,WAAYI,CAAAA;MAC5C,EAAA;MACAG,cAAc;IAClB;EACJ;AACJ;AA7CgBhB;AAyDT,SAASoB,gBAAgBC,QAAmBC,OAAeC,OAAa;AAC3E,QAAMC,WAAWC,aAAaJ,QAAQC,OAAOC,KAAAA;AAC7C,SAAO,CAAC,CAACC,SAASE;AACtB;AAHgBN;AAKT,SAASO,gBAAgBN,QAAmBC,OAAa;AAC5D,QAAMM,WAAWC,aAAaR,QAAQC,KAAAA;AACtC,QAAMQ,SAKF,CAAA;AACJ,aAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQN,SAASO,YAAY,GAAG;AAC9D,QAAI,OAAOH,UAAU,UAAU;AAC3B,YAAM,IAAII,cAAc,wCAAwCL,GAAAA,GAAM;IAC1E;AAEA,QAAI,OAAOC,MAAMK,SAAS,UAAU;AAEhCP,aAAOQ,KAAK;QAAEC,MAAMR;QAAKS,KAAKf,aAAaJ,QAAQC,OAAOS,GAAAA;MAAK,CAAA;IACnE,OAAO;AAEHD,aAAOQ,KAAK;QACRC,MAAMR;QACNU,MAAMR,OAAOS,YAAYT,OAAOU,KAAKX,KAAAA,EAAOY,IAAI,CAACC,MAAM;UAACA;UAAGpB,aAAaJ,QAAQC,OAAOuB,CAAAA;SAAG,CAAA;MAC9F,CAAA;IACJ;EACJ;AACA,SAAOf;AACX;AAzBgBH;AAmCT,SAASmB,cACZC,QACAC,OACAC,OACAC,SACAC,IACAC,YAAmB;AAEnB,QAAMC,WAAWC,aAAaP,QAAQC,OAAOC,KAAAA;AAC7C,MAAI,CAACI,SAASE,UAAU;AACpB,WAAOJ,GAAGK,IAAIJ,aAAa,GAAGA,UAAAA,IAAcH,KAAAA,KAAUA,KAAAA;EAC1D,OAAO;AACH,QAAIQ;AACJ,QAAI,oBAAoBP,SAAS;AAC7B,YAAMQ,iBAAiBR,QAAQQ;AAC/BD,iBAAWC,iBAAiBV,KAAAA,IAASC,KAAAA;IACzC;AACA,QAAI,CAACQ,UAAU;AACX,YAAM,IAAIE,WAAW,mBAAmBV,KAAAA,4CAAiDD,KAAAA,GAAQ;IACrG;AACA,WAAOS,SAASN,EAAAA;EACpB;AACJ;AAtBgBL;AA4BT,SAASc,OAAOC,QAAmBC,MAAY;AAClD,SAAO,CAAC,CAACD,OAAOE,QAAQD,IAAAA;AAC5B;AAFgBF;AAQT,SAASI,eACZC,QACAC,OACAC,YACAC,eACAC,oBAA0B;AAE1B,QAAM,EAAEC,UAAUC,aAAY,IAAKC,gCAAgCP,QAAQC,OAAOE,aAAAA;AAElF,SAAOE,SAASG,IAAI,CAAC,EAAEC,IAAIC,GAAE,MAAE;AAC3B,QAAIJ,cAAc;AAEd,aAAO;QAAC,GAAGF,kBAAAA,IAAsBM,EAAAA;QAAM,GAAGR,UAAAA,IAAcO,EAAAA;;IAC5D,OAAO;AAEH,aAAO;QAAC,GAAGL,kBAAAA,IAAsBK,EAAAA;QAAM,GAAGP,UAAAA,IAAcQ,EAAAA;;IAC5D;EACJ,CAAA;AACJ;AAlBgBX;AAoBT,SAASY,mBAA6CX,QAAmBC,OAAa;AACzF,QAAMW,WAAWC,YAAYb,QAAQC,KAAAA;AACrC,SAAOW,SAASJ,IAAI,CAACM,OAAO;IAAE,CAACA,CAAAA,GAAI;EAAM,EAAA;AAC7C;AAHgBH;AAKT,SAASI,sBAAsBf,QAAmBC,OAAee,OAAa;AACjF,QAAMC,WAAWC,aAAalB,QAAQC,OAAOe,KAAAA;AAC7C,MAAI,CAACC,SAASE,SAAS,CAACF,SAASG,UAAUC,UAAU;AACjD,WAAOC;EACX;AACA,QAAMC,mBAAmBL,aAAalB,QAAQiB,SAASO,MAAMP,SAASG,SAASC,QAAQ;AACvF,MAAIE,iBAAiBJ,OAAO;AAKxB,UAAMM,mBAAmB;MAACxB;MAAOgB,SAASO;MAAME,KAAI;AACpD,WAAO;MACHC,cAAcF,iBAAiB,CAAA,MAAOxB,QAAQ,MAAM;MACpD2B,YAAYX,SAASO;MACrBK,YAAYZ,SAASG,SAASC;MAC9BS,aAAaL,iBAAiB,CAAA,MAAOR,SAASO,OAAO,MAAM;MAC3DO,WAAWd,SAASG,SAASY,OACvB,IAAIf,SAASG,SAASY,IAAI,KAC1B,IAAIP,iBAAiB,CAAA,CAAE,KAAKA,iBAAiB,CAAA,CAAE;IACzD;EACJ,OAAO;AACH,WAAOH;EACX;AACJ;AAxBgBP;AA6BT,SAASkB,6BAA6BjC,QAAmBC,OAAeiC,QAAe;AAC1F,MAAI,OAAOA,WAAW,YAAY,CAACA,QAAQ;AACvC,WAAOA;EACX;AAEA,QAAMC,eAAeC,gBAAgBpC,QAAQC,KAAAA;AAC7C,QAAMoC,kBAAkBF,aAAaD,OAAO,CAACI,MAAM,UAAUA,CAAAA;AAC7D,MAAID,gBAAgBE,WAAW,GAAG;AAC9B,WAAOL;EACX;AAEA,QAAMM,SAAc,CAAC;AACrB,aAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQV,MAAAA,GAAS;AAC/C,QAAIG,gBAAgBQ,KAAK,CAAC,EAAEb,KAAI,MAAOA,SAASS,GAAAA,GAAM;AAElDE,aAAOG,OAAON,QAAQE,KAAAA;IAC1B,OAAO;AACHF,aAAOC,GAAAA,IAAOC;IAClB;EACJ;AACA,SAAOF;AACX;AArBgBP;;;AC9OhB,SAASc,WAAWC,qBAAqB;AAEzC,SAASC,WAAoC;AAC7C,SAASC,OAAOC,SAAS;;;ACKlB,SAASC,UAAaC,GAAgB;AACzC,MAAIA,MAAM,QAAQA,MAAMC,QAAW;AAC/B,WAAO,CAAA;EACX,WAAWC,MAAMC,QAAQH,CAAAA,GAAI;AACzB,WAAOA;EACX,OAAO;AACH,WAAO;MAACA;;EACZ;AACJ;AARgBD;;;ADuBT,IAAeK,kBAAf,MAAeA;EA/BtB,OA+BsBA;;;;;EAClB,YACuBC,QACAC,SACrB;SAFqBD,SAAAA;SACAC,UAAAA;EACpB;EAIHC,mBAAmBC,OAAgBC,OAAoBC,gBAAyB;AAC5E,WAAOF;EACX;EAgBAG,YACIC,IACAC,OACAC,YACAC,OACF;AACE,QAAIA,UAAU,QAAQA,UAAUC,QAAW;AACvC,aAAO,KAAKC,KAAKL,EAAAA;IACrB;AAEA,QAAIG,UAAU,OAAO;AACjB,aAAO,KAAKG,MAAMN,EAAAA;IACtB;AAEA,QAAIO,SAAS,KAAKF,KAAKL,EAAAA;AACvB,UAAMQ,SAASC,6BAA6B,KAAKhB,QAAQQ,OAAOE,KAAAA;AAEhE,eAAW,CAACO,KAAKC,OAAAA,KAAYC,OAAOC,QAAQL,MAAAA,GAAS;AACjD,UAAIG,YAAYP,QAAW;AACvB;MACJ;AAEA,UAAIM,IAAII,WAAW,GAAA,GAAM;AACrB;MACJ;AAEA,UAAIJ,QAAQ,SAASA,QAAQ,QAAQA,QAAQ,OAAO;AAChDH,iBAAS,KAAKQ,IAAIf,IAAIO,QAAQ,KAAKS,qBAAqBhB,IAAIC,OAAOC,YAAYQ,KAAKC,OAAAA,CAAAA;AACpF;MACJ;AAEA,YAAMM,WAAWC,aAAa,KAAKzB,QAAQQ,OAAOS,GAAAA;AAClD,UAAIO,SAASE,UAAU;AACnBZ,iBAAS,KAAKQ,IAAIf,IAAIO,QAAQ,KAAKa,oBAAoBpB,IAAIC,OAAOC,YAAYQ,KAAKO,UAAUN,OAAAA,CAAAA;MACjG,WAAWM,SAASI,OAAO;AACvBd,iBAAS,KAAKQ,IAAIf,IAAIO,QAAQ,KAAKe,iBAAiBtB,IAAIC,OAAOC,YAAYQ,KAAKO,UAAUN,OAAAA,CAAAA;MAC9F,OAAO;AACHJ,iBAAS,KAAKQ,IAAIf,IAAIO,QAAQ,KAAKgB,qBAAqBvB,IAAIC,OAAOC,YAAYQ,KAAKO,UAAUN,OAAAA,CAAAA;MAClG;IACJ;AAGA,QAAI,WAAWH,UAAU,OAAOA,OAAO,OAAA,MAAa,YAAY;AAC5DD,eAAS,KAAKQ,IAAIf,IAAIO,QAAQC,OAAO,OAAA,EAASR,EAAAA,CAAAA;IAClD;AAEA,WAAOO;EACX;EAEUS,qBACNhB,IACAC,OACAC,YACAQ,KACAC,SACmB;AACnB,WAAOa,MAAMd,GAAAA,EACRe,KAAK,OAAO,MACT,KAAKV,IACDf,IAAAA,GACG0B,UAAUf,OAAAA,EAASgB,IAAI,CAACC,eAAe,KAAK7B,YAAYC,IAAIC,OAAOC,YAAY0B,UAAAA,CAAAA,CAAAA,CAAAA,EAGzFH,KAAK,MAAM,MACR,KAAKI,GACD7B,IAAAA,GACG0B,UAAUf,OAAAA,EAASgB,IAAI,CAACC,eAAe,KAAK7B,YAAYC,IAAIC,OAAOC,YAAY0B,UAAAA,CAAAA,CAAAA,CAAAA,EAGzFH,KAAK,OAAO,MAAMzB,GAAG8B,IAAI,KAAKd,qBAAqBhB,IAAIC,OAAOC,YAAY,OAAOS,OAAAA,CAAAA,CAAAA,EACjFoB,WAAU;EACnB;EAEQX,oBACJpB,IACAC,OACAC,YACA8B,OACAf,UACAN,SACF;AACE,QAAI,CAACM,SAASI,OAAO;AACjB,aAAO,KAAKY,yBAAyBjC,IAAIC,OAAOC,YAAY8B,OAAOf,UAAUN,OAAAA;IACjF,OAAO;AACH,aAAO,KAAKuB,0BAA0BlC,IAAIC,OAAOC,YAAY8B,OAAOf,UAAUN,OAAAA;IAClF;EACJ;EAEQsB,yBACJjC,IACAC,OACAkC,OACAH,OACAf,UACAN,SACmB;AACnB,QAAIA,YAAY,MAAM;AAClB,YAAM,EAAEyB,cAAcC,SAAQ,IAAKC,gCAAgC,KAAK7C,QAAQQ,OAAO+B,KAAAA;AAEvF,UAAII,cAAc;AAEd,eAAO,KAAKrB,IAAIf,IAAAA,GAAOqC,SAASV,IAAI,CAAC,EAAEY,GAAE,MAAOvC,GAAGwC,IAAIC,IAAI,GAAGN,KAAAA,IAASI,EAAAA,EAAI,GAAG,MAAM,IAAA,CAAA,CAAA;MACxF,OAAO;AAEH,eAAO,KAAKN,yBAAyBjC,IAAIC,OAAOkC,OAAOH,OAAOf,UAAU;UAAEyB,IAAI;QAAK,CAAA;MACvF;IACJ;AAEA,UAAMC,YAAY,GAAGR,KAAAA,IAASH,KAAAA;AAC9B,UAAMY,YAAYC,eAAe,KAAKpD,QAAQQ,OAAOkC,OAAOH,OAAOW,SAAAA;AACnE,UAAMG,oBAAoB,GAAGd,KAAAA;AAE7B,UAAMe,aAAa/C,GACdgD,WAAW,GAAG/B,SAASgC,IAAI,OAAON,SAAAA,EAAW,EAC7CxC,MAAM,MAAM,KAAKY,IAAIf,IAAAA,GAAO4C,UAAUjB,IAAI,CAAC,CAACuB,MAAMC,KAAAA,MAAWnD,GAAGwC,IAAIC,IAAIS,IAAAA,GAAO,KAAKV,IAAIC,IAAIU,KAAAA,CAAAA,CAAAA,CAAAA,CAAAA,EAC5FC,OAAO,MAAMpD,GAAGqD,GAAGC,MAAMtD,GAAGuD,IAAI,CAAA,CAAA,EAAIC,GAAGV,iBAAAA,CAAAA;AAE5C,UAAMW,aAAoC,CAAA;AAE1C,QAAI,QAAQ9C,WAAW,WAAWA,SAAS;AACvC,UAAI,QAAQA,SAAS;AACjB,YAAIA,QAAQ+B,OAAO,MAAM;AAErBe,qBAAWC,KAAK1D,GAAG+C,YAAY,KAAK,CAAA,CAAA;QACxC,OAAO;AAEHU,qBAAWC,KACP1D,GACI+C,WAAW5C,MAAM,MAAM,KAAKJ,YAAYC,IAAIiB,SAASgC,MAAMN,WAAWhC,QAAQ+B,EAAE,CAAA,GAChF,KACA,CAAA,CAAA;QAGZ;MACJ;AAEA,UAAI,WAAW/B,SAAS;AACpB,YAAIA,QAAQgD,UAAU,MAAM;AAExBF,qBAAWC,KAAK1D,GAAG+C,YAAY,KAAK,CAAA,CAAA;QACxC,OAAO;AACHU,qBAAWC,KACP,KAAK7B;YACD7B;;YAEAA,GAAG+C,YAAY,KAAK,CAAA;;YAEpB/C,GACI+C,WAAW5C,MAAM,MAAM,KAAKJ,YAAYC,IAAIiB,SAASgC,MAAMN,WAAWhC,QAAQgD,KAAK,CAAA,GACnF,KACA,CAAA;UAAA,CAAA;QAIhB;MACJ;IACJ,OAAO;AACHF,iBAAWC,KACP1D,GACI+C,WAAW5C,MAAM,MAAM,KAAKJ,YAAYC,IAAIiB,SAASgC,MAAMN,WAAWhC,OAAAA,CAAAA,GACtE,KACA,CAAA,CAAA;IAGZ;AAEA,WAAO,KAAKI,IAAIf,IAAAA,GAAOyD,UAAAA;EAC3B;EAEQvB,0BACJlC,IACAC,OACAkC,OACAH,OACAf,UACAN,SACF;AAEE,QAAIA,YAAY,MAAM;AAClB,aAAOX,GAAGwC,IAAIC,IAAI,GAAGN,KAAAA,IAASH,KAAAA,EAAO,GAAG,MAAM,IAAA;IAClD;AAEA,UAAM4B,gBAAgB3C,SAASgC;AAE/B,UAAMY,qBAAqB,wBAAC7D,QAAAA;AACxB,YAAM8D,MAAMC,sBAAsB,KAAKtE,QAAQQ,OAAO+B,KAAAA;AACtD,UAAI8B,KAAK;AAEL,cAAME,eAAeC,YAAY,KAAKxE,QAAQQ,KAAAA,EAAO,CAAA;AACrD,cAAMiE,kBAAkBD,YAAY,KAAKxE,QAAQmE,aAAAA,EAAe,CAAA;AAChE,eAAO5D,IACHwC,IAAIC,IAAI,GAAGmB,aAAAA,IAAiBM,eAAAA,EAAiB,GAC7C,MACAlE,IACKgD,WAAWc,IAAIK,SAAS,EACxBf,OAAO,GAAGU,IAAIK,SAAS,IAAIL,IAAIM,WAAW,EAAE,EAC5CC,SACG7B,IAAIC,IAAI,GAAGqB,IAAIK,SAAS,IAAIL,IAAIQ,YAAY,EAAE,GAC9C,KACA9B,IAAIC,IAAI,GAAGN,KAAAA,IAAS6B,YAAAA,EAAc,CAAA,CAAA;MAGlD,OAAO;AACH,cAAMO,mBAAmBjC,gCAAgC,KAAK7C,QAAQQ,OAAO+B,KAAAA;AAE7E,YAAIzB,UAAS,KAAKF,KAAKL,GAAAA;AACvB,mBAAW,EAAEuC,IAAIiC,GAAE,KAAMD,iBAAiBlC,UAAU;AAChD,cAAIkC,iBAAiBnC,cAAc;AAC/B7B,YAAAA,UAAS,KAAKQ,IACVf,KACAO,SACAP,IAAGwC,IAAIC,IAAI,GAAGN,KAAAA,IAASI,EAAAA,EAAI,GAAG,KAAKC,IAAIC,IAAI,GAAGmB,aAAAA,IAAiBY,EAAAA,EAAI,CAAA,CAAA;UAE3E,OAAO;AACHjE,YAAAA,UAAS,KAAKQ,IACVf,KACAO,SACAP,IAAGwC,IAAIC,IAAI,GAAGN,KAAAA,IAASqC,EAAAA,EAAI,GAAG,KAAKhC,IAAIC,IAAI,GAAGmB,aAAAA,IAAiBrB,EAAAA,EAAI,CAAA,CAAA;UAE3E;QACJ;AACA,eAAOhC;MACX;IACJ,GAvC2B;AAyC3B,QAAIA,SAAS,KAAKF,KAAKL,EAAAA;AAEvB,eAAW,CAACU,KAAKkB,UAAAA,KAAehB,OAAOC,QAAQF,OAAAA,GAAU;AACrD,UAAI,CAACiB,YAAY;AACb;MACJ;AAEA,cAAQlB,KAAAA;QACJ,KAAK,QAAQ;AACTH,mBAAS,KAAKQ,IACVf,IACAO,QACAP,GACIA,GACKgD,WAAWY,aAAAA,EACXR,OAAO,CAACqB,QAAQA,IAAIpB,GAAGC,MAAMmB,IAAIlB,IAAI,CAAA,CAAA,EAAIC,GAAG,OAAA,CAAA,EAC5CrD,MAAM0D,mBAAmB7D,EAAAA,CAAAA,EACzBG,MAAM,CAACsE,QAAQ,KAAK1E,YAAY0E,KAAKb,eAAeA,eAAehC,UAAAA,CAAAA,GACxE,KACA,CAAA,CAAA;AAGR;QACJ;QAEA,KAAK,SAAS;AACVrB,mBAAS,KAAKQ,IACVf,IACAO,QACAP,GACIA,GACKgD,WAAWY,aAAAA,EACXR,OAAO,CAACqB,QAAQA,IAAIpB,GAAGC,MAAMmB,IAAIlB,IAAI,CAAA,CAAA,EAAIC,GAAG,OAAA,CAAA,EAC5CrD,MAAM0D,mBAAmB7D,EAAAA,CAAAA,EACzBG,MAAM,CAACsE,QACJA,IAAI3C,IAAI,KAAK/B,YAAY0E,KAAKb,eAAeA,eAAehC,UAAAA,CAAAA,CAAAA,GAEpE,KACA,CAAA,CAAA;AAGR;QACJ;QAEA,KAAK,QAAQ;AACTrB,mBAAS,KAAKQ,IACVf,IACAO,QACAP,GACIA,GACKgD,WAAWY,aAAAA,EACXR,OAAO,CAACqB,QAAQA,IAAIpB,GAAGC,MAAMmB,IAAIlB,IAAI,CAAA,CAAA,EAAIC,GAAG,OAAA,CAAA,EAC5CrD,MAAM0D,mBAAmB7D,EAAAA,CAAAA,EACzBG,MAAM,CAACsE,QAAQ,KAAK1E,YAAY0E,KAAKb,eAAeA,eAAehC,UAAAA,CAAAA,GACxE,KACA,CAAA,CAAA;AAGR;QACJ;MACJ;IACJ;AAEA,WAAOrB;EACX;EAEQe,iBACJtB,IACAC,OACAC,YACA8B,OACAf,UACAN,SACF;AACE,UAAM+D,UAAiC,CAAA;AACvC,UAAMC,YAAY1D,SAASgC;AAC3B,UAAM2B,WAAWC,cAAc,KAAKpF,QAAQQ,OAAO+B,OAAO,KAAKtC,SAASM,IAAIE,UAAAA;AAE5E,eAAW,CAACQ,KAAKoE,MAAAA,KAAWlE,OAAOC,QAAQF,OAAAA,GAAU;AACjD,UAAImE,WAAW1E,QAAW;AACtB;MACJ;AAEA,YAAMR,QAAQ,KAAKD,mBAAmBmF,QAAQH,WAAW,CAAC,CAAC1D,SAASI,KAAK;AAEzE,cAAQX,KAAAA;QACJ,KAAK,UAAU;AACXgE,kBAAQhB,KAAK,KAAKqB,mBAAmB/E,IAAI4E,UAAUD,WAAW3E,GAAGgF,IAAIpF,KAAAA,CAAAA,CAAAA;AACrE;QACJ;QAEA,KAAK,OAAO;AACR8E,kBAAQhB,KAAK1D,GAAG4E,UAAU,MAAM5E,GAAGgF,IAAI;YAACpF;WAAM,CAAA,CAAA;AAC9C;QACJ;QAEA,KAAK,YAAY;AACb8E,kBAAQhB,KAAK1D,GAAG4E,UAAU,MAAM5E,GAAGgF,IAAIpF,KAAAA,CAAAA,CAAAA;AACvC;QACJ;QAEA,KAAK,WAAW;AACZ8E,kBAAQhB,KAAK1D,GAAG4E,UAAU,MAAM5E,GAAGgF,IAAIpF,KAAAA,CAAAA,CAAAA;AACvC;QACJ;QAEA,KAAK,WAAW;AACZ8E,kBAAQhB,KAAK1D,GAAG4E,UAAUhF,UAAU,OAAO,MAAM,MAAMI,GAAGgF,IAAI,CAAA,CAAE,CAAA,CAAA;AAChE;QACJ;QAEA,SAAS;AACL,gBAAM,IAAIC,cAAc,6BAA6BvE,GAAAA,EAAK;QAC9D;MACJ;IACJ;AAEA,WAAO,KAAKK,IAAIf,IAAAA,GAAO0E,OAAAA;EAC3B;EAEAnD,qBACIvB,IACAC,OACAC,YACA8B,OACAf,UACAN,SACF;AACE,QAAIA,YAAY,MAAM;AAClB,aAAOX,GAAGwC,IAAIC,IAAI,GAAGvC,UAAAA,IAAc8B,KAAAA,EAAO,GAAG,MAAM,IAAA;IACvD;AAEA,QAAIkD,OAAO,KAAKzF,QAAQwB,SAASgC,IAAI,GAAG;AACpC,aAAO,KAAKkC,gBAAgBnF,IAAIE,YAAY8B,OAAOf,UAAUN,OAAAA;IACjE;AAEA,WACIa,MAAMP,SAASgC,IAAI,EACdxB,KAAK,UAAU,MAAM,KAAK2D,kBAAkBpF,IAAIE,YAAY8B,OAAOrB,OAAAA,CAAAA,EACnEc,KAAK4D,EAAEC,MAAM,OAAO,SAAS,WAAW,QAAA,GAAW,CAACrC,SACjD,KAAKsC,kBAAkBvF,IAAIC,OAAOC,YAAY8B,OAAOiB,MAAMtC,OAAAA,CAAAA,EAE9Dc,KAAK,WAAW,MAAM,KAAK+D,mBAAmBxF,IAAIE,YAAY8B,OAAOrB,OAAAA,CAAAA,EACrEc,KAAK,YAAY,MAAM,KAAKgE,oBAAoBzF,IAAIE,YAAY8B,OAAOrB,OAAAA,CAAAA,EACvEc,KAAK,SAAS,MAAM,KAAKiE,iBAAiB1F,IAAIE,YAAY8B,OAAOrB,OAAAA,CAAAA,EAEjEc,KAAK,QAAQ,MAAA;AACV,YAAM,IAAIwD,cAAc,oCAAA;IAC5B,CAAA,EACCxD,KAAK,eAAe,MAAA;AACjB,YAAM,IAAIkE,WAAW,6CAA6C;IACtE,CAAA,EACC5D,WAAU;EAEvB;EAEQgD,mBAAmB/E,IAAiC4F,KAAsB3C,MAAmB4C,KAAc;AAC/G,WAAO7F,GAAG4F,KAAK,KAAKC,QAAQ,QAAQA,QAAQzF,SAAY,KAAKT,mBAAmBkG,KAAK5C,MAAM,KAAA,IAAS4C,GAAAA;EACxG;EAEQC,oBACJ9F,IACAiD,MACAtC,SACAiF,KACAG,QACAC,SACAC,iBAAiB,OACjBC,cAAoC9F,QACtC;AACE,QAAIO,YAAY,QAAQ,CAACwF,cAAcxF,OAAAA,GAAU;AAC7C,aAAO;QACH8C,YAAY;UAAC,KAAKsB,mBAAmB/E,IAAI4F,KAAK3C,MAAMtC,OAAAA;;QACpDyF,cAAc,CAAA;MAClB;IACJ;AAEA,UAAM3C,aAAoC,CAAA;AAC1C,UAAM2C,eAAyB,CAAA;AAE/B,eAAW,CAACC,IAAIzG,KAAAA,KAAUgB,OAAOC,QAAQF,OAAAA,GAAU;AAC/C,UAAIuF,eAAe,CAACA,YAAYI,SAASD,EAAAA,GAAK;AAC1C;MACJ;AACA,YAAMR,MAAMU,MAAMC,QAAQ5G,KAAAA,IAASA,MAAM+B,IAAIoE,MAAAA,IAAUA,OAAOnG,KAAAA;AAC9D,YAAM6G,YAAYjF,MAAM6E,EAAAA,EACnB5E,KAAK,UAAU,MAAOoE,QAAQ,OAAO7F,GAAG4F,KAAK,MAAM,IAAA,IAAQ5F,GAAG4F,KAAK,KAAKC,GAAAA,CAAAA,EACxEpE,KAAK,MAAM,MAAA;AACRiF,kBAAUH,MAAMC,QAAQX,GAAAA,GAAM,kCAAA;AAC9B,YAAIA,IAAIc,WAAW,GAAG;AAClB,iBAAO,KAAKrG,MAAMN,EAAAA;QACtB,OAAO;AACH,iBAAOA,GAAG4F,KAAK,MAAMC,GAAAA;QACzB;MACJ,CAAA,EACCpE,KAAK,SAAS,MAAA;AACXiF,kBAAUH,MAAMC,QAAQX,GAAAA,GAAM,kCAAA;AAC9B,YAAIA,IAAIc,WAAW,GAAG;AAClB,iBAAO,KAAKtG,KAAKL,EAAAA;QACrB,OAAO;AACH,iBAAOA,GAAG8B,IAAI9B,GAAG4F,KAAK,MAAMC,GAAAA,CAAAA;QAChC;MACJ,CAAA,EACCpE,KAAK,MAAM,MAAMzB,GAAG4F,KAAK,KAAKC,GAAAA,CAAAA,EAC9BpE,KAAK,OAAO,MAAMzB,GAAG4F,KAAK,MAAMC,GAAAA,CAAAA,EAChCpE,KAAK,MAAM,MAAMzB,GAAG4F,KAAK,KAAKC,GAAAA,CAAAA,EAC9BpE,KAAK,OAAO,MAAMzB,GAAG4F,KAAK,MAAMC,GAAAA,CAAAA,EAChCpE,KAAK,OAAO,MAAMzB,GAAG8B,IAAIkE,QAAQpG,KAAAA,CAAAA,CAAAA,EACjCgH,UAAU,MAAA;AACP,YAAIX,gBAAgB;AAChB,gBAAM,IAAIN,WAAW,uBAAuBU,EAAAA,EAAI;QACpD,OAAO;AACH,iBAAOjG;QACX;MACJ,CAAA;AAEJ,UAAIqG,WAAW;AACXhD,mBAAWC,KAAK+C,SAAAA;AAChBL,qBAAa1C,KAAK2C,EAAAA;MACtB;IACJ;AAEA,WAAO;MAAE5C;MAAY2C;IAAa;EACtC;EAEQhB,kBACJpF,IACAmC,OACAH,OACArB,SACF;AACE,UAAMM,WAAW4F,SAAS,KAAKpH,QAAQ0C,OAAOH,KAAAA;AAC9C,QAAI4C,WAA4B3D,UAAU6F,WAAWtE,IAAIC,IAAIT,KAAAA,IAASQ,IAAIC,IAAI,GAAGN,KAAAA,IAASH,KAAAA,EAAO;AAEjG,QAAI+E,cAAc;AAClB,QAAIpG,WAAW,OAAOA,YAAY,YAAY,UAAUA,WAAWA,QAAQqG,SAAS,eAAe;AAC/FD,oBAAc;AACdnC,iBAAW5E,GAAGqD,GAAG,SAAS;QAACuB;OAAS;IACxC;AAEA,UAAM,EAAEnB,YAAY2C,aAAY,IAAK,KAAKN,oBACtC9F,IACA,UACAW,SACAiE,UACA,CAAChF,UAAU,KAAKqH,iBAAiBjH,IAAIJ,OAAOmH,WAAAA,GAC5C,CAACnH,UAAU,KAAKwF,kBAAkBpF,IAAImC,OAAOH,OAAOpC,KAAAA,CAAAA;AAGxD,QAAIe,WAAW,OAAOA,YAAY,UAAU;AACxC,iBAAW,CAACD,KAAKd,KAAAA,KAAUgB,OAAOC,QAAQF,OAAAA,GAAU;AAChD,YAAID,QAAQ,UAAU0F,aAAaE,SAAS5F,GAAAA,GAAM;AAE9C;QACJ;AAEA,cAAM+F,YAAYjF,MAAMd,GAAAA,EACnBe,KAAK,YAAY,MACdsF,cACM/G,GAAG4E,UAAU,SAASpC,IAAIe,IAAI,IAAI3D,KAAAA,GAAQ,CAAA,IAC1CI,GAAG4E,UAAU,QAAQpC,IAAIe,IAAI,IAAI3D,KAAAA,GAAQ,CAAA,CAAA,EAElD6B,KAAK,cAAc,MAChBsF,cACM/G,GAAG4E,UAAU,SAASpC,IAAIe,IAAI,GAAG3D,KAAAA,GAAQ,CAAA,IACzCI,GAAG4E,UAAU,QAAQpC,IAAIe,IAAI,GAAG3D,KAAAA,GAAQ,CAAA,CAAA,EAEjD6B,KAAK,YAAY,MACdsF,cACM/G,GAAG4E,UAAU,SAASpC,IAAIe,IAAI,IAAI3D,KAAAA,EAAO,CAAA,IACzCI,GAAG4E,UAAU,QAAQpC,IAAIe,IAAI,IAAI3D,KAAAA,EAAO,CAAA,CAAA,EAEjDgH,UAAU,MAAA;AACP,gBAAM,IAAIM,MAAM,8BAA8BxG,GAAAA,EAAK;QACvD,CAAA;AAEJ,YAAI+F,WAAW;AACXhD,qBAAWC,KAAK+C,SAAAA;QACpB;MACJ;IACJ;AAEA,WAAO,KAAK1F,IAAIf,IAAAA,GAAOyD,UAAAA;EAC3B;EAEQwD,iBAAiBjH,IAAiCJ,OAAgBuH,UAAmB,MAAW;AACpG,QAAI,OAAOvH,UAAU,UAAU;AAC3B,aAAOuH,UAAUnH,GAAGqD,GAAG,SAAS;QAACb,IAAIe,IAAI3D,KAAAA;OAAO,IAAI4C,IAAIe,IAAI3D,KAAAA;IAChE,WAAW2G,MAAMC,QAAQ5G,KAAAA,GAAQ;AAC7B,aAAOA,MAAM+B,IAAI,CAACyF,MAAM,KAAKH,iBAAiBjH,IAAIoH,GAAGD,OAAAA,CAAAA;IACzD,OAAO;AACH,aAAOvH,UAAU,OAAO,OAAO4C,IAAIe,IAAI3D,KAAAA;IAC3C;EACJ;EAEQ2F,kBACJvF,IACAC,OACAkC,OACAH,OACAiB,MACAtC,SACF;AACE,UAAM,EAAE8C,WAAU,IAAK,KAAKqC,oBACxB9F,IACAiD,MACAtC,SACAkE,cAAc,KAAKpF,QAAQQ,OAAO+B,OAAO,KAAKtC,SAASM,EAAAA,GACvD,CAACJ,UAAU,KAAKD,mBAAmBC,OAAOqD,MAAM,KAAA,GAChD,CAACrD,UAAU,KAAK2F,kBAAkBvF,IAAIC,OAAOkC,OAAOH,OAAOiB,MAAMrD,KAAAA,CAAAA;AAErE,WAAO,KAAKmB,IAAIf,IAAAA,GAAOyD,UAAAA;EAC3B;EAEQ+B,mBACJxF,IACAmC,OACAH,OACArB,SACF;AACE,UAAM,EAAE8C,WAAU,IAAK,KAAKqC,oBACxB9F,IACA,WACAW,SACA6B,IAAIC,IAAI,GAAGN,KAAAA,IAASH,KAAAA,EAAO,GAC3B,CAACpC,UAAU,KAAKD,mBAAmBC,OAAO,WAAW,KAAA,GACrD,CAACA,UAAU,KAAK4F,mBAAmBxF,IAAImC,OAAOH,OAAOpC,KAAAA,GACrD,MACA;MAAC;MAAU;KAAM;AAErB,WAAO,KAAKmB,IAAIf,IAAAA,GAAOyD,UAAAA;EAC3B;EAEQgC,oBACJzF,IACAmC,OACAH,OACArB,SACF;AACE,UAAM,EAAE8C,WAAU,IAAK,KAAKqC,oBACxB9F,IACA,YACAW,SACA6B,IAAIC,IAAI,GAAGN,KAAAA,IAASH,KAAAA,EAAO,GAC3B,CAACpC,UAAU,KAAKD,mBAAmBC,OAAO,YAAY,KAAA,GACtD,CAACA,UAAU,KAAK6F,oBAAoBzF,IAAImC,OAAOH,OAAOpC,KAAAA,GACtD,IAAA;AAEJ,WAAO,KAAKmB,IAAIf,IAAAA,GAAOyD,UAAAA;EAC3B;EAEQiC,iBACJ1F,IACAmC,OACAH,OACArB,SACF;AACE,UAAM8C,aAAa,KAAKqC,oBACpB9F,IACA,SACAW,SACA6B,IAAIC,IAAI,GAAGN,KAAAA,IAASH,KAAAA,EAAO,GAC3B,CAACpC,UAAU,KAAKD,mBAAmBC,OAAO,SAAS,KAAA,GACnD,CAACA,UAAU,KAAK8F,iBAAiB1F,IAAImC,OAAOH,OAAOpC,KAAAA,GACnD,MACA;MAAC;MAAU;MAAM;MAAS;KAAM;AAEpC,WAAO,KAAKmB,IAAIf,IAAAA,GAAOyD,WAAWA,UAAU;EAChD;EAEQ0B,gBACJnF,IACAmC,OACAH,OACAf,UACAN,SACF;AACE,UAAM8C,aAAa,KAAKqC,oBACpB9F,IACA,UACAW,SACA6B,IAAIC,IAAI,GAAGN,KAAAA,IAASH,KAAAA,EAAO,GAC3B,CAACpC,UAAUA,OACX,CAACA,UAAU,KAAKuF,gBAAgBnF,IAAImC,OAAOH,OAAOf,UAAUrB,KAAAA,GAC5D,MACA;MAAC;MAAU;MAAM;MAAS;KAAM;AAEpC,WAAO,KAAKmB,IAAIf,IAAAA,GAAOyD,WAAWA,UAAU;EAChD;EAEA4D,aACIC,OACArH,OACAC,YACAqH,SACAC,mBACAC,SACF;AACE,QAAI,CAACF,SAAS;AACV,UAAIC,mBAAmB;AACnBD,kBAAUG,mBAAmB,KAAKjI,QAAQQ,KAAAA;MAC9C,OAAO;AACH,eAAOqH;MACX;IACJ;AAEA,QAAI/G,SAAS+G;AACb5F,cAAU6F,OAAAA,EAASI,QAAQ,CAACJ,aAAAA;AACxB,iBAAW,CAACvF,OAAOpC,KAAAA,KAAUgB,OAAOC,QAAa0G,QAAAA,GAAU;AACvD,YAAI,CAAC3H,OAAO;AACR;QACJ;AAGA,YAAI;UAAC;UAAU;UAAQ;UAAQ;UAAQ;UAAQ0G,SAAStE,KAAAA,GAAQ;AAC5D0E,oBAAU9G,SAAS,OAAOA,UAAU,UAAU,oCAAoCoC,KAAAA,GAAQ;AAC1F,qBAAW,CAAC4F,GAAGR,CAAAA,KAAMxG,OAAOC,QAAgBjB,KAAAA,GAAQ;AAChD8G,sBAAUU,MAAM,SAASA,MAAM,QAAQ,oCAAoCpF,KAAAA,GAAQ;AACnFzB,qBAASA,OAAOgH,QACZ,CAACvH,OAAOA,GAAGqD,GAAGrB,MAAM6F,MAAM,CAAA,GAAI;cAACrF,IAAIC,IAAImF,CAAAA;aAAG,GAC1CpF,IAAIsF,IAAI,KAAKC,WAAWX,GAAGK,OAAAA,CAAAA,CAAAA;UAEnC;AACA;QACJ;AAEA,gBAAQzF,OAAAA;UACJ,KAAK,UAAU;AACX0E,sBAAU9G,SAAS,OAAOA,UAAU,UAAU,0CAAA;AAC9C,uBAAW,CAACgI,GAAGR,CAAAA,KAAMxG,OAAOC,QAAgBjB,KAAAA,GAAQ;AAChD8G,wBAAUU,MAAM,SAASA,MAAM,QAAQ,oCAAoCpF,KAAAA,GAAQ;AACnFzB,uBAASA,OAAOgH,QACZ,CAACvH,OAAOA,GAAGqD,GAAGC,MAAMd,IAAIC,IAAImF,CAAAA,CAAAA,GAC5BpF,IAAIsF,IAAI,KAAKC,WAAWX,GAAGK,OAAAA,CAAAA,CAAAA;YAEnC;AACA;UACJ;UACA;AACI;QACR;AAEA,cAAMxG,WAAWC,aAAa,KAAKzB,QAAQQ,OAAO+B,KAAAA;AAElD,YAAI,CAACf,SAASE,UAAU;AACpB,cAAIvB,UAAU,SAASA,UAAU,QAAQ;AACrCW,qBAASA,OAAOgH,QAAQ/E,IAAIC,IAAI,GAAGvC,UAAAA,IAAc8B,KAAAA,EAAO,GAAG,KAAK+F,WAAWnI,OAAO6H,OAAAA,CAAAA;UACtF,WACI7H,SACA,OAAOA,UAAU,YACjB,WAAWA,SACX,UAAUA,UACTA,MAAMoI,SAAS,SAASpI,MAAMoI,SAAS,YACvCpI,MAAMqI,UAAU,WAAWrI,MAAMqI,UAAU,SAC9C;AACE1H,qBAASA,OAAOgH,QACZ/E,IAAIC,IAAI,GAAGvC,UAAAA,IAAc8B,KAAAA,EAAO,GAChCQ,IAAIsF,IAAI,GAAG,KAAKC,WAAWnI,MAAMoI,MAAMP,OAAAA,CAAAA,UAAkB7H,MAAMqI,KAAK,EAAE,CAAA;UAE9E;QACJ,OAAO;AAEH,gBAAMrE,gBAAgB3C,SAASgC;AAE/B,cAAIhC,SAASI,OAAO;AAEhB,gBAAI,OAAOzB,UAAU,UAAU;AAC3B,oBAAM,IAAI+F,WAAW,oCAAoC3D,KAAAA,GAAQ;YACrE;AACA,gBAAI,YAAYpC,OAAO;AACnB8G,wBACI9G,MAAMsI,WAAW,SAAStI,MAAMsI,WAAW,QAC3C,0CAAA;AAEJ,oBAAMF,OAAO,KAAKD,WAAWnI,MAAMsI,QAAQT,OAAAA;AAC3ClH,uBAASA,OAAOgH,QAAQ,CAACvH,OAAAA;AACrB,oBAAImI,WAAWnI,GAAGgD,WAAWY,aAAAA;AAC7B,sBAAMhB,YAAYC,eAAe,KAAKpD,QAAQQ,OAAOC,YAAY8B,OAAO4B,aAAAA;AACxEuE,2BAAWA,SAAShI,MAAM,MACtB,KAAKY,IACDf,IAAAA,GACG4C,UAAUjB,IAAI,CAAC,CAACuB,MAAMC,KAAAA,MAAWnD,GAAGwC,IAAIC,IAAIS,IAAAA,GAAO,KAAKV,IAAIC,IAAIU,KAAAA,CAAAA,CAAAA,CAAAA,CAAAA;AAG3EgF,2BAAWA,SAAS/E,OAAO,MAAMpD,GAAGqD,GAAGC,MAAMtD,GAAGuD,IAAI,CAAA,CAAA,EAAIC,GAAG,QAAA,CAAA;AAC3D,uBAAO2E;cACX,GAAGH,IAAAA;YACP;UACJ,OAAO;AAEHzH,qBAASA,OAAO6H,SAASxE,eAAe,CAACyE,SAAAA;AACrC,oBAAMzF,YAAYC,eAAe,KAAKpD,QAAQQ,OAAOC,YAAY8B,OAAO4B,aAAAA;AACxE,qBAAOyE,KAAKC,GAAG,CAACtI,OACZ,KAAKe,IACDf,IAAAA,GACG4C,UAAUjB,IAAI,CAAC,CAACuB,MAAMC,KAAAA,MAAWnD,GAAGwC,IAAIC,IAAIS,IAAAA,GAAO,KAAKV,IAAIC,IAAIU,KAAAA,CAAAA,CAAAA,CAAAA,CAAAA;YAG/E,CAAA;AACA5C,qBAAS,KAAK8G,aAAa9G,QAAQU,SAASgC,MAAMW,eAAehE,OAAO,OAAO6H,OAAAA;UACnF;QACJ;MACJ;IACJ,CAAA;AAEA,WAAOlH;EACX;EAEQwH,WAAWC,MAAiBP,SAAkB;AAClD,WAAOA,UAAWO,SAAS,QAAQ,SAAS,QAASA;EACzD;EAEO3H,KAAKL,IAAsD;AAC9D,WAAOA,GAAGuD,IAAa,KAAK5D,mBAAmB,MAAM,WAAW,KAAA,CAAA;EACpE;EAEOW,MAAMN,IAAsD;AAC/D,WAAOA,GAAGuD,IAAa,KAAK5D,mBAAmB,OAAO,WAAW,KAAA,CAAA;EACrE;EAEO4I,OAAOC,YAAiC;AAC3C,UAAMC,OAAOD,WAAWE,gBAAe;AACvC,QAAID,KAAKE,SAAS,aAAa;AAC3B,aAAO;IACX;AACA,WAAQF,KAAmB7I,UAAU,QAAS6I,KAAmB7I,UAAU;EAC/E;EAEOgJ,QAAQJ,YAAiC;AAC5C,UAAMC,OAAOD,WAAWE,gBAAe;AACvC,QAAID,KAAKE,SAAS,aAAa;AAC3B,aAAO;IACX;AACA,WAAQF,KAAmB7I,UAAU,SAAU6I,KAAmB7I,UAAU;EAChF;EAEUmB,IAAIf,OAAoC6I,MAA6B;AAC3E,UAAMC,cAAcD,KAAKE,OAAO,CAACC,QAAQ,CAAC,KAAKT,OAAOS,GAAAA,CAAAA;AACtD,QAAIF,YAAYnC,WAAW,GAAG;AAC1B,aAAO,KAAKtG,KAAKL,EAAAA;IACrB,WAAW8I,YAAYnC,WAAW,GAAG;AACjC,aAAOmC,YAAY,CAAA;IACvB,OAAO;AACH,aAAO9I,GAAGe,IAAI+H,WAAAA;IAClB;EACJ;EAEUjH,GAAG7B,OAAoC6I,MAA6B;AAC1E,UAAMI,eAAeJ,KAAKE,OAAO,CAACC,QAAQ,CAAC,KAAKJ,QAAQI,GAAAA,CAAAA;AACxD,QAAIC,aAAatC,WAAW,GAAG;AAC3B,aAAO,KAAKrG,MAAMN,EAAAA;IACtB,WAAWiJ,aAAatC,WAAW,GAAG;AAClC,aAAOsC,aAAa,CAAA;IACxB,OAAO;AACH,aAAOjJ,GAAG6B,GAAGoH,YAAAA;IACjB;EACJ;EAEUnH,IAAI9B,OAAoC6I,MAA6B;AAC3E,WAAO7I,GAAG8B,IAAI,KAAKf,IAAIf,IAAAA,GAAO6I,IAAAA,CAAAA;EAClC;AAqCJ;;;AHx1BO,IAAMK,sBAAN,cAA4DC,gBAAAA;EAvBnE,OAuBmEA;;;EAC/D,IAAaC,WAAW;AACpB,WAAO;EACX;EAESC,mBAAmBC,OAAgBC,MAAmBC,eAAiC;AAC5F,QAAIF,UAAUG,QAAW;AACrB,aAAOH;IACX;AAEA,QAAII,MAAMC,QAAQL,KAAAA,GAAQ;AACtB,UAAIC,SAAS,UAAU,CAACC,eAAe;AAInC,eAAOI,KAAKC,UAAUP,KAAAA;MAC1B,OAAO;AACH,eAAOA,MAAMQ,IAAI,CAACC,MAAM,KAAKV,mBAAmBU,GAAGR,MAAM,KAAA,CAAA;MAC7D;IACJ,OAAO;AACH,aAAOS,OAAMT,IAAAA,EACRU,KAAK,YAAY,MACdX,iBAAiBY,OAAOZ,QAAQ,OAAOA,UAAU,WAAW,IAAIY,KAAKZ,KAAAA,IAASA,KAAAA,EAEjFW,KAAK,WAAW,MAAOX,UAAU,OAAOA,MAAMa,SAAQ,IAAKb,KAAAA,EAC3Dc,UAAU,MAAMd,KAAAA;IACzB;EACJ;EAESe,uBACLC,OACAC,OACAC,eACAC,aACAC,SACiC;AACjC,UAAMC,cAAc,KAAKC,kBAAkBL,OAAOD,OAAOE,eAAeC,aAAaC,OAAAA;AAErF,WAAOC,YAAYE,OAAO,GAAGJ,WAAAA,IAAeD,aAAAA,UAAuBA,aAAAA,EAAe;EACtF;EAEQI,kBACJL,OACAO,IACAN,eACAO,YACAL,SACF;AACE,UAAMM,mBAAmBC,aAAa,KAAKC,QAAQX,OAAOC,aAAAA;AAC1D,UAAMW,gBAAgBH,iBAAiBzB;AAEvC,WAAOuB,GAAGM,gBACN,CAACC,OAAAA;AACG,YAAMC,gBAAgB,GAAGP,UAAAA,IAAcP,aAAAA;AAGvC,UAAIe,SAASF,GAAGG,WAAW,GAAGL,aAAAA,OAAoBG,aAAAA,EAAe;AAIjEC,eAASF,GAAGG,WAAW,MAAA;AACnB,YAAIC,WAAWJ,GAAGG,WAAW,GAAGL,aAAAA,EAAe,EAAEO,UAAS;AAE1D,YAAIhB,WAAW,OAAOA,YAAY,UAAU;AACxC,cAAIA,QAAQiB,OAAO;AACfF,uBAAWA,SAASE,MAAM,CAACN,QACvB,KAAKO,YAAYP,KAAIF,eAAeA,eAAeT,QAAQiB,KAAK,CAAA;UAExE;AAGA,gBAAME,OAAOnB,QAAQmB;AACrB,cAAIC,OAAOpB,QAAQoB;AACnB,cAAIC,gBAAgB;AACpB,cAAID,SAASrC,UAAaqC,OAAO,GAAG;AAChCC,4BAAgB;AAChBD,mBAAO,CAACA;UACZ;AACAL,qBAAW,KAAKO,cAAcP,UAAUI,MAAMC,IAAAA;AAG9CL,qBAAW,KAAKQ,aACZR,UACAN,eACAA,eACAT,QAAQwB,SACRL,SAASpC,UAAaqC,SAASrC,QAC/BsC,aAAAA;QAER;AAIA,cAAMI,MAAMC,sBAAsB,KAAKlB,QAAQX,OAAOC,aAAAA;AAEtD,YAAI2B,KAAK;AAEL,gBAAME,YAAYC,YAAY,KAAKpB,QAAQX,KAAAA;AAC3C,gBAAMgC,cAAcD,YAAY,KAAKpB,QAAQC,aAAAA;AAC7CqB,UAAAA,WAAUH,UAAUI,WAAW,GAAG,sDAAA;AAClCD,UAAAA,WAAUD,YAAYE,WAAW,GAAG,sDAAA;AACpChB,qBAAWA,SAASE,MAChBN,GACIA,GAAGqB,IAAI,GAAGvB,aAAAA,IAAiBoB,YAAY,CAAA,CAAE,EAAE,GAC3C,MACAlB,GACKG,WAAWW,IAAIQ,SAAS,EACxB9B,OAAO,GAAGsB,IAAIQ,SAAS,IAAIR,IAAIS,WAAW,EAAE,EAC5CC,SACG,GAAG9B,UAAAA,IAAcsB,UAAU,CAAA,CAAE,IAC7B,KACA,GAAGF,IAAIQ,SAAS,IAAIR,IAAIW,YAAY,EAAE,CAAA,CAAA;QAI1D,OAAO;AACH,gBAAMC,YAAYC,eAAe,KAAK9B,QAAQX,OAAOQ,YAAYP,eAAeW,aAAAA;AAChFM,qBAAWA,SAASE,MAAM,CAACN,QACvB,KAAK4B,IAAI5B,KAAAA,GAAO0B,UAAUjD,IAAI,CAAC,CAACoD,MAAMC,KAAAA,MAAW9B,IAAG+B,KAAIV,IAAIQ,IAAAA,GAAO,KAAKE,KAAIV,IAAIS,KAAAA,CAAAA,CAAAA,CAAAA,CAAAA;QAExF;AAEA,eAAO1B,SAAS4B,GAAG/B,aAAAA;MACvB,CAAA;AAEAC,eAAS,KAAK+B,0BACVnC,eACAX,eACAQ,kBACAO,QACAb,SACAK,UAAAA;AAIJQ,eAAS,KAAKgC,mBAAmBpC,eAAeX,eAAee,QAAQb,SAASK,UAAAA;AAGhF,aAAOQ,OAAO8B,GAAG/B,aAAAA;IACrB,GACA,CAACkC,SAASA,KAAKC,OAAM,CAAA;EAE7B;EAEQH,0BACJnC,eACAX,eACAQ,kBACAF,IACAJ,SACAK,YACF;AACED,SAAKA,GAAGD,OAAO,CAACQ,OAAAA;AACZ,YAAMqC,UAAU,KAAKC,wBAAwBxC,eAAeX,eAAea,IAAIX,SAASK,UAAAA;AAExF,UAAIC,iBAAiB4C,OAAO;AACxB,eAAOvC,GAAGwC,GACLC,SAASV,oCAAmCA,KAAII,KAAKE,OAAAA,CAAAA,MAAcN,iBAAgB,EACnFC,GAAG,IAAA;MACZ,OAAO;AACH,eAAOD,0BAAyBA,KAAII,KAAKE,OAAAA,CAAAA,IAAYL,GAAG,IAAA;MAC5D;IACJ,CAAA;AAEA,WAAOvC;EACX;EAEQ6C,wBACJxC,eACAX,eACAa,IACAX,SACAK,YACF;AACE,UAAMgD,mBAAmBC,aAAa,KAAK9C,QAAQC,aAAAA;AACnD,UAAMuC,UAEF,CAAA;AAEJ,QAAIhD,YAAY,QAAQ,CAACA,QAAQG,QAAQ;AAErC6C,cAAQO,KAAI,GACLC,OAAOC,QAAQJ,iBAAiBK,MAAM,EACpCC,OAAO,CAAC,CAAA,EAAG/E,KAAAA,MAAW,CAACA,MAAMgF,QAAQ,EACrCD,OAAO,CAAC,CAACE,IAAAA,MAAU,EAAE,OAAO7D,YAAY,YAAaA,QAAQ8D,OAAeD,IAAAA,MAAU,KAAG,EACzFzE,IAAI,CAAC,CAAC2E,KAAAA,MAAW;QACdrB,KAAIsB,IAAID,KAAAA;QACRE,cAAc,KAAKzD,QAAQC,eAAesD,OAAO,KAAKG,SAASvD,EAAAA;OAClE,EACAwD,QAAQ,CAAC9E,MAAMA,CAAAA,CAAAA;IAE5B,WAAWW,QAAQG,QAAQ;AAEvB6C,cAAQO,KAAI,GACLC,OAAOC,QAAQzD,QAAQG,MAAM,EAC3BwD,OAAO,CAAC,CAAA,EAAG/E,KAAAA,MAAWA,KAAAA,EACtBQ,IAAI,CAAC,CAAC2E,KAAAA,MAAM;AACT,cAAMK,WAAW7D,aAAa,KAAKC,QAAQC,eAAesD,KAAAA;AAC1D,cAAMM,aAAaD,SAASR,WAEtBjD,GAAGqB,IAAI,GAAG3B,UAAAA,IAAcP,aAAAA,IAAiBiE,KAAAA,KAAU,IAEnDE,cAAc,KAAKzD,QAAQC,eAAesD,OAAO,KAAKG,SAASvD,EAAAA;AACrE,eAAO;UAAC+B,KAAIsB,IAAID,KAAAA;UAAQM;;MAC5B,CAAA,EACCF,QAAQ,CAAC9E,MAAMA,CAAAA,CAAAA;IAE5B;AAEA,QAAI,OAAOW,YAAY,YAAYA,QAAQsE,WAAW,OAAOtE,QAAQsE,YAAY,UAAU;AAEvFtB,cAAQO,KAAI,GACLC,OAAOC,QAAazD,QAAQsE,OAAO,EACjCX,OAAO,CAAC,CAAA,EAAG/E,KAAAA,MAAWA,KAAAA,EACtBQ,IAAI,CAAC,CAAC2E,KAAAA,MAAW;QACdrB,KAAIsB,IAAID,KAAAA;;QAERpD,GAAGqB,IAAI,GAAG3B,UAAAA,IAAcP,aAAAA,IAAiBiE,KAAAA,KAAU;OACtD,EACAI,QAAQ,CAAC9E,MAAMA,CAAAA,CAAAA;IAE5B;AACA,WAAO2D;EACX;EAEQH,mBACJpC,eACAX,eACAM,IACAJ,SACAK,YACF;AACE,QAAIQ,SAAST;AACb,QAAI,OAAOJ,YAAY,UAAU;AAC7B,YAAMuE,gBAAgBvE,QAAQsE,WAAWtE,QAAQG;AACjD,UAAIoE,iBAAiB,OAAOA,kBAAkB,UAAU;AACpDf,eAAOC,QAAac,aAAAA,EACfZ,OAAO,CAAC,CAAA,EAAG/E,KAAAA,MAAWA,KAAAA,EACtB+E,OAAO,CAAC,CAACI,KAAAA,MAAWS,gBAAgB,KAAKhE,QAAQC,eAAesD,KAAAA,CAAAA,EAChEU,QAAQ,CAAC,CAACV,OAAOnF,KAAAA,MAAM;AACpBiC,mBAAS,KAAKX,kBACVO,eACAI,QACAkD,OACA,GAAG1D,UAAAA,IAAcP,aAAAA,IACjBlB,KAAAA;QAER,CAAA;MACR;IACJ;AACA,WAAOiC;EACX;EAESS,cACL1B,OACAuB,MACAC,MACF;AACE,QAAIA,SAASrC,QAAW;AACpBa,cAAQA,MAAM8E,MAAMtD,IAAAA;IACxB;AACA,QAAID,SAASpC,QAAW;AACpBa,cAAQA,MAAM+E,OAAOxD,IAAAA;IACzB;AACA,WAAOvB;EACX;EAESgF,gBAAgBjE,IAAiC/B,OAA4C;AAClG,WAAO+B,GAAGwC,GACN,sBACAK,OAAOC,QAAQ7E,KAAAA,EAAOuF,QAAQ,CAAC,CAACU,KAAKjG,MAAAA,MAAW;MAAC8D,KAAIsB,IAAIa,GAAAA;MAAMjG;KAAM,CAAA;EAE7E;EAEA,IAAakG,0BAAmC;AAC5C,WAAO;EACX;EAEA,IAAaC,0BAAmC;AAC5C,WAAO;EACX;EAEA,IAAaC,qBAA8B;AACvC,WAAO;EACX;EAESC,iBACLtE,IACAuC,OACmC;AACnC,WAAOvC,GAAGwC,GAAG,gBAAgB;MAACD;KAAM;EACxC;EAESgC,qBAAqBC,QAA2B;AACrD,QAAIA,OAAOpD,WAAW,GAAG;AACrB,aAAO;IACX,OAAO;AACH,aAAO,SAASoD,OAAO/F,IAAI,CAACC,MAAO,OAAOA,MAAM,WAAW,IAAIA,CAAAA,MAAOA,CAAAA,CAAAA;IAC1E;EACJ;AACJ;;;AKnUA,SAAS+F,aAAAA,kBAAiB;AAE1B,SAEIC,OAAAA,YAKG;AACP,SAASC,SAAAA,cAAa;AAaf,IAAMC,oBAAN,cAA0DC,gBAAAA;EAvBjE,OAuBiEA;;;EAC7D,IAAaC,WAAW;AACpB,WAAO;EACX;EAESC,mBAAmBC,OAAgBC,MAAmBC,gBAAkC;AAC7F,QAAIF,UAAUG,QAAW;AACrB,aAAOH;IACX;AAEA,QAAII,MAAMC,QAAQL,KAAAA,GAAQ;AACtB,aAAOA,MAAMM,IAAI,CAACC,MAAM,KAAKR,mBAAmBQ,GAAGN,MAAM,KAAA,CAAA;IAC7D,OAAO;AACH,aAAOO,OAAMP,IAAAA,EACRQ,KAAK,WAAW,MAAOT,QAAQ,IAAI,CAAA,EACnCS,KAAK,YAAY,MAAOT,iBAAiBU,OAAOV,MAAMW,YAAW,IAAKX,KAAAA,EACtES,KAAK,WAAW,MAAOT,MAAkBY,SAAQ,CAAA,EACjDH,KAAK,SAAS,MAAMI,OAAOC,KAAKd,KAAAA,CAAAA,EAChCS,KAAK,QAAQ,MAAMM,KAAKC,UAAUhB,KAAAA,CAAAA,EAClCiB,UAAU,MAAMjB,KAAAA;IACzB;EACJ;EAESkB,uBACLC,OACAC,OACAC,eACAC,aACAC,SACiC;AACjC,WAAOJ,MAAMK,OAAO,CAACC,OACjB,KAAKC,kBAAkBN,OAAOK,IAAIJ,eAAeC,aAAaC,OAAAA,EAASI,GAAGN,aAAAA,CAAAA;EAElF;EAEQK,kBACJN,OACAK,IACAJ,eACAO,YACAL,SACF;AACE,UAAMM,mBAAmBC,aAAa,KAAKC,QAAQX,OAAOC,aAAAA;AAC1D,UAAMW,gBAAgBH,iBAAiB5B;AACvC,UAAMgC,mBAAmBC,aAAa,KAAKH,QAAQC,aAAAA;AAEnD,UAAMG,eAAe,GAAGP,UAAAA,IAAcP,aAAAA;AAEtC,QAAIe,MAAMX,GAAGY,WAAW,MAAA;AACpB,UAAIC,WAAWb,GAAGY,WAAWL,aAAAA,EAAeO,UAAS;AAErD,UAAIhB,WAAW,OAAOA,YAAY,UAAU;AACxC,YAAIA,QAAQiB,OAAO;AACfF,qBAAWA,SAASE,MAAM,CAACf,QACvB,KAAKgB,YAAYhB,KAAIO,eAAeA,eAAeT,QAAQiB,KAAK,CAAA;QAExE;AAGA,cAAME,OAAOnB,QAAQmB;AACrB,YAAIC,OAAOpB,QAAQoB;AACnB,YAAIC,gBAAgB;AACpB,YAAID,SAASxC,UAAawC,OAAO,GAAG;AAChCC,0BAAgB;AAChBD,iBAAO,CAACA;QACZ;AACAL,mBAAW,KAAKO,cAAcP,UAAUI,MAAMC,IAAAA;AAG9CL,mBAAW,KAAKQ,aACZR,UACAN,eACAA,eACAT,QAAQwB,SACRL,SAASvC,UAAawC,SAASxC,QAC/ByC,aAAAA;MAER;AAIA,YAAMI,MAAMC,sBAAsB,KAAKlB,QAAQX,OAAOC,aAAAA;AACtD,UAAI2B,KAAK;AAEL,cAAME,YAAYC,YAAY,KAAKpB,QAAQX,KAAAA;AAC3C,cAAMgC,cAAcD,YAAY,KAAKpB,QAAQC,aAAAA;AAC7CqB,QAAAA,WAAUH,UAAUI,WAAW,GAAG,sDAAA;AAClCD,QAAAA,WAAUD,YAAYE,WAAW,GAAG,sDAAA;AACpChB,mBAAWA,SAASE,MAChBf,GACIA,GAAG8B,IAAI,GAAGvB,aAAAA,IAAiBoB,YAAY,CAAA,CAAE,EAAE,GAC3C,MACA3B,GACKY,WAAWW,IAAIQ,SAAS,EACxBhC,OAAO,GAAGwB,IAAIQ,SAAS,IAAIR,IAAIS,WAAW,EAAE,EAC5CC,SAAS,GAAG9B,UAAAA,IAAcsB,UAAU,CAAA,CAAE,IAAI,KAAK,GAAGF,IAAIQ,SAAS,IAAIR,IAAIW,YAAY,EAAE,CAAA,CAAA;MAGtG,OAAO;AACH,cAAM,EAAEC,UAAUC,aAAY,IAAKC,gCAAgC,KAAK/B,QAAQX,OAAOC,aAAAA;AACvFuC,iBAASG,QAAQ,CAAC,EAAEC,IAAIC,GAAE,MAAE;AACxB,cAAIJ,cAAc;AAEdvB,uBAAWA,SAASoB,SAAS,GAAG1B,aAAAA,IAAiBiC,EAAAA,IAAM,KAAK,GAAGrC,UAAAA,IAAcoC,EAAAA,EAAI;UACrF,OAAO;AAEH1B,uBAAWA,SAASoB,SAAS,GAAG1B,aAAAA,IAAiBgC,EAAAA,IAAM,KAAK,GAAGpC,UAAAA,IAAcqC,EAAAA,EAAI;UACrF;QACJ,CAAA;MACJ;AACA,aAAO3B,SAASX,GAAGQ,YAAAA;IACvB,CAAA;AAEAC,UAAMA,IAAIZ,OAAO,MAAA;AAEb,YAAM0C,UAAsB,CAAA;AAE5B,UAAI3C,YAAY,QAAQ,CAACA,QAAQC,QAAQ;AAErC0C,gBAAQC,KAAI,GACLC,OAAOC,QAAQpC,iBAAiBqC,MAAM,EACpCC,OAAO,CAAC,CAAA,EAAGvE,KAAAA,MAAW,CAACA,MAAMwE,QAAQ,EACrCD,OAAO,CAAC,CAACE,IAAAA,MAAU,EAAE,OAAOlD,YAAY,YAAaA,QAAQmD,OAAeD,IAAAA,MAAU,KAAG,EACzFnE,IAAI,CAAC,CAACqE,KAAAA,MAAW;UACdC,KAAIC,IAAIF,KAAAA;UACRG,cAAc,KAAK/C,QAAQC,eAAe2C,OAAO,KAAKI,SAAStD,EAAAA;SAClE,EACAuD,QAAQ,CAACzE,MAAMA,CAAAA,CAAAA;MAE5B,WAAWgB,QAAQC,QAAQ;AAEvB0C,gBAAQC,KAAI,GACLC,OAAOC,QAAa9C,QAAQC,MAAM,EAChC+C,OAAO,CAAC,CAAA,EAAGvE,KAAAA,MAAWA,KAAAA,EACtBM,IAAI,CAAC,CAACqE,OAAO3E,KAAAA,MAAM;AAChB,gBAAMiF,WAAWnD,aAAa,KAAKC,QAAQC,eAAe2C,KAAAA;AAC1D,cAAIM,SAAST,UAAU;AACnB,kBAAMU,UAAU,KAAKxD,kBACjBM,eACAP,IACAkD,OACA,GAAG/C,UAAAA,IAAcP,aAAAA,IACjBrB,KAAAA;AAEJ,mBAAO;cAAC4E,KAAIC,IAAIF,KAAAA;cAAQO;;UAC5B,OAAO;AACH,mBAAO;cACHN,KAAIC,IAAIF,KAAAA;cACRG,cAAc,KAAK/C,QAAQC,eAAe2C,OAAO,KAAKI,SAAStD,EAAAA;;UAEvE;QACJ,CAAA,EACCuD,QAAQ,CAACzE,MAAMA,CAAAA,CAAAA;MAE5B;AAEA,UAAI,OAAOgB,YAAY,YAAYA,QAAQ4D,WAAW,OAAO5D,QAAQ4D,YAAY,UAAU;AAEvFjB,gBAAQC,KAAI,GACLC,OAAOC,QAAa9C,QAAQ4D,OAAO,EACjCZ,OAAO,CAAC,CAAA,EAAGvE,KAAAA,MAAWA,KAAAA,EACtBM,IAAI,CAAC,CAACqE,OAAO3E,KAAAA,MAAM;AAChB,gBAAMkF,UAAU,KAAKxD,kBACjBM,eACAP,IACAkD,OACA,GAAG/C,UAAAA,IAAcP,aAAAA,IACjBrB,KAAAA;AAEJ,iBAAO;YAAC4E,KAAIC,IAAIF,KAAAA;YAAQO;;QAC5B,CAAA,EACCF,QAAQ,CAACzE,MAAMA,CAAAA,CAAAA;MAE5B;AAEA,UAAIsB,iBAAiBuD,OAAO;AACxB,eAAO3D,GAAG4D,GACLC,SAASV,oCAAmCA,KAAIW,KAAKrB,OAAAA,CAAAA,MAAcU,kBAAiB,EACpFjD,GAAG,IAAA;MACZ,OAAO;AACH,eAAOiD,mBAAkBA,KAAIW,KAAKrB,OAAAA,CAAAA,IAAYvC,GAAG,MAAA;MACrD;IACJ,CAAA;AAEA,WAAOS;EACX;EAESS,cACL1B,OACAuB,MACAC,MACF;AACE,QAAIA,SAASxC,QAAW;AACpBgB,cAAQA,MAAMqE,MAAM7C,IAAAA;IACxB;AACA,QAAID,SAASvC,QAAW;AACpBgB,cAAQA,MAAMsE,OAAO/C,IAAAA;AACrB,UAAIC,SAASxC,QAAW;AAEpBgB,gBAAQA,MAAMqE,MAAM,EAAC;MACzB;IACJ;AACA,WAAOrE;EACX;EAESuE,gBAAgBjE,IAAiCzB,OAA4C;AAClG,WAAOyB,GAAG4D,GACN,eACAjB,OAAOC,QAAQrE,KAAAA,EAAOgF,QAAQ,CAAC,CAACW,KAAK3F,MAAAA,MAAW;MAAC4E,KAAIC,IAAIc,GAAAA;MAAM3F;KAAM,CAAA;EAE7E;EAEA,IAAa4F,0BAA0B;AACnC,WAAO;EACX;EAEA,IAAaC,0BAA0B;AACnC,WAAO;EACX;EAEA,IAAaC,qBAAqB;AAC9B,WAAO;EACX;EAESC,iBACLtE,IACA2D,OACmC;AACnC,WAAO3D,GAAG4D,GAAG,qBAAqB;MAACD;KAAM;EAC7C;EAESY,qBAAqBC,SAA4B;AACtD,UAAM,IAAIC,MAAM,wCAAA;EACpB;AACJ;;;AN1PO,SAASC,eACZC,QACAC,SAA8B;AAE9B,SAAOC,OAAMF,OAAOG,SAASC,IAAI,EAC5BC,KAAK,UAAU,MAAM,IAAIC,kBAAkBN,QAAQC,OAAAA,CAAAA,EACnDI,KAAK,cAAc,MAAM,IAAIE,oBAAoBP,QAAQC,OAAAA,CAAAA,EACzDO,WAAU;AACnB;AARgBT;;;AOQT,IAAMU,kBAAkB;EAC3BC,SAAS,wBAACC,UAAAA;AACN,WAAO;MACHC,MAAM;MACND;IACJ;EACJ,GALS;EAOTE,OAAO,wBAACC,UAAAA;AACJ,WAAO;MACHF,MAAM;MACNE;IACJ;EACJ,GALO;EAOPC,MAAM,wBAACC,cAAsBC,SAAAA;AACzB,WAAO;MACHL,MAAM;MACNM,UAAUF;MACVC;IACJ;EACJ,GANM;EAQNE,QAAQ,wBAACC,MAAkBC,IAAoBC,UAAAA;AAC3C,WAAO;MACHV,MAAM;MACNS;MACAD;MACAE;IACJ;EACJ,GAPQ;EASRC,OAAO,wBAACF,IAAmBG,YAAAA;AACvB,WAAO;MACHZ,MAAM;MACNS;MACAG;IACJ;EACJ,GANO;EAQPC,OAAO,wBAACA,UAAAA;AACJ,WAAO;MACHb,MAAM;MACNa;IACJ;EACJ,GALO;EAOPC,QAAQ,wBAACC,UAAsBC,YAAAA;AAC3B,WAAO;MACHhB,MAAM;MACNe;MACAC;IACJ;EACJ,GANQ;EAQRC,OAAO,6BAAA;AACH,WAAO;MACHjB,MAAM;IACV;EACJ,GAJO;EAMPkB,OAAO,6BAAA;AACH,WAAO;MACHlB,MAAM;IACV;EACJ,GAJO;EAMPmB,KAAK,wBAACC,UAAqBC,gBAAAA;AACvB,WAAOA,YAAYC,OAAO,CAACC,KAAKC,QAAQ3B,gBAAgBU,OAAOgB,KAAK,MAAMC,GAAAA,GAAMJ,KAAAA;EACpF,GAFK;EAILK,IAAI,wBAACL,UAAqBC,gBAAAA;AACtB,WAAOA,YAAYC,OAAO,CAACC,KAAKC,QAAQ3B,gBAAgBU,OAAOgB,KAAK,MAAMC,GAAAA,GAAMJ,KAAAA;EACpF,GAFI;EAIJM,IAAI,wBAAC3B,OAAgBC,SAAAA;AACjB,WAAO,CAAC,CAACD,SAAS,OAAOA,UAAU,YAAY,UAAUA,SAASA,MAAMC,SAASA;EACrF,GAFI;EAIJ2B,WAAW,wBAAC5B,UAA+CF,gBAAgB6B,GAAG3B,OAAO,SAAA,GAA1E;EAEX6B,SAAS,wBAAC7B,UAA6CF,gBAAgB6B,GAAG3B,OAAO,OAAA,GAAxE;EAET8B,QAAQ,wBAAC9B,UAA4CF,gBAAgB6B,GAAG3B,OAAO,MAAA,GAAvE;EAER+B,QAAQ,wBAAC/B,UAA4CF,gBAAgB6B,GAAG3B,OAAO,MAAA,GAAvE;EAERgC,QAAQ,wBAAChC,UAA4CF,gBAAgB6B,GAAG3B,OAAO,MAAA,GAAvE;EAERiC,SAAS,wBAACjC,UAA6CF,gBAAgB6B,GAAG3B,OAAO,OAAA,GAAxE;EAETkC,UAAU,wBAAClC,UAA8CF,gBAAgB6B,GAAG3B,OAAO,QAAA,GAAzE;EAEVmC,SAAS,wBAACnC,UAA6CF,gBAAgB6B,GAAG3B,OAAO,OAAA,GAAxE;EAEToC,UAAU,wBAACpC,UAA8CF,gBAAgB6B,GAAG3B,OAAO,QAAA,GAAzE;AACd;;;AC/GA,SA2DIqC,4BAqCG;AAEA,IAAMC,8BAAN,cAA0CC,qBAAAA;EAlGjD,OAkGiDA;;;EACnCC,aAAaC,MAAqB;AACxCC,WAAOC,OAAOF,IAAAA,EAAMG,QAAQ,CAACC,UAAAA;AACzB,UAAI,CAACA,OAAO;AACR;MACJ;AACA,UAAIC,MAAMC,QAAQF,KAAAA,GAAQ;AACtBA,cAAMD,QAAQ,CAACI,OAAO,KAAKR,aAAaQ,EAAAA,CAAAA;MAC5C;AACA,UAAI,OAAOH,UAAU,YAAY,UAAUA,SAAS,OAAOA,MAAMI,SAAS,UAAU;AAChF,aAAKC,UAAUL,KAAAA;MACnB;IACJ,CAAA;EACJ;EAEmBM,iBAAiBV,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmBW,eAAeX,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmBY,YAAYZ,MAAwB;AACnD,SAAKD,aAAaC,IAAAA;EACtB;EACmBa,WAAWb,MAAuB;AACjD,SAAKD,aAAaC,IAAAA;EACtB;EACmBc,WAAWd,MAAuB;AACjD,SAAKD,aAAaC,IAAAA;EACtB;EACmBe,UAAUf,MAAsB;AAC/C,SAAKD,aAAaC,IAAAA;EACtB;EACmBgB,eAAehB,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmBiB,SAASjB,MAAqB;AAC7C,SAAKD,aAAaC,IAAAA;EACtB;EACmBkB,QAAQlB,MAAoB;AAC3C,SAAKD,aAAaC,IAAAA;EACtB;EACmBmB,eAAenB,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmBoB,YAAYpB,MAAwB;AACnD,SAAKD,aAAaC,IAAAA;EACtB;EACmBqB,UAAUrB,MAAsB;AAC/C,SAAKD,aAAaC,IAAAA;EACtB;EACmBsB,SAAStB,MAAqB;AAC7C,SAAKD,aAAaC,IAAAA;EACtB;EACmBuB,WAAWvB,MAAuB;AACjD,SAAKD,aAAaC,IAAAA;EACtB;EACmBwB,iBAAiBxB,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmByB,iBAAiBzB,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmB0B,eAAe1B,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmB2B,iBAAiB3B,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmB4B,eAAe5B,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmB6B,sBAAsB7B,MAAkC;AACvE,SAAKD,aAAaC,IAAAA;EACtB;EACmB8B,eAAe9B,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmB+B,aAAa/B,MAAyB;AACrD,SAAKD,aAAaC,IAAAA;EACtB;EACmBgC,iBAAiBhC,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmBiC,aAAajC,MAAyB;AACrD,SAAKD,aAAaC,IAAAA;EACtB;EACmBkC,iBAAiBlC,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmBmC,iBAAiBnC,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmBoC,kBAAkBpC,MAA8B;AAC/D,SAAKD,aAAaC,IAAAA;EACtB;EACmBqC,WAAWrC,MAAuB;AACjD,SAAKD,aAAaC,IAAAA;EACtB;EACmBsC,YAAYtC,MAAwB;AACnD,SAAKD,aAAaC,IAAAA;EACtB;EACmBuC,gBAAgBvC,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmBwC,oBAAoBxC,MAAgC;AACnE,SAAKD,aAAaC,IAAAA;EACtB;EACmByC,qBAAqBzC,MAAiC;AACrE,SAAKD,aAAaC,IAAAA;EACtB;EACmB0C,cAAc1C,MAA0B;AACvD,SAAKD,aAAaC,IAAAA;EACtB;EACmB2C,eAAe3C,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmB4C,gBAAgB5C,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmB6C,yBAAyB7C,MAAqC;AAC7E,SAAKD,aAAaC,IAAAA;EACtB;EACmB8C,WAAW9C,MAAuB;AACjD,SAAKD,aAAaC,IAAAA;EACtB;EACmB+C,wBAAwB/C,MAAoC;AAC3E,SAAKD,aAAaC,IAAAA;EACtB;EACmBgD,cAAchD,MAA0B;AACvD,SAAKD,aAAaC,IAAAA;EACtB;EACmBiD,iBAAiBjD,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmBkD,eAAelD,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmBmD,UAAUnD,MAAsB;AAC/C,SAAKD,aAAaC,IAAAA;EACtB;EACmBoD,0BAA0BpD,MAAsC;AAC/E,SAAKD,aAAaC,IAAAA;EACtB;EACmBqD,sBAAsBrD,MAAkC;AACvE,SAAKD,aAAaC,IAAAA;EACtB;EACmBsD,gBAAgBtD,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmBuD,UAAUvD,MAAsB;AAC/C,SAAKD,aAAaC,IAAAA;EACtB;EACmBwD,2BAA2BxD,MAAuC;AACjF,SAAKD,aAAaC,IAAAA;EACtB;EACmByD,+BAA+BzD,MAA2C;AACzF,SAAKD,aAAaC,IAAAA;EACtB;EACmB0D,YAAY1D,MAAwB;AACnD,SAAKD,aAAaC,IAAAA;EACtB;EACmB2D,kBAAkB3D,MAA8B;AAC/D,SAAKD,aAAaC,IAAAA;EACtB;EACmB4D,gBAAgB5D,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmB6D,gBAAgB7D,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmB8D,gBAAgB9D,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmB+D,kBAAkB/D,MAA8B;AAC/D,SAAKD,aAAaC,IAAAA;EACtB;EACmBgE,iBAAiBhE,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmBiE,kBAAkBjE,MAA8B;AAC/D,SAAKD,aAAaC,IAAAA;EACtB;EACmBkE,mBAAmBlE,MAA+B;AACjE,SAAKD,aAAaC,IAAAA;EACtB;EACmBmE,oBAAoBnE,MAAgC;AACnE,SAAKD,aAAaC,IAAAA;EACtB;EACmBoE,0BAA0BpE,MAAsC;AAC/E,SAAKD,aAAaC,IAAAA;EACtB;EACmBqE,gBAAgBrE,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmBsE,cAActE,MAA0B;AACvD,SAAKD,aAAaC,IAAAA;EACtB;EACmBuE,eAAevE,MAA2B;AACzD,SAAKD,aAAaC,IAAAA;EACtB;EACmBwE,kBAAkBxE,MAA8B;AAC/D,SAAKD,aAAaC,IAAAA;EACtB;EACmByE,QAAQzE,MAAoB;AAC3C,SAAKD,aAAaC,IAAAA;EACtB;EACmB0E,YAAY1E,MAAwB;AACnD,SAAKD,aAAaC,IAAAA;EACtB;EACmB2E,oBAAoB3E,MAAgC;AACnE,SAAKD,aAAaC,IAAAA;EACtB;EACmB4E,gBAAgB5E,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmB6E,cAAc7E,MAA0B;AACvD,SAAKD,aAAaC,IAAAA;EACtB;EACmB8E,aAAa9E,MAAyB;AACrD,SAAKD,aAAaC,IAAAA;EACtB;EACmB+E,wBAAwB/E,MAAoC;AAC3E,SAAKD,aAAaC,IAAAA;EACtB;EACmBgF,uBAAuBhF,MAAmC;AACzE,SAAKD,aAAaC,IAAAA;EACtB;EACmBiF,UAAUjF,MAAsB;AAC/C,SAAKD,aAAaC,IAAAA;EACtB;EACmBkF,iBAAiBlF,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmBmF,qBAAqBnF,MAAiC;AACrE,SAAKD,aAAaC,IAAAA;EACtB;EACmBoF,kBAAkBpF,MAA8B;AAC/D,SAAKD,aAAaC,IAAAA;EACtB;EACmBqF,qBAAqBrF,MAAiC;AACrE,SAAKD,aAAaC,IAAAA;EACtB;EACmBsF,oBAAoBtF,MAAgC;AACnE,SAAKD,aAAaC,IAAAA;EACtB;EACmBuF,WAAWvF,MAAuB;AACjD,SAAKD,aAAaC,IAAAA;EACtB;EACmBwF,cAAcxF,MAA0B;AACvD,SAAKD,aAAaC,IAAAA;EACtB;EACmByF,UAAUzF,MAAsB;AAC/C,SAAKD,aAAaC,IAAAA;EACtB;EACmB0F,UAAU1F,MAAsB;AAC/C,SAAKD,aAAaC,IAAAA;EACtB;EACmB2F,mBAAmB3F,MAA+B;AACjE,SAAKD,aAAaC,IAAAA;EACtB;EACmB4F,cAAc5F,MAA0B;AACvD,SAAKD,aAAaC,IAAAA;EACtB;EACmB6F,iBAAiB7F,MAA6B;AAC7D,SAAKD,aAAaC,IAAAA;EACtB;EACmB8F,uBAAuB9F,MAAmC;AACzE,SAAKD,aAAaC,IAAAA;EACtB;EACmB+F,WAAW/F,MAAuB;AACjD,SAAKD,aAAaC,IAAAA;EACtB;EACmBgG,gBAAgBhG,MAA4B;AAC3D,SAAKD,aAAaC,IAAAA;EACtB;EACmBiG,aAAajG,MAAyB;AACrD,SAAKD,aAAaC,IAAAA;EACtB;EACmBkG,cAAclG,MAA0B;AACvD,SAAKD,aAAaC,IAAAA;EACtB;EACmBmG,UAAUnG,MAAsB;AAC/C,SAAKD,aAAaC,IAAAA;EACtB;EACmBoG,WAAWpG,MAAuB;AACjD,SAAKD,aAAaC,IAAAA;EACtB;EACmBqG,SAASrG,MAAqB;AAC7C,SAAKD,aAAaC,IAAAA;EACtB;EACmBsG,YAAYtG,MAAwB;AACnD,SAAKD,aAAaC,IAAAA;EACtB;AACJ;;;AClYO,IAAMuG,kBAAN,cAA8BC,4BAAAA;EALrC,OAKqCA;;;EACzBC,UAAoB,CAAA;EAE5BC,QAAQC,MAAqB;AACzB,SAAKF,UAAU,CAAA;AACf,SAAKG,UAAUD,IAAAA;AACf,WAAO,KAAKF;EAChB;EAEmBI,YAAYF,MAAwB;AACnD,QAAI,CAAC,KAAKF,QAAQK,SAASH,KAAKI,OAAOC,IAAI,GAAG;AAC1C,WAAKP,QAAQQ,KAAKN,KAAKI,OAAOC,IAAI;IACtC;EACJ;AACJ;;;ACpBA,SAASE,aAAAA,kBAAiB;AAC1B,SACIC,aAAAA,YACAC,uBAAAA,sBACAC,YACAC,mBACAC,UACAC,gBAAAA,eACAC,gBACAC,gBAAAA,eACAC,iBAAAA,gBACAC,eACAC,iBACAC,aAAAA,YACAC,eACAC,aAAAA,YACAC,iBAIG;AACP,SAASC,SAAAA,cAAa;;;ACrBtB,SAASC,aAAAA,kBAAiB;AAC1B,SAASC,SAAAA,cAAa;AAqBf,IAAMC,sBAAN,MAAMA;EAtBb,OAsBaA;;;EACTC,SAASC,YAAwBC,SAA0C;AACvE,UAAMC,SAASC,OAAMH,UAAAA,EAChBI,KAAKC,gBAAgBC,SAAS,CAACC,UAAS,KAAKC,cAAcD,OAAMN,OAAAA,CAAAA,EACjEG,KAAKC,gBAAgBI,UAAU,CAACF,UAAS,KAAKG,eAAeH,OAAMN,OAAAA,CAAAA,EACnEG,KAAKC,gBAAgBM,SAAS,CAACJ,UAAS,KAAKK,cAAcL,OAAMN,OAAAA,CAAAA,EACjEG,KAAKC,gBAAgBQ,WAAW,CAACN,UAAS,KAAKO,gBAAgBP,KAAAA,CAAAA,EAC/DH,KAAKC,gBAAgBU,UAAU,CAACR,UAAS,KAAKS,eAAeT,OAAMN,OAAAA,CAAAA,EACnEG,KAAKC,gBAAgBY,SAAS,CAACV,UAAS,KAAKW,cAAcX,OAAMN,OAAAA,CAAAA,EACjEG,KAAKC,gBAAgBc,QAAQ,CAACZ,UAAS,KAAKa,aAAab,OAAMN,OAAAA,CAAAA,EAC/DG,KAAKC,gBAAgBgB,QAAQ,MAAMpB,QAAQqB,SAAS,EACpDlB,KAAKC,gBAAgBkB,QAAQ,MAAM,IAAA,EACnCC,WAAU;AAEf,WAAOtB,UAAU;EACrB;EAEQkB,aAAab,OAAsBN,SAA0C;AACjF,QAAIM,MAAKkB,aAAa,QAAQ;AAC1B,aAAOxB,QAAQyB;IACnB,OAAO;AACH,YAAM,IAAIC,MAAM,yCAAyCpB,MAAKkB,QAAQ,EAAE;IAC5E;EACJ;EAEQP,cAAcX,OAAuBN,SAAqC;AAC9E,WAAOE,OAAMI,MAAKqB,EAAE,EACfC,KAAK,KAAK,MAAM,CAAC,KAAK9B,SAASQ,MAAKuB,SAAS7B,OAAAA,CAAAA,EAC7CuB,WAAU;EACnB;EAEQR,eAAeT,OAAwBN,SAAqC;AAChF,QAAI8B,MAAM,KAAKhC,SAASQ,MAAKyB,UAAU/B,OAAAA;AACvC,eAAWgC,UAAU1B,MAAK2B,SAAS;AAC/BH,YAAMA,MAAME,MAAAA;IAChB;AACA,WAAOF;EACX;EAEQjB,gBAAgBP,OAA8B;AAClD,WAAOA,MAAK4B;EAChB;EAEQvB,cAAcL,OAAuBN,SAA0C;AACnF,WAAOA,QAAQqB,YAAYf,MAAK6B,KAAK;EACzC;EAEQ5B,cAAcD,OAAuBN,SAAqC;AAC9E,WAAOM,MAAK8B,MAAMC,IAAI,CAACC,SAAS,KAAKxC,SAASwC,MAAMtC,OAAAA,CAAAA;EACxD;EAEQS,eAAeH,OAAwBN,SAAqC;AAChF,QAAIM,MAAKqB,OAAO,OAAOrB,MAAKqB,OAAO,OAAOrB,MAAKqB,OAAO,KAAK;AACvD,aAAO,KAAKY,4BAA4BjC,OAAMN,OAAAA;IAClD;AAEA,UAAMwC,OAAO,KAAK1C,SAASQ,MAAKkC,MAAMxC,OAAAA;AACtC,UAAMyC,QAAQ,KAAK3C,SAASQ,MAAKmC,OAAOzC,OAAAA;AAExC,WAAOE,OAAMI,MAAKqB,EAAE,EACfC,KAAK,MAAM,MAAMY,SAASC,KAAAA,EAC1Bb,KAAK,MAAM,MAAMY,SAASC,KAAAA,EAC1Bb,KAAK,KAAK,MAAMY,OAAOC,KAAAA,EACvBb,KAAK,MAAM,MAAMY,QAAQC,KAAAA,EACzBb,KAAK,KAAK,MAAMY,OAAOC,KAAAA,EACvBb,KAAK,MAAM,MAAMY,QAAQC,KAAAA,EACzBb,KAAK,MAAM,MAAMY,QAAQC,KAAAA,EACzBb,KAAK,MAAM,MAAMY,QAAQC,KAAAA,EACzBb,KAAK,MAAM,MAAA;AACR,YAAMc,SAASD,SAAS,CAAA;AACxBE,MAAAA,WAAUC,MAAMvC,QAAQqC,MAAAA,GAAS,kCAAA;AACjC,aAAOA,OAAOG,SAASL,IAAAA;IAC3B,CAAA,EACCjB,WAAU;EACnB;EAEQgB,4BAA4BjC,OAAwBN,SAAqC;AAC7F,UAAM2B,KAAKrB,MAAKqB;AAChBgB,IAAAA,WAAUhB,OAAO,OAAOA,OAAO,OAAOA,OAAO,KAAK,qCAAA;AAElD,UAAMa,OAAO,KAAK1C,SAASQ,MAAKkC,MAAMxC,OAAAA;AACtC,QAAI,CAACwC,MAAM;AACP,aAAO;IACX;AAEAG,IAAAA,WAAUC,MAAMvC,QAAQmC,IAAAA,GAAO,gBAAA;AAE/B,WAAOtC,OAAMyB,EAAAA,EACRC,KAAK,KAAK,MAAMY,KAAKM,KAAK,CAACR,SAAc,KAAKxC,SAASQ,MAAKmC,OAAO;MAAE,GAAGzC;MAASqB,WAAWiB;IAAK,CAAA,CAAA,CAAA,EACjGV,KAAK,KAAK,MAAMY,KAAKO,MAAM,CAACT,SAAc,KAAKxC,SAASQ,MAAKmC,OAAO;MAAE,GAAGzC;MAASqB,WAAWiB;IAAK,CAAA,CAAA,CAAA,EAClGV,KACG,KACA,MACI,CAACY,KAAKM,KAAK,CAACR,SACR,KAAKxC,SAASQ,MAAKmC,OAAO;MACtB,GAAGzC;MACHqB,WAAWiB;IACf,CAAA,CAAA,CAAA,EAGXf,WAAU;EACnB;AACJ;;;AC3HA,SACIyB,WACAC,SACAC,qBACAC,cACAC,cACAC,QACAC,YACAC,eACAC,WACAC,oBACAC,iBACG;AAOA,SAASC,SAAmCC,SAAgC;AAC/E,SAAOC,UAAUC,gBAAgBF,QAAQG,mBAAmB,MAAM,WAAW,KAAA,CAAA;AACjF;AAFgBJ;AAOT,SAASK,UAAoCJ,SAAgC;AAChF,SAAOC,UAAUC,gBAAgBF,QAAQG,mBAAmB,OAAO,WAAW,KAAA,CAAA;AAClF;AAFgBC;AAOT,SAASC,WAAWC,MAAmB;AAC1C,SAAOL,UAAUM,GAAGD,IAAAA,MAAUA,KAAKE,UAAU,QAAQF,KAAKE,UAAU;AACxE;AAFgBH;AAOT,SAASI,YAAYH,MAAmB;AAC3C,SAAOL,UAAUM,GAAGD,IAAAA,MAAUA,KAAKE,UAAU,SAASF,KAAKE,UAAU;AACzE;AAFgBC;AAOT,SAASC,YACZV,SACAW,OAAsB;AAEtB,MAAIA,MAAMC,KAAKH,WAAAA,GAAc;AACzB,WAAOL,UAAUJ,OAAAA;EACrB;AACA,QAAMa,QAAQF,MAAMG,OAAO,CAACC,MAAM,CAACV,WAAWU,CAAAA,CAAAA;AAC9C,MAAIF,MAAMG,WAAW,GAAG;AACpB,WAAOjB,SAASC,OAAAA;EACpB;AACA,SAAOa,MAAMI,OAAO,CAACC,KAAKZ,SACtBa,OAAOZ,GAAGD,IAAAA,IACJc,QAAQC,OAAOH,KAAKI,WAAWD,OAAOf,IAAAA,CAAAA,IACtCc,QAAQC,OAAOH,KAAKZ,IAAAA,CAAAA;AAElC;AAhBgBI;AAkBT,SAASa,YACZvB,SACAW,OAAsB;AAEtB,MAAIA,MAAMC,KAAKP,UAAAA,GAAa;AACxB,WAAON,SAASC,OAAAA;EACpB;AACA,QAAMa,QAAQF,MAAMG,OAAO,CAACC,MAAM,CAACN,YAAYM,CAAAA,CAAAA;AAC/C,MAAIF,MAAMG,WAAW,GAAG;AACpB,WAAOZ,UAAUJ,OAAAA;EACrB;AACA,SAAOa,MAAMI,OAAO,CAACC,KAAKZ,SACtBc,QAAQb,GAAGD,IAAAA,IACLa,OAAOE,OAAOH,KAAKI,WAAWD,OAAOf,IAAAA,CAAAA,IACrCa,OAAOE,OAAOH,KAAKZ,IAAAA,CAAAA;AAEjC;AAhBgBiB;AAqBT,SAASC,WAAWlB,MAAmB;AAC1C,SAAOmB,mBAAmBJ,OACtBK,aAAaL,OAAO,KAAA,GACpBD,QAAQb,GAAGD,IAAAA,KAASa,OAAOZ,GAAGD,IAAAA,IACxBgB,WAAWD,OAAOf,IAAAA,IAClBA,IAAAA;AAEd;AAPgBkB;AAwBT,SAASG,aAAuCC,MAAqBC,SAAgC;AACxG,MAAIC,YAAYF,IAAAA,GAAO;AACnB,WAAOG,SAASF,OAAAA;EACpB,WAAWG,WAAWJ,IAAAA,GAAO;AACzB,WAAOK,UAAUJ,OAAAA;EACrB;AACA,SAAOK,oBAAoBC;;IAEvBC,aAAaD,OAAO,YAAY;MAACP;MAAMK,UAAUJ,OAAAA;KAAS;IAC1DQ,aAAaF,OAAO,GAAA;IACpBF,UAAUJ,OAAAA;EAAAA;AAElB;AAZgBF;AAiBT,SAASW,aAAaV,MAA+B;AACxD,MAAI,CAACA,MAAM;AACP,WAAOA;EACX;AACA,MAAIW,UAAUC,GAAGZ,IAAAA,GAAO;AACpB,WAAOA,KAAKa,MAAMC,WAAWC;EACjC,WAAWC,UAAUJ,GAAGZ,IAAAA,GAAO;AAC3B,WAAOU,aAAaV,KAAKA,IAAI;EACjC,WAAWiB,cAAcL,GAAGZ,IAAAA,KAASA,KAAKa,OAAO;AAC7C,WAAOH,aAAaV,KAAKa,KAAK;EAClC;AACA,SAAOK;AACX;AAZgBR;;;;;;;;;;;;;;AFnEhB,IAAMS,qBAAqB,oBAAIC,IAAAA;AAG/B,SAASC,KAAKC,MAAwB;AAClC,SAAO,SAAUC,SAAkBC,cAAsBC,YAA8B;AACnF,QAAI,CAACN,mBAAmBO,IAAIJ,IAAAA,GAAO;AAC/BH,yBAAmBQ,IAAIL,MAAMG,UAAAA;IACjC;AACA,WAAOA;EACX;AACJ;AAPSJ;AASF,IAAMO,wBAAN,MAAMA;SAAAA;;;;;;EACQC;EAEjB,YACqBC,QACAC,eACAC,MACnB;SAHmBF,SAAAA;SACAC,gBAAAA;SACAC,OAAAA;AAEjB,SAAKH,UAAUI,eAAe,KAAKH,QAAQ,KAAKC,aAAa;EACjE;EAEA,IAAIG,WAAW;AACX,QAAI,CAAC,KAAKJ,OAAOI,UAAU;AACvB,YAAM,IAAIC,cAAc,8CAAA;IAC5B;AACA,WAAO,KAAKL,OAAOI;EACvB;EAEAE,UAAUC,YAAwBC,SAA8D;AAC5F,UAAMC,UAAUpB,mBAAmBO,IAAIW,WAAWf,IAAI;AACtD,QAAI,CAACiB,SAAS;AACV,YAAM,IAAIC,MAAM,gCAAgCH,WAAWf,IAAI,EAAE;IACrE;AACA,WAAOiB,QAAQE,MAAMC,KAAK,MAAML,YAAYC,OAAAA;EAChD;EAIQK,SAAStB,OAAyB;AACtC,WAAO,KAAKuB,eACRvB,MAAKoB,OACL,OAAOpB,MAAKoB,UAAU,WAAW,WAAW,OAAOpB,MAAKoB,UAAU,YAAY,YAAY,KAAA;EAElG;EAIQI,OAAOxB,OAAuBiB,SAA+C;AACjF,WAAOQ,cAAcC,OAAO1B,MAAK2B,MAAMC,IAAI,CAACC,SAAS,KAAKd,UAAUc,MAAMZ,OAAAA,CAAAA,CAAAA;EAC9E;EAIQa,OAAO9B,OAAuBiB,SAA+C;AACjF,UAAMc,WAAWC,aAAa,KAAKvB,QAAQQ,QAAQgB,OAAOjC,MAAKkC,KAAK;AACpE,QAAI,CAACH,SAASI,UAAU;AACpB,UAAIlB,QAAQmB,YAAY;AACpB,eAAOnB,QAAQmB,WAAWpC,MAAKkC,KAAK;MACxC,OAAO;AACH,eAAO,KAAKG,gBAAgBrC,MAAKkC,OAAOjB,OAAAA;MAC5C;IACJ,OAAO;AACH,YAAM,EAAEqB,cAAcC,cAAc,GAAGC,YAAAA,IAAgBvB;AACvD,YAAMkB,WAAW,KAAKM,wBAAwBzC,MAAKkC,OAAOH,SAASW,MAAMF,WAAAA;AACzE,aAAO;QACH,GAAGL;QACHQ,OAAO,KAAKC,WAAWT,SAASQ,OAAOL,YAAAA;QACvCO,YAAYN,eAAe;UAACA;YAAgBJ,SAASU;MACzD;IACJ;EACJ;EAEQD,WAAWD,OAA8BL,cAAyC;AACtF,QAAI,CAACK,OAAO;AACR,aAAOG,UAAUpB,OAAOY,gBAAgBS,SAAS,KAAKvC,OAAO,CAAA;IACjE;AACA,QAAI,CAAC8B,cAAc;AACf,aAAOK;IACX;AACA,WAAOG,UAAUpB,OAAOsB,YAAY,KAAKxC,SAAS;MAACmC,MAAMA;MAAOL;KAAa,CAAA;EACjF;EAIQW,QAAQ;AACZ,WAAOC,WAAUC,gBAAgB,IAAA;EACrC;EAIQC,QAAQpD,OAAwBiB,SAA+C;AACnF,QAAIjB,MAAKqD,OAAO,MAAM;AAClB,aAAOL,YAAY,KAAKxC,SAAS;QAAC,KAAKO,UAAUf,MAAKsD,MAAMrC,OAAAA;QAAU,KAAKF,UAAUf,MAAKuD,OAAOtC,OAAAA;OAAS;IAC9G,WAAWjB,MAAKqD,OAAO,MAAM;AACzB,aAAOG,YAAY,KAAKhD,SAAS;QAAC,KAAKO,UAAUf,MAAKsD,MAAMrC,OAAAA;QAAU,KAAKF,UAAUf,MAAKuD,OAAOtC,OAAAA;OAAS;IAC9G;AAEA,QAAI,KAAKwC,WAAWzD,MAAKsD,IAAI,KAAK,KAAKG,WAAWzD,MAAKuD,KAAK,GAAG;AAC3D,aAAO,KAAKG,oBAAoB1D,KAAAA;IACpC;AAEA,UAAMqD,KAAKrD,MAAKqD;AAEhB,QAAIA,OAAO,OAAOA,OAAO,OAAOA,OAAO,KAAK;AACxC,aAAO,KAAKM,6BAA6B3D,OAAMiB,OAAAA;IACnD;AAEA,UAAMqC,OAAO,KAAKvC,UAAUf,MAAKsD,MAAMrC,OAAAA;AACvC,UAAMsC,QAAQ,KAAKxC,UAAUf,MAAKuD,OAAOtC,OAAAA;AAEzC,QAAIoC,OAAO,MAAM;AACb,UAAI,KAAKO,WAAWN,IAAAA,GAAO;AACvB,eAAO,KAAK/B,eAAe,OAAO,SAAA;MACtC,OAAO;AACH,YAAIE,cAAcoC,GAAGN,KAAAA,GAAQ;AACzB,iBAAOO,qBAAoBpC,OAAO4B,MAAMS,cAAarC,OAAO,IAAA,GAAO6B,KAAAA;QACvE,OAAO;AAEH,iBAAOO,qBAAoBpC,OACvB4B,MACAS,cAAarC,OAAO,GAAA,GACpBsC,cAAatC,OAAO,OAAO;YAAC6B;WAAM,CAAA;QAE1C;MACJ;IACJ;AAEA,QAAI,KAAKK,WAAWL,KAAAA,GAAQ;AACxB,aAAOvD,MAAKqD,OAAO,OACbS,qBAAoBpC,OAAO4B,MAAMS,cAAarC,OAAO,IAAA,GAAO6B,KAAAA,IAC5DO,qBAAoBpC,OAAO4B,MAAMS,cAAarC,OAAO,QAAA,GAAW6B,KAAAA;IAC1E,WAAW,KAAKK,WAAWN,IAAAA,GAAO;AAC9B,aAAOtD,MAAKqD,OAAO,OACbS,qBAAoBpC,OAAO6B,OAAOQ,cAAarC,OAAO,IAAA,GAAOwB,WAAUC,gBAAgB,IAAA,CAAA,IACvFW,qBAAoBpC,OAAO6B,OAAOQ,cAAarC,OAAO,QAAA,GAAWwB,WAAUC,gBAAgB,IAAA,CAAA;IACrG;AAEA,WAAOW,qBAAoBpC,OAAO4B,MAAM,KAAKW,kBAAkBZ,EAAAA,GAAKE,KAAAA;EACxE;EAEQI,6BAA6B3D,OAAwBiB,SAA+C;AACxGiD,IAAAA,WAAUlE,MAAKqD,OAAO,OAAOrD,MAAKqD,OAAO,OAAOrD,MAAKqD,OAAO,KAAK,qCAAA;AAEjE,QAAI,KAAKI,WAAWzD,MAAKsD,IAAI,KAAK,KAAKa,aAAanE,MAAKsD,IAAI,GAAG;AAC5D,YAAMlC,QAAQ,IAAIgD,oBAAAA,EAAsBC,SAASrE,OAAM;QACnDW,MAAM,KAAKA;MACf,CAAA;AACA,aAAO,KAAKY,eAAeH,OAAO,SAAA;IACtC;AAEA8C,IAAAA,WACII,gBAAgBC,QAAQvE,MAAKsD,IAAI,KAAKgB,gBAAgBE,SAASxE,MAAKsD,IAAI,GACxE,6CAAA;AAGJ,QAAImB;AACJ,QAAIH,gBAAgBC,QAAQvE,MAAKsD,IAAI,GAAG;AACpC,YAAMvB,WAAWC,aAAa,KAAKvB,QAAQQ,QAAQgB,OAAOjC,MAAKsD,KAAKpB,KAAK;AACzEuC,wBAAkB1C,SAASW;IAC/B,OAAO;AACHwB,MAAAA,WAAUI,gBAAgBC,QAAQvE,MAAKsD,KAAKoB,QAAQ,CAAA;AACpD,YAAM3C,WAAWC,aAAa,KAAKvB,QAAQQ,QAAQgB,OAAOjC,MAAKsD,KAAKoB,SAASxC,KAAK;AAClFuC,wBAAkB1C,SAASW;AAC3B,iBAAWiC,UAAU3E,MAAKsD,KAAKsB,SAAS;AACpC,cAAMC,YAAY7C,aAAa,KAAKvB,QAAQgE,iBAAiBE,MAAAA;AAC7DF,0BAAkBI,UAAUnC;MAChC;IACJ;AAEA,QAAIoC,kBAAkB,KAAK/D,UAAUf,MAAKuD,OAAO;MAC7C,GAAGtC;MACHgB,OAAOwC;MACPM,OAAOC;MACP5C,YAAY4C;IAChB,CAAA;AAEA,QAAIhF,MAAKqD,OAAO,KAAK;AACjByB,wBAAkBG,WAAWH,eAAAA;IACjC;AAEA,UAAMI,QAAQlB,cAAatC,OAAO,SAAS;MAACwB,WAAUC,gBAAgB,CAAA;KAAG;AAEzE,UAAMgC,kBAAkBC,OAAMpF,MAAKqD,EAAE,EAChCgC,KAAK,KAAK,MAAMvB,qBAAoBpC,OAAOwD,OAAOnB,cAAarC,OAAO,GAAA,GAAMwB,WAAUC,gBAAgB,CAAA,CAAA,CAAA,EACtGkC,KAAK,KAAK,MAAMvB,qBAAoBpC,OAAOwD,OAAOnB,cAAarC,OAAO,GAAA,GAAMwB,WAAUC,gBAAgB,CAAA,CAAA,CAAA,EACtGkC,KAAK,KAAK,MAAMvB,qBAAoBpC,OAAOwD,OAAOnB,cAAarC,OAAO,GAAA,GAAMwB,WAAUC,gBAAgB,CAAA,CAAA,CAAA,EACtGmC,WAAU;AAEf,WAAO,KAAKvE,UAAUf,MAAKsD,MAAM;MAC7B,GAAGrC;MACHsB,cAAcgD,cAAc7D,OAAO8D,WAAU9D,OAAOyD,iBAAiBM,eAAe/D,OAAO,IAAA,CAAA,CAAA;MAC3FY,cAAcwC;IAClB,CAAA;EACJ;EAEQpB,oBAAoB1D,OAAwB;AAChD,QAAIA,MAAKqD,OAAO,QAAQrD,MAAKqD,OAAO,MAAM;AACtC,YAAM,IAAIlC,MAAM,uCAAuCnB,MAAKqD,EAAE,EAAE;IACpE;AACA,QAAIqC;AACJ,QAAI,KAAKjC,WAAWzD,MAAKsD,IAAI,GAAG;AAC5BoC,cAAQ1F,MAAKuD;IACjB,OAAO;AACHmC,cAAQ1F,MAAKsD;IACjB;AAEA,QAAIgB,gBAAgBqB,OAAOD,KAAAA,GAAQ;AAC/B,aAAO,KAAKnE,eAAevB,MAAKqD,OAAO,OAAO,CAAC,KAAK1C,OAAO,CAAC,CAAC,KAAKA,MAAM,SAAA;IAC5E,OAAO;AACH,YAAM,IAAIQ,MAAM,6CAAA;IACpB;EACJ;EAEQI,eAAeH,OAAgBsB,MAAmB;AACtD,WAAOQ,WAAUxB,OAAO,KAAKlB,QAAQoF,mBAAmBxE,OAAOsB,MAAM,KAAA,KAAU,IAAA;EACnF;EAIQmD,OAAO7F,OAAuBiB,SAA+C;AAEjFiD,IAAAA,WAAUlE,MAAKqD,OAAO,KAAK,gCAAA;AAC3B,WAAOS,qBAAoBpC,OACvB,KAAKX,UAAUf,MAAK8F,SAAS7E,OAAAA,GAC7B,KAAKgD,kBAAkB,IAAA,GACvBlB,SAAS,KAAKvC,OAAO,CAAA;EAE7B;EAEQyD,kBAAkBZ,IAA8C;AACpE,UAAM0C,WAAWX,OAAM/B,EAAAA,EAClBgC,KAAK,MAAM,MAAM,GAAA,EACjBW,UAAU,MAAM3C,EAAAA;AACrB,WAAOU,cAAarC,OAAOqE,QAAAA;EAC/B;EAIQE,MAAMjG,OAAsBiB,SAA+C;AAC/E,UAAMiF,SAAS,KAAKC,cAAcnG,OAAMiB,OAAAA;AACxC,WAAOiF,OAAOE,gBAAe;EACjC;EAEQD,cAAcnG,OAAsBiB,SAA+C;AACvF,UAAMoF,OAAO,KAAK3F,cAAc4F,YAAYtG,MAAKuG,QAAQ;AACzD,QAAI,CAACF,MAAM;AACP,YAAM,IAAIG,WAAW,6BAA6BxG,MAAKuG,QAAQ,EAAE;IACrE;AACA,UAAME,KAAKC,kBAAAA;AACX,WAAOL,KACHI,KACCzG,MAAK2G,QAAQ,CAAA,GAAI/E,IAAI,CAACgF,QAAQ,KAAKC,iBAAiBJ,IAAIG,KAAK3F,OAAAA,CAAAA,GAC9D;MACIT,SAAS,KAAKA;MACdyB,OAAOhB,QAAQgB;MACf6E,WAAW7F,QAAQ6F;IACvB,CAAA;EAER;EAEQD,iBACJJ,IACAG,KACA3F,SACsB;AACtB,QAAIqD,gBAAgByC,UAAUH,GAAAA,GAAM;AAChC,aAAOH,GAAGO,IAAIJ,IAAIxF,KAAK;IAC3B;AAEA,QAAIkD,gBAAgBC,QAAQqC,GAAAA,GAAM;AAC9B,aAAO3F,QAAQgG,gBAAgBR,GAAGO,IAAI/F,QAAQgG,cAAcL,IAAI1E,KAAK,CAAC,IAAIuE,GAAGS,IAAIN,IAAI1E,KAAK;IAC9F;AAEA,QAAIoC,gBAAgB6C,OAAOP,GAAAA,GAAM;AAC7B,aAAO,KAAKT,cAAcS,KAAK3F,OAAAA;IACnC;AAEA,QAAI,KAAKkD,aAAayC,GAAAA,GAAM;AACxB,YAAMQ,UAAU,KAAKC,kBAAkBpG,QAAQN,MAAMiG,KAAyB,KAAK/F,QAAQ;AAC3F,aAAOuG,UAAUX,GAAGO,IAAII,QAAQhG,KAAK,IAAIqF,GAAGO,IAAI,IAAA;IACpD;AAMA,UAAM,IAAIlG,cAAc,oCAAoC8F,IAAI3G,IAAI,EAAE;EAC1E;EAIQqH,QAAQtH,OAAwBiB,SAA+C;AAEnF,QAAI,KAAKwC,WAAWzD,MAAK0E,QAAQ,GAAG;AAChC,aAAO,KAAK2C,kBAAkB,KAAK1G,MAAMX,OAAM,KAAKa,QAAQ;IAChE;AAEAqD,IAAAA,WAAUI,gBAAgBC,QAAQvE,MAAK0E,QAAQ,GAAG,wCAAA;AAElD,UAAM,EAAEpC,cAAcC,cAAc,GAAGC,YAAAA,IAAgBvB;AAEvD,UAAMyD,WAAW,KAAK3D,UAAUf,MAAK0E,UAAUlC,WAAAA;AAC/C0B,IAAAA,WAAUqD,gBAAgB1D,GAAGa,QAAAA,GAAW,sCAAA;AAGxC,UAAM8C,gBAAgBxF,aAAa,KAAKvB,QAAQQ,QAAQgB,OAAOjC,MAAK0E,SAASxC,KAAK;AAGlF,UAAMuF,eAA4D,CAAA;AAClE,QAAIC,WAAWF,cAAc9E;AAC7B,eAAWiC,UAAU3E,MAAK4E,SAAS;AAC/B,YAAM7C,WAAWC,aAAa,KAAKvB,QAAQiH,UAAU/C,MAAAA;AACrD8C,mBAAaE,KAAK;QAAE5F;QAAU6F,WAAWF;MAAS,CAAA;AAClDA,iBAAW3F,SAASW;IACxB;AAEA,QAAImF,WAAqE7C;AAEzE,aAAS8C,IAAI9H,MAAK4E,QAAQmD,SAAS,GAAGD,KAAK,GAAGA,KAAK;AAC/C,YAAMnD,SAAS3E,MAAK4E,QAAQkD,CAAAA;AAC5B,YAAM,EAAE/F,UAAU6F,UAAS,IAAKH,aAAaK,CAAAA;AAE7C,UAAI/F,SAASI,UAAU;AACnB,cAAMA,WAAW,KAAKM,wBAAwBkC,QAAQ5C,SAASW,MAAM;UACjE,GAAGF;UACHP,OAAO2F;UACP7C,OAAOC;UACP5C,YAAY4C;QAChB,CAAA;AAEA,YAAI6C,UAAU;AACV3D,UAAAA,WAAUqD,gBAAgB1D,GAAGgE,QAAAA,GAAW,4BAAA;AACxCA,qBAAW;YACP,GAAG1F;YACHU,YAAY;cACR0C,cAAc7D,OACV8D,WAAU9D,OAAOmG,UAAUpC,eAAe/D,OAAO1B,MAAK4E,QAAQkD,IAAI,CAAA,CAAE,CAAA,CAAA;;UAGhF;QACJ,OAAO;AAEHD,qBAAW;YACP,GAAG1F;YACHQ,OAAO,KAAKC,WAAWT,SAASQ,OAAOL,YAAAA;YACvCO,YAAYN,eAAe;cAACA;gBAAgBJ,SAASU;UACzD;QACJ;MACJ,OAAO;AACHqB,QAAAA,WAAU4D,MAAM9H,MAAK4E,QAAQmD,SAAS,GAAG,6CAAA;AACzC7D,QAAAA,WAAU,CAAC2D,UAAU,6CAAA;AAErBA,mBAAWG,WAAWtG,OAAOiD,MAAAA;MACjC;IACJ;AAEA,WAAO;MACH,GAAGD;MACH7B,YAAY;QAAC0C,cAAc7D,OAAO8D,WAAU9D,OAAOmG,UAAWpC,eAAe/D,OAAO,IAAA,CAAA,CAAA;;IACxF;EACJ;EAEQ2F,kBAAkB3C,UAAe1E,OAAwBiI,cAAsB;AACnF,QAAI,CAACvD,UAAU;AACX,aAAOxB,WAAUC,gBAAgB,IAAA;IACrC;AAEA,QAAInD,MAAK4E,QAAQmD,WAAW,GAAG;AAC3B,YAAM,IAAI5G,MAAM,wCAAwC;IAC5D;AAEA,UAAMe,QAAQlC,MAAK4E,QAAQ,CAAA;AAC3B,UAAM7C,WAAWC,aAAa,KAAKvB,QAAQwH,cAAc/F,KAAAA;AACzD,UAAMgG,aAAaxD,SAASxC,KAAAA,KAAU;AACtC,WAAO,KAAKX,eAAe2G,YAAYnG,SAASW,IAAI;EACxD;EAEQD,wBACJP,OACAiG,eACAlH,SACe;AACf,UAAM2G,YAAY3G,QAAQgB;AAC1B,UAAM,EAAEmG,UAAUC,aAAY,IAAKC,gCAAgC,KAAK7H,QAAQmH,WAAW1F,KAAAA;AAE3F,QAAIjB,QAAQmB,YAAY;AACpB,UAAImG;AACJ,UAAIF,cAAc;AACdE,oBAAYvF,YACR,KAAKxC,SACL4H,SAASxG,IAAI,CAAC,EAAE4G,IAAIC,GAAE,MAClB3E,qBAAoBpC,OAChBgH,eAAchH,OAAOsG,WAAWtG,OAAO+G,EAAAA,GAAKE,WAAUjH,OAAOyG,aAAAA,CAAAA,GAC7DpE,cAAarC,OAAO,GAAA,GACpBT,QAAQmB,WAAYoG,EAAAA,CAAG,CAAA,CAAA;MAIvC,OAAO;AACHD,oBAAYvF,YACR,KAAKxC,SACL4H,SAASxG,IAAI,CAAC,EAAE4G,IAAIC,GAAE,MAClB3E,qBAAoBpC,OAChBgH,eAAchH,OAAOsG,WAAWtG,OAAO8G,EAAAA,GAAKG,WAAUjH,OAAOyG,aAAAA,CAAAA,GAC7DpE,cAAarC,OAAO,GAAA,GACpBT,QAAQmB,WAAYqG,EAAAA,CAAG,CAAA,CAAA;MAIvC;AAEA,aAAO;QACHxI,MAAM;QACN2I,MAAMC,SAASnH,OAAO;UAACiH,WAAUjH,OAAOyG,aAAAA;SAAe;QACvDxF,OAAOG,UAAUpB,OAAO6G,SAAAA;MAC5B;IACJ,OAAO;AACH,UAAIA;AACJ,UAAIF,cAAc;AAEdE,oBAAYvF,YACR,KAAKxC,SACL4H,SAASxG,IAAI,CAAC,EAAE4G,IAAIC,GAAE,MAClB3E,qBAAoBpC,OAChBgH,eAAchH,OAAOsG,WAAWtG,OAAO8G,EAAAA,GAAKG,WAAUjH,OAAOT,QAAQ8D,SAAS6C,SAAAA,CAAAA,GAC9E7D,cAAarC,OAAO,GAAA,GACpBgH,eAAchH,OAAOsG,WAAWtG,OAAO+G,EAAAA,GAAKE,WAAUjH,OAAOyG,aAAAA,CAAAA,CAAAA,CAAAA,CAAAA;MAI7E,OAAO;AAEHI,oBAAYvF,YACR,KAAKxC,SACL4H,SAASxG,IAAI,CAAC,EAAE4G,IAAIC,GAAE,MAClB3E,qBAAoBpC,OAChBgH,eAAchH,OAAOsG,WAAWtG,OAAO+G,EAAAA,GAAKE,WAAUjH,OAAOT,QAAQ8D,SAAS6C,SAAAA,CAAAA,GAC9E7D,cAAarC,OAAO,GAAA,GACpBgH,eAAchH,OAAOsG,WAAWtG,OAAO8G,EAAAA,GAAKG,WAAUjH,OAAOyG,aAAAA,CAAAA,CAAAA,CAAAA,CAAAA;MAI7E;AAEA,aAAO;QACHlI,MAAM;QACN2I,MAAMC,SAASnH,OAAO;UAACiH,WAAUjH,OAAOyG,aAAAA;SAAe;QACvDxF,OAAOG,UAAUpB,OAAO6G,SAAAA;MAC5B;IACJ;EACJ;EAEQlG,gBAAgByG,QAAgB7H,SAA8D;AAClG,WAAOyH,eAAchH,OAAOsG,WAAWtG,OAAOoH,MAAAA,GAASH,WAAUjH,OAAOT,QAAQ8D,SAAS9D,QAAQgB,KAAK,CAAA;EAC1G;EAEQwB,WAAWrC,OAAyC;AACxD,WAAOkD,gBAAgB6C,OAAO/F,KAAAA,KAAUA,MAAMmF,aAAa;EAC/D;EAEQpC,aAAanE,OAAkB;AACnC,WAAOsE,gBAAgBE,SAASxE,KAAAA,KAAS,KAAKyD,WAAWzD,MAAK0E,QAAQ;EAC1E;EAEQd,WAAWmF,MAAqB;AACpC,WAAO7F,WAAUW,GAAGkF,IAAAA,KAASA,KAAK3H,UAAU;EAChD;AACJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AXteO,IAAM4H,gBAAN,cAAsDC,yBAAAA;EA5C7D,OA4C6DA;;;;EACxCC;EAEjB,YAA6BC,QAAgC;AACzD,UAAK,GAAA,KADoBA,SAAAA;AAEzB,SAAKD,UAAUE,eAAe,KAAKD,OAAOE,SAAS,KAAKF,OAAOG,QAAQ;EAC3E;EAEA,IAAIC,SAAS;AACT,WAAO,KAAKJ,OAAOK;EACvB;EAEA,MAAMC,OACFC,MACAC,SACF;AACE,QAAI,CAAC,KAAKC,gBAAgBF,IAAAA,GAAO;AAE7B,YAAM,IAAIG,sBAAsBC,QAAW,kCAAA;IAC/C;AAEA,QAAI,CAAC,KAAKC,oBAAoBL,IAAAA,GAAO;AAEjC,aAAOC,QAAQ,KAAKK,cAAcN,IAAAA,CAAAA;IACtC;AAEA,QAAIO,8BAA8B;AAClC,UAAMC,gBAAgB,KAAKC,iBAAiBT,IAAAA;AAE5C,QAAIU,gBAAgBC,GAAGX,IAAAA,GAAO;AAE1B,YAAMY,iBAAiB,KAAKC,qBAAqBL,eAAe,QAAA;AAChE,UAAII,mBAAmB,OAAO;AAC1B,cAAM,IAAIT,sBAAsBK,aAAAA;MACpC,WAAWI,mBAAmBR,QAAW;AACrCG,sCAA8B;MAClC;IACJ;AAEA,QAAI,CAACA,+BAA+B,CAACP,KAAKc,WAAW;AAEjD,aAAOb,QAAQ,KAAKK,cAAcN,IAAAA,CAAAA;IACtC;AAEA,QAAIU,gBAAgBC,GAAGX,IAAAA,GAAO;AAC1B,YAAM,KAAKe,uBAAuBf,MAAMC,OAAAA;IAC5C;AACA,UAAMe,kBAAkB,KAAKV,cAAcN,IAAAA;AAC3C,UAAMiB,SAAS,MAAMhB,QAAQe,eAAAA;AAE7B,QAAI,CAAC,KAAKE,gBAAgBlB,IAAAA,GAAO;AAC7B,YAAMmB,iBAAiB,MAAM,KAAKC,gBAAgBpB,MAAMiB,QAAQhB,OAAAA;AAChE,UAAIkB,eAAeE,KAAKC,WAAWL,OAAOI,KAAKC,QAAQ;AACnD,cAAM,IAAInB,sBAAsBK,eAAe,uCAAA;MACnD;AACA,aAAOW;IACX,OAAO;AACH,aAAOF;IACX;EA6BJ;EAEQC,gBAAgBlB,MAAyB;AAC7C,QAAI,CAACA,KAAKc,WAAW;AACjB,aAAO;IACX;AACA,UAAMS,WAAWC,YAAY,KAAK/B,OAAOE,SAAS,KAAKc,iBAAiBT,IAAAA,CAAAA;AACxE,UAAMyB,YAAY,IAAIC,gBAAAA;AACtB,UAAMC,kBAAkBF,UAAUG,QAAQ5B,KAAKc,SAAS;AACxD,WAAOa,gBAAgBE,MAAM,CAACC,MAAMP,SAASQ,SAASD,CAAAA,CAAAA;EAC1D;EAEA,MAAcf,uBAAuBf,MAAuBC,SAAqC;AAC7F,QAAI,CAACD,KAAKgC,WAAW,CAAChC,KAAKiC,QAAQ;AAC/B;IACJ;AAEA,UAAMC,QAAQ,KAAKzB,iBAAiBT,IAAAA;AACpC,UAAMmC,SAASnC,KAAKgC,QAAQI,IAAI,CAACN,MAAMA,EAAEO,OAAOC,IAAI;AACpD,UAAMC,YAAY,KAAKC,sBAAsBxC,KAAKiC,QAAQC,OAAOC,MAAAA;AACjE,eAAWF,UAAUM,WAAW;AAC5B,YAAM,KAAKE,6BACPP,OACAC,QACAF,OAAOG,IAAI,CAACM,MAAMA,EAAE1C,IAAI,GACxBiC,OAAOG,IAAI,CAACM,MAAMA,EAAEC,GAAG,GACvB1C,OAAAA;IAER;EACJ;EAEA,MAAcwC,6BACVP,OACAC,QACAF,QACAW,WACA3C,SACF;AACE,UAAM4C,aAA4C,CAAC;AACnD,UAAMC,gBAAyC,CAAC;AAChD,aAASC,IAAI,GAAGA,IAAIZ,OAAOb,QAAQyB,KAAK;AACpCF,iBAAWV,OAAOY,CAAAA,CAAE,IAAKd,OAAOc,CAAAA;AAChCD,oBAAcX,OAAOY,CAAAA,CAAE,IAAKH,UAAUG,CAAAA;IAC1C;AAEA,UAAMC,SAAS,KAAKC,kBAAkBf,OAAO9B,QAAW,UAAUyC,YAAYC,aAAAA;AAC9E,UAAMI,iBAAkC;MACpCC,MAAM;MACNC,YAAY;QAACC,eAAcC,OAAOC,WAAUD,OAAON,QAAQQ,gBAAeF,OAAO,YAAA,CAAA,CAAA;;IACrF;AACA,UAAMrC,SAAS,MAAMhB,QAAQiD,cAAAA;AAC7B,QAAI,CAAEjC,OAAOI,KAAK,CAAA,GAAYoC,YAAY;AACtC,YAAM,IAAItD,sBAAsB+B,KAAAA;IACpC;EACJ;EAEQM,sBAAsBxC,MAAqBkC,OAA0BC,QAAkB;AAC3F,QAAIuB,WAAW/C,GAAGX,IAAAA,GAAO;AACrB,aAAOA,KAAKiC,OAAOG,IAAI,CAACM,MAAM,KAAKiB,qBAAqBjB,EAAET,QAAQC,OAAOC,MAAAA,CAAAA;IAC7E,WAAWyB,uBAAuBjD,GAAGX,IAAAA,GAAO;AACxC,aAAO;QAAC,KAAK2D,qBAAqB3D,KAAKiC,QAAQC,OAAOC,MAAAA;;IAC1D,OAAO;AACH,YAAM,IAAI0B,cAAc,yBAAyB7D,KAAKmD,IAAI,+BAA+B;IAC7F;EACJ;EAEQQ,qBAAqBG,MAA0B5B,OAA0BC,QAAkB;AAC/F4B,IAAAA,WAAUD,KAAKxC,WAAWa,OAAOb,QAAQ,sCAAA;AACzC,UAAML,SAAkD,CAAA;AACxD,aAAS8B,IAAI,GAAGA,IAAIe,KAAKxC,QAAQyB,KAAK;AAClC,YAAMiB,OAAOF,KAAKf,CAAAA;AAClB,YAAMkB,WAAWC,aAAa,KAAKzE,OAAOE,SAASuC,OAAOC,OAAOY,CAAAA,CAAE;AACnE,UAAI,OAAOiB,SAAS,YAAYA,QAAQ,UAAUA,MAAM;AACpDD,QAAAA,WAAUC,KAAKb,SAAS,aAAa,uBAAA;AACrClC,eAAOkD,KAAK;UACRnE,MAAMoE,WAAUd,OACZ,KAAK9D,QAAQ6E,mBACRL,KAAmBM,OACpBL,SAASM,MACT,CAAC,CAACN,SAASO,KAAK,CAAA;UAGxB7B,KAAMqB,KAAmBM;QAC7B,CAAA;MACJ,OAAO;AACH,cAAMA,QAAQ,KAAK9E,QAAQ6E,mBAAmBL,MAAMC,SAASM,MAAqB,CAAC,CAACN,SAASO,KAAK;AAClG,YAAIC,MAAMC,QAAQJ,KAAAA,GAAQ;AACtBrD,iBAAOkD,KAAK;YACRnE,MAAM2E,QAAQC,cAAc,KAAKpF,QAAQqF,qBAAqBP,KAAAA,CAAAA;YAC9D3B,KAAK2B;UACT,CAAA;QACJ,OAAO;AACHrD,iBAAOkD,KAAK;YAAEnE,MAAMoE,WAAUd,OAAOgB,KAAAA;YAAQ3B,KAAK2B;UAAM,CAAA;QAC5D;MACJ;IACJ;AACA,WAAOrD;EACX;EAEQJ,qBAAqBqB,OAA0B4C,WAA4B;AAC/E,UAAMC,WAAW,KAAKC,iBAAiB9C,OAAO4C,SAAAA;AAC9C,QAAI,CAACC,SAASE,KAAK,CAACC,MAAMA,EAAE/B,SAAS,OAAA,GAAU;AAE3C,aAAO;IACX;;MAEI4B,SAASE,KAAK,CAACC,MAAMA,EAAE/B,SAAS,UAAU,KAAKgC,WAAWD,EAAEE,SAAS,CAAA;MACvE;AACE,aAAO;IACX;;MAEI,CAACL,SAASE,KAAK,CAACC,MAAMA,EAAE/B,SAAS,MAAA,KACjC4B,SAASE,KAAK,CAACC,MAAMA,EAAE/B,SAAS,WAAW,KAAKgC,WAAWD,EAAEE,SAAS,CAAA;MACxE;AACE,aAAO;IACX,OAAO;AACH,aAAOhF;IACX;EACJ;EAEQ+E,WAAWE,OAAkB;AACjC,WAAOC,gBAAgBC,UAAUF,KAAAA,KAASA,MAAKf,UAAU;EAC7D;EAEA,MAAclD,gBAAgBpB,MAAqBiB,QAA0BhB,SAAqC;AAC9G,QAAIgB,OAAOI,KAAKC,WAAW,GAAG;AAC1B,aAAOL;IACX;AAEA,QAAI,CAAC,KAAKZ,oBAAoBL,IAAAA,KAAS,CAACA,KAAKc,WAAW;AACpD,aAAOG;IACX;AAGA,UAAMuE,QAAQ,KAAK/E,iBAAiBT,IAAAA;AACpC,QAAI,CAACwF,OAAO;AACR,YAAM,IAAI3B,cAAc,4CAA4C7D,IAAAA,EAAM;IAC9E;AAEA,UAAMyF,eAAe,KAAKC,kBAAkBF,OAAOvE,OAAOI,IAAI;AAC9D,UAAMsE,eAAe,KAAK1C,kBAAkBuC,OAAOpF,QAAW,MAAA;AAE9D,UAAMwF,SAA0B;MAC5BzC,MAAM;MACN0C,MAAMC,UAASxC,OAAO;QAACyC,WAAUzC,OAAOkC,KAAAA;OAAO;MAC/CQ,OAAOC,WAAU3C,OAAO4C,YAAY,KAAK1G,SAAS;QAACiG;QAAcE;OAAa,CAAA;MAC9EvC,YAAYpD,KAAKc,UAAUsC;IAC/B;AACA,UAAM+C,eAAe,MAAMlG,QAAQ2F,MAAAA;AACnC,WAAOO;EACX;EAEQT,kBAAkBF,OAAenE,MAA4B;AACjE,UAAME,WAAWC,YAAY,KAAK/B,OAAOE,SAAS6F,KAAAA;AAClD,WAAOY,YACH,KAAK5G,SACL6B,KAAKe,IAAI,CAACiE,QACNH,YACI,KAAK1G,SACL+B,SAASa,IAAI,CAACkE,UACVC,qBAAoBjD,OAChBkD,YAAWlD,OAAOgD,KAAAA,GAClBG,cAAanD,OAAO,GAAA,GACpBc,WAAUd,OAAO+C,IAAIC,KAAAA,CAAM,CAAA,CAAA,CAAA,CAAA,CAAA;EAMnD;EAEQ7F,iBAAiBT,MAA2D;AAChF,UAAM0G,IAAIC,OAAM3G,IAAAA,EACX4G,KAAKlG,gBAAgBC,IAAI,CAACX,UAAS6G,aAAa7G,MAAK8G,IAAI,CAAA,EACzDF,KAAKG,gBAAgBpG,IAAI,CAACX,UAAS6G,aAAa7G,MAAKwF,KAAK,CAAA,EAC1DoB,KAAKI,gBAAgBrG,IAAI,CAACX,UAAAA;AACvB,UAAIA,MAAK6F,KAAKoB,MAAM3F,WAAW,GAAG;AAC9B,cAAM,IAAIuC,cAAc,6CAAA;MAC5B;AACA,aAAOgD,aAAa7G,MAAK6F,KAAKoB,MAAM,CAAA,CAAE;IAC1C,CAAA,EACCC,WAAU;AACf,QAAI,CAACR,GAAG;AACJ,YAAM,IAAI7C,cAAc,4CAA4C7D,IAAAA,EAAM;IAC9E;AACA,WAAO0G;EACX;EAEQxG,gBAAgBF,MAAgD;AACpE,WACImH,iBAAgBxG,GAAGX,IAAAA,KAASU,gBAAgBC,GAAGX,IAAAA,KAAS+G,gBAAgBpG,GAAGX,IAAAA,KAASgH,gBAAgBrG,GAAGX,IAAAA;EAE/G;EAEQK,oBAAoBL,MAAoD;AAC5E,WAAOU,gBAAgBC,GAAGX,IAAAA,KAAS+G,gBAAgBpG,GAAGX,IAAAA,KAASgH,gBAAgBrG,GAAGX,IAAAA;EACtF;EAEQiD,kBACJf,OACAkF,OACAtC,WACAjC,YACAC,eACF;AACE,UAAMiC,WAAW,KAAKC,iBAAiB9C,OAAO4C,SAAAA;AAC9C,QAAIC,SAASzD,WAAW,GAAG;AACvB,aAAO+F,UAAU,KAAK7H,OAAO;IACjC;AAEA,UAAM8H,SAASvC,SACV/B,OAAO,CAACuE,WAAWA,OAAOpE,SAAS,OAAA,EACnCf,IAAI,CAACmF,WAAW,KAAKC,yBAAyBtF,OAAOkF,OAAOtC,WAAWyC,QAAQ1E,YAAYC,aAAAA,CAAAA;AAEhG,UAAM2E,SAAS1C,SACV/B,OAAO,CAACuE,WAAWA,OAAOpE,SAAS,MAAA,EACnCf,IAAI,CAACmF,WAAW,KAAKC,yBAAyBtF,OAAOkF,OAAOtC,WAAWyC,QAAQ1E,YAAYC,aAAAA,CAAAA;AAEhG,QAAI4E;AAEJ,QAAIJ,OAAOhG,WAAW,GAAG;AAErBoG,uBAAiBL,UAAU,KAAK7H,OAAO;IAC3C,OAAO;AAEHkI,uBAAiBtB,YAAY,KAAK5G,SAAS8H,MAAAA;AAG3C,UAAIG,OAAOnG,WAAW,GAAG;AACrB,cAAMqG,iBAAiBzB,YACnB,KAAK1G,SACLiI,OAAOrF,IAAI,CAACwF,MAAMC,aAAaD,GAAG,KAAKpI,OAAO,CAAA,CAAA;AAGlDkI,yBAAiBxB,YAAY,KAAK1G,SAAS;UAACkI;UAAgBC;SAAe;MAC/E;IACJ;AACA,WAAOD;EACX;EAEmBI,qBAAqB9H,MAAuB;AAC3D,QAAI+H,YAAY/H,KAAKgG;AAErBhG,SAAK6F,MAAMoB,MAAMe,QAAQ,CAACnC,SAAAA;AACtB,YAAMoC,gBAAgB,KAAKC,iBAAiBrC,IAAAA;AAC5C,UAAIoC,eAAe;AACf,cAAM,EAAE/F,OAAOkF,MAAK,IAAKa;AACzB,cAAMjF,SAAS,KAAKC,kBAAkBf,OAAOkF,OAAO,MAAA;AACpDW,oBAAY9B,WAAU3C,OAClByE,WAAW/B,QAAQE,YAAY,KAAK1G,SAAS;UAACuI,UAAU/B;UAAOhD;SAAO,IAAIA,MAAAA;MAElF;IACJ,CAAA;AAEA,UAAMmF,aAAa,MAAML,qBAAqB;MAC1C,GAAG9H;MACHgG,OAAO5F;IACX,CAAA;AAEA,WAAO;MACH,GAAG+H;MACHnC,OAAO+B;IACX;EACJ;EAEmBK,qBAAqBpI,MAAuB;AAC3D,UAAMiB,SAAS,MAAMmH,qBAAqBpI,IAAAA;AAC1C,QAAI,CAACA,KAAKc,WAAW;AACjB,aAAOG;IACX;AACA,QAAI,KAAKC,gBAAgBlB,IAAAA,GAAO;AAC5B,aAAOiB;IACX,OAAO;AAEH,YAAMM,WAAWC,YAAY,KAAK/B,OAAOE,SAAS,KAAKc,iBAAiBT,IAAAA,CAAAA;AACxE,aAAO;QACH,GAAGiB;QACHH,WAAWuH,cAAc/E,OACrB/B,SAASa,IAAI,CAACkE,UAAUjD,eAAcC,OAAOkD,YAAWlD,OAAOgD,KAAAA,CAAAA,CAAAA,CAAAA;MAEvE;IACJ;EACJ;EAEmBgC,qBAAqBtI,MAAuB;AAC3D,UAAMiB,SAAS,MAAMqH,qBAAqBtI,IAAAA;AAC1C,UAAMQ,gBAAgB,KAAKC,iBAAiBT,IAAAA;AAC5C,UAAMgD,SAAS,KAAKC,kBAAkBzC,eAAeJ,QAAW,QAAA;AAChE,WAAO;MACH,GAAGa;MACH+E,OAAOC,WAAU3C,OAAOrC,OAAO+E,QAAQE,YAAY,KAAK1G,SAAS;QAACyB,OAAO+E,MAAMA;QAAOhD;OAAO,IAAIA,MAAAA;IACrG;EACJ;EAEmBuF,qBAAqBvI,MAAuB;AAC3D,UAAMiB,SAAS,MAAMsH,qBAAqBvI,IAAAA;AAC1C,UAAMQ,gBAAgB,KAAKC,iBAAiBT,IAAAA;AAC5C,UAAMgD,SAAS,KAAKC,kBAAkBzC,eAAeJ,QAAW,QAAA;AAChE,WAAO;MACH,GAAGa;MACH+E,OAAOC,WAAU3C,OAAOrC,OAAO+E,QAAQE,YAAY,KAAK1G,SAAS;QAACyB,OAAO+E,MAAMA;QAAOhD;OAAO,IAAIA,MAAAA;IACrG;EACJ;EAEQkF,iBAAiBrC,MAA+E;AACpG,QAAIE,WAAUpF,GAAGkF,IAAAA,GAAO;AACpB,aAAO;QAAE3D,OAAO2D,KAAKL,MAAMgD,WAAWlG;MAA0B;IACpE;AACA,QAAIiB,WAAU5C,GAAGkF,IAAAA,GAAO;AACpB,YAAM4C,QAAQ,KAAKP,iBAAiBrC,KAAK7F,IAAI;AAC7C,UAAI,CAACyI,OAAO;AACR,eAAOrI;MACX;AACA,aAAO;QACH8B,OAAOuG,MAAMvG;QACbkF,OAAO5D,gBAAe7C,GAAGkF,KAAKuB,KAAK,IAAIvB,KAAKuB,MAAM9E,OAAOlC;MAC7D;IACJ,OAAO;AAGH,aAAOA;IACX;EACJ;EAEQoH,yBACJtF,OACAkF,OACAtC,WACAyC,QACA1E,YACAC,eACF;AACE,WAAO,IAAI4F,sBAAsB,KAAKjJ,OAAOE,SAAS,KAAKF,OAAOG,UAAU,KAAKH,OAAOkJ,KAAK,EAAEC,UAC3FrB,OAAOnC,WACP;MACIlD;MACAkF;MACAtC;MACAjC;MACAC;MACA+F,MAAM,KAAKpJ,OAAOkJ;IACtB,CAAA;EAER;EAEQ3D,iBAAiB8D,WAAmBhE,WAA4B;AACpE,UAAMiE,WAAWC,aAAa,KAAKvJ,OAAOE,SAASmJ,SAAAA;AACnD,UAAM7H,SAAmB,CAAA;AAEzB,UAAMgI,oBAAoB,wBAAC5D,UAAAA;AACvBtB,MAAAA,WAAUuB,gBAAgBC,UAAUF,KAAAA,GAAO,qBAAA;AAC3CtB,MAAAA,WAAU,OAAOsB,MAAKf,UAAU,UAAU,4BAAA;AAC1C,aAAOe,MAAKf,MACP4E,MAAM,GAAA,EACNlG,OAAO,CAACN,MAAM,CAAC,CAACA,CAAAA,EAChBN,IAAI,CAACM,MAAMA,EAAEyG,KAAI,CAAA;IAC1B,GAP0B;AAS1B,QAAIJ,SAASK,YAAY;AACrBnI,aAAOkD,KAAI,GACJ4E,SAASK,WACPpG,OAAO,CAACqG,SAASA,KAAK/G,SAAS,aAAa+G,KAAK/G,SAAS,QAAA,EAC1DF,IACG,CAACiH,UACI;QACGlG,MAAMkG,KAAK/G,SAAS,YAAY,UAAU;QAC1CgH,YAAYL,kBAAkBI,KAAKE,KAAM,CAAA,EAAIjF,KAAK;QAClDc,WAAWiE,KAAKE,KAAM,CAAA,EAAIjF;MAC9B,EAAA,EAEPtB,OAAO,CAACuE,WAAWA,OAAO+B,WAAWvH,SAAS,KAAA,KAAUwF,OAAO+B,WAAWvH,SAAS+C,SAAAA,CAAAA,CAAAA;IAEhG;AACA,WAAO7D;EACX;AACJ;;;ActfO,IAAMuI,eAAN,MAAMA;EAFb,OAEaA;;;EACT,IAAIC,KAAK;AACL,WAAO;EACX;EAEA,IAAIC,OAAO;AACP,WAAO;EACX;EAEA,IAAIC,cAAc;AACd,WAAO;EACX;EAEAC,cAAc;IAAEC;IAAOC;IAAQC;;EAAuB,GAAiC;AACnF,UAAMC,UAAU,IAAIC,cAAsBH,MAAAA;AAC1C,WAAOE,QAAQE;MAAOL;MAAOE;;IAAuB;EACxD;AACJ;","names":["RejectedByPolicyError","Error","model","reason","invariant","AliasNode","BinaryOperationNode","ColumnNode","DeleteQueryNode","FromNode","IdentifierNode","InsertQueryNode","OperationNodeTransformer","OperatorNode","PrimitiveValueListNode","RawNode","ReturningNode","SelectionNode","SelectQueryNode","TableNode","UpdateQueryNode","ValueNode","ValuesNode","WhereNode","match","match","invariant","sql","match","QueryError","Error","message","cause","InternalError","getModel","schema","model","models","requireModel","matchedName","Object","keys","find","k","toLowerCase","QueryError","getField","field","modelDef","fields","requireField","getIdFields","idFields","getRelationForeignKeyFieldPairs","schema","model","relationField","fieldDef","requireField","relation","InternalError","fields","references","keyPairs","map","f","i","fk","pk","ownedByModel","opposite","oppositeField","type","isRelationField","schema","model","field","fieldDef","requireField","relation","getUniqueFields","modelDef","requireModel","result","key","value","Object","entries","uniqueFields","InternalError","type","push","name","def","defs","fromEntries","keys","map","k","buildFieldRef","schema","model","field","options","eb","modelAlias","fieldDef","requireField","computed","ref","computer","computedFields","QueryError","isEnum","schema","type","enums","buildJoinPairs","schema","model","modelAlias","relationField","relationModelAlias","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","map","fk","pk","makeDefaultOrderBy","idFields","getIdFields","f","getManyToManyRelation","field","fieldDef","requireField","array","relation","opposite","undefined","oppositeFieldDef","type","sortedModelNames","sort","parentFkName","otherModel","otherField","otherFkName","joinTable","name","flattenCompoundUniqueFilters","filter","uniqueFields","getUniqueFields","compoundUniques","u","length","result","key","value","Object","entries","some","assign","invariant","isPlainObject","sql","match","P","enumerate","x","undefined","Array","isArray","BaseCrudDialect","schema","options","transformPrimitive","value","_type","_forArrayField","buildFilter","eb","model","modelAlias","where","undefined","true","false","result","_where","flattenCompoundUniqueFilters","key","payload","Object","entries","startsWith","and","buildCompositeFilter","fieldDef","requireField","relation","buildRelationFilter","array","buildArrayFilter","buildPrimitiveFilter","match","with","enumerate","map","subPayload","or","not","exhaustive","field","buildToOneRelationFilter","buildToManyRelationFilter","table","ownedByModel","keyPairs","getRelationForeignKeyFieldPairs","fk","sql","ref","is","joinAlias","joinPairs","buildJoinPairs","filterResultField","joinSelect","selectFrom","type","left","right","select","fn","count","lit","as","conditions","push","isNot","relationModel","buildPkFkWhereRefs","m2m","getManyToManyRelation","modelIdField","getIdFields","relationIdField","joinTable","otherFkName","whereRef","parentFkName","relationKeyPairs","pk","eb1","clauses","fieldType","fieldRef","buildFieldRef","_value","buildLiteralFilter","val","InternalError","isEnum","buildEnumFilter","buildStringFilter","P","union","buildNumberFilter","buildBooleanFilter","buildDateTimeFilter","buildBytesFilter","QueryError","lhs","rhs","buildStandardFilter","getRhs","recurse","throwIfInvalid","onlyForKeys","isPlainObject","consumedKeys","op","includes","Array","isArray","condition","invariant","length","otherwise","getField","computed","insensitive","mode","prepStringCasing","Error","toLower","v","buildOrderBy","query","orderBy","useDefaultIfEmpty","negated","makeDefaultOrderBy","forEach","k","slice","raw","negateSort","sort","nulls","_count","subQuery","leftJoin","join","on","isTrue","expression","node","toOperationNode","kind","isFalse","args","nonTrueArgs","filter","arg","nonFalseArgs","PostgresCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","forArrayField","undefined","Array","isArray","JSON","stringify","map","v","match","with","Date","toString","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","joinedQuery","buildRelationJSON","select","qb","parentName","relationFieldDef","requireField","schema","relationModel","leftJoinLateral","eb","joinTableName","result","selectFrom","subQuery","selectAll","where","buildFilter","skip","take","negateOrderBy","buildSkipTake","buildOrderBy","orderBy","m2m","getManyToManyRelation","parentIds","getIdFields","relationIds","invariant","length","ref","joinTable","otherFkName","whereRef","parentFkName","joinPairs","buildJoinPairs","and","left","right","sql","as","buildRelationObjectSelect","buildRelationJoins","join","onTrue","objArgs","buildRelationObjectArgs","array","fn","coalesce","relationModelDef","requireModel","push","Object","entries","fields","filter","relation","name","omit","field","lit","buildFieldRef","options","flatMap","fieldDef","fieldValue","include","selectInclude","isRelationField","forEach","limit","offset","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","values","invariant","sql","match","SqliteCrudDialect","BaseCrudDialect","provider","transformPrimitive","value","type","_forArrayField","undefined","Array","isArray","map","v","match","with","Date","toISOString","toString","Buffer","from","JSON","stringify","otherwise","buildRelationSelection","query","model","relationField","parentAlias","payload","select","eb","buildRelationJSON","as","parentName","relationFieldDef","requireField","schema","relationModel","relationModelDef","requireModel","subQueryName","tbl","selectFrom","subQuery","selectAll","where","buildFilter","skip","take","negateOrderBy","buildSkipTake","buildOrderBy","orderBy","m2m","getManyToManyRelation","parentIds","getIdFields","relationIds","invariant","length","ref","joinTable","otherFkName","whereRef","parentFkName","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","forEach","fk","pk","objArgs","push","Object","entries","fields","filter","relation","name","omit","field","sql","lit","buildFieldRef","options","flatMap","fieldDef","subJson","include","array","fn","coalesce","join","limit","offset","buildJsonObject","key","supportsUpdateWithLimit","supportsDeleteWithLimit","supportsDistinctOn","buildArrayLength","buildArrayLiteralSQL","_values","Error","getCrudDialect","schema","options","match","provider","type","with","SqliteCrudDialect","PostgresCrudDialect","exhaustive","ExpressionUtils","literal","value","kind","array","items","call","functionName","args","function","binary","left","op","right","unary","operand","field","member","receiver","members","_this","_null","and","expr","expressions","reduce","acc","exp","or","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","OperationNodeVisitor","DefaultOperationNodeVisitor","OperationNodeVisitor","defaultVisit","node","Object","values","forEach","value","Array","isArray","el","kind","visitNode","visitSelectQuery","visitSelection","visitColumn","visitAlias","visitTable","visitFrom","visitReference","visitAnd","visitOr","visitValueList","visitParens","visitJoin","visitRaw","visitWhere","visitInsertQuery","visitDeleteQuery","visitReturning","visitCreateTable","visitAddColumn","visitColumnDefinition","visitDropTable","visitOrderBy","visitOrderByItem","visitGroupBy","visitGroupByItem","visitUpdateQuery","visitColumnUpdate","visitLimit","visitOffset","visitOnConflict","visitOnDuplicateKey","visitCheckConstraint","visitDataType","visitSelectAll","visitIdentifier","visitSchemableIdentifier","visitValue","visitPrimitiveValueList","visitOperator","visitCreateIndex","visitDropIndex","visitList","visitPrimaryKeyConstraint","visitUniqueConstraint","visitReferences","visitWith","visitCommonTableExpression","visitCommonTableExpressionName","visitHaving","visitCreateSchema","visitDropSchema","visitAlterTable","visitDropColumn","visitRenameColumn","visitAlterColumn","visitModifyColumn","visitAddConstraint","visitDropConstraint","visitForeignKeyConstraint","visitCreateView","visitDropView","visitGenerated","visitDefaultValue","visitOn","visitValues","visitSelectModifier","visitCreateType","visitDropType","visitExplain","visitDefaultInsertValue","visitAggregateFunction","visitOver","visitPartitionBy","visitPartitionByItem","visitSetOperation","visitBinaryOperation","visitUnaryOperation","visitUsing","visitFunction","visitCase","visitWhen","visitJSONReference","visitJSONPath","visitJSONPathLeg","visitJSONOperatorChain","visitTuple","visitMergeQuery","visitMatched","visitAddIndex","visitCast","visitFetch","visitTop","visitOutput","ColumnCollector","DefaultOperationNodeVisitor","columns","collect","node","visitNode","visitColumn","includes","column","name","push","invariant","AliasNode","BinaryOperationNode","ColumnNode","expressionBuilder","FromNode","FunctionNode","IdentifierNode","OperatorNode","ReferenceNode","SelectionNode","SelectQueryNode","TableNode","ValueListNode","ValueNode","WhereNode","match","invariant","match","ExpressionEvaluator","evaluate","expression","context","result","match","when","ExpressionUtils","isArray","expr","evaluateArray","isBinary","evaluateBinary","isField","evaluateField","isLiteral","evaluateLiteral","isMember","evaluateMember","isUnary","evaluateUnary","isCall","evaluateCall","isThis","thisValue","isNull","exhaustive","function","auth","Error","op","with","operand","val","receiver","member","members","value","field","items","map","item","evaluateCollectionPredicate","left","right","_right","invariant","Array","includes","some","every","AliasNode","AndNode","BinaryOperationNode","FunctionNode","OperatorNode","OrNode","ParensNode","ReferenceNode","TableNode","UnaryOperationNode","ValueNode","trueNode","dialect","ValueNode","createImmediate","transformPrimitive","falseNode","isTrueNode","node","is","value","isFalseNode","conjunction","nodes","some","items","filter","n","length","reduce","acc","OrNode","AndNode","create","ParensNode","disjunction","logicalNot","UnaryOperationNode","OperatorNode","buildIsFalse","node","dialect","isFalseNode","trueNode","isTrueNode","falseNode","BinaryOperationNode","create","FunctionNode","OperatorNode","getTableName","TableNode","is","table","identifier","name","AliasNode","ReferenceNode","undefined","expressionHandlers","Map","expr","kind","_target","_propertyKey","descriptor","get","set","ExpressionTransformer","dialect","schema","clientOptions","auth","getCrudDialect","authType","InternalError","transform","expression","context","handler","Error","value","call","_literal","transformValue","_array","ValueListNode","create","items","map","item","_field","fieldDef","requireField","model","field","relation","thisEntity","createColumnRef","memberFilter","memberSelect","restContext","transformRelationAccess","type","where","mergeWhere","selections","WhereNode","trueNode","conjunction","_null","ValueNode","createImmediate","_binary","op","left","right","disjunction","isAuthCall","transformAuthBinary","transformCollectionPredicate","isNullNode","is","BinaryOperationNode","OperatorNode","FunctionNode","transformOperator","invariant","isAuthMember","ExpressionEvaluator","evaluate","ExpressionUtils","isField","isMember","newContextModel","receiver","member","members","memberDef","predicateFilter","alias","undefined","logicalNot","count","predicateResult","match","with","exhaustive","SelectionNode","AliasNode","IdentifierNode","other","isNull","transformPrimitive","_unary","operand","mappedOp","otherwise","_call","result","transformCall","toOperationNode","func","functions","function","QueryError","eb","expressionBuilder","args","arg","transformCallArg","operation","isLiteral","val","thisEntityRaw","ref","isCall","valNode","valueMemberAccess","_member","SelectQueryNode","receiverField","memberFields","currType","push","fromModel","currNode","i","length","ColumnNode","receiverType","fieldValue","relationModel","keyPairs","ownedByModel","getRelationForeignKeyFieldPairs","condition","fk","pk","ReferenceNode","TableNode","from","FromNode","column","node","PolicyHandler","OperationNodeTransformer","dialect","client","getCrudDialect","$schema","$options","kysely","$qb","handle","node","proceed","isCrudQueryNode","RejectedByPolicyError","undefined","isMutationQueryNode","transformNode","mutationRequiresTransaction","mutationModel","getMutationModel","InsertQueryNode","is","constCondition","tryGetConstantPolicy","returning","enforcePreCreatePolicy","transformedNode","result","onlyReturningId","readBackResult","processReadBack","rows","length","idFields","getIdFields","collector","ColumnCollector","selectedColumns","collect","every","c","includes","columns","values","model","fields","map","column","name","valueRows","unwrapCreateValueRows","enforcePreCreatePolicyForOne","v","raw","valuesRaw","thisEntity","thisEntityRaw","i","filter","buildPolicyFilter","preCreateCheck","kind","selections","SelectionNode","create","AliasNode","IdentifierNode","$condition","ValuesNode","unwrapCreateValueRow","PrimitiveValueListNode","InternalError","data","invariant","item","fieldDef","requireField","push","ValueNode","transformPrimitive","value","type","array","Array","isArray","RawNode","createWithSql","buildArrayLiteralSQL","operation","policies","getModelPolicies","some","p","isTrueExpr","condition","expr","ExpressionUtils","isLiteral","table","idConditions","buildIdConditions","policyFilter","select","from","FromNode","TableNode","where","WhereNode","conjunction","selectResult","disjunction","row","field","BinaryOperationNode","ColumnNode","OperatorNode","r","match","when","getTableName","into","UpdateQueryNode","DeleteQueryNode","froms","exhaustive","SelectQueryNode","alias","falseNode","allows","policy","transformPolicyCondition","denies","combinedPolicy","combinedDenies","d","buildIsFalse","transformSelectQuery","whereNode","forEach","extractResult","extractTableName","baseResult","transformInsertQuery","ReturningNode","transformUpdateQuery","transformDeleteQuery","identifier","inner","ExpressionTransformer","$auth","transform","auth","modelName","modelDef","requireModel","extractOperations","split","trim","attributes","attr","operations","args","PolicyPlugin","id","name","description","onKyselyQuery","query","client","proceed","handler","PolicyHandler","handle"]}
|