diff --git a/prisma/migrations/20260911120000_add_audit_log/migration.sql b/prisma/migrations/20260911120000_add_audit_log/migration.sql new file mode 100644 index 0000000..a504577 --- /dev/null +++ b/prisma/migrations/20260911120000_add_audit_log/migration.sql @@ -0,0 +1,30 @@ +-- CreateTable +CREATE TABLE "AuditLog" ( + "id" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "userId" TEXT, + "email" TEXT, + "roleId" INTEGER, + "roleName" TEXT, + "page" TEXT NOT NULL, + "action" TEXT NOT NULL, + "entity" TEXT, + "entityId" TEXT, + "before" JSONB, + "after" JSONB, + "ip" TEXT, + + CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "AuditLog_createdAt_idx" ON "AuditLog"("createdAt"); + +-- CreateIndex +CREATE INDEX "AuditLog_roleId_idx" ON "AuditLog"("roleId"); + +-- CreateIndex +CREATE INDEX "AuditLog_action_idx" ON "AuditLog"("action"); + +-- CreateIndex +CREATE INDEX "AuditLog_page_idx" ON "AuditLog"("page"); diff --git a/prisma/schema.prisma b/prisma/schema.prisma index be8d5bc..4c873ee 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -229,3 +229,27 @@ model ColorPalette { @@map("ColorPalette") } + +// Append-only audit trail of database mutations. Written centrally by the +// Prisma extension in src/lib/db.ts; read by the admin Audit Log page. +model AuditLog { + id String @id @default(uuid()) + createdAt DateTime @default(now()) + userId String? + email String? + roleId Int? + roleName String? + page String + action String + entity String? + entityId String? + before Json? + after Json? + ip String? + + @@index([createdAt]) + @@index([roleId]) + @@index([action]) + @@index([page]) + @@map("AuditLog") +} diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 2585f0a..c086ade 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -3,71 +3,92 @@ import { svelteKitHandler } from 'better-auth/svelte-kit'; import { building } from '$app/environment'; import { env } from '$env/dynamic/private'; import { validateApiKey } from '$lib/server/api-key'; +import { runWithAuditContext, type AuditContext } from '$lib/server/audit-context'; +import { clientIp } from '$lib/server/v2-helpers'; + +function contextFor( + event: { url: URL; request: Request }, + session?: App.Locals['user'] +): AuditContext { + return { + userId: session?.id ?? null, + email: session?.email ?? null, + roleId: session?.roleId ?? null, + page: event.url.pathname, + ip: clientIp(event.request) + }; +} export async function handle({ event, resolve }) { - // v2 auth is ALWAYS enforced — no API_KEYS_ACTIVE bypass. The only - // exceptions are the signed onboarding routes (HMAC-protected). - // TODO: re-enable when v2 API key auth is ready. - // const isV2 = event.url.pathname.startsWith('/api/v2/'); - // const isSignedOnboarding = event.url.pathname.startsWith('/api/v2/automations/'); - // - // if (isV2 && !isSignedOnboarding) { - // const authHeader = event.request.headers.get('authorization'); - // if (!authHeader?.startsWith('Bearer ')) { - // return new Response(JSON.stringify({ error: 'API key required' }), { - // status: 401, - // headers: { 'content-type': 'application/json' } - // }); - // } - // - // const key = authHeader.slice(7); - // const record = await validateApiKey(key); - // if (!record) { - // return new Response(JSON.stringify({ error: 'Invalid or expired API key' }), { - // status: 401, - // headers: { 'content-type': 'application/json' } - // }); - // } - // - // event.locals.apiKey = record; - // - // return resolve(event); - // } + return runWithAuditContext(contextFor(event), async () => { + // v2 auth is ALWAYS enforced — no API_KEYS_ACTIVE bypass. The only + // exceptions are the signed onboarding routes (HMAC-protected). + // TODO: re-enable when v2 API key auth is ready. + // const isV2 = event.url.pathname.startsWith('/api/v2/'); + // const isSignedOnboarding = event.url.pathname.startsWith('/api/v2/automations/'); + // + // if (isV2 && !isSignedOnboarding) { + // const authHeader = event.request.headers.get('authorization'); + // if (!authHeader?.startsWith('Bearer ')) { + // return new Response(JSON.stringify({ error: 'API key required' }), { + // status: 401, + // headers: { 'content-type': 'application/json' } + // }); + // } + // + // const key = authHeader.slice(7); + // const record = await validateApiKey(key); + // if (!record) { + // return new Response(JSON.stringify({ error: 'Invalid or expired API key' }), { + // status: 401, + // headers: { 'content-type': 'application/json' } + // }); + // } + // + // event.locals.apiKey = record; + // + // return resolve(event); + // } - if ( - event.url.pathname.startsWith('/api/v1/') && - !event.url.pathname.startsWith('/api/v1/automations/') - ) { - if (env.API_KEYS_ACTIVE !== 'false') { - const authHeader = event.request.headers.get('authorization'); - if (!authHeader?.startsWith('Bearer ')) { - return new Response(JSON.stringify({ error: 'API key required' }), { - status: 401, - headers: { 'content-type': 'application/json' } - }); + if ( + event.url.pathname.startsWith('/api/v1/') && + !event.url.pathname.startsWith('/api/v1/automations/') + ) { + if (env.API_KEYS_ACTIVE !== 'false') { + const authHeader = event.request.headers.get('authorization'); + if (!authHeader?.startsWith('Bearer ')) { + return new Response(JSON.stringify({ error: 'API key required' }), { + status: 401, + headers: { 'content-type': 'application/json' } + }); + } + + const key = authHeader.slice(7); + const record = await validateApiKey(key); + if (!record) { + return new Response(JSON.stringify({ error: 'Invalid or expired API key' }), { + status: 401, + headers: { 'content-type': 'application/json' } + }); + } } - const key = authHeader.slice(7); - const record = await validateApiKey(key); - if (!record) { - return new Response(JSON.stringify({ error: 'Invalid or expired API key' }), { - status: 401, - headers: { 'content-type': 'application/json' } - }); - } + return resolve(event); } - return resolve(event); - } + const session = await auth.api.getSession({ + headers: event.request.headers + }); - const session = await auth.api.getSession({ - headers: event.request.headers + if (session) { + event.locals.session = session.session; + event.locals.user = session.user; + + return runWithAuditContext(contextFor(event, session.user), () => + svelteKitHandler({ event, resolve, auth, building }) + ); + } + + return svelteKitHandler({ event, resolve, auth, building }); }); - - if (session) { - event.locals.session = session.session; - event.locals.user = session.user; - } - - return svelteKitHandler({ event, resolve, auth, building }); } diff --git a/src/lib/db.ts b/src/lib/db.ts index 10cd777..58c8851 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -2,18 +2,172 @@ import pg from 'pg'; import { PrismaPg } from '@prisma/adapter-pg'; import { PrismaClient } from '$lib/generated/prisma/client'; import { env } from '$env/dynamic/private'; +import { getAuditContext } from '$lib/server/audit-context'; +import { describeAction, entityIdFor, sanitizeAuditValue, shouldAudit } from '$lib/server/audit'; let _prisma: PrismaClient | undefined; +let _base: PrismaClient | undefined; +let _pool: pg.Pool | undefined; + +function getBase(): { base: PrismaClient; pool: pg.Pool } { + if (!_base || !_pool) { + _pool = new pg.Pool({ connectionString: env.DATABASE_URL }); + const adapter = new PrismaPg(_pool); + _base = new PrismaClient({ adapter }); + } + return { base: _base, pool: _pool }; +} + +const roleNameCache = new Map(); + +async function resolveRoleName(base: PrismaClient, roleId: number | null): Promise { + if (roleId === null) return null; + const cached = roleNameCache.get(roleId); + if (cached) return cached; + try { + const role = await base.userRole.findUnique({ + where: { id: roleId }, + select: { name: true } + }); + if (role?.name) { + roleNameCache.set(roleId, role.name); + return role.name; + } + } catch (e) { + console.error('Failed to resolve role name for audit log:', e); + } + return null; +} + +type Delegate = { + findFirst?: (args: unknown) => Promise; + findMany?: (args: unknown) => Promise; +}; + +function delegateFor(base: PrismaClient, model: string): Delegate | undefined { + const key = model.charAt(0).toLowerCase() + model.slice(1); + return (base as unknown as Record)[key] as Delegate | undefined; +} + +async function readBefore( + base: PrismaClient, + model: string, + operation: string, + args: unknown +): Promise { + if (operation.startsWith('create')) return null; + const delegate = delegateFor(base, model); + if (!delegate) return null; + const where = (args as { where?: unknown } | null)?.where; + try { + if (operation === 'updateMany' || operation === 'deleteMany') { + return delegate.findMany ? await delegate.findMany({ where, take: 50 }) : null; + } + return delegate.findFirst ? await delegate.findFirst({ where }) : null; + } catch { + return null; + } +} + +async function writeAuditRow( + pool: pg.Pool, + base: PrismaClient, + entry: { + userId: string | null; + email: string | null; + roleId: number | null; + page: string; + action: string; + entity: string; + entityId: string | null; + before: unknown; + after: unknown; + ip: string | null; + } +): Promise { + const roleName = await resolveRoleName(base, entry.roleId); + await pool.query( + `INSERT INTO "AuditLog" + ("id", "createdAt", "userId", "email", "roleId", "roleName", "page", "action", "entity", "entityId", "before", "after", "ip") + VALUES ($1, now(), $2, $3, $4, $5, $6, $7, $8, $9, $10::jsonb, $11::jsonb, $12)`, + [ + crypto.randomUUID(), + entry.userId, + entry.email, + entry.roleId, + roleName, + entry.page, + entry.action, + entry.entity, + entry.entityId, + entry.before === null ? null : JSON.stringify(entry.before), + entry.after === null ? null : JSON.stringify(entry.after), + entry.ip + ] + ); +} function getPrisma(): PrismaClient { - if (!_prisma) { - const pool = new pg.Pool({ - connectionString: env.DATABASE_URL - }); + if (_prisma) return _prisma; - const adapter = new PrismaPg(pool); - _prisma = new PrismaClient({ adapter }); - } + const { base, pool } = getBase(); + + const extended = base.$extends({ + query: { + $allModels: { + async $allOperations({ model, operation, args, query }) { + if (!shouldAudit(model, operation)) { + return query(args); + } + + const before = await readBefore(base, model, operation, args); + const result = await query(args); + + try { + const ctx = getAuditContext(); + const res = result as { id?: unknown; email?: string; roleId?: number | null } | null; + + let userId = ctx?.userId ?? null; + let email = ctx?.email ?? null; + let roleId = ctx?.roleId ?? null; + + // Self-signup: attribute the new user to itself since no session exists yet. + if (!userId && model === 'User' && operation === 'create' && res) { + userId = (res.id as string | undefined) ?? null; + email = res.email ?? null; + roleId = res.roleId ?? null; + } + + const after = + operation === 'updateMany' || operation === 'deleteMany' + ? { count: (result as { count?: number } | null)?.count ?? null } + : operation.startsWith('delete') + ? null + : result; + + await writeAuditRow(pool, base, { + userId, + email, + roleId, + page: ctx?.page ?? '/system', + action: describeAction(operation), + entity: model, + entityId: entityIdFor(args, result, before), + before: sanitizeAuditValue(before), + after: sanitizeAuditValue(after), + ip: ctx?.ip ?? null + }); + } catch (e) { + console.error('Failed to write audit log:', e); + } + + return result; + } + } + } + }); + + _prisma = extended as unknown as PrismaClient; return _prisma; } diff --git a/src/lib/generated/prisma/browser.ts b/src/lib/generated/prisma/browser.ts index b02ca43..be9621c 100644 --- a/src/lib/generated/prisma/browser.ts +++ b/src/lib/generated/prisma/browser.ts @@ -92,3 +92,8 @@ export type ApiKey = Prisma.ApiKeyModel * */ export type ColorPalette = Prisma.ColorPaletteModel +/** + * Model AuditLog + * + */ +export type AuditLog = Prisma.AuditLogModel diff --git a/src/lib/generated/prisma/client.ts b/src/lib/generated/prisma/client.ts index 62813b5..6a41eca 100644 --- a/src/lib/generated/prisma/client.ts +++ b/src/lib/generated/prisma/client.ts @@ -116,3 +116,8 @@ export type ApiKey = Prisma.ApiKeyModel * */ export type ColorPalette = Prisma.ColorPaletteModel +/** + * Model AuditLog + * + */ +export type AuditLog = Prisma.AuditLogModel diff --git a/src/lib/generated/prisma/commonInputTypes.ts b/src/lib/generated/prisma/commonInputTypes.ts index 48a3f1c..462aed4 100644 --- a/src/lib/generated/prisma/commonInputTypes.ts +++ b/src/lib/generated/prisma/commonInputTypes.ts @@ -253,6 +253,57 @@ export type JsonWithAggregatesFilterBase<$PrismaModel = never> = { _max?: Prisma.NestedJsonFilter<$PrismaModel> } +export type JsonNullableFilter<$PrismaModel = never> = +| Prisma.PatchUndefined< + Prisma.Either>, Exclude>, 'path'>>, + Required> + > +| Prisma.OptionalFlat>, 'path'>> + +export type JsonNullableFilterBase<$PrismaModel = never> = { + equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter + path?: string[] + mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> + string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> + string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> + string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel> + array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter +} + +export type JsonNullableWithAggregatesFilter<$PrismaModel = never> = +| Prisma.PatchUndefined< + Prisma.Either>, Exclude>, 'path'>>, + Required> + > +| Prisma.OptionalFlat>, 'path'>> + +export type JsonNullableWithAggregatesFilterBase<$PrismaModel = never> = { + equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter + path?: string[] + mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> + string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> + string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> + string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel> + array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter + _count?: Prisma.NestedIntNullableFilter<$PrismaModel> + _min?: Prisma.NestedJsonNullableFilter<$PrismaModel> + _max?: Prisma.NestedJsonNullableFilter<$PrismaModel> +} + export type NestedStringFilter<$PrismaModel = never> = { equals?: string | Prisma.StringFieldRefInput<$PrismaModel> in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> @@ -478,4 +529,28 @@ export type NestedJsonFilterBase<$PrismaModel = never> = { not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter } +export type NestedJsonNullableFilter<$PrismaModel = never> = +| Prisma.PatchUndefined< + Prisma.Either>, Exclude>, 'path'>>, + Required> + > +| Prisma.OptionalFlat>, 'path'>> + +export type NestedJsonNullableFilterBase<$PrismaModel = never> = { + equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter + path?: string[] + mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel> + string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel> + string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel> + string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel> + array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null + lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> + not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter +} + diff --git a/src/lib/generated/prisma/internal/class.ts b/src/lib/generated/prisma/internal/class.ts index c15bb3d..5c3e1ef 100644 --- a/src/lib/generated/prisma/internal/class.ts +++ b/src/lib/generated/prisma/internal/class.ts @@ -20,7 +20,7 @@ const config: runtime.GetPrismaClientConfig = { "clientVersion": "7.8.0", "engineVersion": "3c6e192761c0362d496ed980de936e2f3cebcd3a", "activeProvider": "postgresql", - "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/lib/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n roleId Int? @default(4) // New users default to \"User\"\n role UserRole? @relation(fields: [roleId], references: [id])\n sessions Session[]\n accounts Account[]\n profiles Profile[]\n licenseKeys LicenseKey[]\n userProclamations UserProclamations[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\n// I chose to create a Profile table here because honestly, I didn't want to waste\n// a bunch of time trying to figure out how to customize the default Better-Auth model. \nmodel Profile {\n id String @id @default(uuid())\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n email String?\n firstName String\n lastName String\n phoneNumber String\n ghlContactId String? @map(\"ghl_contact_id\")\n addresses Address[]\n\n @@index([userId])\n @@index([email])\n}\n\nmodel Address {\n id String @id @default(uuid())\n profileId String\n profile Profile @relation(fields: [profileId], references: [id], onDelete: Cascade)\n street String\n city String\n state String\n postalCode String\n country String\n type String @default(\"Mailing\")\n isDefaultMailing Boolean @default(false)\n isDefaultBilling Boolean @default(false)\n isDefaultShipping Boolean @default(false)\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel UserRole {\n id Int @id @default(autoincrement())\n name String\n users User[]\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Proclamation {\n id String @id @default(uuid())\n name String @unique\n content String\n solfeggioFrequencyId Int\n solfeggioFrequency SolfeggioFrequency @relation(fields: [solfeggioFrequencyId], references: [id])\n categoryId Int\n category ProclamationCategory @relation(fields: [categoryId], references: [id])\n groupId Int\n group ProclamationGroup @relation(fields: [groupId], references: [id])\n userProclamations UserProclamations[]\n // Legacy subscription-level FK. Retained in the database but unmanaged; the\n // FK constraint is dropped and the value is left NULL. Hidden from the client.\n subscriptionLevelId Int? @ignore\n}\n\nmodel ProclamationGroup {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\nmodel UserProclamations {\n userId String\n user User @relation(fields: [userId], references: [id])\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([userId, proclamationId])\n}\n\nmodel SolfeggioFrequency {\n id Int @id @default(autoincrement())\n name String @unique\n value Int @unique\n proclamations Proclamation[]\n}\n\nmodel ProclamationCategory {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\n// Archive of the former child sub-categories removed when the\n// ProclamationCategory hierarchy was flattened. Kept for recovery/audit.\n// `@@ignore` keeps it out of the generated client while Prisma remains aware\n// of the table so `migrate dev` does not report it as an untracked table.\nmodel ProclamationCategoryLegacy {\n id Int @id\n name String\n parentId Int?\n sortOrder Int @default(0)\n\n @@map(\"ProclamationCategoryLegacy\")\n @@ignore\n}\n\n// Archive of the category->subscription-level mappings for the child\n// categories removed when the category hierarchy was flattened. Kept with\n// `@@ignore` so Prisma remains aware of the table but it is excluded from the\n// generated client and Prisma's own migrations.\nmodel ProclamationCategorySubscriptionLevelLegacy {\n categoryId Int\n subscriptionLevelId Int\n\n @@id([categoryId, subscriptionLevelId])\n @@map(\"ProclamationCategorySubscriptionLevelLegacy\")\n @@ignore\n}\n\nmodel LicenseKey {\n id String @id @default(uuid())\n key String @unique\n active Boolean\n createdAt DateTime @default(now())\n lastValidatedAt DateTime?\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n email String?\n // Legacy subscription level. Retained in the database but unmanaged; hidden\n // from the client and left NULL.\n level String? @ignore\n\n @@index([userId])\n @@index([email])\n}\n\nmodel ApiKey {\n id String @id @default(cuid())\n keyPrefix String\n keyHash String @unique\n createdAt DateTime @default(now())\n expiresAt DateTime?\n revokedAt DateTime?\n}\n\n// Portal-editable 7-color palette per canonical solfeggio frequency id (1-9).\n// `solfeggioFrequencyId` is the canonical id the kiosk uses (see\n// v2-serializers.ts), not the DB autoincrement id of `SolfeggioFrequency`.\nmodel ColorPalette {\n solfeggioFrequencyId Int @id\n colors Json // [\"#RRGGBB\", ... x7]\n\n @@map(\"ColorPalette\")\n}\n", + "inlineSchema": "// This is your Prisma schema file,\n// learn more about it in the docs: https://pris.ly/d/prisma-schema\n\n// Looking for ways to speed up your queries, or scale easily with your serverless or edge functions?\n// Try Prisma Accelerate: https://pris.ly/cli/accelerate-init\n\ngenerator client {\n provider = \"prisma-client\"\n output = \"../src/lib/generated/prisma\"\n}\n\ndatasource db {\n provider = \"postgresql\"\n}\n\nmodel User {\n id String @id\n name String\n email String\n emailVerified Boolean @default(false)\n image String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n roleId Int? @default(4) // New users default to \"User\"\n role UserRole? @relation(fields: [roleId], references: [id])\n sessions Session[]\n accounts Account[]\n profiles Profile[]\n licenseKeys LicenseKey[]\n userProclamations UserProclamations[]\n\n @@unique([email])\n @@map(\"user\")\n}\n\n// I chose to create a Profile table here because honestly, I didn't want to waste\n// a bunch of time trying to figure out how to customize the default Better-Auth model. \nmodel Profile {\n id String @id @default(uuid())\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: Cascade)\n email String?\n firstName String\n lastName String\n phoneNumber String\n ghlContactId String? @map(\"ghl_contact_id\")\n addresses Address[]\n\n @@index([userId])\n @@index([email])\n}\n\nmodel Address {\n id String @id @default(uuid())\n profileId String\n profile Profile @relation(fields: [profileId], references: [id], onDelete: Cascade)\n street String\n city String\n state String\n postalCode String\n country String\n type String @default(\"Mailing\")\n isDefaultMailing Boolean @default(false)\n isDefaultBilling Boolean @default(false)\n isDefaultShipping Boolean @default(false)\n}\n\nmodel Session {\n id String @id\n expiresAt DateTime\n token String\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n ipAddress String?\n userAgent String?\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n\n @@unique([token])\n @@index([userId])\n @@map(\"session\")\n}\n\nmodel Account {\n id String @id\n accountId String\n providerId String\n userId String\n user User @relation(fields: [userId], references: [id], onDelete: Cascade)\n accessToken String?\n refreshToken String?\n idToken String?\n accessTokenExpiresAt DateTime?\n refreshTokenExpiresAt DateTime?\n scope String?\n password String?\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([userId])\n @@map(\"account\")\n}\n\nmodel UserRole {\n id Int @id @default(autoincrement())\n name String\n users User[]\n}\n\nmodel Verification {\n id String @id\n identifier String\n value String\n expiresAt DateTime\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@index([identifier])\n @@map(\"verification\")\n}\n\nmodel Proclamation {\n id String @id @default(uuid())\n name String @unique\n content String\n solfeggioFrequencyId Int\n solfeggioFrequency SolfeggioFrequency @relation(fields: [solfeggioFrequencyId], references: [id])\n categoryId Int\n category ProclamationCategory @relation(fields: [categoryId], references: [id])\n groupId Int\n group ProclamationGroup @relation(fields: [groupId], references: [id])\n userProclamations UserProclamations[]\n // Legacy subscription-level FK. Retained in the database but unmanaged; the\n // FK constraint is dropped and the value is left NULL. Hidden from the client.\n subscriptionLevelId Int? @ignore\n}\n\nmodel ProclamationGroup {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\nmodel UserProclamations {\n userId String\n user User @relation(fields: [userId], references: [id])\n proclamationId String\n proclamation Proclamation @relation(fields: [proclamationId], references: [id])\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n\n @@id([userId, proclamationId])\n}\n\nmodel SolfeggioFrequency {\n id Int @id @default(autoincrement())\n name String @unique\n value Int @unique\n proclamations Proclamation[]\n}\n\nmodel ProclamationCategory {\n id Int @id @default(autoincrement())\n name String @unique\n sortOrder Int @default(0)\n proclamations Proclamation[]\n}\n\n// Archive of the former child sub-categories removed when the\n// ProclamationCategory hierarchy was flattened. Kept for recovery/audit.\n// `@@ignore` keeps it out of the generated client while Prisma remains aware\n// of the table so `migrate dev` does not report it as an untracked table.\nmodel ProclamationCategoryLegacy {\n id Int @id\n name String\n parentId Int?\n sortOrder Int @default(0)\n\n @@map(\"ProclamationCategoryLegacy\")\n @@ignore\n}\n\n// Archive of the category->subscription-level mappings for the child\n// categories removed when the category hierarchy was flattened. Kept with\n// `@@ignore` so Prisma remains aware of the table but it is excluded from the\n// generated client and Prisma's own migrations.\nmodel ProclamationCategorySubscriptionLevelLegacy {\n categoryId Int\n subscriptionLevelId Int\n\n @@id([categoryId, subscriptionLevelId])\n @@map(\"ProclamationCategorySubscriptionLevelLegacy\")\n @@ignore\n}\n\nmodel LicenseKey {\n id String @id @default(uuid())\n key String @unique\n active Boolean\n createdAt DateTime @default(now())\n lastValidatedAt DateTime?\n userId String?\n user User? @relation(fields: [userId], references: [id], onDelete: SetNull)\n email String?\n // Legacy subscription level. Retained in the database but unmanaged; hidden\n // from the client and left NULL.\n level String? @ignore\n\n @@index([userId])\n @@index([email])\n}\n\nmodel ApiKey {\n id String @id @default(cuid())\n keyPrefix String\n keyHash String @unique\n createdAt DateTime @default(now())\n expiresAt DateTime?\n revokedAt DateTime?\n}\n\n// Portal-editable 7-color palette per canonical solfeggio frequency id (1-9).\n// `solfeggioFrequencyId` is the canonical id the kiosk uses (see\n// v2-serializers.ts), not the DB autoincrement id of `SolfeggioFrequency`.\nmodel ColorPalette {\n solfeggioFrequencyId Int @id\n colors Json // [\"#RRGGBB\", ... x7]\n\n @@map(\"ColorPalette\")\n}\n\n// Append-only audit trail of database mutations. Written centrally by the\n// Prisma extension in src/lib/db.ts; read by the admin Audit Log page.\nmodel AuditLog {\n id String @id @default(uuid())\n createdAt DateTime @default(now())\n userId String?\n email String?\n roleId Int?\n roleName String?\n page String\n action String\n entity String?\n entityId String?\n before Json?\n after Json?\n ip String?\n\n @@index([createdAt])\n @@index([roleId])\n @@index([action])\n @@index([page])\n @@map(\"AuditLog\")\n}\n", "runtimeDataModel": { "models": {}, "enums": {}, @@ -32,10 +32,10 @@ const config: runtime.GetPrismaClientConfig = { } } -config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"object\",\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"profiles\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"ProfileToUser\"},{\"name\":\"licenseKeys\",\"kind\":\"object\",\"type\":\"LicenseKey\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"UserToUserProclamations\"}],\"dbName\":\"user\"},\"Profile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProfileToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ghlContactId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"ghl_contact_id\"},{\"name\":\"addresses\",\"kind\":\"object\",\"type\":\"Address\",\"relationName\":\"AddressToProfile\"}],\"dbName\":null},\"Address\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profile\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"AddressToProfile\"},{\"name\":\"street\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDefaultMailing\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultBilling\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultShipping\",\"kind\":\"scalar\",\"type\":\"Boolean\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"session\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"account\"},\"UserRole\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserRole\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Proclamation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"solfeggioFrequency\",\"kind\":\"object\",\"type\":\"SolfeggioFrequency\",\"relationName\":\"ProclamationToSolfeggioFrequency\"},{\"name\":\"categoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"category\",\"kind\":\"object\",\"type\":\"ProclamationCategory\",\"relationName\":\"ProclamationToProclamationCategory\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"ProclamationGroup\",\"relationName\":\"ProclamationToProclamationGroup\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"ProclamationToUserProclamations\"}],\"dbName\":null},\"ProclamationGroup\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationGroup\"}],\"dbName\":null},\"UserProclamations\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SolfeggioFrequency\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToSolfeggioFrequency\"}],\"dbName\":null},\"ProclamationCategory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationCategory\"}],\"dbName\":null},\"LicenseKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"active\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastValidatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyPrefix\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ColorPalette\":{\"fields\":[{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":\"ColorPalette\"}},\"enums\":{},\"types\":{}}") +config.runtimeDataModel = JSON.parse("{\"models\":{\"User\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"emailVerified\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"image\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"role\",\"kind\":\"object\",\"type\":\"UserRole\",\"relationName\":\"UserToUserRole\"},{\"name\":\"sessions\",\"kind\":\"object\",\"type\":\"Session\",\"relationName\":\"SessionToUser\"},{\"name\":\"accounts\",\"kind\":\"object\",\"type\":\"Account\",\"relationName\":\"AccountToUser\"},{\"name\":\"profiles\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"ProfileToUser\"},{\"name\":\"licenseKeys\",\"kind\":\"object\",\"type\":\"LicenseKey\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"UserToUserProclamations\"}],\"dbName\":\"user\"},\"Profile\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"ProfileToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"firstName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"lastName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"phoneNumber\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"ghlContactId\",\"kind\":\"scalar\",\"type\":\"String\",\"dbName\":\"ghl_contact_id\"},{\"name\":\"addresses\",\"kind\":\"object\",\"type\":\"Address\",\"relationName\":\"AddressToProfile\"}],\"dbName\":null},\"Address\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profileId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"profile\",\"kind\":\"object\",\"type\":\"Profile\",\"relationName\":\"AddressToProfile\"},{\"name\":\"street\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"city\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"state\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"postalCode\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"country\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"type\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"isDefaultMailing\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultBilling\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"isDefaultShipping\",\"kind\":\"scalar\",\"type\":\"Boolean\"}],\"dbName\":null},\"Session\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"token\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"ipAddress\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userAgent\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"SessionToUser\"}],\"dbName\":\"session\"},\"Account\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accountId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"providerId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"AccountToUser\"},{\"name\":\"accessToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"refreshToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"idToken\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"accessTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"refreshTokenExpiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"scope\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"password\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"account\"},\"UserRole\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"users\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserRole\"}],\"dbName\":null},\"Verification\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"identifier\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":\"verification\"},\"Proclamation\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"content\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"solfeggioFrequency\",\"kind\":\"object\",\"type\":\"SolfeggioFrequency\",\"relationName\":\"ProclamationToSolfeggioFrequency\"},{\"name\":\"categoryId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"category\",\"kind\":\"object\",\"type\":\"ProclamationCategory\",\"relationName\":\"ProclamationToProclamationCategory\"},{\"name\":\"groupId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"group\",\"kind\":\"object\",\"type\":\"ProclamationGroup\",\"relationName\":\"ProclamationToProclamationGroup\"},{\"name\":\"userProclamations\",\"kind\":\"object\",\"type\":\"UserProclamations\",\"relationName\":\"ProclamationToUserProclamations\"}],\"dbName\":null},\"ProclamationGroup\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationGroup\"}],\"dbName\":null},\"UserProclamations\":{\"fields\":[{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"UserToUserProclamations\"},{\"name\":\"proclamationId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"proclamation\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToUserProclamations\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"updatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"SolfeggioFrequency\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"value\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToSolfeggioFrequency\"}],\"dbName\":null},\"ProclamationCategory\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"name\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"sortOrder\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"proclamations\",\"kind\":\"object\",\"type\":\"Proclamation\",\"relationName\":\"ProclamationToProclamationCategory\"}],\"dbName\":null},\"LicenseKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"key\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"active\",\"kind\":\"scalar\",\"type\":\"Boolean\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"lastValidatedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"user\",\"kind\":\"object\",\"type\":\"User\",\"relationName\":\"LicenseKeyToUser\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":null},\"ApiKey\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyPrefix\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"keyHash\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"expiresAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"revokedAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"}],\"dbName\":null},\"ColorPalette\":{\"fields\":[{\"name\":\"solfeggioFrequencyId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"colors\",\"kind\":\"scalar\",\"type\":\"Json\"}],\"dbName\":\"ColorPalette\"},\"AuditLog\":{\"fields\":[{\"name\":\"id\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"createdAt\",\"kind\":\"scalar\",\"type\":\"DateTime\"},{\"name\":\"userId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"email\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"roleId\",\"kind\":\"scalar\",\"type\":\"Int\"},{\"name\":\"roleName\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"page\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"action\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entity\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"entityId\",\"kind\":\"scalar\",\"type\":\"String\"},{\"name\":\"before\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"after\",\"kind\":\"scalar\",\"type\":\"Json\"},{\"name\":\"ip\",\"kind\":\"scalar\",\"type\":\"String\"}],\"dbName\":\"AuditLog\"}},\"enums\":{},\"types\":{}}") config.parameterizationSchema = { - strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"users\",\"_count\",\"role\",\"user\",\"sessions\",\"accounts\",\"profile\",\"addresses\",\"profiles\",\"licenseKeys\",\"proclamations\",\"solfeggioFrequency\",\"category\",\"group\",\"userProclamations\",\"proclamation\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Profile.findUnique\",\"Profile.findUniqueOrThrow\",\"Profile.findFirst\",\"Profile.findFirstOrThrow\",\"Profile.findMany\",\"Profile.createOne\",\"Profile.createMany\",\"Profile.createManyAndReturn\",\"Profile.updateOne\",\"Profile.updateMany\",\"Profile.updateManyAndReturn\",\"Profile.upsertOne\",\"Profile.deleteOne\",\"Profile.deleteMany\",\"Profile.groupBy\",\"Profile.aggregate\",\"Address.findUnique\",\"Address.findUniqueOrThrow\",\"Address.findFirst\",\"Address.findFirstOrThrow\",\"Address.findMany\",\"Address.createOne\",\"Address.createMany\",\"Address.createManyAndReturn\",\"Address.updateOne\",\"Address.updateMany\",\"Address.updateManyAndReturn\",\"Address.upsertOne\",\"Address.deleteOne\",\"Address.deleteMany\",\"Address.groupBy\",\"Address.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"UserRole.findUnique\",\"UserRole.findUniqueOrThrow\",\"UserRole.findFirst\",\"UserRole.findFirstOrThrow\",\"UserRole.findMany\",\"UserRole.createOne\",\"UserRole.createMany\",\"UserRole.createManyAndReturn\",\"UserRole.updateOne\",\"UserRole.updateMany\",\"UserRole.updateManyAndReturn\",\"UserRole.upsertOne\",\"UserRole.deleteOne\",\"UserRole.deleteMany\",\"UserRole.groupBy\",\"UserRole.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Proclamation.findUnique\",\"Proclamation.findUniqueOrThrow\",\"Proclamation.findFirst\",\"Proclamation.findFirstOrThrow\",\"Proclamation.findMany\",\"Proclamation.createOne\",\"Proclamation.createMany\",\"Proclamation.createManyAndReturn\",\"Proclamation.updateOne\",\"Proclamation.updateMany\",\"Proclamation.updateManyAndReturn\",\"Proclamation.upsertOne\",\"Proclamation.deleteOne\",\"Proclamation.deleteMany\",\"Proclamation.groupBy\",\"Proclamation.aggregate\",\"ProclamationGroup.findUnique\",\"ProclamationGroup.findUniqueOrThrow\",\"ProclamationGroup.findFirst\",\"ProclamationGroup.findFirstOrThrow\",\"ProclamationGroup.findMany\",\"ProclamationGroup.createOne\",\"ProclamationGroup.createMany\",\"ProclamationGroup.createManyAndReturn\",\"ProclamationGroup.updateOne\",\"ProclamationGroup.updateMany\",\"ProclamationGroup.updateManyAndReturn\",\"ProclamationGroup.upsertOne\",\"ProclamationGroup.deleteOne\",\"ProclamationGroup.deleteMany\",\"ProclamationGroup.groupBy\",\"ProclamationGroup.aggregate\",\"UserProclamations.findUnique\",\"UserProclamations.findUniqueOrThrow\",\"UserProclamations.findFirst\",\"UserProclamations.findFirstOrThrow\",\"UserProclamations.findMany\",\"UserProclamations.createOne\",\"UserProclamations.createMany\",\"UserProclamations.createManyAndReturn\",\"UserProclamations.updateOne\",\"UserProclamations.updateMany\",\"UserProclamations.updateManyAndReturn\",\"UserProclamations.upsertOne\",\"UserProclamations.deleteOne\",\"UserProclamations.deleteMany\",\"UserProclamations.groupBy\",\"UserProclamations.aggregate\",\"SolfeggioFrequency.findUnique\",\"SolfeggioFrequency.findUniqueOrThrow\",\"SolfeggioFrequency.findFirst\",\"SolfeggioFrequency.findFirstOrThrow\",\"SolfeggioFrequency.findMany\",\"SolfeggioFrequency.createOne\",\"SolfeggioFrequency.createMany\",\"SolfeggioFrequency.createManyAndReturn\",\"SolfeggioFrequency.updateOne\",\"SolfeggioFrequency.updateMany\",\"SolfeggioFrequency.updateManyAndReturn\",\"SolfeggioFrequency.upsertOne\",\"SolfeggioFrequency.deleteOne\",\"SolfeggioFrequency.deleteMany\",\"SolfeggioFrequency.groupBy\",\"SolfeggioFrequency.aggregate\",\"ProclamationCategory.findUnique\",\"ProclamationCategory.findUniqueOrThrow\",\"ProclamationCategory.findFirst\",\"ProclamationCategory.findFirstOrThrow\",\"ProclamationCategory.findMany\",\"ProclamationCategory.createOne\",\"ProclamationCategory.createMany\",\"ProclamationCategory.createManyAndReturn\",\"ProclamationCategory.updateOne\",\"ProclamationCategory.updateMany\",\"ProclamationCategory.updateManyAndReturn\",\"ProclamationCategory.upsertOne\",\"ProclamationCategory.deleteOne\",\"ProclamationCategory.deleteMany\",\"ProclamationCategory.groupBy\",\"ProclamationCategory.aggregate\",\"LicenseKey.findUnique\",\"LicenseKey.findUniqueOrThrow\",\"LicenseKey.findFirst\",\"LicenseKey.findFirstOrThrow\",\"LicenseKey.findMany\",\"LicenseKey.createOne\",\"LicenseKey.createMany\",\"LicenseKey.createManyAndReturn\",\"LicenseKey.updateOne\",\"LicenseKey.updateMany\",\"LicenseKey.updateManyAndReturn\",\"LicenseKey.upsertOne\",\"LicenseKey.deleteOne\",\"LicenseKey.deleteMany\",\"LicenseKey.groupBy\",\"LicenseKey.aggregate\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"ColorPalette.findUnique\",\"ColorPalette.findUniqueOrThrow\",\"ColorPalette.findFirst\",\"ColorPalette.findFirstOrThrow\",\"ColorPalette.findMany\",\"ColorPalette.createOne\",\"ColorPalette.createMany\",\"ColorPalette.createManyAndReturn\",\"ColorPalette.updateOne\",\"ColorPalette.updateMany\",\"ColorPalette.updateManyAndReturn\",\"ColorPalette.upsertOne\",\"ColorPalette.deleteOne\",\"ColorPalette.deleteMany\",\"ColorPalette.groupBy\",\"ColorPalette.aggregate\",\"AND\",\"OR\",\"NOT\",\"solfeggioFrequencyId\",\"colors\",\"equals\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"in\",\"notIn\",\"id\",\"keyPrefix\",\"keyHash\",\"createdAt\",\"expiresAt\",\"revokedAt\",\"contains\",\"startsWith\",\"endsWith\",\"key\",\"active\",\"lastValidatedAt\",\"userId\",\"email\",\"name\",\"sortOrder\",\"every\",\"some\",\"none\",\"value\",\"proclamationId\",\"updatedAt\",\"content\",\"categoryId\",\"groupId\",\"identifier\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"profileId\",\"street\",\"city\",\"state\",\"postalCode\",\"country\",\"type\",\"isDefaultMailing\",\"isDefaultBilling\",\"isDefaultShipping\",\"firstName\",\"lastName\",\"phoneNumber\",\"ghlContactId\",\"emailVerified\",\"image\",\"roleId\",\"userId_proclamationId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), - graph: "oQaOAfABEQUAAOIDACAHAADjAwAgCAAA5AMAIAsAAOUDACAMAADmAwAgEQAA0QMAIIsCAADgAwAwjAIAAAUAEI0CAADgAwAwngIBAAAAAaECQACuAwAhqwIBAAAAAawCAQCtAwAhswJAAK4DACHSAiAA1wMAIdMCAQDYAwAh1AICAOEDACEBAAAAAQAgBgMAAMQDACCLAgAAwwMAMIwCAAADABCNAgAAwwMAMJ4CAgCfAwAhrAIBAK0DACEBAAAAAwAgEQUAAOIDACAHAADjAwAgCAAA5AMAIAsAAOUDACAMAADmAwAgEQAA0QMAIIsCAADgAwAwjAIAAAUAEI0CAADgAwAwngIBAK0DACGhAkAArgMAIasCAQCtAwAhrAIBAK0DACGzAkAArgMAIdICIADXAwAh0wIBANgDACHUAgIA4QMAIQgFAADbBQAgBwAA3AUAIAgAAN0FACALAADeBQAgDAAA3wUAIBEAANYFACDTAgAA7QMAINQCAADtAwAgAwAAAAUAIAEAAAYAMAIAAAEAIAEAAAAFACAMBgAA1AMAIIsCAADfAwAwjAIAAAkAEI0CAADfAwAwngIBAK0DACGhAkAArgMAIaICQACuAwAhqgIBAK0DACGzAkAArgMAIcECAQCtAwAhwgIBANgDACHDAgEA2AMAIQMGAADXBQAgwgIAAO0DACDDAgAA7QMAIAwGAADUAwAgiwIAAN8DADCMAgAACQAQjQIAAN8DADCeAgEAAAABoQJAAK4DACGiAkAArgMAIaoCAQCtAwAhswJAAK4DACHBAgEAAAABwgIBANgDACHDAgEA2AMAIQMAAAAJACABAAAKADACAAALACARBgAA1AMAIIsCAADeAwAwjAIAAA0AEI0CAADeAwAwngIBAK0DACGhAkAArgMAIaoCAQCtAwAhswJAAK4DACG4AgEArQMAIbkCAQCtAwAhugIBANgDACG7AgEA2AMAIbwCAQDYAwAhvQJAAK8DACG-AkAArwMAIb8CAQDYAwAhwAIBANgDACEIBgAA1wUAILoCAADtAwAguwIAAO0DACC8AgAA7QMAIL0CAADtAwAgvgIAAO0DACC_AgAA7QMAIMACAADtAwAgEQYAANQDACCLAgAA3gMAMIwCAAANABCNAgAA3gMAMJ4CAQAAAAGhAkAArgMAIaoCAQCtAwAhswJAAK4DACG4AgEArQMAIbkCAQCtAwAhugIBANgDACG7AgEA2AMAIbwCAQDYAwAhvQJAAK8DACG-AkAArwMAIb8CAQDYAwAhwAIBANgDACEDAAAADQAgAQAADgAwAgAADwAgDAYAANkDACAKAADdAwAgiwIAANwDADCMAgAAEQAQjQIAANwDADCeAgEArQMAIaoCAQDYAwAhqwIBANgDACHOAgEArQMAIc8CAQCtAwAh0AIBAK0DACHRAgEA2AMAIQUGAADXBQAgCgAA2gUAIKoCAADtAwAgqwIAAO0DACDRAgAA7QMAIAwGAADZAwAgCgAA3QMAIIsCAADcAwAwjAIAABEAEI0CAADcAwAwngIBAAAAAaoCAQDYAwAhqwIBANgDACHOAgEArQMAIc8CAQCtAwAh0AIBAK0DACHRAgEA2AMAIQMAAAARACABAAASADACAAATACABAAAABQAgDwkAANsDACCLAgAA2gMAMIwCAAAWABCNAgAA2gMAMJ4CAQCtAwAhxAIBAK0DACHFAgEArQMAIcYCAQCtAwAhxwIBAK0DACHIAgEArQMAIckCAQCtAwAhygIBAK0DACHLAiAA1wMAIcwCIADXAwAhzQIgANcDACEBCQAA2QUAIA8JAADbAwAgiwIAANoDADCMAgAAFgAQjQIAANoDADCeAgEAAAABxAIBAK0DACHFAgEArQMAIcYCAQCtAwAhxwIBAK0DACHIAgEArQMAIckCAQCtAwAhygIBAK0DACHLAiAA1wMAIcwCIADXAwAhzQIgANcDACEDAAAAFgAgAQAAFwAwAgAAGAAgAQAAABYAIAsGAADZAwAgiwIAANYDADCMAgAAGwAQjQIAANYDADCeAgEArQMAIaECQACuAwAhpwIBAK0DACGoAiAA1wMAIakCQACvAwAhqgIBANgDACGrAgEA2AMAIQQGAADXBQAgqQIAAO0DACCqAgAA7QMAIKsCAADtAwAgCwYAANkDACCLAgAA1gMAMIwCAAAbABCNAgAA1gMAMJ4CAQAAAAGhAkAArgMAIacCAQAAAAGoAiAA1wMAIakCQACvAwAhqgIBANgDACGrAgEA2AMAIQMAAAAbACABAAAcADACAAAdACABAAAABQAgCQYAANQDACASAADVAwAgiwIAANMDADCMAgAAIAAQjQIAANMDADChAkAArgMAIaoCAQCtAwAhsgIBAK0DACGzAkAArgMAIQIGAADXBQAgEgAA2AUAIAoGAADUAwAgEgAA1QMAIIsCAADT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_AgEAAAABwAIBAAAAAQEYAACWAQAwARgAAJYBADAOBgAAugUAIJ4CAQDxAwAhoQJAAPIDACGqAgEA8QMAIbMCQADyAwAhuAIBAPEDACG5AgEA8QMAIboCAQD4AwAhuwIBAPgDACG8AgEA-AMAIb0CQADzAwAhvgJAAPMDACG_AgEA-AMAIcACAQD4AwAhAgAAAA8AIBgAAJkBACANngIBAPEDACGhAkAA8gMAIaoCAQDxAwAhswJAAPIDACG4AgEA8QMAIbkCAQDxAwAhugIBAPgDACG7AgEA-AMAIbwCAQD4AwAhvQJAAPMDACG-AkAA8wMAIb8CAQD4AwAhwAIBAPgDACECAAAADQAgGAAAmwEAIAIAAAANACAYAACbAQAgAwAAAA8AIB8AAJQBACAgAACZAQAgAQAAAA8AIAEAAAANACAKBAAAtwUAICcAALkFACAoAAC4BQAgugIAAO0DACC7AgAA7QMAILwCAADtAwAgvQIAAO0DACC-AgAA7QMAIL8CAADtAwAgwAIAAO0DACAQiwIAAMUDADCMAgAAogEAEI0CAADFAwAwngIBAKIDACGhAkAAowMAIaoCAQCiAwAhswJAAKMDACG4AgEAogMAIbkCAQCiAwAhugIBALIDACG7AgEAsgMAIbwCAQCyAwAhvQJAAKQDACG-AkAApAMAIb8CAQCyAwAhwAIBALIDACEDAAAADQAgAQAAoQEAMCQAAKIBACADAAAADQAgAQAADgAwAgAADwAgBgMAAMQDACCLAgAAwwMAMIwCAAADABCNAgAAwwMAMJ4CAgAAAAGsAgEArQMAIQEAAAClAQAgAQAAAKUBACABAwAAtgUAIAMAAAADACABAACoAQAwAgAApQEAIAMAAAADACABAACoAQAwAgAApQEAIAMAAAADACABAACoAQAwAgAApQEAIAMDAAC1BQAgngICAAAAAawCAQAAAAEBGAAArAEAIAKeAgIAAAABrAIBAAAAAQEYAACuAQAwARgAAK4BADADAwAA1wQAIJ4CAgDsAwAhrAIBAPEDACECAAAApQEAIBgAALEBACACngICAOwDACGsAgEA8QMAIQIAAAADACAYAACzAQAgAgAAAAMAIBgAALMBACADAAAApQEAIB8AAKwBACAgAACxAQAgAQAAAKUBACABAAAAAwAgBQQAANIEACAlAADTBAAgJgAA1gQAICcAANUEACAoAADUBAAgBYsCAADCAwAwjAIAALoBABCNAgAAwgMAMJ4CAgCYAwAhrAIBAKIDACEDAAAAAwAgAQAAuQEAMCQAALoBACADAAAAAwAgAQAAqAEAMAIAAKUBACAJiwIAAMEDADCMAgAAwAEAEI0CAADBAwAwngIBAAAAAaECQACuAwAhogJAAK4DACGxAgEArQMAIbMCQACuAwAhtwIBAK0DACEBAAAAvQEAIAEAAAC9AQAgCYsCAADBAwAwjAIAAMABABCNAgAAwQMAMJ4CAQCtAwAhoQJAAK4DACGiAkAArgMAIbECAQCtAwAhswJAAK4DACG3AgEArQMAIQADAAAAwAEAIAEAAMEBADACAAC9AQAgAwAAAMABACABAADBAQAwAgAAvQEAIAMAAADAAQAgAQAAwQEAMAIAAL0BACAGngIBAAAAAaECQAAAAAGiAkAAAAABsQIBAAAAAbMCQAAAAAG3AgEAAAABARgAAMUBACAGngIBAAAAAaECQAAAAAGiAkAAAAABsQIBAAAAAbMCQAAAAAG3AgEAAAABARgAAMcBADABGAAAxwEAMAaeAgEA8QMAIaECQADyAwAhogJAAPIDACGxAgEA8QMAIbMCQADyAwAhtwIBAPEDACECAAAAvQEAIBgAAMoBACAGngIBAPEDACGhAkAA8gMAIaICQADyAwAhsQIBAPEDACGzAkAA8gMAIbcCAQDxAwAhAgAAAMABACAYAADMAQAgAgAAAMABACAYAADMAQAgAwAAAL0BACAfAADFAQAgIAAAygEAIAEAAAC9AQAgAQAAAMABACADBAAAzwQAICcAANEEACAoAADQBAAgCYsCAADAAwAwjAIAANMBABCNAgAAwAMAMJ4CAQCiAwAhoQJAAKMDACGiAkAAowMAIbECAQCiAwAhswJAAKMDACG3AgEAogMAIQMAAADAAQAgAQAA0gEAMCQAANMBACADAAAAwAEAIAEAAMEBADACAAC9AQAgAQAAACYAIAEAAAAmACADAAAAJAAgAQAAJQAwAgAAJgAgAwAAACQAIAEAACUAMAIAACYAIAMAAAAkACABAAAlADACAAAmACAKDgAAngQAIA8AALMEACAQAACfBAAgEQAAoAQAII4CAgAAAAGeAgEAAAABrAIBAAAAAbQCAQAAAAG1AgIAAAABtgICAAAAAQEYAADbAQAgBo4CAgAAAAGeAgEAAAABrAIBAAAAAbQCAQAAAAG1AgIAAAABtgICAAAAAQEYAADdAQAwARgAAN0BADAKDgAAjAQAIA8AALEEACAQAACNBAAgEQAAjgQAII4CAgDsAwAhngIBAPEDACGsAgEA8QMAIbQCAQDxAwAhtQICAOwDACG2AgIA7AMAIQIAAAAmACAYAADgAQAgBo4CAgDsAwAhngIBAPEDACGsAgEA8QMAIbQCAQDxAwAhtQICAOwDACG2AgIA7AMAIQIAAAAkACAYAADiAQAgAgAAACQAIBgAAOIBACADAAAAJgAgHwAA2wEAICAAAOABACABAAAAJgAgAQAAACQAIAUEAADKBAAgJQAAywQAICYAAM4EACAnAADNBAAgKAAAzAQAIAmLAgAAvwMAMIwCAADpAQAQjQIAAL8DADCOAgIAmAMAIZ4CAQCiAwAhrAIBAKIDACG0AgEAogMAIbUCAgCYAwAhtgICAJgDACEDAAAAJAAgAQAA6AEAMCQAAOkBACADAAAAJAAgAQAAJQAwAgAAJgAgBw0AALkDACCLAgAAvgMAMIwCAADvAQAQjQIAAL4DADCeAgIAAAABrAIBAAAAAa0CAgCfAwAhAQAAAOwBACABAAAA7AEAIAcNAAC5AwAgiwIAAL4DADCMAgAA7wEAEI0CAAC-AwAwngICAJ8DACGsAgEArQMAIa0CAgCfAwAhAQ0AAKIEACADAAAA7wEAIAEAAPABADACAADsAQAgAwAAAO8BACABAADwAQAwAgAA7AEAIAMAAADvAQAgAQAA8AEAMAIAAOwBACAEDQAAyQQAIJ4CAgAAAAGsAgEAAAABrQICAAAAAQEYAAD0AQAgA54CAgAAAAGsAgEAAAABrQICAAAAAQEYAAD2AQAwARgAAPYBADAEDQAAvwQAIJ4CAgDsAwAhrAIBAPEDACGtAgIA7AMAIQIAAADsAQAgGAAA-QEAIAOeAgIA7AMAIawCAQDxAwAhrQICAOwDACECAAAA7wEAIBgAAPsBACACAAAA7wEAIBgAAPsBACADAAAA7AEAIB8AAPQBACAgAAD5AQAgAQAAAOwBACABAAAA7wEAIAUEAAC6BAAgJQAAuwQAICYAAL4EACAnAAC9BAAgKAAAvAQAIAaLAgAAvQMAMIwCAACCAgAQjQIAAL0DADCeAgIAmAMAIawCAQCiAwAhrQICAJgDACEDAAAA7wEAIAEAAIECADAkAACCAgAgAwAAAO8BACABAADwAQAwAgAA7AEAIAEAAAAiACABAAAAIgAgAwAAACAAIAEAACEAMAIAACIAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgBgYAAJwEACASAAC5BAAgoQJAAAAAAaoCAQAAAAGyAgEAAAABswJAAAAAAQEYAACKAgAgBKECQAAAAAGqAgEAAAABsgIBAAAAAbMCQAAAAAEBGAAAjAIAMAEYAACMAgAwBgYAAJoEACASAAC4BAAgoQJAAPIDACGqAgEA8QMAIbICAQDxAwAhswJAAPIDACECAAAAIgAgGAAAjwIAIAShAkAA8gMAIaoCAQDxAwAhsgIBAPEDACGzAkAA8gMAIQIAAAAgACAYAACRAgAgAgAAACAAIBgAAJECACADAAAAIgAgHwAAigIAICAAAI8CACABAAAAIgAgAQAAACAAIAMEAAC1BAAgJwAAtwQAICgAALYEACAHiwIAALwDADCMAgAAmAIAEI0CAAC8AwAwoQJAAKMDACGqAgEAogMAIbICAQCiAwAhswJAAKMDACEDAAAAIAAgAQAAlwIAMCQAAJgCACADAAAAIAAgAQAAIQAwAgAAIgAgBw0AALkDACCLAgAAuwMAMIwCAACeAgAQjQIAALsDADCeAgIAAAABrAIBAAAAAbECAgAAAAEBAAAAmwIAIAEAAACbAgAgBw0AALkDACCLAgAAuwMAMIwCAACeAgAQjQIAALsDADCeAgIAnwMAIawCAQCtAwAhsQICAJ8DACEBDQAAogQAIAMAAACeAgAgAQAAnwIAMAIAAJsCACADAAAAngIAIAEAAJ8CADACAACbAgAgAwAAAJ4CACABAACfAgAwAgAAmwIAIAQNAAC0BAAgngICAAAAAawCAQAAAAGxAgIAAAABARgAAKMCACADngICAAAAAawCAQAAAAGxAgIAAAABARgAAKUCADABGAAApQIAMAQNAACoBAAgngICAOwDACGsAgEA8QMAIbECAgDsAwAhAgAAAJsCACAYAACoAgAgA54CAgDsAwAhrAIBAPEDACGxAgIA7AMAIQIAAACeAgAgGAAAqgIAIAIAAACeAgAgGAAAqgIAIAMAAACbAgAgHwAAowIAICAAAKgCACABAAAAmwIAIAEAAACeAgAgBQQAAKMEACAlAACkBAAgJgAApwQAICcAAKYEACAoAAClBAAgBosCAAC6AwAwjAIAALECABCNAgAAugMAMJ4CAgCYAwAhrAIBAKIDACGxAgIAmAMAIQMAAACeAgAgAQAAsAIAMCQAALECACADAAAAngIAIAEAAJ8CADACAACbAgAgBw0AALkDACCLAgAAuAMAMIwCAAC3AgAQjQIAALgDADCeAgIAAAABrAIBAAAAAa0CAgCfAwAhAQAAALQCACABAAAAtAIAIAcNAAC5AwAgiwIAALgDADCMAgAAtwIAEI0CAAC4AwAwngICAJ8DACGsAgEArQMAIa0CAgCfAwAhAQ0AAKIEACADAAAAtwIAIAEAALgCADACAAC0AgAgAwAAALcCACABAAC4AgAwAgAAtAIAIAMAAAC3AgAgAQAAuAIAMAIAALQCACAEDQAAoQQAIJ4CAgAAAAGsAgEAAAABrQICAAAAAQEYAAC8AgAgA54CAgAAAAGsAgEAAAABrQICAAAAAQEYAAC-AgAwARgAAL4CADAEDQAAgAQAIJ4CAgDsAwAhrAIBAPEDACGtAgIA7AMAIQIAAAC0AgAgGAAAwQIAIAOeAgIA7AMAIawCAQDxAwAhrQICAOwDACECAAAAtwIAIBgAAMMCACACAAAAtwIAIBgAAMMCACADAAAAtAIAIB8AALwCACAgAADBAgAgAQAAALQCACABAAAAtwIAIAUEAAD7AwAgJQAA_AMAICYAAP8DACAnAAD-AwAgKAAA_QMAIAaLAgAAtwMAMIwCAADKAgAQjQIAALcDADCeAgIAmAMAIawCAQCiAwAhrQICAJgDACEDAAAAtwIAIAEAAMkCADAkAADKAgAgAwAAALcCACABAAC4AgAwAgAAtAIAIAEAAAAdACABAAAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgCAYAAPoDACCeAgEAAAABoQJAAAAAAacCAQAAAAGoAiAAAAABqQJAAAAAAaoCAQAAAAGrAgEAAAABARgAANICACAHngIBAAAAAaECQAAAAAGnAgEAAAABqAIgAAAAAakCQAAAAAGqAgEAAAABqwIBAAAAAQEYAADUAgAwARgAANQCADABAAAABQAgCAYAAPkDACCeAgEA8QMAIaECQADyAwAhpwIBAPEDACGoAiAA9wMAIakCQADzAwAhqgIBAPgDACGrAgEA-AMAIQIAAAAdACAYAADYAgAgB54CAQDxAwAhoQJAAPIDACGnAgEA8QMAIagCIAD3AwAhqQJAAPMDACGqAgEA-AMAIasCAQD4AwAhAgAAABsAIBgAANoCACACAAAAGwAgGAAA2gIAIAEAAAAFACADAAAAHQAgHwAA0gIAICAAANgCACABAAAAHQAgAQAAABsAIAYEAAD0AwAgJwAA9gMAICgAAPUDACCpAgAA7QMAIKoCAADtAwAgqwIAAO0DACAKiwIAALADADCMAgAA4gIAEI0CAACwAwAwngIBAKIDACGhAkAAowMAIacCAQCiAwAhqAIgALEDACGpAkAApAMAIaoCAQCyAwAhqwIBALIDACEDAAAAGwAgAQAA4QIAMCQAAOICACADAAAAGwAgAQAAHAAwAgAAHQAgCYsCAACsAwAwjAIAAOgCABCNAgAArAMAMJ4CAQAAAAGfAgEArQMAIaACAQAAAAGhAkAArgMAIaICQACvAwAhowJAAK8DACEBAAAA5QIAIAEAAADlAgAgCYsCAACsAwAwjAIAAOgCABCNAgAArAMAMJ4CAQCtAwAhnwIBAK0DACGgAgEArQMAIaECQACuAwAhogJAAK8DACGjAkAArwMAIQKiAgAA7QMAIKMCAADtAwAgAwAAAOgCACABAADpAgAwAgAA5QIAIAMAAADoAgAgAQAA6QIAMAIAAOUCACADAAAA6AIAIAEAAOkCADACAADlAgAgBp4CAQAAAAGfAgEAAAABoAIBAAAAAaECQAAAAAGiAkAAAAABowJAAAAAAQEYAADtAgAgBp4CAQAAAAGfAgEAAAABoAIBAAAAAaECQAAAAAGiAkAAAAABowJAAAAAAQEYAADvAgAwARgAAO8CADAGngIBAPEDACGfAgEA8QMAIaACAQDxAwAhoQJAAPIDACGiAkAA8wMAIaMCQADzAwAhAgAAAOUCACAYAADyAgAgBp4CAQDxAwAhnwIBAPEDACGgAgEA8QMAIaECQADyAwAhogJAAPMDACGjAkAA8wMAIQIAAADoAgAgGAAA9AIAIAIAAADoAgAgGAAA9AIAIAMAAADlAgAgHwAA7QIAICAAAPICACABAAAA5QIAIAEAAADoAgAgBQQAAO4DACAnAADwAwAgKAAA7wMAIKICAADtAwAgowIAAO0DACAJiwIAAKEDADCMAgAA-wIAEI0CAAChAwAwngIBAKIDACGfAgEAogMAIaACAQCiAwAhoQJAAKMDACGiAkAApAMAIaMCQACkAwAhAwAAAOgCACABAAD6AgAwJAAA-wIAIAMAAADoAgAgAQAA6QIAMAIAAOUCACAFiwIAAJ4DADCMAgAAgQMAEI0CAACeAwAwjgICAAAAAY8CAACgAwAgAQAAAP4CACABAAAA_gIAIAWLAgAAngMAMIwCAACBAwAQjQIAAJ4DADCOAgIAnwMAIY8CAACgAwAgAAMAAACBAwAgAQAAggMAMAIAAP4CACADAAAAgQMAIAEAAIIDADACAAD-AgAgAwAAAIEDACABAACCAwAwAgAA_gIAIAKOAgIAAAABjwKAAAAAAQEYAACGAwAgAo4CAgAAAAGPAoAAAAABARgAAIgDADABGAAAiAMAMAKOAgIA7AMAIY8CgAAAAAECAAAA_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_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_wUAMBEFAADiAwAgBwAA4wMAIAgAAOQDACALAADlAwAgDAAA5gMAIBEAANEDACCLAgAA4AMAMIwCAAAFABCNAgAA4AMAMJ4CAQAAAAGhAkAArgMAIasCAQAAAAGsAgEArQMAIbMCQACuAwAh0gIgANcDACHTAgEA2AMAIdQCAgDhAwAhAgAAAAEAIBgAAOIEACACAAAA4AQAIBgAAOEEACALiwIAAN8EADCMAgAA4AQAEI0CAADfBAAwngIBAK0DACGhAkAArgMAIasCAQCtAwAhrAIBAK0DACGzAkAArgMAIdICIADXAwAh0wIBANgDACHUAgIA4QMAIQuLAgAA3wQAMIwCAADgBAAQjQIAAN8EADCeAgEArQMAIaECQACuAwAhqwIBAK0DACGsAgEArQMAIbMCQACuAwAh0gIgANcDACHTAgEA2AMAIdQCAgDhAwAhB54CAQDxAwAhoQJAAPIDACGrAgEA8QMAIawCAQDxAwAhswJAAPIDACHSAiAA9wMAIdMCAQD4AwAhDAcAAOMEACAIAADkBAAgCwAA5QQAIAwAAOYEACARAADnBAAgngIBAPEDACGhAkAA8gMAIasCAQDxAwAhrAIBAPEDACGzAkAA8gMAIdICIAD3AwAh0wIBAPgDACELHwAAowUAMCAAAKgFADDYAgAApAUAMNkCAAClBQAw2gIAAKYFACDbAgAApwUAMNwCAACnBQAw3QIAAKcFADDeAgAApwUAMN8CAACpBQAw4AIAAKoFADALHwAAlwUAMCAAAJwFADDYAgAAmAUAMNkCAACZBQAw2gIAAJoFACDbAgAAmwUAMNwCAACbBQAw3QIAAJsFADDeAgAAmwUAMN8CAACdBQAw4AIAAJ4FADALHwAA_QQAMCAAAIIFADDYAgAA_gQAMNkCAAD_BAAw2gIAAIAFACDbAgAAgQUAMNwCAACBBQAw3QIAAIEFADDeAgAAgQUAMN8CAACDBQAw4AIAAIQFADALHwAA8QQAMCAAAPYEADDYAgAA8gQAMNkCAADzBAAw2gIAAPQEACDbAgAA9QQAMNwCAAD1BAAw3QIAAPUEADDeAgAA9QQAMN8CAAD3BAAw4AIAAPgEADALHwAA6AQAMCAAAOwEADDYAgAA6QQAMNkCAADqBAAw2gIAAOsEACDbAgAAkwQAMNwCAACTBAAw3QIAAJMEADDeAgAAkwQAMN8CAADtBAAw4AIAAJYEADAEEgAAuQQAIKECQAAAAAGyAgEAAAABswJAAAAAAQIAAAAiACAfAADwBAAgAwAAACIAIB8AAPAEACAgAADvBAAgARgAAP4FADACAAAAIgAgGAAA7wQAIAIAAACXBAAgGAAA7gQAIAOhAkAA8gMAIbICAQDxAwAhswJAAPIDACEEEgAAuAQAIKECQADyAwAhsgIBAPEDACGzAkAA8gMAIQQSAAC5BAAgoQJAAAAAAbICAQAAAAGzAkAAAAABBp4CAQAAAAGhAkAAAAABpwIBAAAAAagCIAAAAAGpAkAAAAABqwIBAAAAAQIAAAAdACAfAAD8BAAgAwAAAB0AIB8AAPwEACAgAAD7BAAgARgAAP0FADALBgAA2QMAIIsCAADWAwAwjAIAABsAEI0CAADWAwAwngIBAAAAAaECQACuAwAhpwIBAAAAAagCIADXAwAhqQJAAK8DACGqAgEA2AMAIasCAQDYAwAhAgAAAB0AIBgAAPsEACACAAAA-QQAIBgAAPoEACAKiwIAAPgEADCMAgAA-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_AgEA2AMAIcACAQDYAwAhAgAAAA8AIBgAAKEFACACAAAAnwUAIBgAAKAFACAQiwIAAJ4FADCMAgAAnwUAEI0CAACeBQAwngIBAK0DACGhAkAArgMAIaoCAQCtAwAhswJAAK4DACG4AgEArQMAIbkCAQCtAwAhugIBANgDACG7AgEA2AMAIbwCAQDYAwAhvQJAAK8DACG-AkAArwMAIb8CAQDYAwAhwAIBANgDACEQiwIAAJ4FADCMAgAAnwUAEI0CAACeBQAwngIBAK0DACGhAkAArgMAIaoCAQCtAwAhswJAAK4DACG4AgEArQMAIbkCAQCtAwAhugIBANgDACG7AgEA2AMAIbwCAQDYAwAhvQJAAK8DACG-AkAArwMAIb8CAQDYAwAhwAIBANgDACEMngIBAPEDACGhAkAA8gMAIbMCQADyAwAhuAIBAPEDACG5AgEA8QMAIboCAQD4AwAhuwIBAPgDACG8AgEA-AMAIb0CQADzAwAhvgJAAPMDACG_AgEA-AMAIcACAQD4AwAhDJ4CAQDxAwAhoQJAAPIDACGzAkAA8gMAIbgCAQDxAwAhuQIBAPEDACG6AgEA-AMAIbsCAQD4AwAhvAIBAPgDACG9AkAA8wMAIb4CQADzAwAhvwIBAPgDACHAAgEA-AMAIQyeAgEAAAABoQJAAAAAAbMCQAAAAAG4AgEAAAABuQIBAAAAAboCAQAAAAG7AgEAAAABvAIBAAAAAb0CQAAAAAG-AkAAAAABvwIBAAAAAcACAQAAAAEHngIBAAAAAaECQAAAAAGiAkAAAAABswJAAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAQIAAAALACAfAACuBQAgAwAAAAsAIB8AAK4FACAgAACtBQAgARgAAPkFADAMBgAA1AMAIIsCAADfAwAwjAIAAAkAEI0CAADfAwAwngIBAAAAAaECQACuAwAhogJAAK4DACGqAgEArQMAIbMCQACuAwAhwQIBAAAAAcICAQDYAwAhwwIBANgDACECAAAACwAgGAAArQUAIAIAAACrBQAgGAAArAUAIAuLAgAAqgUAMIwCAACrBQAQjQIAAKoFADCeAgEArQMAIaECQACuAwAhogJAAK4DACGqAgEArQMAIbMCQACuAwAhwQIBAK0DACHCAgEA2AMAIcMCAQDYAwAhC4sCAACqBQAwjAIAAKsFABCNAgAAqgUAMJ4CAQCtAwAhoQJAAK4DACGiAkAArgMAIaoCAQCtAwAhswJAAK4DACHBAgEArQMAIcICAQDYAwAhwwIBANgDACEHngIBAPEDACGhAkAA8gMAIaICQADyAwAhswJAAPIDACHBAgEA8QMAIcICAQD4AwAhwwIBAPgDACEHngIBAPEDACGhAkAA8gMAIaICQADyAwAhswJAAPIDACHBAgEA8QMAIcICAQD4AwAhwwIBAPgDACEHngIBAAAAAaECQAAAAAGiAkAAAAABswJAAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAQwHAACwBQAgCAAAsQUAIAsAALIFACAMAACzBQAgEQAAtAUAIJ4CAQAAAAGhAkAAAAABqwIBAAAAAawCAQAAAAGzAkAAAAAB0gIgAAAAAdMCAQAAAAEEHwAAowUAMNgCAACkBQAw2gIAAKYFACDeAgAApwUAMAQfAACXBQAw2AIAAJgFADDaAgAAmgUAIN4CAACbBQAwBB8AAP0EADDYAgAA_gQAMNoCAACABQAg3gIAAIEFADAEHwAA8QQAMNgCAADyBAAw2gIAAPQEACDeAgAA9QQAMAQfAADoBAAw2AIAAOkEADDaAgAA6wQAIN4CAACTBAAwBB8AANgEADDYAgAA2QQAMNoCAADbBAAg3gIAANwEADAAAAAABR8AAPQFACAgAAD3BQAg2AIAAPUFACDZAgAA9gUAIN4CAAABACADHwAA9AUAINgCAAD1BQAg3gIAAAEAIAAAAAUfAADvBQAgIAAA8gUAINgCAADwBQAg2QIAAPEFACDeAgAAAQAgAx8AAO8FACDYAgAA8AUAIN4CAAABACAAAAAFHwAA6gUAICAAAO0FACDYAgAA6wUAINkCAADsBQAg3gIAABMAIAMfAADqBQAg2AIAAOsFACDeAgAAEwAgAAAABx8AAOUFACAgAADoBQAg2AIAAOYFACDZAgAA5wUAINwCAAAFACDdAgAABQAg3gIAAAEAIAMfAADlBQAg2AIAAOYFACDeAgAAAQAgAAAAAAAF2wICAAAAAeECAgAAAAHiAgIAAAAB4wICAAAAAeQCAgAAAAEHHwAA4AUAICAAAOMFACDYAgAA4QUAINkCAADiBQAg3AIAAAMAIN0CAAADACDeAgAApQEAIAMfAADgBQAg2AIAAOEFACDeAgAApQEAIAENAACiBAAgAQ0AAKIEACABDQAAogQAIAAIBQAA2wUAIAcAANwFACAIAADdBQAgCwAA3gUAIAwAAN8FACARAADWBQAg0wIAAO0DACDUAgAA7QMAIAQOAADTBQAgDwAA1AUAIBAAANUFACARAADWBQAgBQYAANcFACAKAADaBQAgqgIAAO0DACCrAgAA7QMAINECAADtAwAgAAEDAAC2BQAgAAAAAAKeAgIAAAABrAIBAAAAAQIAAAClAQAgHwAA4AUAIAMAAAADACAfAADgBQAgIAAA5AUAIAQAAAADACAYAADkBQAgngICAOwDACGsAgEA8QMAIQKeAgIA7AMAIawCAQDxAwAhDQUAANIFACAHAACwBQAgCAAAsQUAIAwAALMFACARAAC0BQAgngIBAAAAAaECQAAAAAGrAgEAAAABrAIBAAAAAbMCQAAAAAHSAiAAAAAB0wIBAAAAAdQCAgAAAAECAAAAAQAgHwAA5QUAIAMAAAAFACAfAADlBQAgIAAA6QUAIA8AAAAFACAFAADRBQAgBwAA4wQAIAgAAOQEACAMAADmBAAgEQAA5wQAIBgAAOkFACCeAgEA8QMAIaECQADyAwAhqwIBAPEDACGsAgEA8QMAIbMCQADyAwAh0gIgAPcDACHTAgEA-AMAIdQCAgDQBQAhDQUAANEFACAHAADjBAAgCAAA5AQAIAwAAOYEACARAADnBAAgngIBAPEDACGhAkAA8gMAIasCAQDxAwAhrAIBAPEDACGzAkAA8gMAIdICIAD3AwAh0wIBAPgDACHUAgIA0AUAIQgGAADKBQAgngIBAAAAAaoCAQAAAAGrAgEAAAABzgIBAAAAAc8CAQAAAAHQAgEAAAAB0QIBAAAAAQIAAAATACAfAADqBQAgAwAAABEAIB8AAOoFACAgAADuBQAgCgAAABEAIAYAAMkFACAYAADuBQAgngIBAPEDACGqAgEA-AMAIasCAQD4AwAhzgIBAPEDACHPAgEA8QMAIdACAQDxAwAh0QIBAPgDACEIBgAAyQUAIJ4CAQDxAwAhqgIBAPgDACGrAgEA-AMAIc4CAQDxAwAhzwIBAPEDACHQAgEA8QMAIdECAQD4AwAhDQUAANIFACAIAACxBQAgCwAAsgUAIAwAALMFACARAAC0BQAgngIBAAAAAaECQAAAAAGrAgEAAAABrAIBAAAAAbMCQAAAAAHSAiAAAAAB0wIBAAAAAdQCAgAAAAECAAAAAQAgHwAA7wUAIAMAAAAFACAfAADvBQAgIAAA8wUAIA8AAAAFACAFAADRBQAgCAAA5AQAIAsAAOUEACAMAADmBAAgEQAA5wQAIBgAAPMFACCeAgEA8QMAIaECQADyAwAhqwIBAPEDACGsAgEA8QMAIbMCQADyAwAh0gIgAPcDACHTAgEA-AMAIdQCAgDQBQAhDQUAANEFACAIAADkBAAgCwAA5QQAIAwAAOYEACARAADnBAAgngIBAPEDACGhAkAA8gMAIasCAQDxAwAhrAIBAPEDACGzAkAA8gMAIdICIAD3AwAh0wIBAPgDACHUAgIA0AUAIQ0FAADSBQAgBwAAsAUAIAsAALIFACAMAACzBQAgEQAAtAUAIJ4CAQAAAAGhAkAAAAABqwIBAAAAAawCAQAAAAGzAkAAAAAB0gIgAAAAAdMCAQAAAAHUAgIAAAABAgAAAAEAIB8AAPQFACADAAAABQAgHwAA9AUAICAAAPgFACAPAAAABQAgBQAA0QUAIAcAAOMEACALAADlBAAgDAAA5gQAIBEAAOcEACAYAAD4BQAgngIBAPEDACGhAkAA8gMAIasCAQDxAwAhrAIBAPEDACGzAkAA8gMAIdICIAD3AwAh0wIBAPgDACHUAgIA0AUAIQ0FAADRBQAgBwAA4wQAIAsAAOUEACAMAADmBAAgEQAA5wQAIJ4CAQDxAwAhoQJAAPIDACGrAgEA8QMAIawCAQDxAwAhswJAAPIDACHSAiAA9wMAIdMCAQD4AwAh1AICANAFACEHngIBAAAAAaECQAAAAAGiAkAAAAABswJAAAAAAcECAQAAAAHCAgEAAAABwwIBAAAAAQyeAgEAAAABoQJAAAAAAbMCQAAAAAG4AgEAAAABuQIBAAAAAboCAQAAAAG7AgEAAAABvAIBAAAAAb0CQAAAAAG-AkAAAAABvwIBAAAAAcACAQAAAAEKngIBAAAAAcUCAQAAAAHGAgEAAAABxwIBAAAAAcgCAQAAAAHJAgEAAAABygIBAAAAAcsCIAAAAAHMAiAAAAABzQIgAAAAAQaeAgEAAAABqwIBAAAAAc4CAQAAAAHPAgEAAAAB0AIBAAAAAdECAQAAAAEGngIBAAAAAaECQAAAAAGnAgEAAAABqAIgAAAAAakCQAAAAAGrAgEAAAABA6ECQAAAAAGyAgEAAAABswJAAAAAAQeeAgEAAAABoQJAAAAAAasCAQAAAAGsAgEAAAABswJAAAAAAdICIAAAAAHTAgEAAAABBY4CAgAAAAGeAgEAAAABrAIBAAAAAbQCAQAAAAG1AgIAAAABCQ4AAJ4EACAPAACzBAAgEAAAnwQAII4CAgAAAAGeAgEAAAABrAIBAAAAAbQCAQAAAAG1AgIAAAABtgICAAAAAQIAAAAmACAfAACBBgAgAwAAACQAIB8AAIEGACAgAACFBgAgCwAAACQAIA4AAIwEACAPAACxBAAgEAAAjQQAIBgAAIUGACCOAgIA7AMAIZ4CAQDxAwAhrAIBAPEDACG0AgEA8QMAIbUCAgDsAwAhtgICAOwDACEJDgAAjAQAIA8AALEEACAQAACNBAAgjgICAOwDACGeAgEA8QMAIawCAQDxAwAhtAIBAPEDACG1AgIA7AMAIbYCAgDsAwAhA54CAgAAAAGsAgEAAAABrQICAAAAAQIAAAC0AgAgHwAAhgYAIAMAAAC3AgAgHwAAhgYAICAAAIoGACAFAAAAtwIAIBgAAIoGACCeAgIA7AMAIawCAQDxAwAhrQICAOwDACEDngICAOwDACGsAgEA8QMAIa0CAgDsAwAhBZ4CAQAAAAGsAgEAAAABtAIBAAAAAbUCAgAAAAG2AgIAAAABA54CAgAAAAGsAgEAAAABrQICAAAAAQIAAADsAQAgHwAAjAYAIAOeAgIAAAABrAIBAAAAAbECAgAAAAECAAAAmwIAIB8AAI4GACANBQAA0gUAIAcAALAFACAIAACxBQAgCwAAsgUAIAwAALMFACCeAgEAAAABoQJAAAAAAasCAQAAAAGsAgEAAAABswJAAAAAAdICIAAAAAHTAgEAAAAB1AICAAAAAQIAAAABACAfAACQBgAgAwAAAAUAIB8AAJAGACAgAACUBgAgDwAAAAUAIAUAANEFACAHAADjBAAgCAAA5AQAIAsAAOUEACAMAADmBAAgGAAAlAYAIJ4CAQDxAwAhoQJAAPIDACGrAgEA8QMAIawCAQDxAwAhswJAAPIDACHSAiAA9wMAIdMCAQD4AwAh1AICANAFACENBQAA0QUAIAcAAOMEACAIAADkBAAgCwAA5QQAIAwAAOYEACCeAgEA8QMAIaECQADyAwAhqwIBAPEDACGsAgEA8QMAIbMCQADyAwAh0gIgAPcDACHTAgEA-AMAIdQCAgDQBQAhA6ECQAAAAAGqAgEAAAABswJAAAAAAQMAAADvAQAgHwAAjAYAICAAAJgGACAFAAAA7wEAIBgAAJgGACCeAgIA7AMAIawCAQDxAwAhrQICAOwDACEDngICAOwDACGsAgEA8QMAIa0CAgDsAwAhAwAAAJ4CACAfAACOBgAgIAAAmwYAIAUAAACeAgAgGAAAmwYAIJ4CAgDsAwAhrAIBAPEDACGxAgIA7AMAIQOeAgIA7AMAIawCAQDxAwAhsQICAOwDACEFjgICAAAAAZ4CAQAAAAGsAgEAAAABtAIBAAAAAbYCAgAAAAENBQAA0gUAIAcAALAFACAIAACxBQAgCwAAsgUAIBEAALQFACCeAgEAAAABoQJAAAAAAasCAQAAAAGsAgEAAAABswJAAAAAAdICIAAAAAHTAgEAAAAB1AICAAAAAQIAAAABACAfAACdBgAgAwAAAAUAIB8AAJ0GACAgAAChBgAgDwAAAAUAIAUAANEFACAHAADjBAAgCAAA5AQAIAsAAOUEACARAADnBAAgGAAAoQYAIJ4CAQDxAwAhoQJAAPIDACGrAgEA8QMAIawCAQDxAwAhswJAAPIDACHSAiAA9wMAIdMCAQD4AwAh1AICANAFACENBQAA0QUAIAcAAOMEACAIAADkBAAgCwAA5QQAIBEAAOcEACCeAgEA8QMAIaECQADyAwAhqwIBAPEDACGsAgEA8QMAIbMCQADyAwAh0gIgAPcDACHTAgEA-AMAIdQCAgDQBQAhBwQAEwUEAgcMBAgQBQsUBgweCREjCgIDBwEEAAMBAwgAAQYAAQEGAAEDBAAIBhUBChkHAQkABgEKGgABBh8BAgYAARIACwUEABIOAAwPAA4QABARLQoCBAANDScLAQ0oAAIEAA8NKQsBDSoAAgQAEQ0rCwENLAABES4ABQcvAAgwAAsxAAwyABEzAAABBT0CAQVDAgUEABglABkmABonABsoABwAAAAAAAUEABglABkmABonABsoABwBBlUBAQZbAQMEACEnACIoACMAAAADBAAhJwAiKAAjAQkABgEJAAYDBAAoJwApKAAqAAAAAwQAKCcAKSgAKgEGAAEBBgABAwQALycAMCgAMQAAAAMEAC8nADAoADEBBgABAQYAAQMEADYnADcoADgAAAADBAA2JwA3KAA4AAAFBAA9JQA-JgA_JwBAKABBAAAAAAAFBAA9JQA-JgA_JwBAKABBAAAAAwQARycASCgASQAAAAMEAEcnAEgoAEkDDgAMDwAOEAAQAw4ADA8ADhAAEAUEAE4lAE8mAFAnAFEoAFIAAAAAAAUEAE4lAE8mAFAnAFEoAFIAAAUEAFclAFgmAFknAFooAFsAAAAAAAUEAFclAFgmAFknAFooAFsCBgABEgALAgYAARIACwMEAGAnAGEoAGIAAAADBABgJwBhKABiAAAFBABnJQBoJgBpJwBqKABrAAAAAAAFBABnJQBoJgBpJwBqKABrAAAFBABwJQBxJgByJwBzKAB0AAAAAAAFBABwJQBxJgByJwBzKAB0AQbXAgEBBt0CAQMEAHknAHooAHsAAAADBAB5JwB6KAB7AAAAAwQAgQEnAIIBKACDAQAAAAMEAIEBJwCCASgAgwEAAAAFBACJASUAigEmAIsBJwCMASgAjQEAAAAAAAUEAIkBJQCKASYAiwEnAIwBKACNARMCARQ0ARU1ARY2ARc3ARk5ARo7FBs8FRw_AR1BFB5CFiFEASJFASNGFClJFypKHStLBixMBi1NBi5OBi9PBjBRBjFTFDJUHjNXBjRZFDVaHzZcBjddBjheFDlhIDpiJDtjBzxkBz1lBz5mBz9nB0BpB0FrFEJsJUNuB0RwFEVxJkZyB0dzB0h0FEl3J0p4K0t5BEx6BE17BE58BE99BFB_BFGBARRSggEsU4QBBFSGARRVhwEtVogBBFeJAQRYigEUWY0BLlqOATJbjwEFXJABBV2RAQVekgEFX5MBBWCVAQVhlwEUYpgBM2OaAQVknAEUZZ0BNGaeAQVnnwEFaKABFGmjATVqpAE5a6YBAmynAQJtqQECbqoBAm-rAQJwrQECca8BFHKwATpzsgECdLQBFHW1ATt2tgECd7cBAni4ARR5uwE8erwBQnu-AUN8vwFDfcIBQ37DAUN_xAFDgAHGAUOBAcgBFIIByQFEgwHLAUOEAc0BFIUBzgFFhgHPAUOHAdABQ4gB0QEUiQHUAUaKAdUBSosB1gELjAHXAQuNAdgBC44B2QELjwHaAQuQAdwBC5EB3gEUkgHfAUuTAeEBC5QB4wEUlQHkAUyWAeUBC5cB5gELmAHnARSZAeoBTZoB6wFTmwHtARCcAe4BEJ0B8QEQngHyARCfAfMBEKAB9QEQoQH3ARSiAfgBVKMB-gEQpAH8ARSlAf0BVaYB_gEQpwH_ARCoAYACFKkBgwJWqgGEAlyrAYUCCqwBhgIKrQGHAgquAYgCCq8BiQIKsAGLAgqxAY0CFLIBjgJdswGQAgq0AZICFLUBkwJetgGUAgq3AZUCCrgBlgIUuQGZAl-6AZoCY7sBnAIMvAGdAgy9AaACDL4BoQIMvwGiAgzAAaQCDMEBpgIUwgGnAmTDAakCDMQBqwIUxQGsAmXGAa0CDMcBrgIMyAGvAhTJAbICZsoBswJsywG1Ag7MAbYCDs0BuQIOzgG6Ag7PAbsCDtABvQIO0QG_AhTSAcACbdMBwgIO1AHEAhTVAcUCbtYBxgIO1wHHAg7YAcgCFNkBywJv2gHMAnXbAc0CCdwBzgIJ3QHPAgneAdACCd8B0QIJ4AHTAgnhAdUCFOIB1gJ24wHZAgnkAdsCFOUB3AJ35gHeAgnnAd8CCegB4AIU6QHjAnjqAeQCfOsB5gJ97AHnAn3tAeoCfe4B6wJ97wHsAn3wAe4CffEB8AIU8gHxAn7zAfMCffQB9QIU9QH2An_2AfcCffcB-AJ9-AH5AhT5AfwCgAH6Af0ChAH7Af8ChQH8AYADhQH9AYMDhQH-AYQDhQH_AYUDhQGAAocDhQGBAokDFIICigOGAYMCjAOFAYQCjgMUhQKPA4cBhgKQA4UBhwKRA4UBiAKSAxSJApUDiAGKApYDjgE" + strings: JSON.parse("[\"where\",\"orderBy\",\"cursor\",\"users\",\"_count\",\"role\",\"user\",\"sessions\",\"accounts\",\"profile\",\"addresses\",\"profiles\",\"licenseKeys\",\"proclamations\",\"solfeggioFrequency\",\"category\",\"group\",\"userProclamations\",\"proclamation\",\"User.findUnique\",\"User.findUniqueOrThrow\",\"User.findFirst\",\"User.findFirstOrThrow\",\"User.findMany\",\"data\",\"User.createOne\",\"User.createMany\",\"User.createManyAndReturn\",\"User.updateOne\",\"User.updateMany\",\"User.updateManyAndReturn\",\"create\",\"update\",\"User.upsertOne\",\"User.deleteOne\",\"User.deleteMany\",\"having\",\"_avg\",\"_sum\",\"_min\",\"_max\",\"User.groupBy\",\"User.aggregate\",\"Profile.findUnique\",\"Profile.findUniqueOrThrow\",\"Profile.findFirst\",\"Profile.findFirstOrThrow\",\"Profile.findMany\",\"Profile.createOne\",\"Profile.createMany\",\"Profile.createManyAndReturn\",\"Profile.updateOne\",\"Profile.updateMany\",\"Profile.updateManyAndReturn\",\"Profile.upsertOne\",\"Profile.deleteOne\",\"Profile.deleteMany\",\"Profile.groupBy\",\"Profile.aggregate\",\"Address.findUnique\",\"Address.findUniqueOrThrow\",\"Address.findFirst\",\"Address.findFirstOrThrow\",\"Address.findMany\",\"Address.createOne\",\"Address.createMany\",\"Address.createManyAndReturn\",\"Address.updateOne\",\"Address.updateMany\",\"Address.updateManyAndReturn\",\"Address.upsertOne\",\"Address.deleteOne\",\"Address.deleteMany\",\"Address.groupBy\",\"Address.aggregate\",\"Session.findUnique\",\"Session.findUniqueOrThrow\",\"Session.findFirst\",\"Session.findFirstOrThrow\",\"Session.findMany\",\"Session.createOne\",\"Session.createMany\",\"Session.createManyAndReturn\",\"Session.updateOne\",\"Session.updateMany\",\"Session.updateManyAndReturn\",\"Session.upsertOne\",\"Session.deleteOne\",\"Session.deleteMany\",\"Session.groupBy\",\"Session.aggregate\",\"Account.findUnique\",\"Account.findUniqueOrThrow\",\"Account.findFirst\",\"Account.findFirstOrThrow\",\"Account.findMany\",\"Account.createOne\",\"Account.createMany\",\"Account.createManyAndReturn\",\"Account.updateOne\",\"Account.updateMany\",\"Account.updateManyAndReturn\",\"Account.upsertOne\",\"Account.deleteOne\",\"Account.deleteMany\",\"Account.groupBy\",\"Account.aggregate\",\"UserRole.findUnique\",\"UserRole.findUniqueOrThrow\",\"UserRole.findFirst\",\"UserRole.findFirstOrThrow\",\"UserRole.findMany\",\"UserRole.createOne\",\"UserRole.createMany\",\"UserRole.createManyAndReturn\",\"UserRole.updateOne\",\"UserRole.updateMany\",\"UserRole.updateManyAndReturn\",\"UserRole.upsertOne\",\"UserRole.deleteOne\",\"UserRole.deleteMany\",\"UserRole.groupBy\",\"UserRole.aggregate\",\"Verification.findUnique\",\"Verification.findUniqueOrThrow\",\"Verification.findFirst\",\"Verification.findFirstOrThrow\",\"Verification.findMany\",\"Verification.createOne\",\"Verification.createMany\",\"Verification.createManyAndReturn\",\"Verification.updateOne\",\"Verification.updateMany\",\"Verification.updateManyAndReturn\",\"Verification.upsertOne\",\"Verification.deleteOne\",\"Verification.deleteMany\",\"Verification.groupBy\",\"Verification.aggregate\",\"Proclamation.findUnique\",\"Proclamation.findUniqueOrThrow\",\"Proclamation.findFirst\",\"Proclamation.findFirstOrThrow\",\"Proclamation.findMany\",\"Proclamation.createOne\",\"Proclamation.createMany\",\"Proclamation.createManyAndReturn\",\"Proclamation.updateOne\",\"Proclamation.updateMany\",\"Proclamation.updateManyAndReturn\",\"Proclamation.upsertOne\",\"Proclamation.deleteOne\",\"Proclamation.deleteMany\",\"Proclamation.groupBy\",\"Proclamation.aggregate\",\"ProclamationGroup.findUnique\",\"ProclamationGroup.findUniqueOrThrow\",\"ProclamationGroup.findFirst\",\"ProclamationGroup.findFirstOrThrow\",\"ProclamationGroup.findMany\",\"ProclamationGroup.createOne\",\"ProclamationGroup.createMany\",\"ProclamationGroup.createManyAndReturn\",\"ProclamationGroup.updateOne\",\"ProclamationGroup.updateMany\",\"ProclamationGroup.updateManyAndReturn\",\"ProclamationGroup.upsertOne\",\"ProclamationGroup.deleteOne\",\"ProclamationGroup.deleteMany\",\"ProclamationGroup.groupBy\",\"ProclamationGroup.aggregate\",\"UserProclamations.findUnique\",\"UserProclamations.findUniqueOrThrow\",\"UserProclamations.findFirst\",\"UserProclamations.findFirstOrThrow\",\"UserProclamations.findMany\",\"UserProclamations.createOne\",\"UserProclamations.createMany\",\"UserProclamations.createManyAndReturn\",\"UserProclamations.updateOne\",\"UserProclamations.updateMany\",\"UserProclamations.updateManyAndReturn\",\"UserProclamations.upsertOne\",\"UserProclamations.deleteOne\",\"UserProclamations.deleteMany\",\"UserProclamations.groupBy\",\"UserProclamations.aggregate\",\"SolfeggioFrequency.findUnique\",\"SolfeggioFrequency.findUniqueOrThrow\",\"SolfeggioFrequency.findFirst\",\"SolfeggioFrequency.findFirstOrThrow\",\"SolfeggioFrequency.findMany\",\"SolfeggioFrequency.createOne\",\"SolfeggioFrequency.createMany\",\"SolfeggioFrequency.createManyAndReturn\",\"SolfeggioFrequency.updateOne\",\"SolfeggioFrequency.updateMany\",\"SolfeggioFrequency.updateManyAndReturn\",\"SolfeggioFrequency.upsertOne\",\"SolfeggioFrequency.deleteOne\",\"SolfeggioFrequency.deleteMany\",\"SolfeggioFrequency.groupBy\",\"SolfeggioFrequency.aggregate\",\"ProclamationCategory.findUnique\",\"ProclamationCategory.findUniqueOrThrow\",\"ProclamationCategory.findFirst\",\"ProclamationCategory.findFirstOrThrow\",\"ProclamationCategory.findMany\",\"ProclamationCategory.createOne\",\"ProclamationCategory.createMany\",\"ProclamationCategory.createManyAndReturn\",\"ProclamationCategory.updateOne\",\"ProclamationCategory.updateMany\",\"ProclamationCategory.updateManyAndReturn\",\"ProclamationCategory.upsertOne\",\"ProclamationCategory.deleteOne\",\"ProclamationCategory.deleteMany\",\"ProclamationCategory.groupBy\",\"ProclamationCategory.aggregate\",\"LicenseKey.findUnique\",\"LicenseKey.findUniqueOrThrow\",\"LicenseKey.findFirst\",\"LicenseKey.findFirstOrThrow\",\"LicenseKey.findMany\",\"LicenseKey.createOne\",\"LicenseKey.createMany\",\"LicenseKey.createManyAndReturn\",\"LicenseKey.updateOne\",\"LicenseKey.updateMany\",\"LicenseKey.updateManyAndReturn\",\"LicenseKey.upsertOne\",\"LicenseKey.deleteOne\",\"LicenseKey.deleteMany\",\"LicenseKey.groupBy\",\"LicenseKey.aggregate\",\"ApiKey.findUnique\",\"ApiKey.findUniqueOrThrow\",\"ApiKey.findFirst\",\"ApiKey.findFirstOrThrow\",\"ApiKey.findMany\",\"ApiKey.createOne\",\"ApiKey.createMany\",\"ApiKey.createManyAndReturn\",\"ApiKey.updateOne\",\"ApiKey.updateMany\",\"ApiKey.updateManyAndReturn\",\"ApiKey.upsertOne\",\"ApiKey.deleteOne\",\"ApiKey.deleteMany\",\"ApiKey.groupBy\",\"ApiKey.aggregate\",\"ColorPalette.findUnique\",\"ColorPalette.findUniqueOrThrow\",\"ColorPalette.findFirst\",\"ColorPalette.findFirstOrThrow\",\"ColorPalette.findMany\",\"ColorPalette.createOne\",\"ColorPalette.createMany\",\"ColorPalette.createManyAndReturn\",\"ColorPalette.updateOne\",\"ColorPalette.updateMany\",\"ColorPalette.updateManyAndReturn\",\"ColorPalette.upsertOne\",\"ColorPalette.deleteOne\",\"ColorPalette.deleteMany\",\"ColorPalette.groupBy\",\"ColorPalette.aggregate\",\"AuditLog.findUnique\",\"AuditLog.findUniqueOrThrow\",\"AuditLog.findFirst\",\"AuditLog.findFirstOrThrow\",\"AuditLog.findMany\",\"AuditLog.createOne\",\"AuditLog.createMany\",\"AuditLog.createManyAndReturn\",\"AuditLog.updateOne\",\"AuditLog.updateMany\",\"AuditLog.updateManyAndReturn\",\"AuditLog.upsertOne\",\"AuditLog.deleteOne\",\"AuditLog.deleteMany\",\"AuditLog.groupBy\",\"AuditLog.aggregate\",\"AND\",\"OR\",\"NOT\",\"id\",\"createdAt\",\"userId\",\"email\",\"roleId\",\"roleName\",\"page\",\"action\",\"entity\",\"entityId\",\"before\",\"after\",\"ip\",\"equals\",\"string_contains\",\"string_starts_with\",\"string_ends_with\",\"array_starts_with\",\"array_ends_with\",\"array_contains\",\"lt\",\"lte\",\"gt\",\"gte\",\"not\",\"in\",\"notIn\",\"contains\",\"startsWith\",\"endsWith\",\"solfeggioFrequencyId\",\"colors\",\"keyPrefix\",\"keyHash\",\"expiresAt\",\"revokedAt\",\"key\",\"active\",\"lastValidatedAt\",\"name\",\"sortOrder\",\"every\",\"some\",\"none\",\"value\",\"proclamationId\",\"updatedAt\",\"content\",\"categoryId\",\"groupId\",\"identifier\",\"accountId\",\"providerId\",\"accessToken\",\"refreshToken\",\"idToken\",\"accessTokenExpiresAt\",\"refreshTokenExpiresAt\",\"scope\",\"password\",\"token\",\"ipAddress\",\"userAgent\",\"profileId\",\"street\",\"city\",\"state\",\"postalCode\",\"country\",\"type\",\"isDefaultMailing\",\"isDefaultBilling\",\"isDefaultShipping\",\"firstName\",\"lastName\",\"phoneNumber\",\"ghlContactId\",\"emailVerified\",\"image\",\"userId_proclamationId\",\"is\",\"isNot\",\"connectOrCreate\",\"upsert\",\"createMany\",\"set\",\"disconnect\",\"delete\",\"connect\",\"updateMany\",\"deleteMany\",\"increment\",\"decrement\",\"multiply\",\"divide\"]"), + graph: "xAaYAYACEQUAAIAEACAHAACBBAAgCAAAggQAIAsAAIMEACAMAACEBAAgEQAA8QMAIJsCAAD_AwAwnAIAAAUAEJ0CAAD_AwAwngIBAAAAAZ8CQADDAwAhoQIBAAAAAaICAgDFAwAhxQIBAMIDACHMAkAAwwMAIesCIAD3AwAh7AIBAMQDACEBAAAAAQAgBgMAAOcDACCbAgAA5gMAMJwCAAADABCdAgAA5gMAMJ4CAgDOAwAhxQIBAMIDACEBAAAAAwAgEQUAAIAEACAHAACBBAAgCAAAggQAIAsAAIMEACAMAACEBAAgEQAA8QMAIJsCAAD_AwAwnAIAAAUAEJ0CAAD_AwAwngIBAMIDACGfAkAAwwMAIaECAQDCAwAhogICAMUDACHFAgEAwgMAIcwCQADDAwAh6wIgAPcDACHsAgEAxAMAIQgFAAD-BQAgBwAA_wUAIAgAAIAGACALAACBBgAgDAAAggYAIBEAAPkFACCiAgAAhQQAIOwCAACFBAAgAwAAAAUAIAEAAAYAMAIAAAEAIAEAAAAFACAMBgAA9AMAIJsCAAD-AwAwnAIAAAkAEJ0CAAD-AwAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhwAJAAMMDACHMAkAAwwMAIdoCAQDCAwAh2wIBAMQDACHcAgEAxAMAIQMGAAD6BQAg2wIAAIUEACDcAgAAhQQAIAwGAAD0AwAgmwIAAP4DADCcAgAACQAQnQIAAP4DADCeAgEAAAABnwJAAMMDACGgAgEAwgMAIcACQADDAwAhzAJAAMMDACHaAgEAAAAB2wIBAMQDACHcAgEAxAMAIQMAAAAJACABAAAKADACAAALACARBgAA9AMAIJsCAAD9AwAwnAIAAA0AEJ0CAAD9AwAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhzAJAAMMDACHRAgEAwgMAIdICAQDCAwAh0wIBAMQDACHUAgEAxAMAIdUCAQDEAwAh1gJAANUDACHXAkAA1QMAIdgCAQDEAwAh2QIBAMQDACEIBgAA-gUAINMCAACFBAAg1AIAAIUEACDVAgAAhQQAINYCAACFBAAg1wIAAIUEACDYAgAAhQQAINkCAACFBAAgEQYAAPQDACCbAgAA_QMAMJwCAAANABCdAgAA_QMAMJ4CAQAAAAGfAkAAwwMAIaACAQDCAwAhzAJAAMMDACHRAgEAwgMAIdICAQDCAwAh0wIBAMQDACHUAgEAxAMAIdUCAQDEAwAh1gJAANUDACHXAkAA1QMAIdgCAQDEAwAh2QIBAMQDACEDAAAADQAgAQAADgAwAgAADwAgDAYAAPgDACAKAAD8AwAgmwIAAPsDADCcAgAAEQAQnQIAAPsDADCeAgEAwgMAIaACAQDEAwAhoQIBAMQDACHnAgEAwgMAIegCAQDCAwAh6QIBAMIDACHqAgEAxAMAIQUGAAD6BQAgCgAA_QUAIKACAACFBAAgoQIAAIUEACDqAgAAhQQAIAwGAAD4AwAgCgAA_AMAIJsCAAD7AwAwnAIAABEAEJ0CAAD7AwAwngIBAAAAAaACAQDEAwAhoQIBAMQDACHnAgEAwgMAIegCAQDCAwAh6QIBAMIDACHqAgEAxAMAIQMAAAARACABAAASADACAAATACABAAAABQAgDwkAAPoDACCbAgAA-QMAMJwCAAAWABCdAgAA-QMAMJ4CAQDCAwAh3QIBAMIDACHeAgEAwgMAId8CAQDCAwAh4AIBAMIDACHhAgEAwgMAIeICAQDCAwAh4wIBAMIDACHkAiAA9wMAIeUCIAD3AwAh5gIgAPcDACEBCQAA_AUAIA8JAAD6AwAgmwIAAPkDADCcAgAAFgAQnQIAAPkDADCeAgEAAAAB3QIBAMIDACHeAgEAwgMAId8CAQDCAwAh4AIBAMIDACHhAgEAwgMAIeICAQDCAwAh4wIBAMIDACHkAiAA9wMAIeUCIAD3AwAh5gIgAPcDACEDAAAAFgAgAQAAFwAwAgAAGAAgAQAAABYAIAsGAAD4AwAgmwIAAPYDADCcAgAAGwAQnQIAAPYDADCeAgEAwgMAIZ8CQADDAwAhoAIBAMQDACGhAgEAxAMAIcICAQDCAwAhwwIgAPcDACHEAkAA1QMAIQQGAAD6BQAgoAIAAIUEACChAgAAhQQAIMQCAACFBAAgCwYAAPgDACCbAgAA9gMAMJwCAAAbABCdAgAA9gMAMJ4CAQAAAAGfAkAAwwMAIaACAQDEAwAhoQIBAMQDACHCAgEAAAABwwIgAPcDACHEAkAA1QMAIQMAAAAbACABAAAcADACAAAdACABAAAABQAgCQYAAPQDACASAAD1AwAgmwIAAPMDADCcAgAAIAAQnQIAAPMDADCfAkAAwwMAIaACAQDCAwAhywIBAMIDACHMAkAAwwMAIQIGAAD6BQAgEgAA-wUAIAoGAAD0AwAgEgAA9QMAIJsCAADzAwAwnAIAACAAEJ0CAADzAwAwnwJAAMMDACGgAgEAwgMAIcsCAQDCAwAhzAJAAMMDACHtAgAA8gMAIAMAAAAgACABAAAhADACAAAiACANDgAA7gMAIA8AAO8DACAQAADwAwAgEQAA8QMAIJsCAADtAwAwnAIAACQAEJ0CAADtAwAwngIBAMIDACG8AgIAzgMAIcUCAQDCAwAhzQIBAMIDACHOAgIAzgMAIc8CAgDOAwAhBA4AAPYFACAPAAD3BQAgEAAA-AUAIBEAAPkFACANDgAA7gMAIA8AAO8DACAQAADwAwAgEQAA8QMAIJsCAADtAwAwnAIAACQAEJ0CAADtAwAwngIBAAAAAbwCAgDOAwAhxQIBAAAAAc0CAQDCAwAhzgICAM4DACHPAgIAzgMAIQMAAAAkACABAAAlADACAAAmACABAAAAJAAgAwAAACQAIAEAACUAMAIAACYAIAEAAAAkACADAAAAJAAgAQAAJQAwAgAAJgAgAQAAACQAIAMAAAAgACABAAAhADACAAAiACABAAAAIAAgAQAAAAkAIAEAAAANACABAAAAEQAgAQAAABsAIAEAAAAgACABAAAAAQAgAwAAAAUAIAEAAAYAMAIAAAEAIAMAAAAFACABAAAGADACAAABACADAAAABQAgAQAABgAwAgAAAQAgDgUAAPUFACAHAADUBQAgCAAA1QUAIAsAANYFACAMAADXBQAgEQAA2AUAIJ4CAQAAAAGfAkAAAAABoQIBAAAAAaICAgAAAAHFAgEAAAABzAJAAAAAAesCIAAAAAHsAgEAAAABARgAADgAIAieAgEAAAABnwJAAAAAAaECAQAAAAGiAgIAAAABxQIBAAAAAcwCQAAAAAHrAiAAAAAB7AIBAAAAAQEYAAA6ADABGAAAOgAwAQAAAAMAIA4FAAD0BQAgBwAAhwUAIAgAAIgFACALAACJBQAgDAAAigUAIBEAAIsFACCeAgEAiwQAIZ8CQACMBAAhoQIBAIsEACGiAgIAjgQAIcUCAQCLBAAhzAJAAIwEACHrAiAAnAQAIewCAQCNBAAhAgAAAAEAIBgAAD4AIAieAgEAiwQAIZ8CQACMBAAhoQIBAIsEACGiAgIAjgQAIcUCAQCLBAAhzAJAAIwEACHrAiAAnAQAIewCAQCNBAAhAgAAAAUAIBgAAEAAIAIAAAAFACAYAABAACABAAAAAwAgAwAAAAEAIB8AADgAICAAAD4AIAEAAAABACABAAAABQAgBwQAAO8FACAlAADwBQAgJgAA8wUAICcAAPIFACAoAADxBQAgogIAAIUEACDsAgAAhQQAIAubAgAA7AMAMJwCAABIABCdAgAA7AMAMJ4CAQCxAwAhnwJAALIDACGhAgEAsQMAIaICAgC0AwAhxQIBALEDACHMAkAAsgMAIesCIADXAwAh7AIBALMDACEDAAAABQAgAQAARwAwJAAASAAgAwAAAAUAIAEAAAYAMAIAAAEAIAEAAAATACABAAAAEwAgAwAAABEAIAEAABIAMAIAABMAIAMAAAARACABAAASADACAAATACADAAAAEQAgAQAAEgAwAgAAEwAgCQYAAO4FACAKAAC6BQAgngIBAAAAAaACAQAAAAGhAgEAAAAB5wIBAAAAAegCAQAAAAHpAgEAAAAB6gIBAAAAAQEYAABQACAHngIBAAAAAaACAQAAAAGhAgEAAAAB5wIBAAAAAegCAQAAAAHpAgEAAAAB6gIBAAAAAQEYAABSADABGAAAUgAwAQAAAAUAIAkGAADtBQAgCgAArAUAIJ4CAQCLBAAhoAIBAI0EACGhAgEAjQQAIecCAQCLBAAh6AIBAIsEACHpAgEAiwQAIeoCAQCNBAAhAgAAABMAIBgAAFYAIAeeAgEAiwQAIaACAQCNBAAhoQIBAI0EACHnAgEAiwQAIegCAQCLBAAh6QIBAIsEACHqAgEAjQQAIQIAAAARACAYAABYACACAAAAEQAgGAAAWAAgAQAAAAUAIAMAAAATACAfAABQACAgAABWACABAAAAEwAgAQAAABEAIAYEAADqBQAgJwAA7AUAICgAAOsFACCgAgAAhQQAIKECAACFBAAg6gIAAIUEACAKmwIAAOsDADCcAgAAYAAQnQIAAOsDADCeAgEAsQMAIaACAQCzAwAhoQIBALMDACHnAgEAsQMAIegCAQCxAwAh6QIBALEDACHqAgEAswMAIQMAAAARACABAABfADAkAABgACADAAAAEQAgAQAAEgAwAgAAEwAgAQAAABgAIAEAAAAYACADAAAAFgAgAQAAFwAwAgAAGAAgAwAAABYAIAEAABcAMAIAABgAIAMAAAAWACABAAAXADACAAAYACAMCQAA6QUAIJ4CAQAAAAHdAgEAAAAB3gIBAAAAAd8CAQAAAAHgAgEAAAAB4QIBAAAAAeICAQAAAAHjAgEAAAAB5AIgAAAAAeUCIAAAAAHmAiAAAAABARgAAGgAIAueAgEAAAAB3QIBAAAAAd4CAQAAAAHfAgEAAAAB4AIBAAAAAeECAQAAAAHiAgEAAAAB4wIBAAAAAeQCIAAAAAHlAiAAAAAB5gIgAAAAAQEYAABqADABGAAAagAwDAkAAOgFACCeAgEAiwQAId0CAQCLBAAh3gIBAIsEACHfAgEAiwQAIeACAQCLBAAh4QIBAIsEACHiAgEAiwQAIeMCAQCLBAAh5AIgAJwEACHlAiAAnAQAIeYCIACcBAAhAgAAABgAIBgAAG0AIAueAgEAiwQAId0CAQCLBAAh3gIBAIsEACHfAgEAiwQAIeACAQCLBAAh4QIBAIsEACHiAgEAiwQAIeMCAQCLBAAh5AIgAJwEACHlAiAAnAQAIeYCIACcBAAhAgAAABYAIBgAAG8AIAIAAAAWACAYAABvACADAAAAGAAgHwAAaAAgIAAAbQAgAQAAABgAIAEAAAAWACADBAAA5QUAICcAAOcFACAoAADmBQAgDpsCAADqAwAwnAIAAHYAEJ0CAADqAwAwngIBALEDACHdAgEAsQMAId4CAQCxAwAh3wIBALEDACHgAgEAsQMAIeECAQCxAwAh4gIBALEDACHjAgEAsQMAIeQCIADXAwAh5QIgANcDACHmAiAA1wMAIQMAAAAWACABAAB1ADAkAAB2ACADAAAAFgAgAQAAFwAwAgAAGAAgAQAAAAsAIAEAAAALACADAAAACQAgAQAACgAwAgAACwAgAwAAAAkAIAEAAAoAMAIAAAsAIAMAAAAJACABAAAKADACAAALACAJBgAA5AUAIJ4CAQAAAAGfAkAAAAABoAIBAAAAAcACQAAAAAHMAkAAAAAB2gIBAAAAAdsCAQAAAAHcAgEAAAABARgAAH4AIAieAgEAAAABnwJAAAAAAaACAQAAAAHAAkAAAAABzAJAAAAAAdoCAQAAAAHbAgEAAAAB3AIBAAAAAQEYAACAAQAwARgAAIABADAJBgAA4wUAIJ4CAQCLBAAhnwJAAIwEACGgAgEAiwQAIcACQACMBAAhzAJAAIwEACHaAgEAiwQAIdsCAQCNBAAh3AIBAI0EACECAAAACwAgGAAAgwEAIAieAgEAiwQAIZ8CQACMBAAhoAIBAIsEACHAAkAAjAQAIcwCQACMBAAh2gIBAIsEACHbAgEAjQQAIdwCAQCNBAAhAgAAAAkAIBgAAIUBACACAAAACQAgGAAAhQEAIAMAAAALACAfAAB-ACAgAACDAQAgAQAAAAsAIAEAAAAJACAFBAAA4AUAICcAAOIFACAoAADhBQAg2wIAAIUEACDcAgAAhQQAIAubAgAA6QMAMJwCAACMAQAQnQIAAOkDADCeAgEAsQMAIZ8CQACyAwAhoAIBALEDACHAAkAAsgMAIcwCQACyAwAh2gIBALEDACHbAgEAswMAIdwCAQCzAwAhAwAAAAkAIAEAAIsBADAkAACMAQAgAwAAAAkAIAEAAAoAMAIAAAsAIAEAAAAPACABAAAADwAgAwAAAA0AIAEAAA4AMAIAAA8AIAMAAAANACABAAAOADACAAAPACADAAAADQAgAQAADgAwAgAADwAgDgYAAN8FACCeAgEAAAABnwJAAAAAAaACAQAAAAHMAkAAAAAB0QIBAAAAAdICAQAAAAHTAgEAAAAB1AIBAAAAAdUCAQAAAAHWAkAAAAAB1wJAAAAAAdgCAQAAAAHZAgEAAAABARgAAJQBACANngIBAAAAAZ8CQAAAAAGgAgEAAAABzAJAAAAAAdECAQAAAAHSAgEAAAAB0wIBAAAAAdQCAQAAAAHVAgEAAAAB1gJAAAAAAdcCQAAAAAHYAgEAAAAB2QIBAAAAAQEYAACWAQAwARgAAJYBADAOBgAA3gUAIJ4CAQCLBAAhnwJAAIwEACGgAgEAiwQAIcwCQACMBAAh0QIBAIsEACHSAgEAiwQAIdMCAQCNBAAh1AIBAI0EACHVAgEAjQQAIdYCQACYBAAh1wJAAJgEACHYAgEAjQQAIdkCAQCNBAAhAgAAAA8AIBgAAJkBACANngIBAIsEACGfAkAAjAQAIaACAQCLBAAhzAJAAIwEACHRAgEAiwQAIdICAQCLBAAh0wIBAI0EACHUAgEAjQQAIdUCAQCNBAAh1gJAAJgEACHXAkAAmAQAIdgCAQCNBAAh2QIBAI0EACECAAAADQAgGAAAmwEAIAIAAAANACAYAACbAQAgAwAAAA8AIB8AAJQBACAgAACZAQAgAQAAAA8AIAEAAAANACAKBAAA2wUAICcAAN0FACAoAADcBQAg0wIAAIUEACDUAgAAhQQAINUCAACFBAAg1gIAAIUEACDXAgAAhQQAINgCAACFBAAg2QIAAIUEACAQmwIAAOgDADCcAgAAogEAEJ0CAADoAwAwngIBALEDACGfAkAAsgMAIaACAQCxAwAhzAJAALIDACHRAgEAsQMAIdICAQCxAwAh0wIBALMDACHUAgEAswMAIdUCAQCzAwAh1gJAANEDACHXAkAA0QMAIdgCAQCzAwAh2QIBALMDACEDAAAADQAgAQAAoQEAMCQAAKIBACADAAAADQAgAQAADgAwAgAADwAgBgMAAOcDACCbAgAA5gMAMJwCAAADABCdAgAA5gMAMJ4CAgAAAAHFAgEAwgMAIQEAAAClAQAgAQAAAKUBACABAwAA2gUAIAMAAAADACABAACoAQAwAgAApQEAIAMAAAADACABAACoAQAwAgAApQEAIAMAAAADACABAACoAQAwAgAApQEAIAMDAADZBQAgngICAAAAAcUCAQAAAAEBGAAArAEAIAKeAgIAAAABxQIBAAAAAQEYAACuAQAwARgAAK4BADADAwAA-wQAIJ4CAgCUBAAhxQIBAIsEACECAAAApQEAIBgAALEBACACngICAJQEACHFAgEAiwQAIQIAAAADACAYAACzAQAgAgAAAAMAIBgAALMBACADAAAApQEAIB8AAKwBACAgAACxAQAgAQAAAKUBACABAAAAAwAgBQQAAPYEACAlAAD3BAAgJgAA-gQAICcAAPkEACAoAAD4BAAgBZsCAADlAwAwnAIAALoBABCdAgAA5QMAMJ4CAgDIAwAhxQIBALEDACEDAAAAAwAgAQAAuQEAMCQAALoBACADAAAAAwAgAQAAqAEAMAIAAKUBACAJmwIAAOQDADCcAgAAwAEAEJ0CAADkAwAwngIBAAAAAZ8CQADDAwAhwAJAAMMDACHKAgEAwgMAIcwCQADDAwAh0AIBAMIDACEBAAAAvQEAIAEAAAC9AQAgCZsCAADkAwAwnAIAAMABABCdAgAA5AMAMJ4CAQDCAwAhnwJAAMMDACHAAkAAwwMAIcoCAQDCAwAhzAJAAMMDACHQAgEAwgMAIQADAAAAwAEAIAEAAMEBADACAAC9AQAgAwAAAMABACABAADBAQAwAgAAvQEAIAMAAADAAQAgAQAAwQEAMAIAAL0BACAGngIBAAAAAZ8CQAAAAAHAAkAAAAABygIBAAAAAcwCQAAAAAHQAgEAAAABARgAAMUBACAGngIBAAAAAZ8CQAAAAAHAAkAAAAABygIBAAAAAcwCQAAAAAHQAgEAAAABARgAAMcBADABGAAAxwEAMAaeAgEAiwQAIZ8CQACMBAAhwAJAAIwEACHKAgEAiwQAIcwCQACMBAAh0AIBAIsEACECAAAAvQEAIBgAAMoBACAGngIBAIsEACGfAkAAjAQAIcACQACMBAAhygIBAIsEACHMAkAAjAQAIdACAQCLBAAhAgAAAMABACAYAADMAQAgAgAAAMABACAYAADMAQAgAwAAAL0BACAfAADFAQAgIAAAygEAIAEAAAC9AQAgAQAAAMABACADBAAA8wQAICcAAPUEACAoAAD0BAAgCZsCAADjAwAwnAIAANMBABCdAgAA4wMAMJ4CAQCxAwAhnwJAALIDACHAAkAAsgMAIcoCAQCxAwAhzAJAALIDACHQAgEAsQMAIQMAAADAAQAgAQAA0gEAMCQAANMBACADAAAAwAEAIAEAAMEBADACAAC9AQAgAQAAACYAIAEAAAAmACADAAAAJAAgAQAAJQAwAgAAJgAgAwAAACQAIAEAACUAMAIAACYAIAMAAAAkACABAAAlADACAAAmACAKDgAAwgQAIA8AANcEACAQAADDBAAgEQAAxAQAIJ4CAQAAAAG8AgIAAAABxQIBAAAAAc0CAQAAAAHOAgIAAAABzwICAAAAAQEYAADbAQAgBp4CAQAAAAG8AgIAAAABxQIBAAAAAc0CAQAAAAHOAgIAAAABzwICAAAAAQEYAADdAQAwARgAAN0BADAKDgAAsAQAIA8AANUEACAQAACxBAAgEQAAsgQAIJ4CAQCLBAAhvAICAJQEACHFAgEAiwQAIc0CAQCLBAAhzgICAJQEACHPAgIAlAQAIQIAAAAmACAYAADgAQAgBp4CAQCLBAAhvAICAJQEACHFAgEAiwQAIc0CAQCLBAAhzgICAJQEACHPAgIAlAQAIQIAAAAkACAYAADiAQAgAgAAACQAIBgAAOIBACADAAAAJgAgHwAA2wEAICAAAOABACABAAAAJgAgAQAAACQAIAUEAADuBAAgJQAA7wQAICYAAPIEACAnAADxBAAgKAAA8AQAIAmbAgAA4gMAMJwCAADpAQAQnQIAAOIDADCeAgEAsQMAIbwCAgDIAwAhxQIBALEDACHNAgEAsQMAIc4CAgDIAwAhzwICAMgDACEDAAAAJAAgAQAA6AEAMCQAAOkBACADAAAAJAAgAQAAJQAwAgAAJgAgBw0AANwDACCbAgAA4QMAMJwCAADvAQAQnQIAAOEDADCeAgIAAAABxQIBAAAAAcYCAgDOAwAhAQAAAOwBACABAAAA7AEAIAcNAADcAwAgmwIAAOEDADCcAgAA7wEAEJ0CAADhAwAwngICAM4DACHFAgEAwgMAIcYCAgDOAwAhAQ0AAMYEACADAAAA7wEAIAEAAPABADACAADsAQAgAwAAAO8BACABAADwAQAwAgAA7AEAIAMAAADvAQAgAQAA8AEAMAIAAOwBACAEDQAA7QQAIJ4CAgAAAAHFAgEAAAABxgICAAAAAQEYAAD0AQAgA54CAgAAAAHFAgEAAAABxgICAAAAAQEYAAD2AQAwARgAAPYBADAEDQAA4wQAIJ4CAgCUBAAhxQIBAIsEACHGAgIAlAQAIQIAAADsAQAgGAAA-QEAIAOeAgIAlAQAIcUCAQCLBAAhxgICAJQEACECAAAA7wEAIBgAAPsBACACAAAA7wEAIBgAAPsBACADAAAA7AEAIB8AAPQBACAgAAD5AQAgAQAAAOwBACABAAAA7wEAIAUEAADeBAAgJQAA3wQAICYAAOIEACAnAADhBAAgKAAA4AQAIAabAgAA4AMAMJwCAACCAgAQnQIAAOADADCeAgIAyAMAIcUCAQCxAwAhxgICAMgDACEDAAAA7wEAIAEAAIECADAkAACCAgAgAwAAAO8BACABAADwAQAwAgAA7AEAIAEAAAAiACABAAAAIgAgAwAAACAAIAEAACEAMAIAACIAIAMAAAAgACABAAAhADACAAAiACADAAAAIAAgAQAAIQAwAgAAIgAgBgYAAMAEACASAADdBAAgnwJAAAAAAaACAQAAAAHLAgEAAAABzAJAAAAAAQEYAACKAgAgBJ8CQAAAAAGgAgEAAAABywIBAAAAAcwCQAAAAAEBGAAAjAIAMAEYAACMAgAwBgYAAL4EACASAADcBAAgnwJAAIwEACGgAgEAiwQAIcsCAQCLBAAhzAJAAIwEACECAAAAIgAgGAAAjwIAIASfAkAAjAQAIaACAQCLBAAhywIBAIsEACHMAkAAjAQAIQIAAAAgACAYAACRAgAgAgAAACAAIBgAAJECACADAAAAIgAgHwAAigIAICAAAI8CACABAAAAIgAgAQAAACAAIAMEAADZBAAgJwAA2wQAICgAANoEACAHmwIAAN8DADCcAgAAmAIAEJ0CAADfAwAwnwJAALIDACGgAgEAsQMAIcsCAQCxAwAhzAJAALIDACEDAAAAIAAgAQAAlwIAMCQAAJgCACADAAAAIAAgAQAAIQAwAgAAIgAgBw0AANwDACCbAgAA3gMAMJwCAACeAgAQnQIAAN4DADCeAgIAAAABxQIBAAAAAcoCAgAAAAEBAAAAmwIAIAEAAACbAgAgBw0AANwDACCbAgAA3gMAMJwCAACeAgAQnQIAAN4DADCeAgIAzgMAIcUCAQDCAwAhygICAM4DACEBDQAAxgQAIAMAAACeAgAgAQAAnwIAMAIAAJsCACADAAAAngIAIAEAAJ8CADACAACbAgAgAwAAAJ4CACABAACfAgAwAgAAmwIAIAQNAADYBAAgngICAAAAAcUCAQAAAAHKAgIAAAABARgAAKMCACADngICAAAAAcUCAQAAAAHKAgIAAAABARgAAKUCADABGAAApQIAMAQNAADMBAAgngICAJQEACHFAgEAiwQAIcoCAgCUBAAhAgAAAJsCACAYAACoAgAgA54CAgCUBAAhxQIBAIsEACHKAgIAlAQAIQIAAACeAgAgGAAAqgIAIAIAAACeAgAgGAAAqgIAIAMAAACbAgAgHwAAowIAICAAAKgCACABAAAAmwIAIAEAAACeAgAgBQQAAMcEACAlAADIBAAgJgAAywQAICcAAMoEACAoAADJBAAgBpsCAADdAwAwnAIAALECABCdAgAA3QMAMJ4CAgDIAwAhxQIBALEDACHKAgIAyAMAIQMAAACeAgAgAQAAsAIAMCQAALECACADAAAAngIAIAEAAJ8CADACAACbAgAgBw0AANwDACCbAgAA2wMAMJwCAAC3AgAQnQIAANsDADCeAgIAAAABxQIBAAAAAcYCAgDOAwAhAQAAALQCACABAAAAtAIAIAcNAADcAwAgmwIAANsDADCcAgAAtwIAEJ0CAADbAwAwngICAM4DACHFAgEAwgMAIcYCAgDOAwAhAQ0AAMYEACADAAAAtwIAIAEAALgCADACAAC0AgAgAwAAALcCACABAAC4AgAwAgAAtAIAIAMAAAC3AgAgAQAAuAIAMAIAALQCACAEDQAAxQQAIJ4CAgAAAAHFAgEAAAABxgICAAAAAQEYAAC8AgAgA54CAgAAAAHFAgEAAAABxgICAAAAAQEYAAC-AgAwARgAAL4CADAEDQAApAQAIJ4CAgCUBAAhxQIBAIsEACHGAgIAlAQAIQIAAAC0AgAgGAAAwQIAIAOeAgIAlAQAIcUCAQCLBAAhxgICAJQEACECAAAAtwIAIBgAAMMCACACAAAAtwIAIBgAAMMCACADAAAAtAIAIB8AALwCACAgAADBAgAgAQAAALQCACABAAAAtwIAIAUEAACfBAAgJQAAoAQAICYAAKMEACAnAACiBAAgKAAAoQQAIAabAgAA2gMAMJwCAADKAgAQnQIAANoDADCeAgIAyAMAIcUCAQCxAwAhxgICAMgDACEDAAAAtwIAIAEAAMkCADAkAADKAgAgAwAAALcCACABAAC4AgAwAgAAtAIAIAEAAAAdACABAAAAHQAgAwAAABsAIAEAABwAMAIAAB0AIAMAAAAbACABAAAcADACAAAdACADAAAAGwAgAQAAHAAwAgAAHQAgCAYAAJ4EACCeAgEAAAABnwJAAAAAAaACAQAAAAGhAgEAAAABwgIBAAAAAcMCIAAAAAHEAkAAAAABARgAANICACAHngIBAAAAAZ8CQAAAAAGgAgEAAAABoQIBAAAAAcICAQAAAAHDAiAAAAABxAJAAAAAAQEYAADUAgAwARgAANQCADABAAAABQAgCAYAAJ0EACCeAgEAiwQAIZ8CQACMBAAhoAIBAI0EACGhAgEAjQQAIcICAQCLBAAhwwIgAJwEACHEAkAAmAQAIQIAAAAdACAYAADYAgAgB54CAQCLBAAhnwJAAIwEACGgAgEAjQQAIaECAQCNBAAhwgIBAIsEACHDAiAAnAQAIcQCQACYBAAhAgAAABsAIBgAANoCACACAAAAGwAgGAAA2gIAIAEAAAAFACADAAAAHQAgHwAA0gIAICAAANgCACABAAAAHQAgAQAAABsAIAYEAACZBAAgJwAAmwQAICgAAJoEACCgAgAAhQQAIKECAACFBAAgxAIAAIUEACAKmwIAANYDADCcAgAA4gIAEJ0CAADWAwAwngIBALEDACGfAkAAsgMAIaACAQCzAwAhoQIBALMDACHCAgEAsQMAIcMCIADXAwAhxAJAANEDACEDAAAAGwAgAQAA4QIAMCQAAOICACADAAAAGwAgAQAAHAAwAgAAHQAgCZsCAADUAwAwnAIAAOgCABCdAgAA1AMAMJ4CAQAAAAGfAkAAwwMAIb4CAQDCAwAhvwIBAAAAAcACQADVAwAhwQJAANUDACEBAAAA5QIAIAEAAADlAgAgCZsCAADUAwAwnAIAAOgCABCdAgAA1AMAMJ4CAQDCAwAhnwJAAMMDACG-AgEAwgMAIb8CAQDCAwAhwAJAANUDACHBAkAA1QMAIQLAAgAAhQQAIMECAACFBAAgAwAAAOgCACABAADpAgAwAgAA5QIAIAMAAADoAgAgAQAA6QIAMAIAAOUCACADAAAA6AIAIAEAAOkCADACAADlAgAgBp4CAQAAAAGfAkAAAAABvgIBAAAAAb8CAQAAAAHAAkAAAAABwQJAAAAAAQEYAADtAgAgBp4CAQAAAAGfAkAAAAABvgIBAAAAAb8CAQAAAAHAAkAAAAABwQJAAAAAAQEYAADvAgAwARgAAO8CADAGngIBAIsEACGfAkAAjAQAIb4CAQCLBAAhvwIBAIsEACHAAkAAmAQAIcECQACYBAAhAgAAAOUCACAYAADyAgAgBp4CAQCLBAAhnwJAAIwEACG-AgEAiwQAIb8CAQCLBAAhwAJAAJgEACHBAkAAmAQAIQIAAADoAgAgGAAA9AIAIAIAAADoAgAgGAAA9AIAIAMAAADlAgAgHwAA7QIAICAAAPICACABAAAA5QIAIAEAAADoAgAgBQQAAJUEACAnAACXBAAgKAAAlgQAIMACAACFBAAgwQIAAIUEACAJmwIAANADADCcAgAA-wIAEJ0CAADQAwAwngIBALEDACGfAkAAsgMAIb4CAQCxAwAhvwIBALEDACHAAkAA0QMAIcECQADRAwAhAwAAAOgCACABAAD6AgAwJAAA-wIAIAMAAADoAgAgAQAA6QIAMAIAAOUCACAFmwIAAM0DADCcAgAAgQMAEJ0CAADNAwAwvAICAAAAAb0CAADPAwAgAQAAAP4CACABAAAA_gIAIAWbAgAAzQMAMJwCAACBAwAQnQIAAM0DADC8AgIAzgMAIb0CAADPAwAgAAMAAACBAwAgAQAAggMAMAIAAP4CACADAAAAgQMAIAEAAIIDADACAAD-AgAgAwAAAIEDACABAACCAwAwAgAA_gIAIAK8AgIAAAABvQKAAAAAAQEYAACGAwAgArwCAgAAAAG9AoAAAAABARgAAIgDADABGAAAiAMAMAK8AgIAlAQAIb0CgAAAAAECAAAA_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_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_AwAwnAIAAAUAEJ0CAAD_AwAwngIBAMIDACGfAkAAwwMAIaECAQDCAwAhogICAMUDACHFAgEAwgMAIcwCQADDAwAh6wIgAPcDACHsAgEAxAMAIe4CAAAFACDvAgAABQAgDw4AAO4DACAPAADvAwAgEAAA8AMAIBEAAPEDACCbAgAA7QMAMJwCAAAkABCdAgAA7QMAMJ4CAQDCAwAhvAICAM4DACHFAgEAwgMAIc0CAQDCAwAhzgICAM4DACHPAgIAzgMAIe4CAAAkACDvAgAAJAAgCwYAAPgDACCbAgAA9gMAMJwCAAAbABCdAgAA9gMAMJ4CAQDCAwAhnwJAAMMDACGgAgEAxAMAIaECAQDEAwAhwgIBAMIDACHDAiAA9wMAIcQCQADVAwAhAqsCIAAAAAG2AiAA2QMAIRMFAACABAAgBwAAgQQAIAgAAIIEACALAACDBAAgDAAAhAQAIBEAAPEDACCbAgAA_wMAMJwCAAAFABCdAgAA_wMAMJ4CAQDCAwAhnwJAAMMDACGhAgEAwgMAIaICAgDFAwAhxQIBAMIDACHMAkAAwwMAIesCIAD3AwAh7AIBAMQDACHuAgAABQAg7wIAAAUAIA8JAAD6AwAgmwIAAPkDADCcAgAAFgAQnQIAAPkDADCeAgEAwgMAId0CAQDCAwAh3gIBAMIDACHfAgEAwgMAIeACAQDCAwAh4QIBAMIDACHiAgEAwgMAIeMCAQDCAwAh5AIgAPcDACHlAiAA9wMAIeYCIAD3AwAhDgYAAPgDACAKAAD8AwAgmwIAAPsDADCcAgAAEQAQnQIAAPsDADCeAgEAwgMAIaACAQDEAwAhoQIBAMQDACHnAgEAwgMAIegCAQDCAwAh6QIBAMIDACHqAgEAxAMAIe4CAAARACDvAgAAEQAgDAYAAPgDACAKAAD8AwAgmwIAAPsDADCcAgAAEQAQnQIAAPsDADCeAgEAwgMAIaACAQDEAwAhoQIBAMQDACHnAgEAwgMAIegCAQDCAwAh6QIBAMIDACHqAgEAxAMAIQPHAgAAFgAgyAIAABYAIMkCAAAWACARBgAA9AMAIJsCAAD9AwAwnAIAAA0AEJ0CAAD9AwAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhzAJAAMMDACHRAgEAwgMAIdICAQDCAwAh0wIBAMQDACHUAgEAxAMAIdUCAQDEAwAh1gJAANUDACHXAkAA1QMAIdgCAQDEAwAh2QIBAMQDACEMBgAA9AMAIJsCAAD-AwAwnAIAAAkAEJ0CAAD-AwAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhwAJAAMMDACHMAkAAwwMAIdoCAQDCAwAh2wIBAMQDACHcAgEAxAMAIREFAACABAAgBwAAgQQAIAgAAIIEACALAACDBAAgDAAAhAQAIBEAAPEDACCbAgAA_wMAMJwCAAAFABCdAgAA_wMAMJ4CAQDCAwAhnwJAAMMDACGhAgEAwgMAIaICAgDFAwAhxQIBAMIDACHMAkAAwwMAIesCIAD3AwAh7AIBAMQDACEIAwAA5wMAIJsCAADmAwAwnAIAAAMAEJ0CAADmAwAwngICAM4DACHFAgEAwgMAIe4CAAADACDvAgAAAwAgA8cCAAAJACDIAgAACQAgyQIAAAkAIAPHAgAADQAgyAIAAA0AIMkCAAANACADxwIAABEAIMgCAAARACDJAgAAEQAgA8cCAAAbACDIAgAAGwAgyQIAABsAIAAAAAAAAAHzAgEAAAABAfMCQAAAAAEB8wIBAAAAAQXzAgIAAAAB-QICAAAAAfoCAgAAAAH7AgIAAAAB_AICAAAAAQAAAAAABfMCAgAAAAH5AgIAAAAB-gICAAAAAfsCAgAAAAH8AgIAAAABAAAAAfMCQAAAAAEAAAAB8wIgAAAAAQcfAADABgAgIAAAwwYAIPACAADBBgAg8QIAAMIGACD0AgAABQAg9QIAAAUAIPYCAAABACADHwAAwAYAIPACAADBBgAg9gIAAAEAIAAAAAAACx8AAKUEADAgAACqBAAw8AIAAKYEADDxAgAApwQAMPICAACoBAAg8wIAAKkEADD0AgAAqQQAMPUCAACpBAAw9gIAAKkEADD3AgAAqwQAMPgCAACsBAAwCA4AAMIEACAQAADDBAAgEQAAxAQAIJ4CAQAAAAG8AgIAAAABxQIBAAAAAc0CAQAAAAHPAgIAAAABAgAAACYAIB8AAMEEACADAAAAJgAgHwAAwQQAICAAAK8EACABGAAAvwYAMA0OAADuAwAgDwAA7wMAIBAAAPADACARAADxAwAgmwIAAO0DADCcAgAAJAAQnQIAAO0DADCeAgEAAAABvAICAM4DACHFAgEAAAABzQIBAMIDACHOAgIAzgMAIc8CAgDOAwAhAgAAACYAIBgAAK8EACACAAAArQQAIBgAAK4EACAJmwIAAKwEADCcAgAArQQAEJ0CAACsBAAwngIBAMIDACG8AgIAzgMAIcUCAQDCAwAhzQIBAMIDACHOAgIAzgMAIc8CAgDOAwAhCZsCAACsBAAwnAIAAK0EABCdAgAArAQAMJ4CAQDCAwAhvAICAM4DACHFAgEAwgMAIc0CAQDCAwAhzgICAM4DACHPAgIAzgMAIQWeAgEAiwQAIbwCAgCUBAAhxQIBAIsEACHNAgEAiwQAIc8CAgCUBAAhCA4AALAEACAQAACxBAAgEQAAsgQAIJ4CAQCLBAAhvAICAJQEACHFAgEAiwQAIc0CAQCLBAAhzwICAJQEACEFHwAAsQYAICAAAL0GACDwAgAAsgYAIPECAAC8BgAg9gIAAJsCACAFHwAArwYAICAAALoGACDwAgAAsAYAIPECAAC5BgAg9gIAAOwBACALHwAAswQAMCAAALgEADDwAgAAtAQAMPECAAC1BAAw8gIAALYEACDzAgAAtwQAMPQCAAC3BAAw9QIAALcEADD2AgAAtwQAMPcCAAC5BAAw-AIAALoEADAEBgAAwAQAIJ8CQAAAAAGgAgEAAAABzAJAAAAAAQIAAAAiACAfAAC_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_gQAMPICAAD_BAAg8wIAAIAFADD0AgAAgAUAMPUCAACABQAw9gIAAIAFADD3AgAAggUAMPgCAACDBQAwDAcAANQFACAIAADVBQAgCwAA1gUAIAwAANcFACARAADYBQAgngIBAAAAAZ8CQAAAAAGhAgEAAAABxQIBAAAAAcwCQAAAAAHrAiAAAAAB7AIBAAAAAQIAAAABACAfAADTBQAgAwAAAAEAIB8AANMFACAgAACGBQAgARgAAKIGADARBQAAgAQAIAcAAIEEACAIAACCBAAgCwAAgwQAIAwAAIQEACARAADxAwAgmwIAAP8DADCcAgAABQAQnQIAAP8DADCeAgEAAAABnwJAAMMDACGhAgEAAAABogICAMUDACHFAgEAwgMAIcwCQADDAwAh6wIgAPcDACHsAgEAxAMAIQIAAAABACAYAACGBQAgAgAAAIQFACAYAACFBQAgC5sCAACDBQAwnAIAAIQFABCdAgAAgwUAMJ4CAQDCAwAhnwJAAMMDACGhAgEAwgMAIaICAgDFAwAhxQIBAMIDACHMAkAAwwMAIesCIAD3AwAh7AIBAMQDACELmwIAAIMFADCcAgAAhAUAEJ0CAACDBQAwngIBAMIDACGfAkAAwwMAIaECAQDCAwAhogICAMUDACHFAgEAwgMAIcwCQADDAwAh6wIgAPcDACHsAgEAxAMAIQeeAgEAiwQAIZ8CQACMBAAhoQIBAIsEACHFAgEAiwQAIcwCQACMBAAh6wIgAJwEACHsAgEAjQQAIQwHAACHBQAgCAAAiAUAIAsAAIkFACAMAACKBQAgEQAAiwUAIJ4CAQCLBAAhnwJAAIwEACGhAgEAiwQAIcUCAQCLBAAhzAJAAIwEACHrAiAAnAQAIewCAQCNBAAhCx8AAMcFADAgAADMBQAw8AIAAMgFADDxAgAAyQUAMPICAADKBQAg8wIAAMsFADD0AgAAywUAMPUCAADLBQAw9gIAAMsFADD3AgAAzQUAMPgCAADOBQAwCx8AALsFADAgAADABQAw8AIAALwFADDxAgAAvQUAMPICAAC-BQAg8wIAAL8FADD0AgAAvwUAMPUCAAC_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_gMAMJwCAAAJABCdAgAA_gMAMJ4CAQAAAAGfAkAAwwMAIaACAQDCAwAhwAJAAMMDACHMAkAAwwMAIdoCAQAAAAHbAgEAxAMAIdwCAQDEAwAhAgAAAAsAIBgAANEFACACAAAAzwUAIBgAANAFACALmwIAAM4FADCcAgAAzwUAEJ0CAADOBQAwngIBAMIDACGfAkAAwwMAIaACAQDCAwAhwAJAAMMDACHMAkAAwwMAIdoCAQDCAwAh2wIBAMQDACHcAgEAxAMAIQubAgAAzgUAMJwCAADPBQAQnQIAAM4FADCeAgEAwgMAIZ8CQADDAwAhoAIBAMIDACHAAkAAwwMAIcwCQADDAwAh2gIBAMIDACHbAgEAxAMAIdwCAQDEAwAhB54CAQCLBAAhnwJAAIwEACHAAkAAjAQAIcwCQACMBAAh2gIBAIsEACHbAgEAjQQAIdwCAQCNBAAhB54CAQCLBAAhnwJAAIwEACHAAkAAjAQAIcwCQACMBAAh2gIBAIsEACHbAgEAjQQAIdwCAQCNBAAhB54CAQAAAAGfAkAAAAABwAJAAAAAAcwCQAAAAAHaAgEAAAAB2wIBAAAAAdwCAQAAAAEMBwAA1AUAIAgAANUFACALAADWBQAgDAAA1wUAIBEAANgFACCeAgEAAAABnwJAAAAAAaECAQAAAAHFAgEAAAABzAJAAAAAAesCIAAAAAHsAgEAAAABBB8AAMcFADDwAgAAyAUAMPICAADKBQAg9gIAAMsFADAEHwAAuwUAMPACAAC8BQAw8gIAAL4FACD2AgAAvwUAMAQfAAChBQAw8AIAAKIFADDyAgAApAUAIPYCAAClBQAwBB8AAJUFADDwAgAAlgUAMPICAACYBQAg9gIAAJkFADAEHwAAjAUAMPACAACNBQAw8gIAAI8FACD2AgAAtwQAMAQfAAD8BAAw8AIAAP0EADDyAgAA_wQAIPYCAACABQAwAAAAAAUfAACXBgAgIAAAmgYAIPACAACYBgAg8QIAAJkGACD2AgAAAQAgAx8AAJcGACDwAgAAmAYAIPYCAAABACAAAAAFHwAAkgYAICAAAJUGACDwAgAAkwYAIPECAACUBgAg9gIAAAEAIAMfAACSBgAg8AIAAJMGACD2AgAAAQAgAAAABR8AAI0GACAgAACQBgAg8AIAAI4GACDxAgAAjwYAIPYCAAATACADHwAAjQYAIPACAACOBgAg9gIAABMAIAAAAAcfAACIBgAgIAAAiwYAIPACAACJBgAg8QIAAIoGACD0AgAABQAg9QIAAAUAIPYCAAABACADHwAAiAYAIPACAACJBgAg9gIAAAEAIAAAAAAABx8AAIMGACAgAACGBgAg8AIAAIQGACDxAgAAhQYAIPQCAAADACD1AgAAAwAg9gIAAKUBACADHwAAgwYAIPACAACEBgAg9gIAAKUBACABDQAAxgQAIAENAADGBAAgAQ0AAMYEACAACAUAAP4FACAHAAD_BQAgCAAAgAYAIAsAAIEGACAMAACCBgAgEQAA-QUAIKICAACFBAAg7AIAAIUEACAEDgAA9gUAIA8AAPcFACAQAAD4BQAgEQAA-QUAIAUGAAD6BQAgCgAA_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_AR1BFB5CFiFEASJFASNGFClJFypKHStLBixMBi1NBi5OBi9PBjBRBjFTFDJUHjNXBjRZFDVaHzZcBjddBjheFDlhIDpiJDtjBzxkBz1lBz5mBz9nB0BpB0FrFEJsJUNuB0RwFEVxJkZyB0dzB0h0FEl3J0p4K0t5BEx6BE17BE58BE99BFB_BFGBARRSggEsU4QBBFSGARRVhwEtVogBBFeJAQRYigEUWY0BLlqOATJbjwEFXJABBV2RAQVekgEFX5MBBWCVAQVhlwEUYpgBM2OaAQVknAEUZZ0BNGaeAQVnnwEFaKABFGmjATVqpAE5a6YBAmynAQJtqQECbqoBAm-rAQJwrQECca8BFHKwATpzsgECdLQBFHW1ATt2tgECd7cBAni4ARR5uwE8erwBQnu-AUN8vwFDfcIBQ37DAUN_xAFDgAHGAUOBAcgBFIIByQFEgwHLAUOEAc0BFIUBzgFFhgHPAUOHAdABQ4gB0QEUiQHUAUaKAdUBSosB1gELjAHXAQuNAdgBC44B2QELjwHaAQuQAdwBC5EB3gEUkgHfAUuTAeEBC5QB4wEUlQHkAUyWAeUBC5cB5gELmAHnARSZAeoBTZoB6wFTmwHtARCcAe4BEJ0B8QEQngHyARCfAfMBEKAB9QEQoQH3ARSiAfgBVKMB-gEQpAH8ARSlAf0BVaYB_gEQpwH_ARCoAYACFKkBgwJWqgGEAlyrAYUCCqwBhgIKrQGHAgquAYgCCq8BiQIKsAGLAgqxAY0CFLIBjgJdswGQAgq0AZICFLUBkwJetgGUAgq3AZUCCrgBlgIUuQGZAl-6AZoCY7sBnAIMvAGdAgy9AaACDL4BoQIMvwGiAgzAAaQCDMEBpgIUwgGnAmTDAakCDMQBqwIUxQGsAmXGAa0CDMcBrgIMyAGvAhTJAbICZsoBswJsywG1Ag7MAbYCDs0BuQIOzgG6Ag7PAbsCDtABvQIO0QG_AhTSAcACbdMBwgIO1AHEAhTVAcUCbtYBxgIO1wHHAg7YAcgCFNkBywJv2gHMAnXbAc0CCdwBzgIJ3QHPAgneAdACCd8B0QIJ4AHTAgnhAdUCFOIB1gJ24wHZAgnkAdsCFOUB3AJ35gHeAgnnAd8CCegB4AIU6QHjAnjqAeQCfOsB5gJ97AHnAn3tAeoCfe4B6wJ97wHsAn3wAe4CffEB8AIU8gHxAn7zAfMCffQB9QIU9QH2An_2AfcCffcB-AJ9-AH5AhT5AfwCgAH6Af0ChAH7Af8ChQH8AYADhQH9AYMDhQH-AYQDhQH_AYUDhQGAAocDhQGBAokDFIICigOGAYMCjAOFAYQCjgMUhQKPA4cBhgKQA4UBhwKRA4UBiAKSAxSJApUDiAGKApYDjgGLApgDjwGMApkDjwGNApwDjwGOAp0DjwGPAp4DjwGQAqADjwGRAqIDFJICowOQAZMCpQOPAZQCpwMUlQKoA5EBlgKpA48BlwKqA48BmAKrAxSZAq4DkgGaAq8DmAE" } async function decodeBase64AsWasm(wasmBase64: string): Promise { @@ -337,6 +337,16 @@ export interface PrismaClient< * ``` */ get colorPalette(): Prisma.ColorPaletteDelegate; + + /** + * `prisma.auditLog`: Exposes CRUD operations for the **AuditLog** model. + * Example usage: + * ```ts + * // Fetch zero or more AuditLogs + * const auditLogs = await prisma.auditLog.findMany() + * ``` + */ + get auditLog(): Prisma.AuditLogDelegate; } export function getPrismaClientClass(): PrismaClientConstructor { diff --git a/src/lib/generated/prisma/internal/prismaNamespace.ts b/src/lib/generated/prisma/internal/prismaNamespace.ts index bb1bcf4..6985888 100644 --- a/src/lib/generated/prisma/internal/prismaNamespace.ts +++ b/src/lib/generated/prisma/internal/prismaNamespace.ts @@ -398,7 +398,8 @@ export const ModelName = { ProclamationCategory: 'ProclamationCategory', LicenseKey: 'LicenseKey', ApiKey: 'ApiKey', - ColorPalette: 'ColorPalette' + ColorPalette: 'ColorPalette', + AuditLog: 'AuditLog' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -414,7 +415,7 @@ export type TypeMap + fields: Prisma.AuditLogFieldRefs + operations: { + findUnique: { + args: Prisma.AuditLogFindUniqueArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findUniqueOrThrow: { + args: Prisma.AuditLogFindUniqueOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findFirst: { + args: Prisma.AuditLogFindFirstArgs + result: runtime.Types.Utils.PayloadToResult | null + } + findFirstOrThrow: { + args: Prisma.AuditLogFindFirstOrThrowArgs + result: runtime.Types.Utils.PayloadToResult + } + findMany: { + args: Prisma.AuditLogFindManyArgs + result: runtime.Types.Utils.PayloadToResult[] + } + create: { + args: Prisma.AuditLogCreateArgs + result: runtime.Types.Utils.PayloadToResult + } + createMany: { + args: Prisma.AuditLogCreateManyArgs + result: BatchPayload + } + createManyAndReturn: { + args: Prisma.AuditLogCreateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + delete: { + args: Prisma.AuditLogDeleteArgs + result: runtime.Types.Utils.PayloadToResult + } + update: { + args: Prisma.AuditLogUpdateArgs + result: runtime.Types.Utils.PayloadToResult + } + deleteMany: { + args: Prisma.AuditLogDeleteManyArgs + result: BatchPayload + } + updateMany: { + args: Prisma.AuditLogUpdateManyArgs + result: BatchPayload + } + updateManyAndReturn: { + args: Prisma.AuditLogUpdateManyAndReturnArgs + result: runtime.Types.Utils.PayloadToResult[] + } + upsert: { + args: Prisma.AuditLogUpsertArgs + result: runtime.Types.Utils.PayloadToResult + } + aggregate: { + args: Prisma.AuditLogAggregateArgs + result: runtime.Types.Utils.Optional + } + groupBy: { + args: Prisma.AuditLogGroupByArgs + result: runtime.Types.Utils.Optional[] + } + count: { + args: Prisma.AuditLogCountArgs + result: runtime.Types.Utils.Optional | number + } + } + } } } & { other: { @@ -1746,6 +1821,25 @@ export const ColorPaletteScalarFieldEnum = { export type ColorPaletteScalarFieldEnum = (typeof ColorPaletteScalarFieldEnum)[keyof typeof ColorPaletteScalarFieldEnum] +export const AuditLogScalarFieldEnum = { + id: 'id', + createdAt: 'createdAt', + userId: 'userId', + email: 'email', + roleId: 'roleId', + roleName: 'roleName', + page: 'page', + action: 'action', + entity: 'entity', + entityId: 'entityId', + before: 'before', + after: 'after', + ip: 'ip' +} as const + +export type AuditLogScalarFieldEnum = (typeof AuditLogScalarFieldEnum)[keyof typeof AuditLogScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' @@ -1761,6 +1855,14 @@ export const JsonNullValueInput = { export type JsonNullValueInput = (typeof JsonNullValueInput)[keyof typeof JsonNullValueInput] +export const NullableJsonNullValueInput = { + DbNull: DbNull, + JsonNull: JsonNull +} as const + +export type NullableJsonNullValueInput = (typeof NullableJsonNullValueInput)[keyof typeof NullableJsonNullValueInput] + + export const QueryMode = { default: 'default', insensitive: 'insensitive' @@ -1993,6 +2095,7 @@ export type GlobalOmitConfig = { licenseKey?: Prisma.LicenseKeyOmit apiKey?: Prisma.ApiKeyOmit colorPalette?: Prisma.ColorPaletteOmit + auditLog?: Prisma.AuditLogOmit } /* Types for Logging */ diff --git a/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts b/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts index 10dc2a9..ec0de97 100644 --- a/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts +++ b/src/lib/generated/prisma/internal/prismaNamespaceBrowser.ts @@ -65,7 +65,8 @@ export const ModelName = { ProclamationCategory: 'ProclamationCategory', LicenseKey: 'LicenseKey', ApiKey: 'ApiKey', - ColorPalette: 'ColorPalette' + ColorPalette: 'ColorPalette', + AuditLog: 'AuditLog' } as const export type ModelName = (typeof ModelName)[keyof typeof ModelName] @@ -263,6 +264,25 @@ export const ColorPaletteScalarFieldEnum = { export type ColorPaletteScalarFieldEnum = (typeof ColorPaletteScalarFieldEnum)[keyof typeof ColorPaletteScalarFieldEnum] +export const AuditLogScalarFieldEnum = { + id: 'id', + createdAt: 'createdAt', + userId: 'userId', + email: 'email', + roleId: 'roleId', + roleName: 'roleName', + page: 'page', + action: 'action', + entity: 'entity', + entityId: 'entityId', + before: 'before', + after: 'after', + ip: 'ip' +} as const + +export type AuditLogScalarFieldEnum = (typeof AuditLogScalarFieldEnum)[keyof typeof AuditLogScalarFieldEnum] + + export const SortOrder = { asc: 'asc', desc: 'desc' @@ -278,6 +298,14 @@ export const JsonNullValueInput = { export type JsonNullValueInput = (typeof JsonNullValueInput)[keyof typeof JsonNullValueInput] +export const NullableJsonNullValueInput = { + DbNull: DbNull, + JsonNull: JsonNull +} as const + +export type NullableJsonNullValueInput = (typeof NullableJsonNullValueInput)[keyof typeof NullableJsonNullValueInput] + + export const QueryMode = { default: 'default', insensitive: 'insensitive' diff --git a/src/lib/generated/prisma/models.ts b/src/lib/generated/prisma/models.ts index afdab5f..73bf210 100644 --- a/src/lib/generated/prisma/models.ts +++ b/src/lib/generated/prisma/models.ts @@ -23,4 +23,5 @@ export type * from './models/ProclamationCategory.ts' export type * from './models/LicenseKey.ts' export type * from './models/ApiKey.ts' export type * from './models/ColorPalette.ts' +export type * from './models/AuditLog.ts' export type * from './commonInputTypes.ts' \ No newline at end of file diff --git a/src/lib/generated/prisma/models/AuditLog.ts b/src/lib/generated/prisma/models/AuditLog.ts new file mode 100644 index 0000000..02a18ff --- /dev/null +++ b/src/lib/generated/prisma/models/AuditLog.ts @@ -0,0 +1,1405 @@ + +/* !!! This is code generated by Prisma. Do not edit directly. !!! */ +/* eslint-disable */ +// biome-ignore-all lint: generated file +// @ts-nocheck +/* + * This file exports the `AuditLog` model and its related types. + * + * 🟢 You can import this file directly. + */ +import type * as runtime from "@prisma/client/runtime/client" +import type * as $Enums from "../enums.ts" +import type * as Prisma from "../internal/prismaNamespace.ts" + +/** + * Model AuditLog + * + */ +export type AuditLogModel = runtime.Types.Result.DefaultSelection + +export type AggregateAuditLog = { + _count: AuditLogCountAggregateOutputType | null + _avg: AuditLogAvgAggregateOutputType | null + _sum: AuditLogSumAggregateOutputType | null + _min: AuditLogMinAggregateOutputType | null + _max: AuditLogMaxAggregateOutputType | null +} + +export type AuditLogAvgAggregateOutputType = { + roleId: number | null +} + +export type AuditLogSumAggregateOutputType = { + roleId: number | null +} + +export type AuditLogMinAggregateOutputType = { + id: string | null + createdAt: Date | null + userId: string | null + email: string | null + roleId: number | null + roleName: string | null + page: string | null + action: string | null + entity: string | null + entityId: string | null + ip: string | null +} + +export type AuditLogMaxAggregateOutputType = { + id: string | null + createdAt: Date | null + userId: string | null + email: string | null + roleId: number | null + roleName: string | null + page: string | null + action: string | null + entity: string | null + entityId: string | null + ip: string | null +} + +export type AuditLogCountAggregateOutputType = { + id: number + createdAt: number + userId: number + email: number + roleId: number + roleName: number + page: number + action: number + entity: number + entityId: number + before: number + after: number + ip: number + _all: number +} + + +export type AuditLogAvgAggregateInputType = { + roleId?: true +} + +export type AuditLogSumAggregateInputType = { + roleId?: true +} + +export type AuditLogMinAggregateInputType = { + id?: true + createdAt?: true + userId?: true + email?: true + roleId?: true + roleName?: true + page?: true + action?: true + entity?: true + entityId?: true + ip?: true +} + +export type AuditLogMaxAggregateInputType = { + id?: true + createdAt?: true + userId?: true + email?: true + roleId?: true + roleName?: true + page?: true + action?: true + entity?: true + entityId?: true + ip?: true +} + +export type AuditLogCountAggregateInputType = { + id?: true + createdAt?: true + userId?: true + email?: true + roleId?: true + roleName?: true + page?: true + action?: true + entity?: true + entityId?: true + before?: true + after?: true + ip?: true + _all?: true +} + +export type AuditLogAggregateArgs = { + /** + * Filter which AuditLog to aggregate. + */ + where?: Prisma.AuditLogWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of AuditLogs to fetch. + */ + orderBy?: Prisma.AuditLogOrderByWithRelationInput | Prisma.AuditLogOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the start position + */ + cursor?: Prisma.AuditLogWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` AuditLogs from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` AuditLogs. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Count returned AuditLogs + **/ + _count?: true | AuditLogCountAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to average + **/ + _avg?: AuditLogAvgAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to sum + **/ + _sum?: AuditLogSumAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the minimum value + **/ + _min?: AuditLogMinAggregateInputType + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/aggregations Aggregation Docs} + * + * Select which fields to find the maximum value + **/ + _max?: AuditLogMaxAggregateInputType +} + +export type GetAuditLogAggregateType = { + [P in keyof T & keyof AggregateAuditLog]: P extends '_count' | 'count' + ? T[P] extends true + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType +} + + + + +export type AuditLogGroupByArgs = { + where?: Prisma.AuditLogWhereInput + orderBy?: Prisma.AuditLogOrderByWithAggregationInput | Prisma.AuditLogOrderByWithAggregationInput[] + by: Prisma.AuditLogScalarFieldEnum[] | Prisma.AuditLogScalarFieldEnum + having?: Prisma.AuditLogScalarWhereWithAggregatesInput + take?: number + skip?: number + _count?: AuditLogCountAggregateInputType | true + _avg?: AuditLogAvgAggregateInputType + _sum?: AuditLogSumAggregateInputType + _min?: AuditLogMinAggregateInputType + _max?: AuditLogMaxAggregateInputType +} + +export type AuditLogGroupByOutputType = { + id: string + createdAt: Date + userId: string | null + email: string | null + roleId: number | null + roleName: string | null + page: string + action: string + entity: string | null + entityId: string | null + before: runtime.JsonValue | null + after: runtime.JsonValue | null + ip: string | null + _count: AuditLogCountAggregateOutputType | null + _avg: AuditLogAvgAggregateOutputType | null + _sum: AuditLogSumAggregateOutputType | null + _min: AuditLogMinAggregateOutputType | null + _max: AuditLogMaxAggregateOutputType | null +} + +export type GetAuditLogGroupByPayload = Prisma.PrismaPromise< + Array< + Prisma.PickEnumerable & + { + [P in ((keyof T) & (keyof AuditLogGroupByOutputType))]: P extends '_count' + ? T[P] extends boolean + ? number + : Prisma.GetScalarType + : Prisma.GetScalarType + } + > + > + + + +export type AuditLogWhereInput = { + AND?: Prisma.AuditLogWhereInput | Prisma.AuditLogWhereInput[] + OR?: Prisma.AuditLogWhereInput[] + NOT?: Prisma.AuditLogWhereInput | Prisma.AuditLogWhereInput[] + id?: Prisma.StringFilter<"AuditLog"> | string + createdAt?: Prisma.DateTimeFilter<"AuditLog"> | Date | string + userId?: Prisma.StringNullableFilter<"AuditLog"> | string | null + email?: Prisma.StringNullableFilter<"AuditLog"> | string | null + roleId?: Prisma.IntNullableFilter<"AuditLog"> | number | null + roleName?: Prisma.StringNullableFilter<"AuditLog"> | string | null + page?: Prisma.StringFilter<"AuditLog"> | string + action?: Prisma.StringFilter<"AuditLog"> | string + entity?: Prisma.StringNullableFilter<"AuditLog"> | string | null + entityId?: Prisma.StringNullableFilter<"AuditLog"> | string | null + before?: Prisma.JsonNullableFilter<"AuditLog"> + after?: Prisma.JsonNullableFilter<"AuditLog"> + ip?: Prisma.StringNullableFilter<"AuditLog"> | string | null +} + +export type AuditLogOrderByWithRelationInput = { + id?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + userId?: Prisma.SortOrderInput | Prisma.SortOrder + email?: Prisma.SortOrderInput | Prisma.SortOrder + roleId?: Prisma.SortOrderInput | Prisma.SortOrder + roleName?: Prisma.SortOrderInput | Prisma.SortOrder + page?: Prisma.SortOrder + action?: Prisma.SortOrder + entity?: Prisma.SortOrderInput | Prisma.SortOrder + entityId?: Prisma.SortOrderInput | Prisma.SortOrder + before?: Prisma.SortOrderInput | Prisma.SortOrder + after?: Prisma.SortOrderInput | Prisma.SortOrder + ip?: Prisma.SortOrderInput | Prisma.SortOrder +} + +export type AuditLogWhereUniqueInput = Prisma.AtLeast<{ + id?: string + AND?: Prisma.AuditLogWhereInput | Prisma.AuditLogWhereInput[] + OR?: Prisma.AuditLogWhereInput[] + NOT?: Prisma.AuditLogWhereInput | Prisma.AuditLogWhereInput[] + createdAt?: Prisma.DateTimeFilter<"AuditLog"> | Date | string + userId?: Prisma.StringNullableFilter<"AuditLog"> | string | null + email?: Prisma.StringNullableFilter<"AuditLog"> | string | null + roleId?: Prisma.IntNullableFilter<"AuditLog"> | number | null + roleName?: Prisma.StringNullableFilter<"AuditLog"> | string | null + page?: Prisma.StringFilter<"AuditLog"> | string + action?: Prisma.StringFilter<"AuditLog"> | string + entity?: Prisma.StringNullableFilter<"AuditLog"> | string | null + entityId?: Prisma.StringNullableFilter<"AuditLog"> | string | null + before?: Prisma.JsonNullableFilter<"AuditLog"> + after?: Prisma.JsonNullableFilter<"AuditLog"> + ip?: Prisma.StringNullableFilter<"AuditLog"> | string | null +}, "id"> + +export type AuditLogOrderByWithAggregationInput = { + id?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + userId?: Prisma.SortOrderInput | Prisma.SortOrder + email?: Prisma.SortOrderInput | Prisma.SortOrder + roleId?: Prisma.SortOrderInput | Prisma.SortOrder + roleName?: Prisma.SortOrderInput | Prisma.SortOrder + page?: Prisma.SortOrder + action?: Prisma.SortOrder + entity?: Prisma.SortOrderInput | Prisma.SortOrder + entityId?: Prisma.SortOrderInput | Prisma.SortOrder + before?: Prisma.SortOrderInput | Prisma.SortOrder + after?: Prisma.SortOrderInput | Prisma.SortOrder + ip?: Prisma.SortOrderInput | Prisma.SortOrder + _count?: Prisma.AuditLogCountOrderByAggregateInput + _avg?: Prisma.AuditLogAvgOrderByAggregateInput + _max?: Prisma.AuditLogMaxOrderByAggregateInput + _min?: Prisma.AuditLogMinOrderByAggregateInput + _sum?: Prisma.AuditLogSumOrderByAggregateInput +} + +export type AuditLogScalarWhereWithAggregatesInput = { + AND?: Prisma.AuditLogScalarWhereWithAggregatesInput | Prisma.AuditLogScalarWhereWithAggregatesInput[] + OR?: Prisma.AuditLogScalarWhereWithAggregatesInput[] + NOT?: Prisma.AuditLogScalarWhereWithAggregatesInput | Prisma.AuditLogScalarWhereWithAggregatesInput[] + id?: Prisma.StringWithAggregatesFilter<"AuditLog"> | string + createdAt?: Prisma.DateTimeWithAggregatesFilter<"AuditLog"> | Date | string + userId?: Prisma.StringNullableWithAggregatesFilter<"AuditLog"> | string | null + email?: Prisma.StringNullableWithAggregatesFilter<"AuditLog"> | string | null + roleId?: Prisma.IntNullableWithAggregatesFilter<"AuditLog"> | number | null + roleName?: Prisma.StringNullableWithAggregatesFilter<"AuditLog"> | string | null + page?: Prisma.StringWithAggregatesFilter<"AuditLog"> | string + action?: Prisma.StringWithAggregatesFilter<"AuditLog"> | string + entity?: Prisma.StringNullableWithAggregatesFilter<"AuditLog"> | string | null + entityId?: Prisma.StringNullableWithAggregatesFilter<"AuditLog"> | string | null + before?: Prisma.JsonNullableWithAggregatesFilter<"AuditLog"> + after?: Prisma.JsonNullableWithAggregatesFilter<"AuditLog"> + ip?: Prisma.StringNullableWithAggregatesFilter<"AuditLog"> | string | null +} + +export type AuditLogCreateInput = { + id?: string + createdAt?: Date | string + userId?: string | null + email?: string | null + roleId?: number | null + roleName?: string | null + page: string + action: string + entity?: string | null + entityId?: string | null + before?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + after?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + ip?: string | null +} + +export type AuditLogUncheckedCreateInput = { + id?: string + createdAt?: Date | string + userId?: string | null + email?: string | null + roleId?: number | null + roleName?: string | null + page: string + action: string + entity?: string | null + entityId?: string | null + before?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + after?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + ip?: string | null +} + +export type AuditLogUpdateInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + userId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + email?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + roleId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + roleName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + page?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + entity?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + entityId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + before?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + after?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + ip?: Prisma.NullableStringFieldUpdateOperationsInput | string | null +} + +export type AuditLogUncheckedUpdateInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + userId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + email?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + roleId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + roleName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + page?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + entity?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + entityId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + before?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + after?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + ip?: Prisma.NullableStringFieldUpdateOperationsInput | string | null +} + +export type AuditLogCreateManyInput = { + id?: string + createdAt?: Date | string + userId?: string | null + email?: string | null + roleId?: number | null + roleName?: string | null + page: string + action: string + entity?: string | null + entityId?: string | null + before?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + after?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + ip?: string | null +} + +export type AuditLogUpdateManyMutationInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + userId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + email?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + roleId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + roleName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + page?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + entity?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + entityId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + before?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + after?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + ip?: Prisma.NullableStringFieldUpdateOperationsInput | string | null +} + +export type AuditLogUncheckedUpdateManyInput = { + id?: Prisma.StringFieldUpdateOperationsInput | string + createdAt?: Prisma.DateTimeFieldUpdateOperationsInput | Date | string + userId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + email?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + roleId?: Prisma.NullableIntFieldUpdateOperationsInput | number | null + roleName?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + page?: Prisma.StringFieldUpdateOperationsInput | string + action?: Prisma.StringFieldUpdateOperationsInput | string + entity?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + entityId?: Prisma.NullableStringFieldUpdateOperationsInput | string | null + before?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + after?: Prisma.NullableJsonNullValueInput | runtime.InputJsonValue + ip?: Prisma.NullableStringFieldUpdateOperationsInput | string | null +} + +export type AuditLogCountOrderByAggregateInput = { + id?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + userId?: Prisma.SortOrder + email?: Prisma.SortOrder + roleId?: Prisma.SortOrder + roleName?: Prisma.SortOrder + page?: Prisma.SortOrder + action?: Prisma.SortOrder + entity?: Prisma.SortOrder + entityId?: Prisma.SortOrder + before?: Prisma.SortOrder + after?: Prisma.SortOrder + ip?: Prisma.SortOrder +} + +export type AuditLogAvgOrderByAggregateInput = { + roleId?: Prisma.SortOrder +} + +export type AuditLogMaxOrderByAggregateInput = { + id?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + userId?: Prisma.SortOrder + email?: Prisma.SortOrder + roleId?: Prisma.SortOrder + roleName?: Prisma.SortOrder + page?: Prisma.SortOrder + action?: Prisma.SortOrder + entity?: Prisma.SortOrder + entityId?: Prisma.SortOrder + ip?: Prisma.SortOrder +} + +export type AuditLogMinOrderByAggregateInput = { + id?: Prisma.SortOrder + createdAt?: Prisma.SortOrder + userId?: Prisma.SortOrder + email?: Prisma.SortOrder + roleId?: Prisma.SortOrder + roleName?: Prisma.SortOrder + page?: Prisma.SortOrder + action?: Prisma.SortOrder + entity?: Prisma.SortOrder + entityId?: Prisma.SortOrder + ip?: Prisma.SortOrder +} + +export type AuditLogSumOrderByAggregateInput = { + roleId?: Prisma.SortOrder +} + + + +export type AuditLogSelect = runtime.Types.Extensions.GetSelect<{ + id?: boolean + createdAt?: boolean + userId?: boolean + email?: boolean + roleId?: boolean + roleName?: boolean + page?: boolean + action?: boolean + entity?: boolean + entityId?: boolean + before?: boolean + after?: boolean + ip?: boolean +}, ExtArgs["result"]["auditLog"]> + +export type AuditLogSelectCreateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + createdAt?: boolean + userId?: boolean + email?: boolean + roleId?: boolean + roleName?: boolean + page?: boolean + action?: boolean + entity?: boolean + entityId?: boolean + before?: boolean + after?: boolean + ip?: boolean +}, ExtArgs["result"]["auditLog"]> + +export type AuditLogSelectUpdateManyAndReturn = runtime.Types.Extensions.GetSelect<{ + id?: boolean + createdAt?: boolean + userId?: boolean + email?: boolean + roleId?: boolean + roleName?: boolean + page?: boolean + action?: boolean + entity?: boolean + entityId?: boolean + before?: boolean + after?: boolean + ip?: boolean +}, ExtArgs["result"]["auditLog"]> + +export type AuditLogSelectScalar = { + id?: boolean + createdAt?: boolean + userId?: boolean + email?: boolean + roleId?: boolean + roleName?: boolean + page?: boolean + action?: boolean + entity?: boolean + entityId?: boolean + before?: boolean + after?: boolean + ip?: boolean +} + +export type AuditLogOmit = runtime.Types.Extensions.GetOmit<"id" | "createdAt" | "userId" | "email" | "roleId" | "roleName" | "page" | "action" | "entity" | "entityId" | "before" | "after" | "ip", ExtArgs["result"]["auditLog"]> + +export type $AuditLogPayload = { + name: "AuditLog" + objects: {} + scalars: runtime.Types.Extensions.GetPayloadResult<{ + id: string + createdAt: Date + userId: string | null + email: string | null + roleId: number | null + roleName: string | null + page: string + action: string + entity: string | null + entityId: string | null + before: runtime.JsonValue | null + after: runtime.JsonValue | null + ip: string | null + }, ExtArgs["result"]["auditLog"]> + composites: {} +} + +export type AuditLogGetPayload = runtime.Types.Result.GetResult + +export type AuditLogCountArgs = + Omit & { + select?: AuditLogCountAggregateInputType | true + } + +export interface AuditLogDelegate { + [K: symbol]: { types: Prisma.TypeMap['model']['AuditLog'], meta: { name: 'AuditLog' } } + /** + * Find zero or one AuditLog that matches the filter. + * @param {AuditLogFindUniqueArgs} args - Arguments to find a AuditLog + * @example + * // Get one AuditLog + * const auditLog = await prisma.auditLog.findUnique({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUnique(args: Prisma.SelectSubset>): Prisma.Prisma__AuditLogClient, T, "findUnique", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find one AuditLog that matches the filter or throw an error with `error.code='P2025'` + * if no matches were found. + * @param {AuditLogFindUniqueOrThrowArgs} args - Arguments to find a AuditLog + * @example + * // Get one AuditLog + * const auditLog = await prisma.auditLog.findUniqueOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findUniqueOrThrow(args: Prisma.SelectSubset>): Prisma.Prisma__AuditLogClient, T, "findUniqueOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find the first AuditLog that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditLogFindFirstArgs} args - Arguments to find a AuditLog + * @example + * // Get one AuditLog + * const auditLog = await prisma.auditLog.findFirst({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirst(args?: Prisma.SelectSubset>): Prisma.Prisma__AuditLogClient, T, "findFirst", GlobalOmitOptions> | null, null, ExtArgs, GlobalOmitOptions> + + /** + * Find the first AuditLog that matches the filter or + * throw `PrismaKnownClientError` with `P2025` code if no matches were found. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditLogFindFirstOrThrowArgs} args - Arguments to find a AuditLog + * @example + * // Get one AuditLog + * const auditLog = await prisma.auditLog.findFirstOrThrow({ + * where: { + * // ... provide filter here + * } + * }) + */ + findFirstOrThrow(args?: Prisma.SelectSubset>): Prisma.Prisma__AuditLogClient, T, "findFirstOrThrow", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Find zero or more AuditLogs that matches the filter. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditLogFindManyArgs} args - Arguments to filter and select certain fields only. + * @example + * // Get all AuditLogs + * const auditLogs = await prisma.auditLog.findMany() + * + * // Get first 10 AuditLogs + * const auditLogs = await prisma.auditLog.findMany({ take: 10 }) + * + * // Only select the `id` + * const auditLogWithIdOnly = await prisma.auditLog.findMany({ select: { id: true } }) + * + */ + findMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "findMany", GlobalOmitOptions>> + + /** + * Create a AuditLog. + * @param {AuditLogCreateArgs} args - Arguments to create a AuditLog. + * @example + * // Create one AuditLog + * const AuditLog = await prisma.auditLog.create({ + * data: { + * // ... data to create a AuditLog + * } + * }) + * + */ + create(args: Prisma.SelectSubset>): Prisma.Prisma__AuditLogClient, T, "create", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Create many AuditLogs. + * @param {AuditLogCreateManyArgs} args - Arguments to create many AuditLogs. + * @example + * // Create many AuditLogs + * const auditLog = await prisma.auditLog.createMany({ + * data: [ + * // ... provide data here + * ] + * }) + * + */ + createMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Create many AuditLogs and returns the data saved in the database. + * @param {AuditLogCreateManyAndReturnArgs} args - Arguments to create many AuditLogs. + * @example + * // Create many AuditLogs + * const auditLog = await prisma.auditLog.createManyAndReturn({ + * data: [ + * // ... provide data here + * ] + * }) + * + * // Create many AuditLogs and only return the `id` + * const auditLogWithIdOnly = await prisma.auditLog.createManyAndReturn({ + * select: { id: true }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + createManyAndReturn(args?: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "createManyAndReturn", GlobalOmitOptions>> + + /** + * Delete a AuditLog. + * @param {AuditLogDeleteArgs} args - Arguments to delete one AuditLog. + * @example + * // Delete one AuditLog + * const AuditLog = await prisma.auditLog.delete({ + * where: { + * // ... filter to delete one AuditLog + * } + * }) + * + */ + delete(args: Prisma.SelectSubset>): Prisma.Prisma__AuditLogClient, T, "delete", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Update one AuditLog. + * @param {AuditLogUpdateArgs} args - Arguments to update one AuditLog. + * @example + * // Update one AuditLog + * const auditLog = await prisma.auditLog.update({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + update(args: Prisma.SelectSubset>): Prisma.Prisma__AuditLogClient, T, "update", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + /** + * Delete zero or more AuditLogs. + * @param {AuditLogDeleteManyArgs} args - Arguments to filter AuditLogs to delete. + * @example + * // Delete a few AuditLogs + * const { count } = await prisma.auditLog.deleteMany({ + * where: { + * // ... provide filter here + * } + * }) + * + */ + deleteMany(args?: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more AuditLogs. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditLogUpdateManyArgs} args - Arguments to update one or more rows. + * @example + * // Update many AuditLogs + * const auditLog = await prisma.auditLog.updateMany({ + * where: { + * // ... provide filter here + * }, + * data: { + * // ... provide data here + * } + * }) + * + */ + updateMany(args: Prisma.SelectSubset>): Prisma.PrismaPromise + + /** + * Update zero or more AuditLogs and returns the data updated in the database. + * @param {AuditLogUpdateManyAndReturnArgs} args - Arguments to update many AuditLogs. + * @example + * // Update many AuditLogs + * const auditLog = await prisma.auditLog.updateManyAndReturn({ + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * + * // Update zero or more AuditLogs and only return the `id` + * const auditLogWithIdOnly = await prisma.auditLog.updateManyAndReturn({ + * select: { id: true }, + * where: { + * // ... provide filter here + * }, + * data: [ + * // ... provide data here + * ] + * }) + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * + */ + updateManyAndReturn(args: Prisma.SelectSubset>): Prisma.PrismaPromise, T, "updateManyAndReturn", GlobalOmitOptions>> + + /** + * Create or update one AuditLog. + * @param {AuditLogUpsertArgs} args - Arguments to update or create a AuditLog. + * @example + * // Update or create a AuditLog + * const auditLog = await prisma.auditLog.upsert({ + * create: { + * // ... data to create a AuditLog + * }, + * update: { + * // ... in case it already exists, update + * }, + * where: { + * // ... the filter for the AuditLog we want to update + * } + * }) + */ + upsert(args: Prisma.SelectSubset>): Prisma.Prisma__AuditLogClient, T, "upsert", GlobalOmitOptions>, never, ExtArgs, GlobalOmitOptions> + + + /** + * Count the number of AuditLogs. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditLogCountArgs} args - Arguments to filter AuditLogs to count. + * @example + * // Count the number of AuditLogs + * const count = await prisma.auditLog.count({ + * where: { + * // ... the filter for the AuditLogs we want to count + * } + * }) + **/ + count( + args?: Prisma.Subset, + ): Prisma.PrismaPromise< + T extends runtime.Types.Utils.Record<'select', any> + ? T['select'] extends true + ? number + : Prisma.GetScalarType + : number + > + + /** + * Allows you to perform aggregations operations on a AuditLog. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditLogAggregateArgs} args - Select which aggregations you would like to apply and on what fields. + * @example + * // Ordered by age ascending + * // Where email contains prisma.io + * // Limited to the 10 users + * const aggregations = await prisma.user.aggregate({ + * _avg: { + * age: true, + * }, + * where: { + * email: { + * contains: "prisma.io", + * }, + * }, + * orderBy: { + * age: "asc", + * }, + * take: 10, + * }) + **/ + aggregate(args: Prisma.Subset): Prisma.PrismaPromise> + + /** + * Group by AuditLog. + * Note, that providing `undefined` is treated as the value not being there. + * Read more here: https://pris.ly/d/null-undefined + * @param {AuditLogGroupByArgs} args - Group by arguments. + * @example + * // Group by city, order by createdAt, get count + * const result = await prisma.user.groupBy({ + * by: ['city', 'createdAt'], + * orderBy: { + * createdAt: true + * }, + * _count: { + * _all: true + * }, + * }) + * + **/ + groupBy< + T extends AuditLogGroupByArgs, + HasSelectOrTake extends Prisma.Or< + Prisma.Extends<'skip', Prisma.Keys>, + Prisma.Extends<'take', Prisma.Keys> + >, + OrderByArg extends Prisma.True extends HasSelectOrTake + ? { orderBy: AuditLogGroupByArgs['orderBy'] } + : { orderBy?: AuditLogGroupByArgs['orderBy'] }, + OrderFields extends Prisma.ExcludeUnderscoreKeys>>, + ByFields extends Prisma.MaybeTupleToUnion, + ByValid extends Prisma.Has, + HavingFields extends Prisma.GetHavingFields, + HavingValid extends Prisma.Has, + ByEmpty extends T['by'] extends never[] ? Prisma.True : Prisma.False, + InputErrors extends ByEmpty extends Prisma.True + ? `Error: "by" must not be empty.` + : HavingValid extends Prisma.False + ? { + [P in HavingFields]: P extends ByFields + ? never + : P extends string + ? `Error: Field "${P}" used in "having" needs to be provided in "by".` + : [ + Error, + 'Field ', + P, + ` in "having" needs to be provided in "by"`, + ] + }[HavingFields] + : 'take' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "take", you also need to provide "orderBy"' + : 'skip' extends Prisma.Keys + ? 'orderBy' extends Prisma.Keys + ? ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + : 'Error: If you provide "skip", you also need to provide "orderBy"' + : ByValid extends Prisma.True + ? {} + : { + [P in OrderFields]: P extends ByFields + ? never + : `Error: Field "${P}" in "orderBy" needs to be provided in "by"` + }[OrderFields] + >(args: Prisma.SubsetIntersection & InputErrors): {} extends InputErrors ? GetAuditLogGroupByPayload : Prisma.PrismaPromise +/** + * Fields of the AuditLog model + */ +readonly fields: AuditLogFieldRefs; +} + +/** + * The delegate class that acts as a "Promise-like" for AuditLog. + * Why is this prefixed with `Prisma__`? + * Because we want to prevent naming conflicts as mentioned in + * https://github.com/prisma/prisma-client-js/issues/707 + */ +export interface Prisma__AuditLogClient extends Prisma.PrismaPromise { + readonly [Symbol.toStringTag]: "PrismaPromise" + /** + * Attaches callbacks for the resolution and/or rejection of the Promise. + * @param onfulfilled The callback to execute when the Promise is resolved. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of which ever callback is executed. + */ + then(onfulfilled?: ((value: T) => TResult1 | PromiseLike) | undefined | null, onrejected?: ((reason: any) => TResult2 | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback for only the rejection of the Promise. + * @param onrejected The callback to execute when the Promise is rejected. + * @returns A Promise for the completion of the callback. + */ + catch(onrejected?: ((reason: any) => TResult | PromiseLike) | undefined | null): runtime.Types.Utils.JsPromise + /** + * Attaches a callback that is invoked when the Promise is settled (fulfilled or rejected). The + * resolved value cannot be modified from the callback. + * @param onfinally The callback to execute when the Promise is settled (fulfilled or rejected). + * @returns A Promise for the completion of the callback. + */ + finally(onfinally?: (() => void) | undefined | null): runtime.Types.Utils.JsPromise +} + + + + +/** + * Fields of the AuditLog model + */ +export interface AuditLogFieldRefs { + readonly id: Prisma.FieldRef<"AuditLog", 'String'> + readonly createdAt: Prisma.FieldRef<"AuditLog", 'DateTime'> + readonly userId: Prisma.FieldRef<"AuditLog", 'String'> + readonly email: Prisma.FieldRef<"AuditLog", 'String'> + readonly roleId: Prisma.FieldRef<"AuditLog", 'Int'> + readonly roleName: Prisma.FieldRef<"AuditLog", 'String'> + readonly page: Prisma.FieldRef<"AuditLog", 'String'> + readonly action: Prisma.FieldRef<"AuditLog", 'String'> + readonly entity: Prisma.FieldRef<"AuditLog", 'String'> + readonly entityId: Prisma.FieldRef<"AuditLog", 'String'> + readonly before: Prisma.FieldRef<"AuditLog", 'Json'> + readonly after: Prisma.FieldRef<"AuditLog", 'Json'> + readonly ip: Prisma.FieldRef<"AuditLog", 'String'> +} + + +// Custom InputTypes +/** + * AuditLog findUnique + */ +export type AuditLogFindUniqueArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * Filter, which AuditLog to fetch. + */ + where: Prisma.AuditLogWhereUniqueInput +} + +/** + * AuditLog findUniqueOrThrow + */ +export type AuditLogFindUniqueOrThrowArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * Filter, which AuditLog to fetch. + */ + where: Prisma.AuditLogWhereUniqueInput +} + +/** + * AuditLog findFirst + */ +export type AuditLogFindFirstArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * Filter, which AuditLog to fetch. + */ + where?: Prisma.AuditLogWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of AuditLogs to fetch. + */ + orderBy?: Prisma.AuditLogOrderByWithRelationInput | Prisma.AuditLogOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for AuditLogs. + */ + cursor?: Prisma.AuditLogWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` AuditLogs from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` AuditLogs. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of AuditLogs. + */ + distinct?: Prisma.AuditLogScalarFieldEnum | Prisma.AuditLogScalarFieldEnum[] +} + +/** + * AuditLog findFirstOrThrow + */ +export type AuditLogFindFirstOrThrowArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * Filter, which AuditLog to fetch. + */ + where?: Prisma.AuditLogWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of AuditLogs to fetch. + */ + orderBy?: Prisma.AuditLogOrderByWithRelationInput | Prisma.AuditLogOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for searching for AuditLogs. + */ + cursor?: Prisma.AuditLogWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` AuditLogs from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` AuditLogs. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of AuditLogs. + */ + distinct?: Prisma.AuditLogScalarFieldEnum | Prisma.AuditLogScalarFieldEnum[] +} + +/** + * AuditLog findMany + */ +export type AuditLogFindManyArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * Filter, which AuditLogs to fetch. + */ + where?: Prisma.AuditLogWhereInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/sorting Sorting Docs} + * + * Determine the order of AuditLogs to fetch. + */ + orderBy?: Prisma.AuditLogOrderByWithRelationInput | Prisma.AuditLogOrderByWithRelationInput[] + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination#cursor-based-pagination Cursor Docs} + * + * Sets the position for listing AuditLogs. + */ + cursor?: Prisma.AuditLogWhereUniqueInput + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Take `±n` AuditLogs from the position of the cursor. + */ + take?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/pagination Pagination Docs} + * + * Skip the first `n` AuditLogs. + */ + skip?: number + /** + * {@link https://www.prisma.io/docs/concepts/components/prisma-client/distinct Distinct Docs} + * + * Filter by unique combinations of AuditLogs. + */ + distinct?: Prisma.AuditLogScalarFieldEnum | Prisma.AuditLogScalarFieldEnum[] +} + +/** + * AuditLog create + */ +export type AuditLogCreateArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * The data needed to create a AuditLog. + */ + data: Prisma.XOR +} + +/** + * AuditLog createMany + */ +export type AuditLogCreateManyArgs = { + /** + * The data used to create many AuditLogs. + */ + data: Prisma.AuditLogCreateManyInput | Prisma.AuditLogCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * AuditLog createManyAndReturn + */ +export type AuditLogCreateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelectCreateManyAndReturn | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * The data used to create many AuditLogs. + */ + data: Prisma.AuditLogCreateManyInput | Prisma.AuditLogCreateManyInput[] + skipDuplicates?: boolean +} + +/** + * AuditLog update + */ +export type AuditLogUpdateArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * The data needed to update a AuditLog. + */ + data: Prisma.XOR + /** + * Choose, which AuditLog to update. + */ + where: Prisma.AuditLogWhereUniqueInput +} + +/** + * AuditLog updateMany + */ +export type AuditLogUpdateManyArgs = { + /** + * The data used to update AuditLogs. + */ + data: Prisma.XOR + /** + * Filter which AuditLogs to update + */ + where?: Prisma.AuditLogWhereInput + /** + * Limit how many AuditLogs to update. + */ + limit?: number +} + +/** + * AuditLog updateManyAndReturn + */ +export type AuditLogUpdateManyAndReturnArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelectUpdateManyAndReturn | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * The data used to update AuditLogs. + */ + data: Prisma.XOR + /** + * Filter which AuditLogs to update + */ + where?: Prisma.AuditLogWhereInput + /** + * Limit how many AuditLogs to update. + */ + limit?: number +} + +/** + * AuditLog upsert + */ +export type AuditLogUpsertArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * The filter to search for the AuditLog to update in case it exists. + */ + where: Prisma.AuditLogWhereUniqueInput + /** + * In case the AuditLog found by the `where` argument doesn't exist, create a new AuditLog with this data. + */ + create: Prisma.XOR + /** + * In case the AuditLog was found with the provided `where` argument, update it with this data. + */ + update: Prisma.XOR +} + +/** + * AuditLog delete + */ +export type AuditLogDeleteArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null + /** + * Filter which AuditLog to delete. + */ + where: Prisma.AuditLogWhereUniqueInput +} + +/** + * AuditLog deleteMany + */ +export type AuditLogDeleteManyArgs = { + /** + * Filter which AuditLogs to delete + */ + where?: Prisma.AuditLogWhereInput + /** + * Limit how many AuditLogs to delete. + */ + limit?: number +} + +/** + * AuditLog without action + */ +export type AuditLogDefaultArgs = { + /** + * Select specific fields to fetch from the AuditLog + */ + select?: Prisma.AuditLogSelect | null + /** + * Omit specific fields from the AuditLog + */ + omit?: Prisma.AuditLogOmit | null +} diff --git a/src/lib/server/audit-context.ts b/src/lib/server/audit-context.ts new file mode 100644 index 0000000..6d706c3 --- /dev/null +++ b/src/lib/server/audit-context.ts @@ -0,0 +1,23 @@ +import { AsyncLocalStorage } from 'node:async_hooks'; + +/** + * The actor for the current request, used by the Prisma audit extension to + * attribute database mutations. Populated in `hooks.server.ts`. + */ +export type AuditContext = { + userId: string | null; + email: string | null; + roleId: number | null; + page: string; + ip: string | null; +}; + +const storage = new AsyncLocalStorage(); + +export function runWithAuditContext(context: AuditContext, fn: () => T): T { + return storage.run(context, fn); +} + +export function getAuditContext(): AuditContext | undefined { + return storage.getStore(); +} diff --git a/src/lib/server/audit.spec.ts b/src/lib/server/audit.spec.ts new file mode 100644 index 0000000..a267af7 --- /dev/null +++ b/src/lib/server/audit.spec.ts @@ -0,0 +1,78 @@ +import { describe, it, expect } from 'vitest'; +import { describeAction, entityIdFor, sanitizeAuditValue, shouldAudit } from './audit'; + +describe('shouldAudit', () => { + it('audits mutations', () => { + expect(shouldAudit('User', 'create')).toBe(true); + expect(shouldAudit('Profile', 'update')).toBe(true); + expect(shouldAudit('Proclamation', 'delete')).toBe(true); + expect(shouldAudit('LicenseKey', 'updateMany')).toBe(true); + }); + + it('ignores reads', () => { + expect(shouldAudit('User', 'findMany')).toBe(false); + expect(shouldAudit('User', 'findUnique')).toBe(false); + expect(shouldAudit('User', 'count')).toBe(false); + }); + + it('ignores the audit log and auth internals', () => { + for (const model of ['AuditLog', 'Session', 'Account', 'Verification']) { + expect(shouldAudit(model, 'create')).toBe(false); + } + }); +}); + +describe('sanitizeAuditValue', () => { + it('redacts sensitive keys', () => { + const out = sanitizeAuditValue({ + password: 'hunter2', + token: 'abc', + keyHash: 'deadbeef', + email: 'jane@example.com' + }) as Record; + + expect(out.password).toBe('[redacted]'); + expect(out.token).toBe('[redacted]'); + expect(out.keyHash).toBe('[redacted]'); + expect(out.email).toBe('jane@example.com'); + }); + + it('converts dates to ISO strings', () => { + const date = new Date('2026-01-01T00:00:00.000Z'); + expect(sanitizeAuditValue({ at: date })).toEqual({ at: '2026-01-01T00:00:00.000Z' }); + }); + + it('handles arrays and nullish values', () => { + expect(sanitizeAuditValue([1, null, 'a'])).toEqual([1, null, 'a']); + expect(sanitizeAuditValue(null)).toBeNull(); + expect(sanitizeAuditValue(undefined)).toBeNull(); + }); + + it('truncates very long strings', () => { + const long = 'a'.repeat(21000); + const out = sanitizeAuditValue(long) as string; + expect(out.length).toBe(20001); + expect(out.endsWith('…')).toBe(true); + }); +}); + +describe('entityIdFor', () => { + it('prefers the result id', () => { + expect(entityIdFor({ where: { id: 'w' } }, { id: 'r' }, { id: 'b' })).toBe('r'); + }); + + it('falls back to where, data, then before', () => { + expect(entityIdFor({ where: { id: 5 } }, null, null)).toBe('5'); + expect(entityIdFor({ data: { id: 'd' } }, null, null)).toBe('d'); + expect(entityIdFor({}, null, { id: 'b' })).toBe('b'); + expect(entityIdFor({}, null, null)).toBeNull(); + }); +}); + +describe('describeAction', () => { + it('labels bulk operations', () => { + expect(describeAction('updateMany')).toBe('bulk update'); + expect(describeAction('deleteMany')).toBe('bulk delete'); + expect(describeAction('create')).toBe('create'); + }); +}); diff --git a/src/lib/server/audit.ts b/src/lib/server/audit.ts new file mode 100644 index 0000000..b1ab683 --- /dev/null +++ b/src/lib/server/audit.ts @@ -0,0 +1,87 @@ +/** + * Pure helpers for the audit extension. Kept free of database imports so the + * extension in `$lib/db.ts` can use them without a cycle. + */ + +/** Prisma operations that change data. Reads are never audited. */ +const MUTATION_OPERATIONS = new Set([ + 'create', + 'createMany', + 'createManyAndReturn', + 'update', + 'updateMany', + 'updateManyAndReturn', + 'upsert', + 'delete', + 'deleteMany' +]); + +/** + * Models we never audit: + * - `AuditLog` itself (would recurse and is not user data) + * - `Session`/`Account`/`Verification` are high-churn auth internals that hold + * tokens, password hashes and other secrets. Business mutations are audited. + */ +const EXCLUDED_MODELS = new Set(['AuditLog', 'Session', 'Account', 'Verification']); + +export function shouldAudit(model: string, operation: string): boolean { + return !EXCLUDED_MODELS.has(model) && MUTATION_OPERATIONS.has(operation); +} + +const SENSITIVE_KEY = /pass(word)?|secret|token|hash/i; + +/** + * Make a value safe to persist as JSON: dates become ISO strings, sensitive + * keys are redacted, very long strings are truncated, and cycles/depth are + * bounded. + */ +export function sanitizeAuditValue(value: unknown, depth = 0): unknown { + if (value === undefined || value === null) return null; + if (depth > 8) return '[truncated]'; + if (value instanceof Date) return value.toISOString(); + if (Array.isArray(value)) return value.map((item) => sanitizeAuditValue(item, depth + 1)); + if (typeof value === 'object') { + const out: Record = {}; + for (const [key, nested] of Object.entries(value as Record)) { + out[key] = SENSITIVE_KEY.test(key) ? '[redacted]' : sanitizeAuditValue(nested, depth + 1); + } + return out; + } + if (typeof value === 'string' && value.length > 20000) return `${value.slice(0, 20000)}…`; + return value; +} + +/** Best-effort row id for the changed record. */ +export function entityIdFor(args: unknown, result: unknown, before: unknown): string | null { + const where = (args as { where?: { id?: unknown } } | null)?.where; + const data = (args as { data?: { id?: unknown } } | null)?.data; + const resultId = (result as { id?: unknown } | null)?.id; + const first = Array.isArray(before) ? before[0] : before; + const beforeId = (first as { id?: unknown } | undefined)?.id; + const id = resultId ?? where?.id ?? data?.id ?? beforeId; + return id === undefined || id === null ? null : String(id); +} + +/** Human label for an operation, e.g. `updateMany` → `bulk update`. */ +export function describeAction(operation: string): string { + switch (operation) { + case 'create': + return 'create'; + case 'update': + return 'update'; + case 'delete': + return 'delete'; + case 'upsert': + return 'upsert'; + case 'createMany': + case 'createManyAndReturn': + return 'bulk create'; + case 'updateMany': + case 'updateManyAndReturn': + return 'bulk update'; + case 'deleteMany': + return 'bulk delete'; + default: + return operation; + } +}